Lancer une requête SQL sur des Tables dans du code VBA

Résolu/Fermé
Random Dude Messages postés 24 Date d'inscription mercredi 3 juillet 2013 Statut Membre Dernière intervention 6 août 2013 - 3 juil. 2013 à 09:58
Random Dude Messages postés 24 Date d'inscription mercredi 3 juillet 2013 Statut Membre Dernière intervention 6 août 2013 - 9 juil. 2013 à 15:41
Bonjour à tous,

Je suis nouveau sur ce site, donc veuillez m'excuser par avance si je ne poste pas ce sujet au bon endroit.

Alors voilà comme l'indique le titre, je cherche à faire quelque chose d'assez basique en soit, puisqu'il s'agit de lancer une requête SQL sur des Tables préalablement créées, le tout via du code VBA.

Je suis totalement nouveau dans Access, et aussi en VBA, en revanche j'ai quelques notions de SQL, et ayant fait de la programmation dans d'autres langages également, je m'adapte petit à petit au VBA.

L'objectif : créer un formulaire, doté d'un bouton "comparer" qui permet lorsque l'on clique dessus de repérer les différences entre 2 Tables précises, contenant les mêmes informations à 2 dates différentes, donc avec quelques différences à repérer, et que l'on aura créé juste avant.

Alors pourquoi ne pas faire tout simplement une requête via Access ? parce qu'il s'agit de faire un environnement "User Friendly" étant donné que les utilisateurs futurs de ce formulaire n'y connaîtront rien en Access ou en base de donnés. Il leur faudra donc juste cliquer sur un bouton et importer 2 fichiers excel dans 2 tables différentes ( d'ailleurs j'automatiserai ça également par la suite mais ce n'est pas le point maintenant )

Ce que j'ai fait : j'ai les Tables, j'ai le formulaire, je suis donc en train de développer le code dans la partie "Sur clic" de l'onglet événement de mon bouton. M'étant renseigné sur internet, il me semble qu'il faut ces lignes de code pour lancer du SQL via le VBA :

DoCmd.RunSQL (" SELECT ....." )

mais ça ne suffit apparemment pas. Dans les "Requêtes" d'Access, lorsque on les ouvre, ça nous sort directement une Table avec le résultat. Est-ce que le code inséré de cette façon dans le "DoCmd.RunSQL" permet la même chose ? ( ouvrir une Table avec le résultat ?)

Le code permettant de comparer les 2 tables en SQL même je pense pouvoir m'en sortir seul, ce que je voudrais obtenir pour le moment c'est la création d'une table avec le résultat d'une requête basique. pour le moment le compilateur m'affiche

"Erreur d'exécution '2342' "
" Une action ExécuterSQL nécessite un argument consistant en une instruction SQL"

Voilà merci de vos réponses et conseils, je suis ouvert à toute suggestion ;)
A voir également:

5 réponses

Random Dude Messages postés 24 Date d'inscription mercredi 3 juillet 2013 Statut Membre Dernière intervention 6 août 2013
3 juil. 2013 à 11:18
Je suis de retour ! bon, avec quelques recherches approfondies, et en posant les bonnes questions à google, j'ai pu tomber sur une explication qui résout en partie mon problème :

je n'arrive toujours pas à créer de Table contenant mon résultat, mais j'arrive à l'afficher dans une zone de liste dans mon formulaire.

J'ai pu voir également un code qui permettrait d'afficher le résultat dans une Table mais il ne fonctionne toujours pas : voici les avancées :

Code à ajouter pour afficher le résultat dans une table :

Dim RS As DAO.Recordset

SQL= (" blabla bla ")

Set RS = CurrentDb.OpenRecordset(SQL)

Voilà il reste une ligne de code à ajouter permettant d'afficher le résultat dans une table.

J'utilisais avant le DoCmd.RunSQL mais il parait qu'on ne l'utilise que pour manipuler des données, pas un simple SELECT

Maintenant, l'autre piste que j'ai exploité c'est l'affichage dans une zone de liste du formulaire :

ma zone de liste d'appelle donc " affiche_recherche "

affiche_recherche.Enabled = True

Me.affiche_recherche.RowSource = SQL

Me.affiche_recherche.Requery

