Partage
  • Partager sur Facebook
  • Partager sur Twitter

Probleme de requete SQL en VBA excel

    22 juillet 2021 à 17:25:17

    Bonjour,

    j'aimerais faire une requete SQL sur une base de données afin de savoir si la référence que je souhaite implémenter dans la base existe déjà ou non. 

    Ma requête fonctionne bien sur SQL-Server mais je n'arrive pas a la faire fonctionner dans l'éditeur VBA.. 

    Merci d'avance de votre aide. 

    Private Sub CommandButton1_Click()

        Dim ref As String

        Dim derniereligne As String, adressetrouvee As String, famille As String, client As String, code_affaire As String, chantier As String, recap As String

        Dim trouve As Range, plage As Range, strexiste As String, rst As ADODB.Recordset, wChaineConnection As String, Cn2SAGE As ADODB.Connection

        ref = ref_box.Text

        If Len(ref) <> 12 Then

            MsgBox (" le nombre de caractere est incorrect")

            ref_box.SetFocus

            Exit Sub

        End If

        Set plage = Sheets("Demande de dev").Columns(1)

        Set trouve = plage.Cells.Find(what:=ref, lookat:=xlWhole, LookIn:=xlValues)

        If trouve Is Nothing Then

            adressetrouvee = ref & " n'existe pas"

        Else

            adressetrouvee = trouve.Row

        End If

        Set Cn2SAGE = New ADODB.Connection

       wChaineConnection = "Provider=SQLOLEDB.1;Password=XXXXXXX;Persist Security Info=True;User ID=sa;Initial Catalog=XXXXXXXX;Data Source=XXXXXX"

        Cn2SAGE.Open wChaineConnection

        strexiste = "IF EXISTS (SELECT * FROM [XXXXXXXX].[dbo].[F_ARTICLE] WHERE AR_REF = '" & ref & "') "

        Cn2SAGE.Execute strexiste

        'Récupération des informations

        designation = Cells(adressetrouvee, 3).value

        famille = Cells(adressetrouvee, 12).value

        client = Cells(adressetrouvee, 8).value

        code_affaire = Cells(adressetrouvee, 11).value

        chantier = Cells(adressetrouvee, 10).value

        'Fermeture de la connexion

        CnSAGE.Close

    End Sub

    • Partager sur Facebook
    • Partager sur Twitter
      22 juillet 2021 à 17:37:31

      Bonjour,

      Le message qui suit est une réponse automatique activée par un membre de l'équipe. Les réponses automatiques leur permettent d'éviter d'avoir à répéter de nombreuses fois la même chose, ce qui leur fait gagner du temps et leur permet de s'occuper des sujets qui méritent plus d'attention.
      Nous sommes néanmoins ouverts et si vous avez une question ou une remarque, n'hésitez pas à contacter la personne en question par Message Privé.

      Pour plus d'informations, nous vous invitons à lire les règles générales du forum

      Merci de colorer votre code à l'aide du bouton Code

      Les forums d'Openclassrooms disposent d'une fonctionnalité permettant de colorer et mettre en forme les codes source afin de les rendre plus lisibles et faciles à manipuler par les intervenants. Pour cela, il faut utiliser le bouton Code de l'éditeur, choisir un des langages proposés et coller votre code dans la zone prévue. Si vous utilisez l'éditeur de messages en mode Markdown, il faut utiliser les balises <pre class="brush: vb;">Votre code ici</pre>.

      Merci de modifier votre message d'origine en fonction.

      Liens conseillés

      • Partager sur Facebook
      • Partager sur Twitter
        22 juillet 2021 à 19:07:46

        Bonjour,

        Il faudrait que tu sois plus précis sur ce que ta macro est censée faire, et sur ce qu'elle fait actuellement, pour qu'on puisse mieux t'aider.

        En attendant, voici ce que je peux en dire :

            'Fermeture de la connexion
        
            CnSAGE.Close

        Petite erreur d'étourderie, tu as déclaré cette variable sous le nom Cn2SAGE, donc cette ligne va sans doute lever une erreur.

        Cn2SAGE.Execute strexiste

        Cette ligne devrait lancer la requête, mais ensuite, rien n'est fait avec les résultats. Il manque sans doute quelque chose.

            'Récupération des informations
        
            designation = Cells(adressetrouvee, 3).value
        
            famille = Cells(adressetrouvee, 12).value
        
            client = Cells(adressetrouvee, 8).value
        
            code_affaire = Cells(adressetrouvee, 11).value
        
            chantier = Cells(adressetrouvee, 10).value

        Ces lignes mettent les valeurs de certaines cellules dans des variables, mais ces variables ne sont pas utilisées par la suite. Là aussi, il doit manquer quelque chose.

        -
        Edité par Sarkas 22 juillet 2021 à 19:09:11

        • Partager sur Facebook
        • Partager sur Twitter
          23 juillet 2021 à 7:51:49

          Bonjour, 

          merci pour ta réponse, 

          oui j'y vais pas à pas c'est pour ca que la fin du code n'est qu'une ébauche. 

          Effectivement j'ai corrigé la fermeture de la connexion ( j'ai copié un autre code déjà fait et changé les connexions ) 

          Mon code est censé vérifier que la variable ref est déjà présente ou non dans ma base de données qui est un ERP. 

          Mais j'ai une erreur d'éxécution sur la ligne suivante : Cn2SAGE.Execute strexiste

          Je n'arrive absolument pas a comprendre d'ou cela vient car la ligne fonctionne quand je l'execute sur la même base de données sur SQL server :(  

          Message d'erreur : Erreur d'execution '-2147217900(80040e14)': Syntaxe incorrecte vers ')'

          -
          Edité par vincentbottier41 23 juillet 2021 à 7:53:15

          • Partager sur Facebook
          • Partager sur Twitter
            23 juillet 2021 à 12:23:54

            Le message d'erreur indique une erreur de syntaxe dans strexiste. Assure-toi que c'est bien le contenu de cette variable que tu testes sur SQL server. Sinon, essaie de lancer une requête plus simple (sans ref, sans IF EXISTS), le résultat pourra donner une piste sur l'origine du problème.
            • Partager sur Facebook
            • Partager sur Twitter
              23 juillet 2021 à 13:03:39

              Bonjour, 
              sur une autre macro j'exécute ce code qui fonctionne. 
                  CnSAGE.Execute "INSERT INTO [XXXXXX].[dbo].[F_ARTICLE](AR_Ref,AR_Design,FA_CodeFamille,AR_Sommeil,AR_Nomencl) values ('" & num_suivant & "','" & designation & "','" & famille & "','0','1')"
                  CnSAGE.Close
              Serait-ce la fonction IF EXISTS qui ne fonctionne pas, ou mes guillemets sont mal placées ? Avez vous une autre facon de faire pour tester si une valeur existe deja dans la base de données  ?
              • Partager sur Facebook
              • Partager sur Twitter
                23 juillet 2021 à 15:40:00

                "if exists" doit attendre une action à faire si la condition est vraie (et éventuellement une autre si la condition est fausse)

                quand tu dit que ta requête fonctionne sur sql server, c'est la requête entière ou juste le select ?

                tu n'as peut-être besoin que du EXIST. mais si tu veux avoir le résultat de la requête, il faut que tu le récupères dans un recordset.

                Mais j'ai du mal à comprendre ce que tu veux faire dans ton code:

                Après avoir vérifier que ref a 12 caractères, tu cherches si une cellule de la colonne 1 contient déjà cette valeur. Si non, tu mets dans ta variable que la référence n'est pas trouvée; et si oui, tu mets le numéro de ligne dans ta variable adressetrouve.

                Tu exécutes une requête dont tu te moques du résultat.

                Ensuite, tu initialises tes variables à partir des cellules dont la ligne est adressetrouve (qui peut valoir "xxxxxxxxxxxx n'existe pas"; donc une bonne source d'erreur).

                Le plus simple pour tester si ta valeur est dans la base est de faire un simple select, et de voir si ça te retourne au moins un résultat.

                strexiste = "SELECT * FROM [XXXXXXXX].[dbo].[F_ARTICLE] WHERE AR_REF = '" & ref & "' "
                
                Set rst = Cn2SAGE.Execute(strexiste)
                if rst.count >0 then
                    ' ref existe dans la base
                else
                    ' ref n'existe pas dans la base
                end if
                • Partager sur Facebook
                • Partager sur Twitter
                  23 juillet 2021 à 16:12:16

                  En fait, 

                  je prend une référence tapée par un utilisateur, si j'ai le bon nombre de caractere je continue. 

                  Ensuite, je veux vérifier si elle existe dans la base de données, si oui je ne fais rien en dehors peut etre d'un messagebox, si elle n'existe pas je l'insère dedans.

                  Le select fonctionne sur la même référence.

                  J'essaierais lundi avec uniquement un exists mais j'avoue qu'en SQL, j'étais pas premier de ma classe :D 

                  Merci en tout cas de vos retours, et je vous tiens au courant lundi. Vous souhaitant un bon week end :)  

                  • Partager sur Facebook
                  • Partager sur Twitter
                    23 juillet 2021 à 16:53:14

                    mais là, ton code tel que tu nous l'as mis, ne sort que si le nombre de caractères n'est pas bon, sinon tu fais tout le reste.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      26 juillet 2021 à 8:03:53

                      Oui car je me suis arrété a la ligne de commande if exists qui ne fonctionne pas. Sinon j'aurais continué en fonction du retour de celle ci mais je n'arrive pas a la faire fonctionner :( 

                      Y'a t il un probleme de compatibilité avec cette commande et le VBA ?

                      • Partager sur Facebook
                      • Partager sur Twitter
                        26 juillet 2021 à 15:38:39

                        la question a te poser c'est que fait IF EXISTS(..) : c'est une opération de test (SQL) sur l'existence de quelquechose

                        IF {quelque chose} THEN {je fais ça} [ELSE {je fais autre chose}]

                        Toi, tu veux savoir (dans VBA) si on a {quelque chose}, il faut donc tester le retour de la requête {quelque chose}

                        Donc ta requête doit être ici soit EXISTS(...) et tu testes si vrai ou faux ou la requête est celle incluse dans EXISTS, et tu testes si elle renvoie quelque chose.

                        • Partager sur Facebook
                        • Partager sur Twitter

                        Probleme de requete SQL en VBA excel

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown