IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

SQL dans VBA element syntaxique n'est pas correct


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Femme Profil pro
    Contrôle de gestion
    Inscrit en
    Mai 2022
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Contrôle de gestion
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2022
    Messages : 17
    Points : 15
    Points
    15
    Par défaut SQL dans VBA element syntaxique n'est pas correct
    Bonjour à tous,


    J'ai une requête SQL dans une macro Excel pour récupérer mes données directement dans l'ODBC. Je doit la modifier à cause d'une sous-famille de ref qui ne ressort pas comme attendu, l'équipe IT a fait sa requête dans leur système en direct et le résultat est celui attendu, à moi maintenant d'adapter le SQL pour que ça fonctionne pareil et c'est bien là le problème..

    Connexion ODBC :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chaineConnexion = "Driver={Client Access ODBC Driver (32-bit)};System=SIPRDOPT;Uid=XX;Pwd=XX+;DBQ=OPADTA"

    Requête initiale OK :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    'Crétaion de la requete SQL
    SQL = "Select MRNDOC, MRCONS, MRDAMV, MRCFOU, MRREFA,MRCOMV, MRTYMV, Sum(MRQTUC) AS SUMQTT " & _
      "From " & _
        "( Select MRNDOC, MRCONS, MRDAMV, MRCFOU, MRREFA, MRCOMV, MRTYMV, MRQTUC " & _
          "From X_MVREFA " & _
          "Where MRCOMV = 'S' And MRCONS <> ' ' AND MRCENT IN ('W4', 'W5') AND MRDAMV >= " & dateDebutSQL & " AND MRDAMV <= " & dateFinSQL & _
        " Union All " & _
          "Select MRNDOC, MRCONS, MRDAMV, MRCFOU, MRREFA, MRCOMV, MRTYMV, MRQTUC " & _
          "From X_MVREFA A " & _
          "Where MRCOMV = 'S' AND MRCENT IN ('W4', 'W5') AND MRDAMV >= " & dateDebutSQL & " AND MRDAMV <= " & dateFinSQL & " And MRCONS = ' ' And MRNOMV Not In " & _
               "( Select B.MRNOMV " & _
                 "From X_MVREFA B " & _
                 "Where B.MRCOMV = 'E' " & _
                    "And B.MRREFA = A.MRREFA  " & _
                    "And B.MRCENT In ('W4', 'W5')) " & _
        ") As Req " & _
     "Group By MRNDOC, MRCONS, MRDAMV, MRCFOU, MRREFA, MRCOMV, MRTYMV  " & _
     "Order By MRREFA  "

    Requête IT interne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Select MRNDOC, MRCONS, MRDAMV, MRCFOU, MRREFA, ifnull(mcrefa, '') as mcrefa, MRCOMV, MRTYMV, Sum(MRQTUC) AS SUMQTT 
    From
    ( Select MRNDOC, MRCONS, MRDAMV, MRCFOU, MRREFA, mcrefa, MRCOMV, MRTYMV, MRQTUC 
    From opadta.X_MVREFA 
    left join opadta.x_mvcoli on mrnomv = mcnomv and MRANMV=MCANMV and MRRAMV=MCRAMV
    Where MRCOMV = 'S' And MRCONS <> ' ' AND MRCENT IN ('W4', 'W5') AND MRDAMV >=20220901 AND MRDAMV <= 20220921
    Union All 
    Select MRNDOC, MRCONS, MRDAMV, MRCFOU, MRREFA, mcrefa, MRCOMV, MRTYMV, MRQTUC 
    From opadta.X_MVREFA A
    left join opadta.x_mvcoli on mrnomv = mcnomv and MRANMV=MCANMV and MRRAMV=MCRAMV 
    Where MRCOMV = 'S' AND MRCENT IN ('W4', 'W5') AND MRDAMV >=20220901 AND MRDAMV <= 20220921 And MRCONS = ' ' And MRNOMV Not In  
    ( Select B.MRNOMV 
    From opadta.X_MVREFA B 
    Where B.MRCOMV = 'E' 
    And B.MRREFA = A.MRREFA And B.MRCENT In ('W4', 'W5')) ) As Req
    Group By MRNDOC, MRCONS, MRDAMV, MRCFOU, MRREFA, mcrefa, MRCOMV, MRTYMV
    Order By MRDAMV, MRREFA, mcrefa

    Adaptée ici avec erreur -2147217900
    [IBM][System i Access ODBC Driver][DB2 for i5/OS]SQL0104 - Elément syntaxique MCNOMV n'est pas correct. Eléments possibles : JSON.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    'Création de la requete SQL
    SQL = "Select MRNDOC, MRCONS, MRDAMV, MRCFOU, MRREFA, MCREFA, MRCOMV, MRTYMV, Sum(MRQTUC) AS SUMQTT " & _
      "From " & _
        "( Select MRNDOC, MRCONS, MRDAMV, MRCFOU, MRREFA, MCREFA, MRCOMV, MRTYMV, MRQTUC " & _
          "From X_MVREFA " & _
          "LEFT JOIN X_MVCOLI on MRNOMV is MCNOMV And MRANMV is MCANMV and MRRAMV is MCRAMV " & _
          "Where MRCOMV is 'S' And MRCONS <> ' ' AND MRCENT IN ('W4', 'W5') AND MRDAMV >= " & dateDebutSQL & " AND MRDAMV <= " & dateFinSQL & _
        " Union All " & _
          "Select MRNDOC, MRCONS, MRDAMV, MRCFOU, MRREFA, MCREFA, MRCOMV, MRTYMV, MRQTUC " & _
          "From X_MVREFA A " & _
          "LEFT JOIN X_MVCOLI on MRNOMV is MCNOMV And MRANMV is MCANMV and MRRAMV is MCRAMV " & _
          "Where MRCOMV = 'S' AND MRCENT IN ('W4', 'W5') AND MRDAMV >= " & dateDebutSQL & " AND MRDAMV <= " & dateFinSQL & " And MRCONS = ' ' And MRNOMV Not In " & _
               "( Select B.MRNOMV " & _
                 "From X_MVREFA B " & _
                 "Where B.MRCOMV is 'E' " & _
                    "And B.MRREFA is A.MRREFA  " & _
                    "And B.MRCENT In ('W4', 'W5')) " & _
        ") As Req " & _
     "Group By MRNDOC, MRCONS, MRDAMV, MRCFOU, MRREFA, MCREFA, MRCOMV, MRTYMV  " & _
     "Order By MRDAMV, MRREFA, MCREFA  "

    J'ai fais des recherches sur JSON et n'ai absolument rien compris, est-ce réellement à mettre en place ? J'ai également vu cet article sur les jointures mais ca ne m'aide pas à corriger ma requête..
    https://www.developpez.net/forums/d5...-dit-jointure/


    Quelqu'un s'aurait-il apporté sa précieuse aide ?


    Merci beaucoup beaucoup !

    LRN

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 561
    Points
    38 561
    Billets dans le blog
    9
    Par défaut
    Bonjour

    Dans le prédicat de jointure, le mot clef "IS" est erroné, à remplacer par "=" :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    From X_MVREFA 
    LEFT JOIN X_MVCOLI 
      on MRNOMV is MCNOMV 
     and MRANMV is MCANMV 
     and MRRAMV is MCRAMV

    à remplacer par

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    From X_MVREFA 
    LEFT JOIN X_MVCOLI 
      on MRNOMV = MCNOMV 
     and MRANMV = MCANMV 
     and MRRAMV = MCRAMV

    De plus, comme il y a plusieurs tables, il est recommandé d'utiliser des alias de tables en préfixe de chaque colonne pour faciliter la compréhension et donc la maintenance.

  3. #3
    Membre à l'essai
    Femme Profil pro
    Contrôle de gestion
    Inscrit en
    Mai 2022
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Contrôle de gestion
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2022
    Messages : 17
    Points : 15
    Points
    15
    Par défaut
    Bonjour,


    J'avais pourtant pensé solutionner ce soucis avec le is justement parce que le = était une erreur de syntaxe avant JSON.
    J'ai donc modifier la première partie et remis =, voici l'erreur :
    Erreur d'exécution '-2147217900 (80040e14)':
    [IBM][System i Access ODBC Driver][DB2 for i5/OS]SQL0104 - Élément syntaxique 'S' n'est pas correct. Eléments possibles : NOT NULL DISTINCT <IDENTIFIER>.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    SQL = "Select MRNDOC, MRCONS, MRDAMV, MRCFOU, MRREFA, MCREFA, MRCOMV, MRTYMV, Sum(MRQTUC) AS SUMQTT " & _
      "From " & _
        "( Select MRNDOC, MRCONS, MRDAMV, MRCFOU, MRREFA, MCREFA, MRCOMV, MRTYMV, MRQTUC " & _
          "From X_MVREFA " & _
          "LEFT JOIN X_MVCOLI " & _
          "on MRNOMV = MCNOMV " & _
          "and MRANMV = MCANMV " & _
          "and MRRAMV = MCRAMV " & _
          "Where MRCOMV is 'S' And MRCONS <> ' ' AND MRCENT IN ('W4', 'W5') AND MRDAMV >= " & dateDebutSQL & " AND MRDAMV <= " & dateFinSQL & _
        " Union All " & _
          "Select MRNDOC, MRCONS, MRDAMV, MRCFOU, MRREFA, MCREFA, MRCOMV, MRTYMV, MRQTUC " & _
          "From X_MVREFA A " & _
          "LEFT JOIN X_MVCOLI on MRNOMV is MCNOMV And MRANMV is MCANMV and MRRAMV is MCRAMV " & _
          "Where MRCOMV = 'S' AND MRCENT IN ('W4', 'W5') AND MRDAMV >= " & dateDebutSQL & " AND MRDAMV <= " & dateFinSQL & " And MRCONS = ' ' And MRNOMV Not In " & _
               "( Select B.MRNOMV " & _
                 "From X_MVREFA B " & _
                 "Where B.MRCOMV is 'E' " & _
                    "And B.MRREFA is A.MRREFA  " & _
                    "And B.MRCENT In ('W4', 'W5')) " & _
        ") As Req " & _
     "Group By MRNDOC, MRCONS, MRDAMV, MRCFOU, MRREFA, MCREFA, MRCOMV, MRTYMV  " & _
     "Order By MRDAMV, MRREFA, MCREFA  "

    Pour les alias, vous parlez de renommer les colonnes comme MRREFA as REFERENCE pour nommer ma colonne explicitement ?

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 561
    Points
    38 561
    Billets dans le blog
    9
    Par défaut
    Exemple d'utilisation d'alias (ici T1 et T2) :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    select T1.MRNDOC  
         , T1.MRCONS 
         , T2.MRDAMV
    [...]
    from       X_MVREFA as T1
    left join  X_MVCOLI as T2 
       on T2.MRNOMV = T1.MCNOMV
      and T2.MRANMV = T1.MCANMV
    [...]
    group by T1.MRNDOC
           , T1.MRCONS
           , T2.MRDAMV
    order by T1.MRDAMV 
    [...]

    Je suppose que la nouvelle erreur vient d'ici : Where MRCOMV is 'S' <-- "IS" à remplacer par "="

  5. #5
    Membre à l'essai
    Femme Profil pro
    Contrôle de gestion
    Inscrit en
    Mai 2022
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Contrôle de gestion
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2022
    Messages : 17
    Points : 15
    Points
    15
    Par défaut
    Pardon j'avais effectivement oublier un =, et voilà à nouveau l'erreur
    -2147217900
    [IBM][System i Access ODBC Driver][DB2 for i5/OS]SQL0104 - Elément syntaxique MCNOMV n'est pas correct. Eléments possibles : JSON.

    Modification du codage selon votre exemple, erreur JSON sur le D, je ne comprends pas pourquoi..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    SQL = "Select MRNDOC, MRCONS, MRDAMV, MRCFOU, MRREFA, MCREFA, MRCOMV, MRTYMV, Sum(MRQTUC) AS SUMQTT " & _
      "From " & _
        "( Select a.MRNDOC, a.MRCONS, a.MRDAMV, a.MRCFOU, a.MRREFA, a.MCREFA, a.MRCOMV, a.MRTYMV, a.MRQTUC " & _
          "From X_MVREFA AS a " & _
          "LEFT JOIN X_MVCOLI AS b " & _
          "on a.MRNOMV = b.MCNOMV " & _
          "and a.MRANMV = b.MCANMV " & _
          "and a.MRRAMV = b.MCRAMV " & _
          "Where a.MRCOMV = 'S' And a.MRCONS <> ' ' AND a.MRCENT IN ('W4', 'W5') AND a.MRDAMV >= " & dateDebutSQL & " AND a.MRDAMV <= " & dateFinSQL & _
        " Union All " & _
          "Select c.MRNDOC, c.MRCONS, c.MRDAMV, c.MRCFOU, c.MRREFA, c.MCREFA, c.MRCOMV, c.MRTYMV, c.MRQTUC " & _
          "From X_MVREFA AS c " & _
          "LEFT JOIN X_MVCOLI AS d on c.MRNOMV is d.MCNOMV And c.MRANMV is d.MCANMV and c.MRRAMV is d.MCRAMV " & _
          "Where c.MRCOMV = 'S' AND c.MRCENT IN ('W4', 'W5') AND c.MRDAMV >= " & dateDebutSQL & " AND c.MRDAMV <= " & dateFinSQL & " And c.MRCONS = ' ' And c.MRNOMV Not In " & _
               "( Select e.MRNOMV " & _
                 "From X_MVREFA AS e " & _
                 "Where e.MRCOMV is 'E' " & _
                    "And e.MRREFA is c.MRREFA  " & _
                    "And e.MRCENT In ('W4', 'W5')) " & _
        ") As Req " & _
     "Group By MRNDOC, MRCONS, MRDAMV, MRCFOU, MRREFA, MCREFA, MRCOMV, MRTYMV  " & _
     "Order By MRDAMV, MRREFA, MCREFA  "

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Il y a encore plusieurs IS qui "trainent" dans la requête, par exemple ligne 13, 17, 18...

    Pour simplifier la recherche des erreurs ce serait bien que tu postes la requête telle qu'elle est exécutée, c'est à dire le contenu exact de la variable sql.

    Tatayo.

  7. #7
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 561
    Points
    38 561
    Billets dans le blog
    9
    Par défaut
    La bonne démarche quand on tombe sur une erreur de syntaxe dans du code est de réparer cette erreur, mais aussi de vérifier si on ne la rencontre pas ailleurs dans le code

  8. #8
    Membre à l'essai
    Femme Profil pro
    Contrôle de gestion
    Inscrit en
    Mai 2022
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Contrôle de gestion
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2022
    Messages : 17
    Points : 15
    Points
    15
    Par défaut
    J'ai donc bien remis les = partout, je pensais qu'il ne fallait le changer que sur la première partie autant pour moi.

    C'est OK ça fonctionne ! Merci beaucoup !!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 14/03/2018, 09h21
  2. [MooTools] AddEvent sur un element dans une Class : this n'est pas l'objet courant
    Par Neilime05 dans le forum Bibliothèques & Frameworks
    Réponses: 6
    Dernier message: 12/01/2011, 12h20
  3. elements qui n'est pas dans une liste
    Par KEnder dans le forum Général Python
    Réponses: 2
    Dernier message: 16/05/2008, 01h52
  4. Réponses: 6
    Dernier message: 09/01/2008, 11h56
  5. Utiliser du code SQL dans VBA
    Par a2line dans le forum Requêtes et SQL.
    Réponses: 25
    Dernier message: 30/05/2006, 14h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo