Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > VBA Access
VBA Access Le forum pour les questions relatives au code VBA sous Access, et à son environnement de développement VBE.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 23/09/2011, 18h24   #1
Membre régulier
 
Inscription : novembre 2008
Messages : 219
Détails du profil
Informations personnelles :
Âge : 25
Localisation : Suisse

Informations forums :
Inscription : novembre 2008
Messages : 219
Points : 79
Points : 79
Envoyer un message via MSN à Bobble
Par défaut DAO Filter "cannot open any more tables or queries"

Bonjour,

je dois effectuer des opérations sur une table, et filtrer des résultats en boucle. Si j'ai peu de résultats ça fonctionne, mais si j'en ai trop j'ai l'erreur "cannot open any more tables or queries".

Je n'arrive pas à trouver une solution...
Je cois que le soucis vient du OpenRecordset, mais je n'ai pas trouvé un autre moyen pour appliquer le filtre a ma requête...

Pourtant je ferme bien les requêtes et je les vides....

Voilà mon code:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
Private Sub bCreateFile_Click()
    Dim i As Integer
    Dim totale As Integer
    Dim qd As DAO.QueryDef
    Dim rs As DAO.Recordset
    Dim rsCopy As DAO.Recordset
 
    Dim tmpRepID As String
    Dim tmpAccID As String
 
On Error GoTo Err_bCreateFile_Click
 
    Set qd = db.QueryDefs("Q_maRequete")
    qd.Parameters(0) = ID
    Set rs = qd.OpenRecordset(dbOpenDynaset)
    qd.Close
    If Not (rs.EOF And rs.BOF) Then
        rs.MoveLast
        rs.MoveFirst
    End If
    totale = rs.RecordCount
 
    i = 1
    Do
        ....
 
        If (Not (IsNull(rs![AccRepID])) And Len(rs![AccRepID]) > 0) Then
                tmpRepID = rs![RepID]
                tmpAccID = rs![AccRepID]
                rs.FindFirst ("[RepID] = " & tmpAccID)
                If (Not rs.NoMatch) Then
                    i = i + 1
 
  		    .....
 
                    rs.Filter = "Not [RepID] = " & tmpAccID
                    Set rsCopy = rs.OpenRecordset
                    rs.Close
                    Set rs = Nothing
                    Set rs = rsCopy.Clone
                    rsCopy.Close
                    Set rsCopy = Nothing
                End If
                rs.Filter = "Not [RepID] = " & tmpRepID
                Set rsCopy = rs.OpenRecordset
                rs.Close
                Set rs = Nothing
                Set rs = rsCopy.Clone
                rsCopy.Close
                Set rsCopy = Nothing
            Else
                rs.Filter = "Not [RepID] = " & rs![RepID]
                Set rsCopy = rs.OpenRecordset
                rs.Close
                Set rs = Nothing
                Set rs = rsCopy.Clone
                rsCopy.Close
                Set rsCopy = Nothing
            End If
 
        If Not (rs.EOF And rs.BOF) Then
            rs.MoveLast
            rs.MoveFirst
        End If
    i = i + 1
    Loop While rs.RecordCount > 0
    rs.Close
 
........
 
Exit_bCreateFile_Click:
    Exit Sub
Err_bCreateFile_Click:
    MsgBox Err.Description
    Resume Exit_bCreateFile_Click
End Sub
Bobble est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/09/2011, 11h27   #2
Membre confirmé
 
Avatar de lelensois16
 
Homme Romain M.
Étudiant
Inscription : avril 2009
Messages : 167
Détails du profil
Informations personnelles :
Nom : Homme Romain M.
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Étudiant
Secteur : Conseil

Informations forums :
Inscription : avril 2009
Messages : 167
Points : 204
Points : 204
Bonjour,

Est ce que la variable db est correctement déclarée ???
Faudrait peut être rajouter cette ligne de code :

Cdt

RM
lelensois16 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/09/2011, 12h27   #3
Membre régulier
 
Inscription : novembre 2008
Messages : 219
Détails du profil
Informations personnelles :
Âge : 25
Localisation : Suisse

