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

Requêtes et SQL. Discussion :

PASS-THROUGH QUERY et synthaxe CASE [AC-2003]


Sujet :

Requêtes et SQL.

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 190
    Par défaut PASS-THROUGH QUERY et synthaxe CASE
    Bonjour,

    Dans une requete VBA,
    je fais appel à un requête SQL (pass-through query), mais j'ai un problème de synthaxe avec mon CASE Statement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Set db = CurrentDb
    Set qry = db.CreateQueryDef("")
     
    strConnect = db.QueryDefs("Query1").Connect
    strSQL = db.QueryDefs("Query1").sql
    Set qry = db.CreateQueryDef("", strSQL)       <--- CA BUG ICI
    qry.Connect = strConnect
    Run-time error '3075':
    Synthax error (missing operator) in query expression 'CASE ....'


    Voici ma requête SQL (Query1)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT
      CASE field1 WHEN 1 THEN 'YES' ELSE 'NO' END
     
    FROM MA_TABLE
    Faut-il des parenthèse quelquepart ?

    Pourriez-vous m'aider s'il vous plait ? Je peine à trouver..

    Merci d'avance.

  2. #2
    Expert confirmé
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Par défaut
    Bonjour,

    et comme ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Set db = CurrentDb
     
    strConnect = db.QueryDefs("Query1").Connect
    strSQL = db.QueryDefs("Query1").sql
     
    ' L'ordre a son importance :
    ' 1. Créer requête temporaire sans code SQL
    Set qry = db.CreateQueryDef("")
    ' 2. Définir chaîne de connexion
    qry.Connect = strConnect
    ' DAO est maintenant capable déterminer que ce n'est pas une requête Jet
    ' et ne valide pas le SQL selon la syntaxe du moteur Jet
    ' 3. Définir le code SQL
    qry.SQL = strSQL

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 190
    Par défaut
    Bonsoir ,

    Je testerai demain au boulot.
    J'espère réellement que le problème est solutionné car je dois terminer mon code avant demain soir.. (et il n'est pas encore fini..) :p

    Sinon, concernant l'ordre des instructions, je m'étais basé sur le code que vous m'aviez déjà proposé sur ce post (qui fonctionne nickel) :
    http://www.developpez.net/forums/d10...s-trough-query

    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
    Dim db As DAO.Database
    Dim qry As DAO.QueryDef
    Dim rs As DAO.Recordset
    Dim strConnect As String
    Dim strSQL As String
     
    Set db = CurrentDb
     
    strConnect = db.QueryDefs("PassThrougQueryTest").Connect
    strSQL = db.QueryDefs("PassThrougQueryTest").SQL
    strSQL = Replace(strSQL, "<PARAMETRE>", "FR")
    Set qry = db.CreateQueryDef("", strSQL)
     
    qry.Connect = strConnect
     
    Set rs = qry.OpenRecordset()
     
    xlBook.Sheets("Sheet1).Range("A1").CopyFromRecordset rs

    En tout cas, merci pour votre aide très précieuse et instructive.*

    Bonne fin de soirée.

  4. #4
    Expert confirmé
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Par défaut
    Bonsoir,
    Citation Envoyé par apnw7931 Voir le message
    Sinon, concernant l'ordre des instructions, je m'étais basé sur le code que vous m'aviez déjà proposé sur ce post (qui fonctionne nickel) :
    http://www.developpez.net/forums/d10...s-trough-query

    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
    Dim db As DAO.Database
    Dim qry As DAO.QueryDef
    Dim rs As DAO.Recordset
    Dim strConnect As String
    Dim strSQL As String
     
    Set db = CurrentDb
     
    strConnect = db.QueryDefs("PassThrougQueryTest").Connect
    strSQL = db.QueryDefs("PassThrougQueryTest").SQL
    strSQL = Replace(strSQL, "<PARAMETRE>", "FR")
    Set qry = db.CreateQueryDef("", strSQL)
     
    qry.Connect = strConnect
     
    Set rs = qry.OpenRecordset()
     
    xlBook.Sheets("Sheet1).Range("A1").CopyFromRecordset rs
    Ça c'était ma réponse du post #3 dans la discussion.
    J'ai rectifié dans le post #7, après avoir testé sur une requête dont le SQL, spécifique à SQL Server, ne pouvait pas être validée pour le moteur Jet.

    Dans le code que tu as posté, tout va bien jusqu'ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Set db = CurrentDb
    Set qry = db.CreateQueryDef("")
     
    strConnect = db.QueryDefs("Query1").Connect
    strSQL = db.QueryDefs("Query1").sql
    Ensuite tu as une erreur à la ligne suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set qry = db.CreateQueryDef("", strSQL)       <--- CA BUG ICI
    1) parce que tu crée une nouvelle requête temporaire en fournissant le code SQL.
    2) parce que la propriété Connect n'est pas encore définie.

    Cela aurait certainement fonctionné avec (dans cet ordre)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    qry.Connect = strConnect
    qry.SQL = strSQL
    En ce qui me concerne, chaque fois que je respecte cet ordre, j'évite l'erreur de syntaxe SQL (du moteur Jet).

    A+

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 190
    Par défaut
    Avec ce code,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
                Set db = CurrentDb
                strConnect = db.QueryDefs("Query1").Connect
                strSQL = db.QueryDefs("Query1").sql
     
                Set qry = db.CreateQueryDef("")
                qry.Connect = strConnect
                qry.sql = strSQL
     
                strSQL = Replace(strSQL, "<DateMIS>", dte)
     
                qry.ODBCTimeout = 0
                Set rs = qry.OpenRecordset()
    J'ai une erreur :

    Run-Time error '3146'
    ODBC--call failed.


    EDIT :

    L'ordre à son importance, en effet.

    Voici mon code, qui semble foncitonner maintenant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
                Set db = CurrentDb
                strConnect = db.QueryDefs("Query1").Connect
                strSQL = db.QueryDefs("Query1").sql
     
                strSQL = Replace(strSQL, "<DateMIS>", dte)
     
                Set qry = db.CreateQueryDef("")
                qry.Connect = strConnect
                qry.sql = strSQL
     
                Set rs = qry.OpenRecordset()

  6. #6
    Expert confirmé
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Par défaut
    Bonsoir,

    Visual Basic reporte toujours l'erreur 3146 «ODBC -- l'appel a échoué.», sans plus de précision, dès qu'une action implique ODBC.
    Ça peut être n'importe quoi, y compris une erreur de syntaxe dans le SQL du SGBD.

    Pour avoir plus d'information, il faut mettre en place une gestion d'erreur exploitant la collection Errors de la bibliothèque DAO.

    Voici un exemple de code avec gestion d'erreur :
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    Sub daoTempQrySqlDirect2()
    Dim db              As DAO.Database
    Dim qry             As DAO.QueryDef
    Dim rs              As DAO.Recordset
    Dim strConnect      As String
    Dim strSQL          As String
    Dim ErrX            As DAO.Error
    Dim strErrMsg       As String
     
    On Error GoTo ErrH
     
    Set db = CurrentDb
     
    ' Récupère chaîne de connexion de la requête SQL Direct modèle
    strConnect = db.QueryDefs("PassThroughQuery_Modele").Connect
     
    ' Récupère SQL de la requête SQL Direct modèle
    strSQL = db.QueryDefs("PassThroughQuery_Modele").SQL
     
    ' Remplace <PARAMETRE> par une valeur
    strSQL = Replace(strSQL, "<PARAMETRE>", "FR")
     
    ' Crée requête temporaire.
    ' (!) si on fournit le SQL à CreateQueryDef, DAO le valide
    ' par rapport à la syntaxe du moteur Jet. C'est pour cela
    ' que le code SQL est défini plus tard dans le code.
    Set qry = db.CreateQueryDef("")
     
    ' Définit la chaîne de connexion de la requête temporaire.
    qry.Connect = strConnect
     
    ' Définit l'instruction SQL de la requête temporaire.
    qry.SQL = strSQL
     
    ' Exécute la requête temporaire et renvoie le jeu de donnée
    ' dans un recordset DAO.
    Set rs = qry.OpenRecordset()
     
    MsgBox rs(0)
    rs.Close
     
    Sortie:
    Set rs = Nothing
    Set qry = Nothing
    Set db = Nothing
    Exit Sub
     
    ErrH:
    strErrMsg = "Erreur N° " & CStr(Err.Number) & " : " & Err.Description
    Select Case Err.Number
        Case 3146, 3151, 3154, 3155, 3156, 3157, 3231, 3232, 3234, 3225, 3238, 3247, 3254
            strErrMsg = strErrMsg & vbCrLf & vbCrLf & _
               ">>> Erreurs complémentaires DAO :" & vbCrLf & _
               "======================"
            'Récupérations Erreur(s) driver ODBC
            For Each ErrX In DBEngine.Errors
                strErrMsg = strErrMsg & vbCrLf & Format(ErrX.Number, "00000") & " : " & ErrX.Description
            Next
    End Select
     
    MsgBox strErrMsg
    Resume Sortie
    End Sub
    Si je remplace par exemple la ligne ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strSQL = Replace(strSQL, "<PARAMETRE>", "FR")
    ... par (j'introduis volontairement une erreur de syntaxe)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strSQL = Replace(strSQL, "<PARAMETRE>", "'")
    j'obtiens :
    Erreur N° 3146 : ODBC -- l'appel a échoué.

    >>> Erreurs complémentaires DAO :
    ======================
    00105 : [Microsoft][ODBC SQL Server Driver][SQL Server]Ouvrez les guillemets après la chaîne de caractères ''.
    00102 : [Microsoft][ODBC SQL Server Driver][SQL Server]Syntaxe incorrecte vers ''.
    03146 : ODBC -- l'appel a échoué.
    Les lignes 00105 et 00102 viennent de SQL Server, qui me signale une erreur de syntaxe.

    A+

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

Discussions similaires

  1. mot de passe oublié - Query was empty
    Par Creanet dans le forum Langage
    Réponses: 7
    Dernier message: 04/09/2009, 20h08
  2. SP : Synthaxe CASE (switch)
    Par BenoitM dans le forum Développement
    Réponses: 3
    Dernier message: 17/07/2009, 11h51
  3. Special query SELECT * FROM CASE WHERE ORDER
    Par WildGroup dans le forum Requêtes
    Réponses: 4
    Dernier message: 30/06/2009, 21h17
  4. Pass-through avec access 2000
    Par innova dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 15/02/2007, 09h52
  5. Utilisation de pass-through ?
    Par innova dans le forum Access
    Réponses: 1
    Dernier message: 15/02/2007, 00h00

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