OVH Cloud OVH Cloud

Comprendre rq vba

6 réponses
Avatar
Arnaud
Je n'ai toujours rien compris aux requ=EAtes que l'on peut=20
faire en vba !
Je ne comprends pas comment voir le r=E9sultat
J'ai fait une toute petite bd pour faire des tests et je=20
n'obtiens pas de r=E9sultat.
Les champs sont :=20
Nom ; Prenom ; Ville ; Critere un champ zone de texte=20
qui me sert d'entr=E9e de crit=E8re.
Le code est joint ci-dessous.

Private Sub Btn_Rq_Click()
On Error GoTo Err_Btn_Rq_Click

Dim bd As Database
Dim rst As Recordset
Dim strREQ As String
Set bd =3D CurrentDb

Dim StrSql As String
StrSql =3D "" & _
"SELECT Tbl_Adresses.Num, Tbl_Adresses.Nom, Tbl_Adr" & _
"esses.Prenom, Tbl_Adresses.Ville FROM Tbl_Adresses" & _
" WHERE (((Tbl_Adresses.Nom)=3Dforms!Fm_Adresses!critere))"=20
& _
"ORDER BY Tbl_Adresses.Nom; "

rst.Close
bd.Close
Set rst =3D Nothing
Set bd =3D Nothing

Exit_Btn_Rq_Click:
Exit Sub
Err_Btn_Rq_Click:
MsgBox Err.Description
Resume Exit_Btn_Rq_Click
=20
End Sub


Si une bonne =E2me voulait me dire ce qui cloche.
Merci d'avance

6 réponses

Avatar
Eric
Bonjour Arnaud

Dans le code que tu donnes ci-dessous, tu definis une chaine sql et c'est
tout, donc rien ne se passe. Partant de ton exemple, voila ce qu'on peut
faire:

1- les infos seront affichées dans une msgbox

Private Sub Btn_Rq_Click()
Dim bd As DAO.Database
Dim rst As DAO.Recordset
Dim strSQL As String, msg as String
Set bd = CurrentDb
strSQL = "Select Num, Nom, Prenom, Ville "
strSQL = strSQL & "from Adresses Where Nom='"
strSQL & strSQL & Me.Critere & "' order by Nom;"
Set rs½.OpenRecordset(strSQL)
While not rs.EOF 'tant qu'il y a des enregistrements
msg = rs!Num & " " & rs!Nom & " " & rs!Prenom
msg = msg & " " & rs!Ville & vbCrLf
rs.MoveNext
Wend
MsgBox msg ' on affiche le resulat
Set rs= Nothing
Set bd= Nothing
End Sub

2- On crée une requête, on la visualise comme d'habitude et on la
supprime.

Private Sub Btn_Rq_Click()
Dim bd As DAO.Database
Dim rq as DAO.Querydef
Dim strSQL As String, msg as String
Set bd = CurrentDb
strSQL = "Select Num, Nom, Prenom, Ville "
strSQL = strSQL & "from Adresses Where Nom='"
strSQL & strSQL & Me.Critere & "' order by Nom;"
Set rq= bd.CreateQuerydef("TmpQry", strSQL)
DoCmd.OpenQuery "TmpQry"
bd.Querydefs.Delete "TmpQry"
Set rq= Nothing
Set bd= Nothing
End Sub

Ceci concerne les requêtes Selection.
Comme ton critere est sur le nom ca ne te retournera que les
enregistrements pour lesquels le champ Nom = le champ critere mais ca ne
sera pas ordonné car tu fais order by Nom alors qu'il faudrait le faire
sur Nom et prenom (order by Nom, Prenom).

Voila
Eric

PS: Charges les références DAO 3.x dans la fenetre vba (Menu Outils-
Références)


"Arnaud" écrivait
news:123fe01c44289$8a60a9c0$:

