Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > Requêtes et SQL.
Requêtes et SQL. Tout ce qui concerne vos questions sur les requêtes et le SQL sous Access se trouve ici.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/03/2011, 15h14   #1
Futur Membre du Club
 
Inscription : décembre 2010
Messages : 125
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 125
Points : 19
Points : 19
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 :
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 :
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.
apnw7931 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 19h00   #2
Rédacteur
 
Avatar de LedZeppII
 
Homme
Maintenance données produits
Inscription : décembre 2005
Messages : 3 939
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 : 3 939
Points : 6 278
Points : 6 278
Bonjour,

et comme ça ?
Code :
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
LedZeppII est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 22h16   #3
Futur Membre du Club
 
Inscription : décembre 2010
Messages : 125
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 125
Points : 19
Points : 19
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 :
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.
apnw7931 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 23h12   #4
Rédacteur
 
Avatar de LedZeppII
 
Homme
Maintenance données produits
Inscription : décembre 2005
Messages : 3 939
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 : 3 939
Points : 6 278
Points : 6 278
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 :
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 :
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 :
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 :
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+
LedZeppII est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2011, 09h03   #5
Futur Membre du Club
 
Inscription : décembre 2010
Messages : 125
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 125
Points : 19
Points : 19
Avec ce code,

Code :
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 :
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()
apnw7931 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2011, 19h30   #6
Rédacteur
 
Avatar de LedZeppII
 
Homme
Maintenance données produits
Inscription : décembre 2005
Messages : 3 939
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 : 3 939
Points : 6 278
Points : 6 278
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 :
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 :
strSQL = Replace(strSQL, "<PARAMETRE>", "FR")
... par (j'introduis volontairement une erreur de syntaxe)
Code :
strSQL = Replace(strSQL, "<PARAMETRE>", "'")
j'obtiens :
Citation:
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+
LedZeppII est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h06.


 
 
 
 
Partenaires

Hébergement Web