Ouvrir via VB une requete Access en mode SQL

Résolu
Bonjour,

comme le suggere mon titre, il s'agit bien de SQL et de VB.

J'ai commencé a programmer un code VB pour qu'il copier une reqete en la renomant via une variable, voici le code :

Function Nouveau_tag()

Dim strMaVar As String

strMaVar = InputBox("Entrez le nom de votre nouveau tag !")

DoCmd.CopyObject "", "ASC_" + strMaVar, acQuery, "ASC_TAG"

End Function


Je voudrais a présent pouvoir ouvrir la nouvelle requete en mode SQL, selectionner un mot bien particulier (qui revient plus fois) dans l'instruction et le remplacer par un autre qui sera la variable strMaVar

Je ne suis pas trés doué en VB, etre parvenue a ce resultat la me laisse deja pantois, si quelqu'un veut bien m'aider, il sera considéré comme mon hero a vie :)
Configuration: Windows XP Internet Explorer 6.0

20 réponses

Résumé de la discussion

Des échanges portent sur la manipulation dynamique de requêtes Access avec VB, visant à copier une requête nommée ASC_TAG et à la renommer ASC_VARIABLE avant de modifier son SQL. Des propositions privilégient l'utilisation d'une chaîne SQL extraite de la requête existante, modifiée par des opérations de chaîne et réenregistrée, avec l'insertion de la valeur de la variable dans l'instruction UNION. Par exemple, la meilleure réponse suggère d'extraire le SQL existant, d'ajouter une portion UNION ALL et d'utiliser 'FROM ASC_' + StrTag pour diriger l'injection dans ASC_VARIABLE. D'autres détails portent sur l'alignement des noms de requêtes et sur la validité syntaxique des expressions VB, notamment la gestion des guillemets et des retours de ligne pour éviter les erreurs.

