Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Créer une requête par une macro ou un module

11 réponses
Avatar
Chevrot
Bonjour à tous et bonne année,

Je ne connais pas bien Access, et vous suis reconnaisant par avance de
m'aider sur le problkème suivant:

Je souhaite, par une macro ou un module, créer et enregistrer soius le nom
"A 1250" une requête identique à une requête existante "A" , mais dont la
valeur du champ "ETA-NUM" est 1250.

Merci d'avance

Chevrot

10 réponses

1 2
Avatar
david
salut,

il faut faire du VB pour cela :
ajoute une référence à DAO (en plus ADO) :
et fais ceci :
public Sub CreerRqA(byval EtaNum as Long)
dim db as database
dim sql as string
dim rq as queryDef

set db=currentdb()
SQL = db.queryDefs("A").sql
SQL = SQL + "WHERE ETA_NUM=" + CStr(EtaNum)
set rqÛ.createQueryDef("A " + CStr(EtaNum))
rq.sql = SQL
db.queryDefs.Add rq

set rq=nothing
set db=nothing
end sub

Voila, je ne suis plus certain que la propriété qui retourne le code
SQL s'appelle SQL (vérifies avec l'aide) et que la méthode d'ajout
soit Add (ou append).
Rq : il faut que ta requête n'utilise pas de critère de tri ou de
critère de filtrage sinon, l'insertion du critére ETA_NUM=.... sera
plus compliqué. Il faut rechercher la position du mot WHERE et ajouter
ton critére dérière celui-ci en ajoutant ensuite " AND " et le
reste.

A+
Avatar
Chevrot
Merci!

1. Comment ajouter une référence à DAO et que cela signifie t-il?
2. J'ai fait une erreur dans mon énoncé: 1250 est une chaine texte, pas un
nombre.

Désolé de mon faible niveau.

Merci



salut,

il faut faire du VB pour cela :
ajoute une référence à DAO (en plus ADO) :
et fais ceci :
public Sub CreerRqA(byval EtaNum as Long)
dim db as database
dim sql as string
dim rq as queryDef

set db=currentdb()
SQL = db.queryDefs("A").sql
SQL = SQL + "WHERE ETA_NUM=" + CStr(EtaNum)
set rqÛ.createQueryDef("A " + CStr(EtaNum))
rq.sql = SQL
db.queryDefs.Add rq

set rq=nothing
set db=nothing
end sub

Voila, je ne suis plus certain que la propriété qui retourne le code
SQL s'appelle SQL (vérifies avec l'aide) et que la méthode d'ajout
soit Add (ou append).
Rq : il faut que ta requête n'utilise pas de critère de tri ou de
critère de filtrage sinon, l'insertion du critére ETA_NUM=.... sera
plus compliqué. Il faut rechercher la position du mot WHERE et ajouter
ton critére dérière celui-ci en ajoutant ensuite " AND " et le
reste.

A+




Avatar
Eric
Bonjour,

1 - Vas dans l'éditeur VB par ALT + F11
ou par le Menu Outis|Macro|Visual Basic Editor
Dans l'éditeur VB : Menu Outils|Références et tu fais descendre
l'ascenseur jusqu'à Microsoft DAO 3.6 Object Library (3.6 ou 3.x suvant
ta version d'Access) que tu coches. Tu charges une librairie qui te
donne accès aux objets de base de données.

2 - Dans le code que t'a donné David, mets:
Dim db as DAO.Database
Dim rq as DAO.QueryDef
remplaces les + par des &
3 - le SQl devient :
SQL = SQL + "WHERE ETA_NUM='1250'"
set rqÛ.createQueryDef("A 1250")

Toutefois pas assez d'informations quant à l'origine de la valeur du
champ ETAT_NUM pour plus de précision.

Merci!

1. Comment ajouter une référence à DAO et que cela signifie t-il?
2. J'ai fait une erreur dans mon énoncé: 1250 est une chaine texte, pas un
nombre.

Désolé de mon faible niveau.

Merci




salut,

il faut faire du VB pour cela :
ajoute une référence à DAO (en plus ADO) :
et fais ceci :
public Sub CreerRqA(byval EtaNum as Long)
dim db as database
dim sql as string
dim rq as queryDef

set db=currentdb()
SQL = db.queryDefs("A").sql
SQL = SQL + "WHERE ETA_NUM=" + CStr(EtaNum)
set rqÛ.createQueryDef("A " + CStr(EtaNum))
rq.sql = SQL
db.queryDefs.Add rq

set rq=nothing
set db=nothing
end sub

Voila, je ne suis plus certain que la propriété qui retourne le code
SQL s'appelle SQL (vérifies avec l'aide) et que la méthode d'ajout
soit Add (ou append).
Rq : il faut que ta requête n'utilise pas de critère de tri ou de
critère de filtrage sinon, l'insertion du critére ETA_NUM=.... sera
plus compliqué. Il faut rechercher la position du mot WHERE et ajouter
ton critére dérière celui-ci en ajoutant ensuite " AND " et le
reste.

