OVH Cloud OVH Cloud

Vider une requête dans une table par VB

8 réponses
Avatar
jorie80
Bonjour,

POuvez-vous m'expliquer comment est-il possible de faire ceci en
passant par un module VB sous ACESS :

- exécuter une requête qui demande un paramètre et qui existe dans ma
BDD
- puis vider le résultat de celle-ci (les données et les champs) dans
une nouvelle table

En effet, je bloque littéralement sur ce sujet.

Merci à vous.

8 réponses

Avatar
Raymond [mvp]
Bonjour.

Tu fais une requête création de table et tu lances l'exécution par
DoCmd.OpenQuery "requête1"
le paramètre sera demandé par la requête ? ou faut-il le donner par vba ?
car ça change totalement le code.
--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour débuter sur le forum


"okto" a écrit dans le message de
news:
Bonjour,

POuvez-vous m'expliquer comment est-il possible de faire ceci en
passant par un module VB sous ACESS :

- exécuter une requête qui demande un paramètre et qui existe dans ma
BDD
- puis vider le résultat de celle-ci (les données et les champs) dans
une nouvelle table

En effet, je bloque littéralement sur ce sujet.

Merci à vous.


Avatar
Pierre CFI [mvp]
bonjour
pourquoi en vb alors qu'il suffit de transformer ta req en req création de table, ou ajout ??

--
Pierre CFI
MVP Microsoft Access
Mail : http://cerbermail.com/?z0SN8cN53B

Site pour bien commencer
http://users.skynet.be/mpfa/
Site perso
http://access.cfi.free.fr
"okto" a écrit dans le message de news:
Bonjour,

POuvez-vous m'expliquer comment est-il possible de faire ceci en
passant par un module VB sous ACESS :

- exécuter une requête qui demande un paramètre et qui existe dans ma
BDD
- puis vider le résultat de celle-ci (les données et les champs) dans
une nouvelle table

En effet, je bloque littéralement sur ce sujet.

Merci à vous.


Avatar
jorie80
Bonsoir,

Je m'explique plus en détail d'autant plus que je vous propose ce que
j'ai fait pour le moment :

- j'ai deux tables
- j'ai une requête qui lie les 2 tables et qui a un paramètre (on
demande à l'utilisateur le nom de l'étudiant pour lequel on souhaite
les infos)

Ce que je tente de faire dans un module :
- lancer ma requête
- récupérer le résultat de celle-ci (donnée + champs) et le copier
dans une nouvelle table.

Voici comment je procéde :


Code:
Option Compare Database
Option Explicit
Global gs_val As String

Public Function set_val(val As String) As String
gs_val = val
End Function


Public Function get_val() As String
get_val = gs_val
End Function


Function stateQuery(QueryName As String, strParameter As String) As
Recordset
Dim qdState As QueryDef
Dim dbsCurrent As Database
Set dbsCurrent = CurrentDb()
Set qdState = dbsCurrent.QueryDefs(QueryName)
qdState.Parameters(get_val()) = strParameter
Set stateQuery = qdState.OpenRecordset
End Function


Sub Export()
Dim cnn As New ADODB.Connection
Dim NOM As String

NOM = InputBox("nom")
set_val NOM

Call stateQuery("Requête1", get_val)
CurrentDb.Execute "SELECT * INTO [Table_vidage] FROM [Requête1] ;"
End Sub



