Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > VBA Access
VBA Access Le forum pour les questions relatives au code VBA sous Access, et à son environnement de développement VBE.
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 07/03/2011, 17h16   #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 Parametre dans une requête SQL (pass trough query)

Bonjour,

me voici avec un nouveau dilemme..

J'ai une requête sql (passtrough query) dans ma base de donnée.
J'aimerai y mettre un paramètre, mais je n'y arrive pas.

Voici mon code:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Sub test()
 
Dim db              As DAO.Database
Dim qry             As DAO.QueryDef
Dim rs               As DAO.Recordset
Dim strSQL         As String
 
Set db = CurrentDb
Set qry = db.CreateQueryDef("")
 
strSQL = "SELECT * FROM PassThroughQuery"
strSQL = Replace(strSQL, "<PARAMETRE>", "123")
 
qry.sql = strSQL
 
Set rs = qry.OpenRecordset()
 
xlBook.Sheets("Sheet1).Range("A1").CopyFromRecordset rs
Le problème, c'est qu'il ne me remplace pas <PARAMETRE> dans ma requete par "123"

Du coup, je n'ai aucun résultat dans ma feuille EXCEL, puisqu'il lui manque un argument (123) (il n'a pas changer ma requete SQL).

Une aide ?
apnw7931 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/03/2011, 18h15   #2
Rédacteur/Modérateur
 
Avatar de jpcheck
 
Jean-Philippe ANDRÉ
Inscription : juillet 2007
Messages : 7 863
Détails du profil
Informations personnelles :
Nom : Jean-Philippe ANDRÉ
Âge : 28
Localisation : France

Informations forums :
Inscription : juillet 2007
Messages : 7 863
Points : 10 742
Points : 10 742
Envoyer un message via MSN à jpcheck
Salut,

un peu de lecture depuis la me semble opportune:
http://access.developpez.com/faq/?page=SQL#ReqParamVar
__________________
Pas de question technique par MP, je ne réponds pas

Mon perso ? Une vraie brute

Tutos Access, Tâches planifiées et Batch,Tables de Paramètres sous Access, Excel et Batch, Tâches planifiées et Access
jpcheck est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/03/2011, 19h11   #3
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,

Essaie comme ça :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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
 
' 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
Set qry = db.CreateQueryDef("", strSQL)
' Définit la chaîne de connexion de la requête temporaire
qry.Connect = strConnect
' Exécute la requête temporaire et renvoie le jeu de donnée
' dans un recordset DAO.
Set rs = qry.OpenRecordset()
PassThroughQuery_Modele est une requête SQL Direct (Pass through) modèle.
Elle doit avoir une connexion ODBC fonctionnelle.

A+
LedZeppII est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/03/2011, 19h47   #4
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
Merci LedZeppII, votre réponse semble plus correspondre à mon soucis que la solution proposée par jpcheck.

N'etant pas au bureau, j'essayerai demain.
Mais pour ne pas attendre jusqu'à demain, j'aimerai être sur de ne pas dire de bêtise.

J'ai une requête SQL (sans paramètre) que j'ai codé avec SQL Server 2005.
Code :
1
2
Select *
FROM table_A

Je décide de travailler avec VBA. Donc je crée et sauvegarde une requête SQL (passtrough querry), nommée PassThrougQueryTest.
Je décide ensuite modifier la requête SQL et d'y insérer une clause avec paramètre :
Code :
1
2
3
Select *
FROM table_A
WHERE field1 = <PARAMETRE>
si je souhaite faire appel a cette requête, je fais donc comme suit ??

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

QUID ? Est ce que la requête PassThrougQueryTest est conservée avec field1 = <PARAMETRE> ? Car je souhaite gardé la requête telle quelle, avec <PARAMETRE>

En tout cas,merci pour vos aides.
C'est tres aimable.
apnw7931 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/03/2011, 20h28   #5
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
Oui, c'est ça.
La requête PassThrougQueryTest reste inchangée.
Le code ne s'en sert que pour obtenir la chaîne de connexion ODBC, et le texte de l'instruction SQL SELECT.
La ligne
Code :
Set qry = db.CreateQueryDef("", strSQL)
crée une requête temporaire (premier argument pour le nom de la requête est une chaîne vide),
avec une instruction SQL dérivée de celle de PassThrougQueryTest, dans laquelle <PARAMETRE> a été remplacé par une valeur littérale.

Attention à la syntaxe des valeurs littérales utilisées en tant que critères de sélection.
Dans mon exemple la requête SQL Direct était
Code transact-sql :
1
2
SELECT * FROM Clients
WHERE Pays LIKE '%<PARAMETRE>%'
Les guillemets simples encadrant la valeur de type texte étaient déjà présents.

A+
LedZeppII est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2011, 13h18   #6
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
Rebonjour,

Arrivé à cette ligne
Code :
Set qry = db.CreateQueryDef("", strSQL)
j'ai un message d'erreur
Code :
1
2
Run-time error '3075':
Syntax error (missing operator) in query expression ".
EDIT : J'ai trouvé. Il s'agit d'un problème de parenthèse dans mon FROM. Etrange..
Voici le code correct.


Code :
1
2
3
4
5
6
7
8
9
10
11
SELECT *
 
FROM (dbo.table1 as a
 
	LEFT JOIN dbo.table2 as b
		ON (a.field3 = b.aaa)
		AND (a.field1= b.bbb))
 
	LEFT JOIN dbo.table3 as c
		ON (a.field3 = c.ccc)
		AND (a.field1= c.ddd)
Merci pour vos aides.
Ca fonctionne nickel.
apnw7931 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2011, 19h11   #7
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,

On dirait que CreateQueryDef valide l'instruction SQL par rapport à la syntaxe du SQL d'Access.

En définissant le SQL après avoir créé la requête temporaire, Access ne valide pas le SQL.

Code :
1
2
3
4
5
6
7
8
9
' Crée requête temporaire.
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()
A+
LedZeppII est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h08.


 
 
 
 
Partenaires

Hébergement Web