Informations forums :
Inscription : novembre 2008
Messages : 219
Points : 79
Points : 79
Envoyer un message via MSN à Bobble
Merci pour ta réponse. Oui, cette variable est correctement déclarée. Autrement j'aurais déjà une erreur avant j'exécution. Je pense que ça vient du fait d'ouvrir plusieurs fois le rs... mais je ne comprend pas car il me semble que je le ferme correctement..
Bobble est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/09/2011, 12h37   #4
Membre confirmé
 
Avatar de lelensois16
 
Homme Romain M.
Étudiant
Inscription : avril 2009
Messages : 167
Détails du profil
Informations personnelles :
Nom : Homme Romain M.
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Étudiant
Secteur : Conseil

Informations forums :
Inscription : avril 2009
Messages : 167
Points : 204
Points : 204
Essaies d'utiliser la méthode RecordsetClone ?
( ici )
lelensois16 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 26/09/2011, 09h14   #5
Membre régulier
 
Inscription : novembre 2008
Messages : 219
Détails du profil
Informations personnelles :
Âge : 25
Localisation : Suisse

Informations forums :
Inscription : novembre 2008
Messages : 219
Points : 79
Points : 79
Envoyer un message via MSN à Bobble
Bonjour,
Merci pour ton aide.

La fonction RecordsetClone est pour les formulaires. Je ne peux pas l'appliquer à un Recordset. J'ai quand même essayé, mais j'ai une erreur de compilation, la fonction est introuvable, pour le recordset...

une autre idée?
Bobble est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2011, 11h48   #6
Expert Confirmé
 
Avatar de Godzestla
 
Homme
Chercheur de bonheur
Inscription : août 2007
Messages : 2 255
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 47
Localisation : Belgique

Informations professionnelles :
Activité : Chercheur de bonheur
Secteur : Industrie

Informations forums :
Inscription : août 2007
Messages : 2 255
Points : 2 979
Points : 2 979
Bonjour,

Citation:
je dois effectuer des opérations sur une table, et filtrer des résultats en boucle
Pourquoi filtrer des résultats en boucle, et qu'essaies tu de faire en fait ?
__________________
(\ _ /) Cordialement G@dz
(='.'=)

(")-(") Vous avez des neurones. Sollicitez-les. . Si vous êtes aidé, pensez à Voter.
Godzestla est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 26/09/2011, 11h55   #7
Membre régulier
 
Inscription : novembre 2008
Messages : 219
Détails du profil
Informations personnelles :
Âge : 25
Localisation : Suisse

Informations forums :
Inscription : novembre 2008
Messages : 219
Points : 79
Points : 79
Envoyer un message via MSN à Bobble
Bonjour,

J'ai le doute que sur un recordset il y a une limite de filtres.
Est-ce quelqu'un peut confirmer?

Donc, je pense que avec le .Clone on copie le recordset comme ça comme il est, donc avec les filtres, et pas uniquement les données.

Comme je n'ai pas trouvé une solution pour copier uniquement les données dans un autre recordset, j'ai finalement cherché une solution alternative.

ça ne me plait pas beaucoup. Donc, si quelqu'un trouve une solution, merci de continuer le post!

J'ai ajouté un champs boolean à ma table, et au lieu de filtrer sur l'id je filtre sur ce champ. Je set ce champ à true, et je fais un "rs.Requery"..
Bobble est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2011, 12h08   #8
Membre Expert
 
Homme Michel
Ingénieur développement logiciels
Inscription : mai 2005
Messages : 1 584
Détails du profil
Informations personnelles :
Nom : Homme Michel
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mai 2005
Messages : 1 584
Points : 2 143
Points : 2 143
Bonjour,
Je ne comprend pas tout au traitement présenté plus haut
mais je pense qu'il n'est pas très propet :
Faire une boucle sur un RS avec une condition sur RS : OK
Mais à l'intérieur de la boucle, faire un RS = nothing et tant qu'on y est, une réaffectation de RS : il y a mieux à faire ! (en fonction du but recherché bien sûr)

__________________
"tout le monde veut sauver la planète, mais personne ne veut descendre les poubelles." J Yanne
micniv est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 26/09/2011, 15h11   #9
Membre régulier
 
Inscription : novembre 2008
Messages : 219
Détails du profil
Informations personnelles :
Âge : 25
Localisation : Suisse

Informations forums :
Inscription : novembre 2008
Messages : 219
Points : 79
Points : 79
Envoyer un message via MSN à Bobble
En fait, j'ai une table contenant une liste d'appareil. Certains appareils peuvent être liés à un autre appareil (son accessoire).