Voilà, c'est un début de solution mais vraiment pas pratique, la largeur des colonnes est limitées, et la sélection du texte peu pratique ....

J'aimerais vraiment afficher le résultat dans une Table

merci de vos réponses
0
Jean_Jacques Messages postés 1040 Date d'inscription mercredi 30 avril 2008 Statut Membre Dernière intervention 1 août 2014 112
4 juil. 2013 à 09:07
Bonjour Random Dude,


Le site https://access.developpez.com/ est un bon support pour aborder Access et ses particularités...

https://access.developpez.com/faq/?page=SQL

Cordialement
0
Random Dude Messages postés 24 Date d'inscription mercredi 3 juillet 2013 Statut Membre Dernière intervention 6 août 2013
4 juil. 2013 à 09:44
Merci Jean_Jacques,

je m'étais effectivement également inscrit sur developpez.com, où j'avais posé la même question ;)

merci pour ta réponse ;)
0
Random Dude Messages postés 24 Date d'inscription mercredi 3 juillet 2013 Statut Membre Dernière intervention 6 août 2013
8 juil. 2013 à 15:55
Re ! ^^

Je viens juste pour préciser que malgré mon inscription sur développez.com, je n'ai toujours pas trouvé de réponse, au cas où ça intéresserait quelqu'un :P

Le sujet n'est pas clos quoi ^^
0
blux Messages postés 26001 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 24 avril 2024 3 289
9 juil. 2013 à 11:13
Salut,

je n'ai pas tout compris, mais on ne peut pas afficher un résultat dans une 'table'. La table est un objet de base de donnée bien spécifique.

Par contre, on peut afficher le résultat d'une requête sélection dans un formulaire de type 'table' (celui qu'on voit habituellement par défaut)... Mais il faut que la requête existe déjà (il est toutefois possible de la créer en dynamique via VBA).

DoCmd.OpenQuery "Requête1" 
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Random Dude Messages postés 24 Date d'inscription mercredi 3 juillet 2013 Statut Membre Dernière intervention 6 août 2013
9 juil. 2013 à 11:58
Bonjour Blux !

et merci de ta réponse ;)

Alors je vais essayer d'être un peu plus clair, et merci de tes précisions sur les Tables ^^

Sous Access tout d'abord : dans l'onglet "Tous les objets Access" (que l'on peut afficher sur la gauche lorsque l'on veut créer un formulaire ou autre) peuvent figurer plusieurs choses dont : les "Tables" , les "Requêtes", les "Formulaires" et je suppose qu'il existe encore quelques autres objets auxquels on ne s'intéressera pas ici.

l'onglet "Requête" permet de créer une requête sans le code, en reliant différents champs de plusieurs Tables, et affiche lorsqu'on la lance le résultat dans un tableau très fortement similaire a celui d'une Table.

Ce qui m'intéresse ici, ce n'est pas cette requête là, mais une requête codée en SQL, c'est à dire dynamiquement, depuis le code VBA.

lorsque celle-ci est codée et incluse dans le code VBA sous cette forme :

Dim SQL As String

SQL = "SELECT ..."


j'aimerais comme tu le dis, afficher le résultat dans un formulaire de type "Table".

Je suppose que la commande que tu proposes permet de lancer une requête déjà existante et créée dans les objets Access.

j'aimerais que me code fasse tout : contienne la requête codée, et puisse afficher le résultat.

C'est donc bien cette partie " en dynamique" qui m'intéresse et que j'aimerais que tu développes si possible ;)

merci beaucoup !
0
blux Messages postés 26001 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 24 avril 2024 3 289
9 juil. 2013 à 12:43
Tiens, plutôt que de retaper tout le code, je te propose de reprendre l'exemple donné ici.
Si ça coince, n'hésite pas à demander conseil...
0
Random Dude Messages postés 24 Date d'inscription mercredi 3 juillet 2013 Statut Membre Dernière intervention 6 août 2013
9 juil. 2013 à 13:34
Merci ;)

Alors je viens d'essayer en adaptant le code à mon cas, et le compilo m'affiche : "Trop peu de paramètres. 1 attendu "

pour cette ligne :
Set rs = dbs.OpenRecordset(SQL2, dbOpenSnapshot)