A+





--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr


Avatar
Chevrot
Merci de l'explication. En fait la requête A est formée à partir de 9 tables
liées. L'une d'entre elle appelée "SOI A" contient un champ "ETA-NUM". La
requête A permet d'éviter de manipuler les 9 tables et sert d'origine à
l'ensemble des requêtes créées pour exploiter la base de données qui comporte
environ 20 millions de lignes. Parmi celles ci , les tables "A ETA-NUM".

J'rai bien fait comme indiqué et comme suit:

Option Compare Database

'------------------------------------------------------------
' Création_requête_A
'
'------------------------------------------------------------
Function Création_requête_A()
On Error GoTo Création_requête_A_Err

Public Sub CreerRqA(ByVal EtaNum As Long)
Dim db As Database
Dim sql As String
Dim rq As queryDef
Set db = CurrentDb()
sql = dbqueryDefs("A").sql
sql = sql + "WHERE ETA_NUM='130786445'"
Set rq = dbcreateQueryDef("A 130786445")
rq.sql = sql
db.queryDefsAdd rq
Set rq = Nothing
Set db = Nothing
End Sub

Création_requête_A_Exit:
Exit Function

Création_requête_A_Err:
MsgBox Error$
Resume Création_requête_A_Exit

End Function


Lorsque je lance l'exécution, il m'affiche qu'End Sub est manquant?

Merci de l'aide supplémentaire que vous voudrez bien m'apporter

Chevrot


Bonjour,

1 - Vas dans l'éditeur VB par ALT + F11
ou par le Menu Outis|Macro|Visual Basic Editor
Dans l'éditeur VB : Menu Outils|Références et tu fais descendre
l'ascenseur jusqu'à Microsoft DAO 3.6 Object Library (3.6 ou 3.x suvant
ta version d'Access) que tu coches. Tu charges une librairie qui te
donne accès aux objets de base de données.

2 - Dans le code que t'a donné David, mets:
Dim db as DAO.Database
Dim rq as DAO.QueryDef
remplaces les + par des &
3 - le SQl devient :
SQL = SQL + "WHERE ETA_NUM='1250'"
set rqÛ.createQueryDef("A 1250")

Toutefois pas assez d'informations quant à l'origine de la valeur du
champ ETAT_NUM pour plus de précision.

Merci!

1. Comment ajouter une référence à DAO et que cela signifie t-il?
2. J'ai fait une erreur dans mon énoncé: 1250 est une chaine texte, pas un
nombre.

Désolé de mon faible niveau.

Merci




salut,

il faut faire du VB pour cela :
ajoute une référence à DAO (en plus ADO) :
et fais ceci :
public Sub CreerRqA(byval EtaNum as Long)
dim db as database
dim sql as string
dim rq as queryDef

set db=currentdb()
SQL = db.queryDefs("A").sql
SQL = SQL + "WHERE ETA_NUM=" + CStr(EtaNum)
set rqÛ.createQueryDef("A " + CStr(EtaNum))
rq.sql = SQL
db.queryDefs.Add rq

set rq=nothing
set db=nothing
end sub

Voila, je ne suis plus certain que la propriété qui retourne le code
SQL s'appelle SQL (vérifies avec l'aide) et que la méthode d'ajout
soit Add (ou append).
Rq : il faut que ta requête n'utilise pas de critère de tri ou de
critère de filtrage sinon, l'insertion du critére ETA_NUM=.... sera
plus compliqué. Il faut rechercher la position du mot WHERE et ajouter
ton critére dérière celui-ci en ajoutant ensuite " AND " et le
reste.

A+





--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr





Avatar
Eric
Re,

Plusieurs remarques :
1-Tu ne peux pas imbriquer une procédure dans une fonction comme tu le fais:
Function Toto(argument As ...)
...
Sub Tutu()
...
End Sub
...
End Function
Si tu veux, dans une fonction, appeler une procédure, tu dois écrire
séparément la fonction et la procédure. Ca donne quelque chose du genre:
Function AppelProcedure
Call maProcedure ' appel de la procédure
End Function
Sub maProcedure
...
End Sub

