Lancer une requête SQL sur des Tables dans du code VBA
Résolu
Random Dude
Messages postés
24
Date d'inscription
Statut
Membre
Dernière intervention
-
Random Dude Messages postés 24 Date d'inscription Statut Membre Dernière intervention -
Random Dude Messages postés 24 Date d'inscription Statut Membre Dernière intervention -
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 ;)
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:
- Lancer une requête SQL sur des Tables dans du code VBA
- Code ascii - Guide
- Comment faire une table des matières sur word - Guide
- Code puk bloqué - Guide
- Comment déverrouiller un téléphone quand on a oublié le code - Guide
- Code activation windows 10 - Guide
5 réponses
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
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
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
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
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 ^^
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 ^^
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).
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"
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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 :
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 !
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 !
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 :
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 :
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é :
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 ;)
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 ;)
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 :
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 :
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é :
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 ;)
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 ;)
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).
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).
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).
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).