MaTable(RepID, descApp, AccRepID)
Où AccRepID correspond à un RepID.

je dois sortir chaque appareil avec son accessoire. Donc, quand je tombe sur un appareil qui a un accessoire, je fais un find pour l'accessoire, j'exécute mon code et je filtre mon appareil et son accessoire, de façon à ne plus les retrouver dans la suite...

Je ne sais pas si c'est claire...?

Ce que je veux faire c'est à partir d'une table comme celle-ci:
Code :
1
2
3
4
Rep1, Descr1, Rep3
Rep2, Descr2, 
Rep3, Descr3,
...
Avoir ça comme ordre:
Code :
1
2
3
4
Rep1, Descr1, Rep3
Rep3, Descr3,
Rep2, Descr2, 
...
Avoir à la suite de l'appareil son accessoire.


Pour faire un filtre, je dois faire un OpenRecordset, au départ je n'avais pas mis le Nothing...mais j'ai essayé et ça ne change rien.
Bobble est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2011, 15h22   #10
Expert Confirmé
 
Avatar de Godzestla
 
Homme
Chercheur de bonheur
Inscription : août 2007
Messages : 2 255
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 47
Localisation : Belgique

Informations professionnelles :
Activité : Chercheur de bonheur
Secteur : Industrie

Informations forums :
Inscription : août 2007
Messages : 2 255
Points : 2 979
Points : 2 979
Citation:
je dois sortir chaque appareil avec son accessoire. Donc, quand je tombe sur un appareil qui a un accessoire, je fais un find pour l'accessoire, j'exécute mon code et je filtre mon appareil et son accessoire, de façon à ne plus les retrouver dans la suite...

Je ne sais pas si c'est claire...?
Euh, non, pas du tout.

Que signifie pour toi
Citation:
de façon à ne plus les retrouver dans la suite...
?

Tu ne parles pas du lien entre les appareils et les accessoires. !!
Un accessoire ne convient qu'à un appareil ?
Ils sont dans la même table ? Comment sont-ils liés ?

Pourquoi ne pas retrouver tes accessoires avec une simple requete (autre requete) sur les accessoires avec comme critère de sélection = Appareil en trt ?
__________________
(\ _ /) Cordialement G@dz
(='.'=)

(")-(") Vous avez des neurones. Sollicitez-les. . Si vous êtes aidé, pensez à Voter.
Godzestla est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 26/09/2011, 15h46   #11
Rédacteur/Modérateur

 
Avatar de argyronet
 
Homme Jean-Philippe AMBROSINO
Panseur de bobos en solutions ETL
Inscription : mai 2004
Messages : 3 655
Détails du profil
Informations personnelles :
Nom : Homme Jean-Philippe AMBROSINO
Localisation : France

Informations professionnelles :
Activité : Panseur de bobos en solutions ETL
Secteur : Finance

Informations forums :
Inscription : mai 2004
Messages : 3 655
Points : 6 220
Points : 6 220
Envoyer un message via MSN à argyronet
Bonjour,

Si tu t'es bien exprimé, je propose :
Code :
1
2
3
4
 
SELECT APR.AppID, APR.Description, NZ([Accessoires],'Aucun') AS Accessoire
FROM TAppareils AS APR LEFT JOIN TAccessoires AS ACC ON APR.AppID = ACC.AppID
ORDER BY Len([APR].[AppID] & [APR].[Description] & NZ([ACC].[Accessoires],'Aucun')) DESC;
Dans un CreateQueryDefs, tu créés dynamiquement cette requête.
En moins de 5 lignes c'est fait
Tout simplement...

Argy
__________________
Ils comptent sur vous...

Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

Web Site@Mail
Livres : VBA pour OFFICE 2007 et MICROSOFT ACCESS 2007
Nouveau Tutoriel : Déployer vos applications avec Microsoft Access 2010
MDB Viewer : Visionneuse Access v4.0
argyronet est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 26/09/2011, 16h33   #12
Membre régulier
 
Inscription : novembre 2008
Messages : 219
Détails du profil
Informations personnelles :
Âge : 25
Localisation : Suisse

Informations forums :
Inscription : novembre 2008
Messages : 219
Points : 79
Points : 79
Envoyer un message via MSN à Bobble
oui, Certains appareils peuvent être liés à un autre appareil (son accessoire).
Un appareil peut avoir 0;1 accessoire. Oui, ils sont dans la même table.

