Lancer une requête SQL sur des Tables dans du code VBA [Résolu/Fermé]

Messages postés
24
Date d'inscription
mercredi 3 juillet 2013
Statut
Membre
Dernière intervention
6 août 2013
- - Dernière réponse : 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 ;)
Afficher la suite 

5 réponses

Messages postés
24
Date d'inscription
mercredi 3 juillet 2013
Statut
Membre
Dernière intervention
6 août 2013
0
Merci
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
Messages postés
1045
Date d'inscription
mercredi 30 avril 2008
Statut
Membre
Dernière intervention
5 mars 2014
108
0
Merci
Bonjour Random Dude,


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

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

Cordialement
Random Dude
Messages postés
24
Date d'inscription
mercredi 3 juillet 2013
Statut
Membre
Dernière intervention
6 août 2013
-
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 ;)
Messages postés
24
Date d'inscription
mercredi 3 juillet 2013
Statut
Membre
Dernière intervention
6 août 2013
0
Merci
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 ^^
Messages postés
23911
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
18 mars 2019
2664
0
Merci
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" 
Messages postés
24
Date d'inscription
mercredi 3 juillet 2013
Statut
Membre
Dernière intervention
6 août 2013
0
Merci
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 !
Random Dude
Messages postés
24
Date d'inscription
mercredi 3 juillet 2013
Statut
Membre
Dernière intervention
6 août 2013
-
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 ;)
blux
Messages postés
23911
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
18 mars 2019
2664 -
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).
blux
Messages postés
23911
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
18 mars 2019
2664 -
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).
Random Dude
Messages postés
24
Date d'inscription
mercredi 3 juillet 2013
Statut
Membre
Dernière intervention
6 août 2013
-
D'accord, merci beaucoup Blux, cela donne enfin un résultat ;)

j'ai donc viré les lignes

Dim rs As Recordset

Set rs = dbs.OpenRecordset(SQL2, dbOpenSnapshot)


j'ai bien remis les noms de variables comme il fallait ( je m'emmêlais les pinceaux avec 2 requêtes : une compliquée pour plus tard et une très simple pour les tests )

ça marche ( du moins ça crée une table comme je le voulais ) mais j'ai un autre problème : ma requête est normalement bonne :

SQL2 = "SELECT Nom, Prénom FROM TbPorteurs2011 WHERE Nom LIKE'%INOUX'"


( ceci est une requête test, censée me donner le Nom et le prénom d'un demi-douzaine de personnes environ )

et Access m'ouvre une petite fenêtre et me demande d'" Entrer une valeur de paramètre " , et plus précisément le champ "Prénom" .

là je dois avouer que je suis perdu .... pourquoi Access me demande-t-il une telle chose ?

d'autant que quelque soit la valeur que j'entre dans cette petite fenêtre de message, le résultat est le même : j'obtiens une Table avec 2 champs : Nom et Prénom, complètement vide.

besoin d'explications supplémentaires svp ^^

Je ne pense pas que l'erreur vienne de la requête.

Merci d'avances....
Random Dude
Messages postés
24
Date d'inscription
mercredi 3 juillet 2013
Statut
Membre
Dernière intervention
6 août 2013
-
C'est bon, en fait j'avais mal écrit un des champs, donc il n'arrivait pas à le repérer.

j'ai changé le nom du champ dans ma requête et tout marche nikel, je vais pouvoir m'atteler à de la requête pure ;)

merci beaucoup pour vos réponses !

Le sujet est maintenant résolu.