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 27/09/2011, 17h50   #1
Membre habitué
 
quentin massé
Inscription : janvier 2010
Messages : 251
Détails du profil
Informations personnelles :
Nom : quentin massé
Âge : 27
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : janvier 2010
Messages : 251
Points : 125
Points : 125
Par défaut Problème de recordset d'une requête paramêtrée

Bonjour,

J'ai créé une requête par l'assistant de requête.
je voudrai faire un recordset dessus en vba.
Faire un recordset ne me pose pas de problème habituellement, mais la il me dis qu'il attend 1 paramètre.
Après quelque recherche sur le forum j'ai trouvé des discutions dessus mais je n'arrive pas à me dépatouiller.
Il me marque "élément non trouvé dans la collection".

Voici ma requête en sql:
Code :
1
2
3
4
5
PARAMETERS [Forms]![Frm_Selection_Comparaison]![Lmd_Etape] Text ( 5 );
SELECT Projet.ID_P, Projet.Nom_P, Projet.Longueur, Projet.Nb_Stations, Projet.Montant_Projet, Detail_Poste.Num_Certu, Detail_Poste.Montant_PCertu, Liste_Poste_Certu.Nom_Certu, Detail_Poste_Certu.ID_SP_Certu, Detail_Poste_Certu.Montant_SP_Certu, Sous_Poste_Certu.Nom_SP_Certu, Detail_SP_Certu.ID_Desig, Detail_SP_Certu.Montant_Desig, Designation.Nom_Desig, Contient.ID_Data, Contient.CE, Contient.Etape, Contient.Indice, DATA.Unité, DATA.PU, DATA.Qté, DATA.Peraleas, DATA.Remarque, DATA.Offreur
FROM (Sous_Poste_Certu INNER JOIN (Projet INNER JOIN ((Liste_Poste_Certu INNER JOIN Detail_Poste ON Liste_Poste_Certu.Num_Certu = Detail_Poste.Num_Certu) INNER JOIN Detail_Poste_Certu ON Liste_Poste_Certu.Num_Certu = Detail_Poste_Certu.Num_Certu) ON Projet.ID_P = Detail_Poste.ID_P) ON Sous_Poste_Certu.ID_SP_Certu = Detail_Poste_Certu.ID_SP_Certu) INNER JOIN ((Designation INNER JOIN (DATA INNER JOIN Contient ON DATA.ID_Data = Contient.ID_Data) ON Designation.ID_Desig = Contient.ID_Desig) INNER JOIN Detail_SP_Certu ON Designation.ID_Desig = Detail_SP_Certu.ID_Desig) ON Sous_Poste_Certu.ID_SP_Certu = Detail_SP_Certu.ID_SP_Certu
GROUP BY Projet.ID_P, Projet.Nom_P, Projet.Longueur, Projet.Nb_Stations, Projet.Montant_Projet, Detail_Poste.Num_Certu, Detail_Poste.Montant_PCertu, Liste_Poste_Certu.Nom_Certu, Detail_Poste_Certu.ID_SP_Certu, Detail_Poste_Certu.Montant_SP_Certu, Sous_Poste_Certu.Nom_SP_Certu, Detail_SP_Certu.ID_Desig, Detail_SP_Certu.Montant_Desig, Designation.Nom_Desig, Contient.ID_Data, Contient.CE, Contient.Etape, Contient.Indice, DATA.Unité, DATA.PU, DATA.Qté, DATA.Peraleas, DATA.Remarque, DATA.Offreur, Liste_Poste_Certu.Selection, Sous_Poste_Certu.Selection
HAVING (((Contient.Etape)=[Formulaires]![Frm_Selection_Comparaison]![Lmd_Etape]) AND ((Liste_Poste_Certu.Selection)=True) AND ((Sous_Poste_Certu.Selection)=True));
Comme vous le voyez celle-ci est imposant et je ne voulais pas faire comme d'habitude cad mettre dans une variable text mon code sql.
Je voulais essayer autrement.

J'ai donc mis se code pour parcourir ma requête:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Set Db = CurrentDb
 
    Set qry = Db.QueryDefs("Rqt_Projet_A_Comparer")
 
    qry.Parameters("Etape") = "SDP"
 
    Set myrst = qry.OpenRecordset
 
    'si le recordset n'est pas vide
    If Not myrst.EOF Then
    ' tant qu'il n'est pas vide
        Do While Not myrst.EOF
        MsgBox (myrst.Name)
        myrst.MoveNext
        Loop
    End If