2-Si le champ ETAT_NUM est présent dans plusieurs tables de la requête A
il faudra préfixer dans le Where le champ par le nom de la table à prendre.

3-Il ne doit pas y avoir de clause WHERE ou ORDER BY dans la requête A,
ni de regroupement. Il doit s'agir juste d'une requête Sélection banale.

4-La procédure donnée ci-dessous doit être modifiée si tu veux créer
toutes les requêtes pour toutes les valeurs d'ETAT_NUM car elle n'en
crée qu'une, celle donnée en exemple mais je ne connais pas tes besoins.
(Attention, pas de gestion d'erreur donc on ne peut pas lancer 2 fois de
suite cette procédure)


Voila un exemple de procédure qui te crée la requête "A 130786445".
Testes-la pour voir si ca te donne le résultat escompté. (Pour relancer,
il faudra supprimer la requête dans la fenêtre de la bd. Mais cela peut
être fait dans le code.)

Sub zz()
Dim rq As DAO.QueryDef
Dim db As DAO.Database
Dim SQL As String
Set db = CurrentDb
' Pour enlever le ; à la fin de l'instruction SQL
SQL = Left(db.QueryDefs("A").SQL, InStrRev(db.QueryDefs("A").SQL,
";") - 1)
SQL = SQL & " WHERE ETAT_NUM='130786445'"
'Crée la requête et l'ajoute à la collection des requêtes
Set rq = db.CreateQueryDef("A 130786445", SQL)
MsgBox "La requête " & rq.Name & " vient d'être créée !"
Set rq = Nothing
Set db = Nothing
' Rafraichissement de la fenêtre de la base de données
RefreshDatabaseWindow
End Sub

Merci de l'explication. En fait la requête A est formée à partir de 9 tables
liées. L'une d'entre elle appelée "SOI A" contient un champ "ETA-NUM". La
requête A permet d'éviter de manipuler les 9 tables et sert d'origine à
l'ensemble des requêtes créées pour exploiter la base de données qui comporte
environ 20 millions de lignes. Parmi celles ci , les tables "A ETA-NUM".

J'rai bien fait comme indiqué et comme suit:

Option Compare Database

'------------------------------------------------------------
' Création_requête_A
'
'------------------------------------------------------------
Function Création_requête_A()
On Error GoTo Création_requête_A_Err

Public Sub CreerRqA(ByVal EtaNum As Long)
Dim db As Database
Dim sql As String
Dim rq As queryDef
Set db = CurrentDb()
sql = dbqueryDefs("A").sql
sql = sql + "WHERE ETA_NUM='130786445'"
Set rq = dbcreateQueryDef("A 130786445")
rq.sql = sql
db.queryDefsAdd rq
Set rq = Nothing
Set db = Nothing
End Sub

Création_requête_A_Exit:
Exit Function

Création_requête_A_Err:
MsgBox Error$
Resume Création_requête_A_Exit

End Function


Lorsque je lance l'exécution, il m'affiche qu'End Sub est manquant?

Merci de l'aide supplémentaire que vous voudrez bien m'apporter

Chevrot



--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

Avatar
Chevrot
Merci infiniment à Eric pour une aide très précieuse, rapide et compétente.

Bonne année 2006

Chevrot


Re,

Plusieurs remarques :
1-Tu ne peux pas imbriquer une procédure dans une fonction comme tu le fais:
Function Toto(argument As ...)
...
Sub Tutu()
...
End Sub
...
End Function
Si tu veux, dans une fonction, appeler une procédure, tu dois écrire
séparément la fonction et la procédure. Ca donne quelque chose du genre:
Function AppelProcedure
Call maProcedure ' appel de la procédure
End Function
Sub maProcedure
...
End Sub

2-Si le champ ETAT_NUM est présent dans plusieurs tables de la requête A
il faudra préfixer dans le Where le champ par le nom de la table à prendre.

3-Il ne doit pas y avoir de clause WHERE ou ORDER BY dans la requête A,
ni de regroupement. Il doit s'agir juste d'une requête Sélection banale.

4-La procédure donnée ci-dessous doit être modifiée si tu veux créer
toutes les requêtes pour toutes les valeurs d'ETAT_NUM car elle n'en
crée qu'une, celle donnée en exemple mais je ne connais pas tes besoins.
(Attention, pas de gestion d'erreur donc on ne peut pas lancer 2 fois de
suite cette procédure)


Voila un exemple de procédure qui te crée la requête "A 130786445".
Testes-la pour voir si ca te donne le résultat escompté. (Pour relancer,
il faudra supprimer la requête dans la fenêtre de la bd. Mais cela peut
être fait dans le code.)