MaTable(RepID, descApp, AccRepID)
Où AccRepID correspond à un RepID.

Ce que argyronet m'a donné est correcte, mais je n'ai pas les résultats dans le bon ordre.

Mon but est d'avoir un appareil et son accessoire dans la ligne suivante.

Code :
1
2
3
4
Rep1, Descr1, Rep3
Rep3, Descr3,
Rep2, Descr2, 
...
Je n'ai pas un ordre fixe, par rapport à un id ou autre...donc je dois parcourir ma table, quand je trouve un appareil avec un accessoire je dois sauter à l'enregistrement de l'accessoire. C'est à ce moment la que j'ai pensé de filtrer l'appareil et l'accessoire que je viens de "ressortir", comme ça je peux reprendre ma table depuis le début...jusqu'à que tous les enregistrements soient filtrés (donc traités).

Mais, c'est une bonne idée. Trouver d'abord tous les appareils qui n'ont pas d'accessoire, ensuite chaque appareil qui a un accessoire et chercher son accessoire et qu' à la fin, chercher s'il y a des accessoires sans appareil...

Je ferais ça avec 3 requêtes, ça va aussi.
Bobble est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2011, 16h38   #13
Membre régulier
 
Inscription : novembre 2008
Messages : 219
Détails du profil
Informations personnelles :
Âge : 25
Localisation : Suisse

Informations forums :
Inscription : novembre 2008
Messages : 219
Points : 79
Points : 79
Envoyer un message via MSN à Bobble
Ah no! Je n'ai rien dit!

La requête de argyronet est parfaite!

Merci!!!

Merci à tout le monde pour l'aide et la patience
Bobble est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2011, 17h26   #14
Membre régulier
 
Inscription : novembre 2008
Messages : 219
Détails du profil
Informations personnelles :
Âge : 25
Localisation : Suisse

Informations forums :
Inscription : novembre 2008
Messages : 219
Points : 79
Points : 79
Envoyer un message via MSN à Bobble
Après plusieurs tests, j'ai pu constater que cette requête ne fonctionne pas dans tous les cas...ça dépend de la longueur de la Description...et cette longueur n'est pas constante...

une autre idée?

Bobble est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2011, 09h04   #15
Rédacteur/Modérateur

 
Avatar de argyronet
 
Homme Jean-Philippe AMBROSINO
Panseur de bobos en solutions ETL
Inscription : mai 2004
Messages : 3 655
Détails du profil
Informations personnelles :
Nom : Homme Jean-Philippe AMBROSINO
Localisation : France

Informations professionnelles :
Activité : Panseur de bobos en solutions ETL
Secteur : Finance

Informations forums :
Inscription : mai 2004
Messages : 3 655
Points : 6 220
Points : 6 220
Envoyer un message via MSN à argyronet
Ma proposition restait une idée pour te monter qu'il est parfois très simple de réaliser quelque chose où tu t'embarques sans t'en sortir...
Elle n'était en aucun cas une solution...

Et en fait, il est difficile de déterminer le tri dans le sens où l'on ne peut déduire que tel appareil arrive ne tête sous prétexte que son accessoire principal est le :
"ndeglutopzutik à tête azimutée magnétique inversée"
et que l'autre a simplement un :
"truchmonch carré"
voire : "aucun"...

Donc, ce que je vois, c'est d'envisager plutôt un COUNT() du nombre d'accessoires par appareil associé effectivement au LEN de l'ensemble de la chaîne.
L'ordre de tri serait alors établi par nombre d'accessoires par appareil avec le nombre représenté par la chaîne la plus grande en tête.

Toutefois, je ne vois pas trop l'objectif de ta demande...

Il faudrait que tu nous en dise un peu plus.

Argy
__________________
Ils comptent sur vous...

Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

Web Site@Mail
Livres : VBA pour OFFICE 2007 et MICROSOFT ACCESS 2007
Nouveau Tutoriel : Déployer vos applications avec Microsoft Access 2010
MDB Viewer : Visionneuse Access v4.0
argyronet est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/09/2011, 09h17   #16
Membre régulier
 
Inscription : novembre 2008
Messages : 219
Détails du profil
Informations personnelles :
Âge : 25
Localisation : Suisse