Je n'ai toujours rien compris aux requêtes que l'on peut
faire en vba !
Je ne comprends pas comment voir le résultat
J'ai fait une toute petite bd pour faire des tests et je
n'obtiens pas de résultat.
Les champs sont :
Nom ; Prenom ; Ville ; Critere un champ zone de texte
qui me sert d'entrée de critère.
Le code est joint ci-dessous.

Private Sub Btn_Rq_Click()
On Error GoTo Err_Btn_Rq_Click

Dim bd As Database
Dim rst As Recordset
Dim strREQ As String
Set bd = CurrentDb

Dim StrSql As String
StrSql = "" & _
"SELECT Tbl_Adresses.Num, Tbl_Adresses.Nom, Tbl_Adr" & _
"esses.Prenom, Tbl_Adresses.Ville FROM Tbl_Adresses" & _
" WHERE (((Tbl_Adresses.Nom)=forms!Fm_Adresses!critere))"
& _
"ORDER BY Tbl_Adresses.Nom; "

rst.Close
bd.Close
Set rst = Nothing
Set bd = Nothing

Exit_Btn_Rq_Click:
Exit Sub
Err_Btn_Rq_Click:
MsgBox Err.Description
Resume Exit_Btn_Rq_Click

End Sub


Si une bonne âme voulait me dire ce qui cloche.
Merci d'avance



Avatar
JC
Salut,

Tu as plusieurs modes possibles :

- celui qui te permet d'exécuter une action (INSERT / UPDATE / ...)
Dim MySQL As String
MySQL = "UPDATE ..."
DoCmd.RunSQL MySQL

- celui qui te permet de créer un recordset sur lequel travailler
Dim MyDB As Database
Dim MyRS As Recordset
Set MyDB = CurrentDb
Set MyRS = MyDB.OpenRecordset("SELECT ...")
ensuite tu peux utiliser chaque élément de ton recordset avec MyRS.NomDuChamp

Dans ton code tu donne simplement la syntaxe dans la string sans l'utiliser,
puis tu referme le recordset sans même l'avoir créé ou utiliser.

Sauf erreur je mettrais cela (cela n'étant peut être pas la syntaxe optimale,
mais je pense que tu devrais avoir un résultat) :


Dim bd As Database
Dim rst As Recordset
Dim StrSql As String

Set bd = CurrentDb
StrSql = "SELECT Tbl_Adresses.Num, Tbl_Adresses.Nom, Tbl_Adresses.Prenom, " & _
"Tbl_Adresses.Ville FROM Tbl_Adresses " & _
"WHERE (((Tbl_Adresses.Nom)=forms!Fm_Adresses!critere))" & _
"ORDER BY Tbl_Adresses.Nom"

Set rst = bd.OpenRecordset(StrSql)

puis utiliser les éléments en les préfixant de rst. (comme rst.Num)

PS : pas de point virgule dans ta syntaxe SQL

Voilà je pense que c'est bon,

@+
Avatar
Damien Mermoz
Salut,
y'a un paquet de truc qui clochent mais faut reconnaitre que c'est dur quand
on débute.

Commençons déjà par savoir ce que tu veux faire car ton code ne fait
stictement rien (en plus d'être faux :) )
Dans le cadre d'un test mettons que tu veuille afficher la valeur du champ
prénom de ta requête dans une msgbox et que le code s'actionne sur un bouton
de ton form fm_adresse

Première erreur, tu ne dis pas que tu travailles avec DAO or si tu es sous
access 2000 ou >, il faut le préciser sinon il comprendra pas
Donc dans la fenêtre VBE (celle du code), tu fais Outilréférences
et tu choisis Microsoft.DAO.3.6 Object library
Ensuite dans tes déclaration pour pas prendre de risque
Dim db as DAO.database
Dim rs as DAO.recordset
dim strSql as string

set db = currentdb 'ca c'était bon:)
'ensuite ta requête
'Une technique c'est de la faire avec le générateur, de passer en
Affichemode sql
'puis copier coller et rajouter à chaque fin de ligne" & vbcrlf
' et de sortir les variable de la chaine