SQL2 étant une string qui contient une requête.

Alors après quelque recherches, il me semble qu'il s'agit d'un manque de déclaration d'une Table dans le code :

il me semble que ces lignes :

Dim dbs As Database
Set dbs = CurrentDb()


ne suffisent pas à déclarer que l'on va utiliser des Tables présentes dans la base de données utilisée pour le formulaire.

Le " 1 attendu " était un " 2 attendu" quand j'utilisais 2 Tables différentes dans ma requête.

Il me semble évident que les Tables concernées ne sont donc pas correctement déclarée dans le code.

Peux-tu m'éclairer à ce sujet ?

Pour plus de clarté : voici le code utilisé :

Private Sub Étiquette1_Click()




Dim SQL2 As String


SQL2 = "SELECT ..."  
  
  
Dim dbs As Database
Dim rs As Recordset
Dim qdf As QueryDef



Set dbs = CurrentDb()



Set rs = dbs.OpenRecordset(SQL2, dbOpenSnapshot)

With dbs
Set qdf = .CreateQueryDef("Ecarts", SQL)
DoCmd.OpenQuery "Ecarts"
.QueryDefs.Delete "Ecarts"
End With
dbs.Close
qdf.Close
    

  

End Sub



Voilà donc SQL2 contient une requête extrêmement basique sur une seule Table. Je ne sais pas comment déclarer l'utilisation de cette Table dans le code.

merci de tes lumières ;)
0
Random Dude Messages postés 24 Date d'inscription mercredi 3 juillet 2013 Statut Membre Dernière intervention 6 août 2013
9 juil. 2013 à 13:35
Merci ;)

Alors je viens d'essayer en adaptant le code à mon cas, et le compilo m'affiche : "Trop peu de paramètres. 1 attendu "

pour cette ligne :
Set rs = dbs.OpenRecordset(SQL2, dbOpenSnapshot)


SQL2 étant une string qui contient une requête.

Alors après quelque recherches, il me semble qu'il s'agit d'un manque de déclaration d'une Table dans le code :

il me semble que ces lignes :

Dim dbs As Database
Set dbs = CurrentDb()


ne suffisent pas à déclarer que l'on va utiliser des Tables présentes dans la base de données utilisée pour le formulaire.

Le " 1 attendu " était un " 2 attendu" quand j'utilisais 2 Tables différentes dans ma requête.

Il me semble évident que les Tables concernées ne sont donc pas correctement déclarée dans le code.

Peux-tu m'éclairer à ce sujet ?

Pour plus de clarté : voici le code utilisé :

Private Sub Étiquette1_Click()




Dim SQL2 As String


SQL2 = "SELECT ..."  
  
  
Dim dbs As Database
Dim rs As Recordset
Dim qdf As QueryDef



Set dbs = CurrentDb()



Set rs = dbs.OpenRecordset(SQL2, dbOpenSnapshot)

With dbs
Set qdf = .CreateQueryDef("Ecarts", SQL)
DoCmd.OpenQuery "Ecarts"
.QueryDefs.Delete "Ecarts"
End With
dbs.Close
qdf.Close
    

  

End Sub



Voilà donc SQL2 contient une requête extrêmement basique sur une seule Table. Je ne sais pas comment déclarer l'utilisation de cette Table dans le code.

merci de tes lumières ;)
0
blux Messages postés 26001 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 24 avril 2024 3 289
9 juil. 2013 à 13:48
Pas besoin de déclarer la table dans le code, elle sera accédée via SQL pur.
Donc, tu vires tout ce qui concerne ton recordset (c'est inutile pour ce que tu as à faire), mais il faut que tu mettes quelque chose dans la variable SQL, puisque c'est elle qui est appelée dans le openquery (et non la variable SQL2).
0
blux Messages postés 26001 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 24 avril 2024 3 289
9 juil. 2013 à 13:50
Pas besoin de déclarer la table dans le code, elle sera accédée via SQL pur.
Donc, tu vires tout ce qui concerne ton recordset (c'est inutile pour ce que tu as à faire), mais il faut que tu mettes quelque chose dans la variable SQL, puisque c'est elle qui est appelée dans le openquery (et non la variable SQL2).
0