Informations forums :
Inscription : novembre 2008
Messages : 219
Points : 79
Points : 79
Envoyer un message via MSN à Bobble
C'est vraie que des fois on tourne autour avec des solution compliquées, quand ce serais tout simple...
Je vais regarder s'il y a une solution avec le count.

En fait, je dois mettre le résultat de la requête dans un fichier excel, et dans ce fichier je dois avoir l'appareil et juste après son accessoire.

Merci encore
Bobble est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2011, 10h25   #17
Rédacteur/Modérateur

 
Avatar de argyronet
 
Homme Jean-Philippe AMBROSINO
Panseur de bobos en solutions ETL
Inscription : mai 2004
Messages : 3 655
Détails du profil
Informations personnelles :
Nom : Homme Jean-Philippe AMBROSINO
Localisation : France

Informations professionnelles :
Activité : Panseur de bobos en solutions ETL
Secteur : Finance

Informations forums :
Inscription : mai 2004
Messages : 3 655
Points : 6 220
Points : 6 220
Envoyer un message via MSN à argyronet
Citation:
Envoyé par Bobble Voir le message
En fait, je dois mettre le résultat de la requête dans un fichier excel, et dans ce fichier je dois avoir l'appareil et juste après son accessoire.
Je pense que c'est plutôt :
En fait, je dois mettre le résultat de la requête dans un fichier excel,
et dans ce fichier je dois avoir l'appareil et juste après ses accessoires.


Non ?

Argy
__________________
Ils comptent sur vous...

Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

Web Site@Mail
Livres : VBA pour OFFICE 2007 et MICROSOFT ACCESS 2007
Nouveau Tutoriel : Déployer vos applications avec Microsoft Access 2010
MDB Viewer : Visionneuse Access v4.0
argyronet est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/09/2011, 10h44   #18
Membre régulier
 
Inscription : novembre 2008
Messages : 219
Détails du profil
Informations personnelles :
Âge : 25
Localisation : Suisse

Informations forums :
Inscription : novembre 2008
Messages : 219
Points : 79
Points : 79
Envoyer un message via MSN à Bobble
Oui, dans un future il pourrait y avoir plusieurs accessoires pour un appareil (mais toujours un appareil pour un accessoire).

Mais pour le moment chaque appareil peut avoir 0 ou 1 accessoire.
Un accessoire peut avoir 0 ou 1 appareil.

Je pensais partir du simple, vu que je le trouve déjà compliqué...mais si t'a une solution "à long terme" c'est encore mieux
Bobble est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2011, 11h41   #19
Expert Confirmé
 
Avatar de Godzestla
 
Homme
Chercheur de bonheur
Inscription : août 2007
Messages : 2 255
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 47
Localisation : Belgique

Informations professionnelles :
Activité : Chercheur de bonheur
Secteur : Industrie

Informations forums :
Inscription : août 2007
Messages : 2 255
Points : 2 979
Points : 2 979
... ou encore
Citation:
je dois mettre le résultat de la requête dans un fichier excel,
et dans ce fichier je dois avoir l'appareil et dans la colonne suivante son accessoire, avec au minimum 1 ligne et au maximum 1 ligne par accessoire
Ce qui permettrait dans Excel des traitements impossibles avec l'autre présentation.

Mais c'est juste une suggestion.
__________________
(\ _ /) Cordialement G@dz
(='.'=)

(")-(") Vous avez des neurones. Sollicitez-les. . Si vous êtes aidé, pensez à Voter.
Godzestla est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/09/2011, 11h49   #20
Membre régulier
 
Inscription : novembre 2008
Messages : 219
Détails du profil
Informations personnelles :
Âge : 25
Localisation : Suisse

Informations forums :
Inscription : novembre 2008
Messages : 219
Points : 79
Points : 79
Envoyer un message via MSN à Bobble
Ce n'est pas dans la colonne suivante, mais dans la ligne suivante...

je ne comprend pas
Citation:
avec au minimum 1 ligne et au maximum 1 ligne par accessoire. Ce qui permettrait dans Excel des traitements impossibles avec l'autre présentation.
Je ne dois pas faire de traitements dans excel..je dois insérer les lignes correspondantes à ma query dans le bon ordre..
Bobble est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h36.


 
 
 
 
Partenaires

Hébergement Web