Bobot (l’IA à votre service)
  1. Modérateur
    Salut,

    tu ne peux pas faire ça, une requête ouverte en mode sql ne peut pas être modifiée autrement qu'à l'écran.

    Mais si tu maitrises DAO ou ADO via VB, il te sera facile d'accéder au contenu de la requête, pour le modifier.

    En VBA, depuis ACCESS, ça peut prendre 2 lignes...
    1. Tout d'abord merci pour ta réponse !

      Alors, je ne maitrise pas les choses dont tu parles en revanche, j'ai pas du m'exprimer correctement, parcequ'il ne s'agit pas de modifier une requete SQL deja ouverte !

      En fait,

      J'ai une requete SQL qui s'appel ASC_TAG dont voici l'instruction SQL :

      SELECT Alliance_Shared_Contact.Company, Alliance_Shared_Contact.[Last Name], Alliance_Shared_Contact.[First Name], Alliance_Shared_Contact.[Job Title], Alliance_Shared_Contact.[E-mail Address], Alliance_Shared_Contact.[Business Phone], Alliance_Shared_Contact.[Mobile Phone], Alliance_Shared_Contact.[Fax Number], Alliance_Shared_Contact.[Web page], "Tag" AS [Origine Contact]

      FROM Alliance_Shared_Contact

      WHERE (((Alliance_Shared_Contact.Categories) Like "*" & "Tag" & "*"));

      Le but pour moi est de pouvoir copier cette requete et de la renomer en ASC_"variable" ; variable que j'obtient grace à la programmation VB que je vous ai montré !

      Pour faire simple, cela a pour effet de m'ouvrir une boite de dialogue qui me demande en quoi comment je veux nommer la copie.

      Maintenant que j'ai réussit ca, il faudrait qu'a la suite de la programmation VB, je rajoute un truc qui me permette de changer l'instruction SQL de la copie de ma requete pour changer le mot "tag" par la nouvelle variable !

      Merci encore pour le temps que tu m'accordes !
      1. Modérateur
        La requête est stockée sous une forme particulière par access, impossible d'y accéder autrement qu'en mode interactif (à l'écran) ou qu'avec les propriétés de l'objet requête via ado/dao.
    2. Hum ok. Merci bcp pour l'attention que tu m'accordes !

      N'y a t'il pas un moyen d'arriver au resultat que je veux ? Tu disais que ca pouvait se faire en 2 lignes ... Par contre, je n'y connais pas grande chose en VB Access :)
      1. Modérateur
        dans ton VB, il faut créer un objet adodb, puis t'y connecter, ensuite, tu peux récupérer n'importe quel objet de la base (table, requête, champ...) et le modifier...
    3. Ha merci Blux, je vais fouiller ca !

      PS : tu sembles donner bcp de toi sur ce forum pour aider les autres, merci !
      1. Héhé ca marche !

        Pour info :

        Option Compare Database

        Public Function test_DAO_QUERYDEF()

        Dim Bdd As DAO.Database
        Dim Qdf As DAO.QueryDef
        Dim StrSql As String
        Dim StrSqlModif As String
        Dim StrTag As String

        StrTag = InputBox("Quel est le nom de votre nouveau tag?")

        DoCmd.CopyObject "", "ASC_" + StrTag, acQuery, "ASC_TAG"

        Set Bdd = Application.CurrentDb
        Set Qdf = Bdd.QueryDefs("ASC_" + StrTag)

        With Qdf
        StrSql = .SQL
        StrSqlModif = Replace(StrSql, "tag", StrTag)
        .SQL = StrSqlModif

        '....

        .Close
        End With

        Set Qdf = Nothing

        Bdd.Close
        Set Bdd = Nothing

        End Function


        Merci donc

        A présent j'aimerais pouvoir inclure ma nouvelle requete dans une requete union deja existante. Cela va exiger que je puisse editer ma requete union et que j'ajoute à la partie fixe qui existe deja, une partie variable qui dependra du nom de la nouvelle requete.

        Quelqu'un a un idée du code ?
        1. Modérateur
          C'est guère plus dur :-)

          Tu récupères le .sql de ta requête UNION pour le mettre dans une chaine que tu traffiques avec les opérateurs de manipulation de chaine et ensuite tu réenregistres ta requête.

          Juste une question : tu es sous ACCESS ou sous VB ? car je ne vois pas de séquence de connexion à la base...
      2. je suis sur Access :)

        Et bien j'ai essayé de reprendre le .SQL pour le trafiquer mais ne connaissant pas bien les bases du code VB, ca n'a pas fonctionné..

        J'ai eu le droit a un message du genre " INSERT / UPDATE ou DELETE requis "
        1. Modérateur
          Donc depuis le début je crois que tu accèdes à une base ACCESS via VB (comme ton titre le suggère), c'est pour ça que je t'ai proposé une connexion avec un objet type adodb !

          C'est cette phrase-là qui me pose problème : une partie variable qui dependra du nom de la nouvelle requete. parce que sinon, le reste est à ta portée (vu ce que tu as déjà créé comme code).

          Un exemple serait plus parlant...
          1. Héhé navré Blux, j'ai eu egalement un doute sur ce dont nous parlions mais n'etant pas avancé dans l'art de la VB, je n'etait pas sur de moi ...

            Alors en fait :

            J'ai une requete appelé ASC_TAG. Ma VB la copie et la renome par une variable determinée par une inputbox. Voici l'instruction sql de tag. Par exemple, je pourrais renomé la copie en ASC_VARIABLE

            SELECT Alliance_Shared_Contact.Company, Alliance_Shared_Contact.[Last Name], Alliance_Shared_Contact.[First Name], Alliance_Shared_Contact.[Job Title], Alliance_Shared_Contact.[E-mail Address], Alliance_Shared_Contact.[Business Phone], Alliance_Shared_Contact.[Mobile Phone], Alliance_Shared_Contact.[Fax Number], Alliance_Shared_Contact.[Web page], "<gras>tag" AS [Origine Contact]
            FROM Alliance_Shared_Contact
            WHERE (((Alliance_Shared_Contact.Categories) Like "*" & "tag" & "*"));</gras>

            (j'ai réussi a faire en sorte que le mot "tag" soit changé en "Variable" dans l'instruction.

            D'un autre coté j'ai une requete Union qui melange plein de requete comme TAG.

            L'objectif pour moi est de pouvoir inclure la copie renomée de la requete TAG dans mon union, ici suivant l'exemple, ASC_VARIABLE.

            Est ce que j'arrive a etre claire ? :s
            1. Modérateur
              pas trop...

              mais pour moi, il ne s'agit que d'une construction de chaine, à faire avec les opérateurs classiques...
              1. Certes, mais je connais a peine le language VB.

                Tout ce que j'ai réussi a faire jusque la, c'est en observant, en faisant de nombreux essais, et en galérant.

                :(
                1. Modérateur
                  donc je n'ai pas trop compris, essaye d'être un peu explicite dans l'exemple.
              2. Bon on va essayer un petit schema :)

                J'ai plusieurs requete dont l'instruction n'a pas tant d'importance et une union qui vient récuper les donnés de mes requetes pour les mettre ensemble

                ASC_TAG______+_______ASC_MAIN________+____ASC_MKG

                = UNION_ASC

                A présent, grace a un module VB, je peux créer une nouvelle requete ASC_VARIABLE et j'aimerais egalement completer ma VB pour pouvoir le mettre dans l'UNION

                ASC_TAG______+_______ASC_MAIN________+____ASC_MKG_________+ASC_VARIABLE

                = UNION_ASC

                Pour info , voici la requete UNION actuelle

                SELECT

                Company,
                [Last Name],
                [First Name],
                [Job Title],
                [E-mail Address],
                [Business Phone],
                [Mobile Phone],
                [Fax Number],
                [Web page],
                [Origine Contact], "sharepoint" as ID

                FROM [ASC_Tag]

                UNION ALL SELECT

                Company,
                [Last Name],
                [First Name],
                [Job Title],
                [E-mail Address],
                [Business Phone],
                [Mobile Phone],
                [Fax Number],
                [Web page],
                [Origine Contact], "sharepoint"

                FROM ASC_MAIN

                UNION ALL SELECT

                Company,
                [Last Name],
                [First Name],
                [Job Title],
                [E-mail Address],
                [Business Phone],
                [Mobile Phone],
                [Fax Number],
                [Web page],
                [Origine Contact], "sharepoint"
                FROM ASC_MKG


                Il y doit bien avoir une manip qui sert a dire : Tu edites UNION_ASC et tu ajoutes le truc ci dessous a l'instruction

                Company,
                [Last Name],
                [First Name],
                [Job Title],
                [E-mail Address],
                [Business Phone],
                [Mobile Phone],
                [Fax Number],
                [Web page],
                [Origine Contact], "sharepoint"
                FROM ASC_VARIABLE

                *espoir*
                1. Modérateur
                  ben tu prends ton .sql actuel que tu mets dans une chaine et tu concatènes avec ce que tu veux :

                  toto = .sql

                  toto = toto & "company, ..... FROM ASC " & variable & ";"

                  et ensuite tu réenregistres ton .sql comme tu l'a fais avec ton code du début.
                  1. Ha merci bcp Blux, on se comprend enfin :-)

                    Alors j'ai essayé le code suivant a la suite du reste

                    Set Bdd = Application.CurrentDb
                    Set Qdf = Bdd.QueryDefs("UNION_ASC")

                    With Qdf

                    StrSql = .SQL
                    StrSqlModif = .SQL & "Company,[Last Name],[First Name],[Job Title],[E-mail Address],[Business Phone],[Mobile Phone],[Fax Number],[Web page],[Origine Contact], 'sharepoint' as ID FROM [ASC_ + StrTag]"
                    .SQL = StrSqlModif

                    Close
                    End With

                    Set Qdf = Nothing

                    Il me dit message d'erreur : " caractere trouvé apres la fin de l'instruction SQL" :-(

                    Une idée de ce que ca peut etre ?

                    ps : ( on touche au buuuuut)

                    Bdd.Close
                    Set Bdd = Nothing

                    End Function
                    1. Modérateur
                      StrSqlModif = .SQL & "UNION Company..." ?

                      et aussi penser à récupérer la valeur de StrTag, genre : FROM [ASC_ " & StrTag & "]"
                      1. Arf, j'aai plus de message genre " instruction sql trouvé apres la fin " mais maintenant avec ce code la :

                        Set Bdd = Application.CurrentDb
                        Set Qdf = Bdd.QueryDefs("UNION_ASC")

                        With Qdf

                        StrSql = .SQL
                        StrSqlModif = .SQL & "UNION ALL SELECT Company,[Last Name],[First Name],[Job Title],[E-mail Address],[Business Phone],[Mobile Phone],[Fax Number],[Web page],[Origine Contact], 'sharepoint' as ID " & vbCrLf & _
                        StrSqlModif = StrSqlModif & "FROM [ASC_ + StrTag];"
                        .SQL = StrSqlModif

                        Close
                        End With

                        Set Qdf = Nothing

                        Bdd.Close
                        Set Bdd = Nothing

                        End Function


                        J'ai le droit à "Instruction SQL non valide : delete insert procedure select ou update attendu " :(
                        1. Il fallait juste supprimer le ;
                        2. Modérateur
                          Il fallait juste supprimer le ;
                          Non, si tu regardes le message jusqu'au bout, tu t'en rendras compte...
                      2. Modérateur
                        à quel moment ? parce que là, il n'y a aucune raison, ce message d'erreur doit être lors de l'exécution de la requête...
                        1. Set Bdd = Application.CurrentDb
                          Set Qdf = Bdd.QueryDefs("UNION_ASC")

                          With Qdf

                          StrSql = .SQL
                          StrSqlModif = .SQL & "UNION ALL SELECT Company,[Last Name],[First Name],[Job Title],[E-mail Address],[Business Phone],[Mobile Phone],[Fax Number],[Web page],[Origine Contact], 'sharepoint' as ID " & vbCrLf & _
                          StrSqlModif = StrSqlModif & "FROM [ASC_ + StrTag];"
                          .SQL = StrSqlModif

                          Close
                          End With

                          Set Qdf = Nothing

                          Bdd.Close
                          Set Bdd = Nothing

                          End Function

                          Je confirme que le reste est bon je teste tout en pas a pas, je ne comprend pas, pourquoi, pourquoiiiiii ?
                          1. Modérateur
                            fais un msgbox strsqlmodif, et ça te donnera une piste...

                            en fait, je l'ai pas vu tout de suite, mais c'est le vbcrlf qui fout la zone, il ne doit pas y en avoir (une requête est une suite de caractères, sans format de mise en page), contente toi de mettre des espaces entre les mots-clés SQL (c'est-à-dire avant le FROM ou après le ID, comme c'est le cas)...
                        2. Ok on y presque, a présent il m'ajoute bien l'union, reste quelques erreur de mise en page !

                          La VB fonctionne normalement reste juste un petit probleme :) :) : )

                          StrSql = .SQL
                          StrSqlModif = .SQL & "UNION ALL SELECT Company,[Last Name],[First Name],[Job Title],[E-mail Address],[Business Phone],[Mobile Phone],[Fax Number],[Web page],[Origine Contact], ""sharepoint"" "
                          StrSqlModif = StrSqlModif & "FROM ASC_+ StrTag"
                          .SQL = StrSqlModif

                          Lors de l'ajout à l'union est ajoutée FROM ASC_StrTag a la place de ma variable (mettons que si dans l'inpubox, j'avais ecrit TOTO ; il faudrait qu'il y ai marqué FROM ASC_TOTO)
                          1. Modérateur
                            2ième ligne de mon message 20...

                            faut lire ;-)
                        3. Hahaha excuse moi !

                          Je te confirme donc a toi et a tout les eventuels lecteurs qui auront besoin de cette solution un jour que ca fonctionne !!!!!

                          Un grand merci a toi Blux, je n'ai jamais rencontré personne sur un forum qui s'est autant attaché a aider les autres :)

                          ENCORE merci !
                          1. Modérateur
                            C'est parce que tu ne fréquentes pas assez les forums...

                            Mets le problème en résolu.