stsSql = "SELECT Tbl_Adresses.Num, Tbl_Adresses.Nom, Tbl_Adresses.Prenom,
Tbl_Adresses.Ville" & vbcrlf
strSql = strsql & " FROM Tbl_Adresses WHERE (((Tbl_Adresses.Nom)=' &
forms!Fm_Adresses!critere &'))"

'plusieur erreurs, tu n'as pas le droit de casser un mot d'une chaine par "
& _
'((je suis pas sûr à 100 % mais de toute façon c'est très laid)
' Ensuite forms!..etc. c'est une variable donc il faut le sortir de la
chaine
' Et ce champ est certainement de type alphanumérique donc il faut entourer
ta variable de '

'ben ensuite faut ouvrir ton recordset sinon ca sert à rien :)
set rs = db.openrecordset(strsql)

'on affiche la msgbox pour voir si ca marche
'vérifier que le recordset n'est pas vide sinon y'aura une erreur
if rs.recordcount <> 0 then
do until rs.eof
msgbox rs!Prenom
loop
else
msgbox "aucune valeur trouvée"
end if

'la fin de ton code est parfaite

En espèrant que ca t'aide.
A +
Damien.
"Arnaud" a écrit dans le message de
news:123fe01c44289$8a60a9c0$
Je n'ai toujours rien compris aux requêtes que l'on peut
faire en vba !
Je ne comprends pas comment voir le résultat
J'ai fait une toute petite bd pour faire des tests et je
n'obtiens pas de résultat.
Les champs sont :
Nom ; Prenom ; Ville ; Critere un champ zone de texte
qui me sert d'entrée de critère.
Le code est joint ci-dessous.

Private Sub Btn_Rq_Click()
On Error GoTo Err_Btn_Rq_Click

Dim bd As Database
Dim rst As Recordset
Dim strREQ As String
Set bd = CurrentDb

Dim StrSql As String
StrSql = "" & _
"SELECT Tbl_Adresses.Num, Tbl_Adresses.Nom, Tbl_Adr" & _
"esses.Prenom, Tbl_Adresses.Ville FROM Tbl_Adresses" & _
" WHERE (((Tbl_Adresses.Nom)=forms!Fm_Adresses!critere))"
& _
"ORDER BY Tbl_Adresses.Nom; "

rst.Close
bd.Close
Set rst = Nothing
Set bd = Nothing

Exit_Btn_Rq_Click:
Exit Sub
Err_Btn_Rq_Click:
MsgBox Err.Description
Resume Exit_Btn_Rq_Click

End Sub


Si une bonne âme voulait me dire ce qui cloche.
Merci d'avance
Avatar
Arnaud
Merci pour vos réponses détaillées et explicites. C'est
vraiment très sympa.
Arnaud

-----Message d'origine-----
Bonjour Arnaud

Dans le code que tu donnes ci-dessous, tu definis une
chaine sql et c'est

tout, donc rien ne se passe. Partant de ton exemple,
voila ce qu'on peut

faire:

1- les infos seront affichées dans une msgbox

Private Sub Btn_Rq_Click()
Dim bd As DAO.Database
Dim rst As DAO.Recordset
Dim strSQL As String, msg as String
Set bd = CurrentDb
strSQL = "Select Num, Nom, Prenom, Ville "
strSQL = strSQL & "from Adresses Where Nom='"
strSQL & strSQL & Me.Critere & "' order by Nom;"
Set rs½.OpenRecordset(strSQL)
While not rs.EOF 'tant qu'il y a des
enregistrements

msg = rs!Num & " " & rs!Nom & " " & rs!
Prenom

msg = msg & " " & rs!Ville & vbCrLf
rs.MoveNext
Wend
MsgBox msg ' on affiche le resulat
Set rs= Nothing
Set bd= Nothing
End Sub

2- On crée une requête, on la visualise comme d'habitude
et on la

supprime.