Or il me génère une erreur sur la ligne suivante ("Elément non trouvé
dans cette collection"):
Code:
qdState.Parameters(get_val()) = strParameter


Aussi, j'ai bien mis le critère suivant dans ma requête : get_val()
Voici ma requête :
Code:
SELECT Table1.Prénom, Table1.Nom, Table2.Adresse, Table2.Ville
FROM Table1 INNER JOIN Table2 ON Table1.Nom = Table2.Nom
WHERE (((Table1.Nom)=get_val()));



Sauriez-vous comment remédier à mon souci ?

Merci d'avance et à bientôt
Avatar
Raymond [mvp]
On va refaire le point car tu mélanges ado et dao et tu compliques la
procédure.
le principe simple pour faire ce que tu veux faire est une requête création
de table ou une requête ajout selon que la table existe ou non.
pour exécuter une requête avec paramètres et créer une table avec les
éléments résultant de la requête tu dois faire au minimum ceci, en
simplifiant:
Dim Db As DAO.Database
Dim Qry As DAO.QueryDef
Dim Etudiant As String
Etudiant = InputBox("Nom de l'étudiant")
Set Db = CurrentDb
Set Qry = Db.QueryDefs("requête1")
Qry.Parameters("Nom de l'étudiant").Value = Etudiant
Qry.Execute
Qry.Close
Set Qry = Nothing
Set Db = Nothing
ça , ça marche.

Ta requête création nommée Requête1 doit contenir:
SELECT table1.Prénom, table1.Nom, TABLE2.Adresse, TABLE2.Ville INTO TABLE4
FROM table1 INNER JOIN TABLE2 ON table1.Nom= TABLE2.Nom WHERE
(((table1.Nom)=[Nom de l'étudiant]));

ça doit fonctionner.


--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour débuter sur le forum


"okto" a écrit dans le message de
news:
Bonsoir,

Je m'explique plus en détail d'autant plus que je vous propose ce que
j'ai fait pour le moment :

- j'ai deux tables
- j'ai une requête qui lie les 2 tables et qui a un paramètre (on
demande à l'utilisateur le nom de l'étudiant pour lequel on souhaite
les infos)

Ce que je tente de faire dans un module :
- lancer ma requête
- récupérer le résultat de celle-ci (donnée + champs) et le copier
dans une nouvelle table.

Voici comment je procéde :


Code:
Option Compare Database
Option Explicit
Global gs_val As String

Public Function set_val(val As String) As String
gs_val = val
End Function


Public Function get_val() As String
get_val = gs_val
End Function


Function stateQuery(QueryName As String, strParameter As String) As
Recordset
Dim qdState As QueryDef
Dim dbsCurrent As Database
Set dbsCurrent = CurrentDb()
Set qdState = dbsCurrent.QueryDefs(QueryName)
qdState.Parameters(get_val()) = strParameter
Set stateQuery = qdState.OpenRecordset
End Function


Sub Export()
Dim cnn As New ADODB.Connection
Dim NOM As String

NOM = InputBox("nom")
set_val NOM

Call stateQuery("Requête1", get_val)
CurrentDb.Execute "SELECT * INTO [Table_vidage] FROM [Requête1] ;"
End Sub



Or il me génère une erreur sur la ligne suivante ("Elément non trouvé
dans cette collection"):
Code:
qdState.Parameters(get_val()) = strParameter


Aussi, j'ai bien mis le critère suivant dans ma requête : get_val()
Voici ma requête :
Code:
SELECT Table1.Prénom, Table1.Nom, Table2.Adresse, Table2.Ville
FROM Table1 INNER JOIN Table2 ON Table1.Nom = Table2.Nom
WHERE (((Table1.Nom)=get_val()));



Sauriez-vous comment remédier à mon souci ?

Merci d'avance et à bientôt


Avatar
jorie80
Bonjour,

Suite à votre mess, j'ai procédé comme suit. Or, il y a un pb :
"Erreur d'exécution '3061' : Trop peu de paramètres. 1 attendu. "
Cette erreur pointe sur la ligne de code suivante : CurrentDb.Execute
"SELECT * INTO [Table_vidage] FROM [Requête1] ;"

Sub Export()

Dim Db As DAO.Database
Dim Qry As DAO.QueryDef
Dim DATE_T As String
DATE_Anniv = InputBox("Entre ta date de naissance")
Set Db = CurrentDb
Set Qry = Db.QueryDefs("Requête1")
Qry.Parameters("Birthday_DATE").Value = DATE_Anniv CurrentDb.Execute
"SELECT * INTO [Table_vidage] FROM [Requête1] ;"
Qry.Close
Set Qry = Nothing
Set Db = Nothing

End Sub


Merci de votre précieuse aide,
Avatar
Raymond [mvp]
il ne faut pas relancer ton select, ta requête1 existe. tu n'as pas fait ce
que j'ai marqué dans mon post.

Dim Db As DAO.Database
Dim Qry As DAO.QueryDef
Dim DATE_T As String
DATE_Anniv = InputBox("Entre ta date de naissance")
Set Db = CurrentDb
Set Qry = Db.QueryDefs("Requête1")
Qry.Parameters("Birthday_DATE").Value = DATE_Anniv
Qry.Execute ' ********************************** ici

Qry.Close
Set Qry = Nothing
Set Db = Nothing


ta requête a-telle bien Birthday_DATE comme paramètre à entrer ?
--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour débuter sur le forum


"okto" a écrit dans le message de
news:
Bonjour,

Suite à votre mess, j'ai procédé comme suit. Or, il y a un pb :
"Erreur d'exécution '3061' : Trop peu de paramètres. 1 attendu. "
Cette erreur pointe sur la ligne de code suivante : CurrentDb.Execute
"SELECT * INTO [Table_vidage] FROM [Requête1] ;"

Sub Export()

Dim Db As DAO.Database
Dim Qry As DAO.QueryDef
Dim DATE_T As String
DATE_Anniv = InputBox("Entre ta date de naissance")
Set Db = CurrentDb
Set Qry = Db.QueryDefs("Requête1")
Qry.Parameters("Birthday_DATE").Value = DATE_Anniv CurrentDb.Execute
"SELECT * INTO [Table_vidage] FROM [Requête1] ;"
Qry.Close
Set Qry = Nothing
Set Db = Nothing

End Sub


Merci de votre précieuse aide,


Avatar
jorie80
Voili, j'ai réparé le code comme suit. Cependant, une erreur persiste
du type "Elément non trouvé dans cette collection"...
Comment y remédier ?

Aussi, je ne vois pas dans le code où les données de la requête1 sont
vidées dans une nouvelle table. Il faut bien le préciser pourtant, nan
?

merci de votre précieuse aide,


Sub test()

Dim Db As DAO.Database
Dim Qry As DAO.QueryDef
Dim DATE_Anniv As String

DATE_Anniv = InputBox("Entre ta date de naissance")
Set Db = CurrentDb
Set Qry = Db.QueryDefs("Requête1")
Qry.Parameters("B_DATE").Value = DATE_Anniv
Qry.Execute
Qry.Close
Set Qry = Nothing
Set Db = Nothing

End Sub
Avatar
Raymond [mvp]
Affiche ta requête ici pour voir.
il y a aussi une possibilité d'erreur sur la date car vba envoie la date
sous sa forme US.

--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour débuter sur le forum


"okto" a écrit dans le message de
news:
Voili, j'ai réparé le code comme suit. Cependant, une erreur persiste
du type "Elément non trouvé dans cette collection"...
Comment y remédier ?

Aussi, je ne vois pas dans le code où les données de la requête1 sont
vidées dans une nouvelle table. Il faut bien le préciser pourtant, nan
?

merci de votre précieuse aide,


Sub test()

Dim Db As DAO.Database
Dim Qry As DAO.QueryDef
Dim DATE_Anniv As String

DATE_Anniv = InputBox("Entre ta date de naissance")
Set Db = CurrentDb
Set Qry = Db.QueryDefs("Requête1")
Qry.Parameters("B_DATE").Value = DATE_Anniv
Qry.Execute
Qry.Close
Set Qry = Nothing
Set Db = Nothing

End Sub