Savez vous pourquoi il ne trouve pas l'élément dans la collection?
Est-ce parce que ma requête a 3 paramètre (etape, selection1,selection2)?
Si oui comment je fais pour paramétrer mes 3 critères?

Si non est-ce parce que ma requête a besoin des éléments du formulaire ou j'exécute se code?

Et si encore non avez vous une idée pour résoudre mon problème?

Merci
rob1son76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2011, 19h01   #2
Rédacteur
 
Avatar de LedZeppII
 
Homme
Maintenance données produits
Inscription : décembre 2005
Messages : 3 939
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Maintenance données produits
Secteur : Distribution

Informations forums :
Inscription : décembre 2005
Messages : 3 939
Points : 6 278
Points : 6 278
Bonjour,

As-tu essayé
Code :
    qry.Parameters("[Forms]![Frm_Selection_Comparaison]![Lmd_Etape]") = "SDP"
ou encore, sans le nom du paramètre
Code :
    qry.Parameters(0) = "SDP"
Si veux vérifier les paramètres et savoir leurs noms, après
Code :
Set qry = Db.QueryDefs("Rqt_Projet_A_Comparer")
ajoute
Code :
1
2
3
4
Dim i As Integer
    For i = 0 To qry.Parameters.Count - 1
        Debug.Print qry.Parameters(i).Name
    Next
Tu verra dans la fenêtre d'exécution le nom des paramètres.

A+
LedZeppII est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2011, 10h29   #3
Membre habitué
 
quentin massé
Inscription : janvier 2010
Messages : 251
Détails du profil
Informations personnelles :
Nom : quentin massé
Âge : 27
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : janvier 2010
Messages : 251
Points : 125
Points : 125
Merci LedZeppII.

C'était bien ce code qu'il fallait mettre.
Code :
qry.Parameters("[Forms]![Frm_Selection_Comparaison]![Lmd_Etape]") = "SDP"
Par contre maintenant il me dis qu'il faut 2 autres paramètres.
Il s'agit de mes variable "Selection" de mes tables "Liste_Poste_Certu" et "Sous_Poste_Certu".

Comme je ne peux pas récupérer les valeur sur mon form j'ai donc utilisé ton autre code.
Code :
qry.Parameters(0).Value = " & Me.Lmd_Etape & "
Ca marche aussi très bien.

J'ai donc mis se code pour les 2 autres paramètres.
Code :
qry.Parameters(1).Value = vrai
Je n'ai mis qu'une ligne pour les 2 car si je mettais:
Code :
1
2
qry.Parameters(1).Value = vrai
qry.Parameters(2).Value = vrai
Il me dis que l'élément n'est pas trouvé dans la collection.
Alors qu'avec seulement 1 ligne je n'ai plus de message d'erreur.
Est-ce parce que mes 2 variables on le même nom?

Par contre la suite de mon code ne marche pas.
Code :
1
2
3
4
5
6
7
8
9
Set myrst = qry.OpenRecordset
    'si le recordset n'est pas vide
    If Not myrst.EOF Then
    ' tant qu'il n'est pas vide
        Do While Not myrst.EOF
        MsgBox (myrst.Fields("Nom_P").Value)
        myrst.MoveNext
        Loop
    End If
Le recordset est bizarrement vide.
J'ai mis un msgbox tout simple après : Et il n'est pas apparu.

je me suis dis que c'était la requête qui n'allait pas.
J'ai donc ouvert ma requête (en faisant un openquerry) et elle s'est bien ouverte avec les bon enregistrement dedans.

Qu'est-ce qui ne va pas dans mon code qui parcourt mon recordset?
rob1son76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2011, 10h47   #4
Membre habitué
 
quentin massé
Inscription : janvier 2010
Messages : 251
Détails du profil
Informations personnelles :
Nom : quentin massé
Âge : 27
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : janvier 2010
Messages : 251
Points : 125
Points : 125
C'est bon j'avais oublié les parenthèse à:
Code :
Set myrst = qry.OpenRecordset
Ce qui donne:
Code :
Set myrst = qry.OpenRecordset ()
rob1son76 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 22h59.


 
 
 
 
Partenaires

Hébergement Web