Private Sub Btn_Rq_Click()
Dim bd As DAO.Database
Dim rq as DAO.Querydef
Dim strSQL As String, msg as String
Set bd = CurrentDb
strSQL = "Select Num, Nom, Prenom, Ville "
strSQL = strSQL & "from Adresses Where Nom='"
strSQL & strSQL & Me.Critere & "' order by Nom;"
Set rq= bd.CreateQuerydef("TmpQry", strSQL)
DoCmd.OpenQuery "TmpQry"
bd.Querydefs.Delete "TmpQry"
Set rq= Nothing
Set bd= Nothing
End Sub

Ceci concerne les requêtes Selection.
Comme ton critere est sur le nom ca ne te retournera que
les

enregistrements pour lesquels le champ Nom = le champ
critere mais ca ne

sera pas ordonné car tu fais order by Nom alors qu'il
faudrait le faire

sur Nom et prenom (order by Nom, Prenom).

Voila
Eric

PS: Charges les références DAO 3.x dans la fenetre vba
(Menu Outils-

Références)


"Arnaud" écrivait
news:123fe01c44289$8a60a9c0$:

Je n'ai toujours rien compris aux requêtes que l'on
peut


faire en vba !
Je ne comprends pas comment voir le résultat
J'ai fait une toute petite bd pour faire des tests et
je


n'obtiens pas de résultat.
Les champs sont :
Nom ; Prenom ; Ville ; Critere un champ zone de texte
qui me sert d'entrée de critère.
Le code est joint ci-dessous.

Private Sub Btn_Rq_Click()
On Error GoTo Err_Btn_Rq_Click

Dim bd As Database
Dim rst As Recordset
Dim strREQ As String
Set bd = CurrentDb

Dim StrSql As String
StrSql = "" & _
"SELECT Tbl_Adresses.Num, Tbl_Adresses.Nom, Tbl_Adr" &
_


"esses.Prenom, Tbl_Adresses.Ville FROM Tbl_Adresses" &
_


" WHERE (((Tbl_Adresses.Nom)=forms!Fm_Adresses!
critere))"


& _
"ORDER BY Tbl_Adresses.Nom; "

rst.Close
bd.Close
Set rst = Nothing
Set bd = Nothing

Exit_Btn_Rq_Click:
Exit Sub
Err_Btn_Rq_Click:
MsgBox Err.Description
Resume Exit_Btn_Rq_Click

End Sub


Si une bonne âme voulait me dire ce qui cloche.
Merci d'avance



.




Avatar
Anor
Bonjour Eric
C'est exactement ce que je voulais lui proposer, mais
comme je n'avais pas d'exemple sous la main, je me suis
dit qu'il y aurait bien quelqu'un qui répondrait avant moi ;-)))
à+
--
Arnaud
--------------------------------------------------
Conseils d'utilisation : http://users.skynet.be/mpfa/
Site Perso : http://memoaccess.free.fr
/Réponses souhaitées sur ce forum, merci/
--------------------------------------------------

Eric wrote:
| Bonjour Arnaud
|
| Dans le code que tu donnes ci-dessous, tu definis une chaine sql et
| c'est tout, donc rien ne se passe. Partant de ton exemple, voila ce
| qu'on peut faire:
Avatar
Eric
re Arnaud(Anor),

A vrai dire tu étais plongé dans la traduction multilingue d'une
application Access. Bientôt va falloir enlever le .fr dans l'adresse du
Newsgroup ;-). Now, u can answer in any language !!!
En tout cas je viens de jeter un oeil sur ton code, c'est TOP - Bravo
Eric

(PS: Voir post Différentes langues suivant utilisateur pour ceux qui sont
perdus -25/05 09:50)



"Anor" <http://memoaccess.free.fr/anor/email.htm> écrivait
news::

Bonjour Eric
C'est exactement ce que je voulais lui proposer, mais
comme je n'avais pas d'exemple sous la main, je me suis
dit qu'il y aurait bien quelqu'un qui répondrait avant moi ;-)))
à+