Sub zz()
Dim rq As DAO.QueryDef
Dim db As DAO.Database
Dim SQL As String
Set db = CurrentDb
' Pour enlever le ; à la fin de l'instruction SQL
SQL = Left(db.QueryDefs("A").SQL, InStrRev(db.QueryDefs("A").SQL,
";") - 1)
SQL = SQL & " WHERE ETAT_NUM='130786445'"
'Crée la requête et l'ajoute à la collection des requêtes
Set rq = db.CreateQueryDef("A 130786445", SQL)
MsgBox "La requête " & rq.Name & " vient d'être créée !"
Set rq = Nothing
Set db = Nothing
' Rafraichissement de la fenêtre de la base de données
RefreshDatabaseWindow
End Sub

Merci de l'explication. En fait la requête A est formée à partir de 9 tables
liées. L'une d'entre elle appelée "SOI A" contient un champ "ETA-NUM". La
requête A permet d'éviter de manipuler les 9 tables et sert d'origine à
l'ensemble des requêtes créées pour exploiter la base de données qui comporte
environ 20 millions de lignes. Parmi celles ci , les tables "A ETA-NUM".

J'rai bien fait comme indiqué et comme suit:

Option Compare Database

'------------------------------------------------------------
' Création_requête_A
'
'------------------------------------------------------------
Function Création_requête_A()
On Error GoTo Création_requête_A_Err

Public Sub CreerRqA(ByVal EtaNum As Long)
Dim db As Database
Dim sql As String
Dim rq As queryDef
Set db = CurrentDb()
sql = dbqueryDefs("A").sql
sql = sql + "WHERE ETA_NUM='130786445'"
Set rq = dbcreateQueryDef("A 130786445")
rq.sql = sql
db.queryDefsAdd rq
Set rq = Nothing
Set db = Nothing
End Sub

Création_requête_A_Exit:
Exit Function

Création_requête_A_Err:
MsgBox Error$
Resume Création_requête_A_Exit

End Function


Lorsque je lance l'exécution, il m'affiche qu'End Sub est manquant?

Merci de l'aide supplémentaire que vous voudrez bien m'apporter

Chevrot



--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr




Avatar
Eric
re,

Merci infiniment à Eric pour une aide très précieuse, rapide et compétente.
Merci aussi.

Je me permets d'y associer David car il avait fourni 99%
de la solution si ce n'est plus.

Bonne année 2006
Meilleurs voeux à toi




--
A+
Eric
http://www.mpfa.info/

Avatar
Chevrot
Je remercie également David, bien entendu, avec les mêmes termes.

Je pensais avoir tout compris, mais je me suis planté en tentant d'effectuer
pliusieurs créations de requête successives du type
Function Tutu
Call maprocédure1
Call maprocédure2
Call maprocédure3
End function

J'ai b ien relu vos conseils et noté la phrase suivante (Attention, pas de
gestion d'erreur donc on ne peut pas lancer 2 fois de suite cette procédure)

Cela signifie t il que l'on, ne peut pas créere une fonction contenant
plusieurs "Call maprocédure" ? Existe t il une solution?

Deuxièmement, est il possible de créer une requête comportant deux
conditions. J'ai essayé avec
"SQL = SQL & " WHERE ETAT_NUM='130786445'" & "WHERE Secteur='Ardennes'"
"SQL = SQL & " WHERE ETAT_NUM='130786445'" AND "WHERE Secteur='Ardennes'"
"SQL = SQL & " WHERE ETAT_NUM='130786445' AND WHERE Secteur='Ardennes'"
je n'ai pas trouvé. Existe t il une solution?

J'ai le sentiment d'exagérer dans mes demandes et le fais avec humilité.
Merci d'avance de vos conseils.

Chevrot


re,

Merci infiniment à Eric pour une aide très précieuse, rapide et compétente.
Merci aussi.

Je me permets d'y associer David car il avait fourni 99%
de la solution si ce n'est plus.

Bonne année 2006
Meilleurs voeux à toi




--
A+
Eric
http://www.mpfa.info/




Avatar
Eric
Bonsoir,

1-D'où proviennent les valeurs du genre '130786445' car il est possible
de créer les requetes pour chacune de ces valeurs dans la même
procédure.(Procédure modifiée de tête à partir des infos des posts
précédents donc pas testée mais ça doit être proche de ce que tu attends)

Sub zz()
Dim rq As DAO.QueryDef
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim SQL As String, critere As String
Set db = CurrentDb
'on crée un jeu d'enregistrements ne contenant que les différents
NUM_ETAT
' adapter éventuellement le nom de la table donnant les NUM_ETAT
Set rs = db.OpenRecordset("Select distinct NUM_ETAT from [SOI A]")
' Pour chaque NUM_ETAT on crée une requête
While Not rs.EOF
' on recupère le NUM_ETAT
critere = rs(0)
' Pour enlever le ; à la fin de l'instruction SQL
SQL = Left(db.QueryDefs("A").SQL,
InStrRev(db.QueryDefs("A").SQL, ";") - 1)
' on définit la clause WHERE de la nouvelle requête
SQL = SQL & " WHERE NUM_ETAT='" & critere & "'"
'Crée la requête et l'ajoute à la collection
Set rq = db.CreateQueryDef("A " & critere, SQL)
rs.MoveNext
Wend
Set rs = Nothing
Set rq = Nothing
Set db = Nothing
RefreshDatabaseWindow
End Sub

2-Oui, on peut mettre plusieurs critères sur le WHERE, comme ceci:
SQL = SQL & " WHERE ETAT_NUM='130786445' AND Secteur='Ardennes'"


[...]
Deuxièmement, est il possible de créer une requête comportant deux
conditions. J'ai essayé avec
"SQL = SQL & " WHERE ETAT_NUM='130786445'" & "WHERE Secteur='Ardennes'"
"SQL = SQL & " WHERE ETAT_NUM='130786445'" AND "WHERE Secteur='Ardennes'"
"SQL = SQL & " WHERE ETAT_NUM='130786445' AND WHERE Secteur='Ardennes'"
je n'ai pas trouvé. Existe t il une solution?

J'ai le sentiment d'exagérer dans mes demandes et le fais avec humilité.
Merci d'avance de vos conseils.

Chevrot



--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

Avatar
Chevrot
Merci

En ce qui concerne le multi critères, ça marche sans problème.

Par contre, en ce qui concerne la création de plusieurs requêtes dans
lesquelles seule la valeur du champ est différente, je coince sur ("Select
distinct NUM_ETAT from [SOI A]"). <from> n'est pas reconnu.

Enfin, ma question était aussi plus généralement: est il possible de créer à
la suite des <maprocédure> différentes (pas uniquement par la valeur du
critère, mais par la requête de référence (<A> dans l'exemple) et par le nom
du champ)?

merci

Chevrot


Bonsoir,

1-D'où proviennent les valeurs du genre '130786445' car il est possible
de créer les requetes pour chacune de ces valeurs dans la même
procédure.(Procédure modifiée de tête à partir des infos des posts
précédents donc pas testée mais ça doit être proche de ce que tu attends)

Sub zz()
Dim rq As DAO.QueryDef
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim SQL As String, critere As String
Set db = CurrentDb
'on crée un jeu d'enregistrements ne contenant que les différents
NUM_ETAT
' adapter éventuellement le nom de la table donnant les NUM_ETAT
Set rs = db.OpenRecordset("Select distinct NUM_ETAT from [SOI A]")
' Pour chaque NUM_ETAT on crée une requête
While Not rs.EOF
' on recupère le NUM_ETAT
critere = rs(0)
' Pour enlever le ; à la fin de l'instruction SQL
SQL = Left(db.QueryDefs("A").SQL,
InStrRev(db.QueryDefs("A").SQL, ";") - 1)
' on définit la clause WHERE de la nouvelle requête
SQL = SQL & " WHERE NUM_ETAT='" & critere & "'"
'Crée la requête et l'ajoute à la collection
Set rq = db.CreateQueryDef("A " & critere, SQL)
rs.MoveNext
Wend
Set rs = Nothing
Set rq = Nothing
Set db = Nothing
RefreshDatabaseWindow
End Sub

2-Oui, on peut mettre plusieurs critères sur le WHERE, comme ceci:
SQL = SQL & " WHERE ETAT_NUM='130786445' AND Secteur='Ardennes'"


[...]
Deuxièmement, est il possible de créer une requête comportant deux
conditions. J'ai essayé avec
"SQL = SQL & " WHERE ETAT_NUM='130786445'" & "WHERE Secteur='Ardennes'"
"SQL = SQL & " WHERE ETAT_NUM='130786445'" AND "WHERE Secteur='Ardennes'"
"SQL = SQL & " WHERE ETAT_NUM='130786445' AND WHERE Secteur='Ardennes'"
je n'ai pas trouvé. Existe t il une solution?

J'ai le sentiment d'exagérer dans mes demandes et le fais avec humilité.
Merci d'avance de vos conseils.

Chevrot



--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr




1 2