[Access] - Exploitation de requêtes SQL sous VBA

morice

Best Member
Salut à tous,

Bon j'ai encore des petits bugs avec mon application de stage.
(Vestale je te remercie encore une fois pour ton coup de main de la dernière fois)

En fait, j'ai un peu de mal à comprendre comment faire pour exécuter une requête SELECT, récupérer les données retournées, les exploiter et les ré-insérer dans la base.

Enfin, pour l'INSERT, ça va, je sais faire ça. C'est juste le coup du SELECT avec récupération des données dans le code qui me pose problème... :wacko:
 

Asiany

Best Member
Exploitation de requêtes SQL sous VBA avec Access

Utilise tu des recordset ?
 

morice

Best Member
Exploitation de requêtes SQL sous VBA avec Access

Euh, je t'avoue que je me suis pas penché sur la question...

Tu peux me filer uncoup de main là-dessus?
 

Asiany

Best Member
Exploitation de requêtes SQL sous VBA avec Access

Je peux toujours essayer :happy:

Par le biais, de réquète via des Recordset, tu peux assez facilement réaliser des SELECT.
 

morice

Best Member
Exploitation de requêtes SQL sous VBA avec Access

T'as pas un exemple? ça me simplifiera la vie :chessy:
 

Asiany

Best Member
Exploitation de requêtes SQL sous VBA avec Access

Voici un exemple:

Dim req As ADODB.Recordset
Dim req2 As ADODB.Recordset

Set req = New ADODB.Recordset
req.CursorLocation = adUseClient
req.Open "SELECT * FROM Table_Test", adoConnect, adKeySet, adLockOptimistic, adCmdText

Set req2 = New ADODB.Recordset
req2.CursorLocation = adUseClient
req2.Open "TABLE_DESTINATION", adoConnect, adKeySet, adLockOptimistic, adCmdTableDirect


// et ici tu réalise des manipulations que tu souhaites faire, exemple ci dessous pour mettre le nom sélectionné dans une autre table
While Not req.EOF
req2.AddNew
req2!Nom = req!Nom
req2.Update
req2.MoveNext
Wend

req2.Close
req.Close
req2=Nothing
req=Nothing


NB: Sachant que ici adoConnect est un objet de connexion.
 

morice

Best Member
Exploitation de requêtes SQL sous VBA avec Access

Ok, je vais déjà tester ça, je te remercie :happy:
 

morice

Best Member
Exploitation de requêtes SQL sous VBA avec Access

Salut mec, salut à tous!

euh ben j'ai testé, mais ça plante :wacko:

le code de mon applic:
Dim req0 As ADODB.Recordset 'Efface la table des attestations
    Dim req1 As ADODB.Recordset 'Récupère les clients qui ont eu des interventions
    Dim req2 As ADODB.Recordset 'Récupère les données des interventions d'un client précis
   
    Set req0 = New ADODB.Recordset
    Set req1 = New ADODB.Recordset
    Set req2 = New ADODB.Recordset
   
    sql0 = "DELETE * FROM attestation;"
    :fleche: req0.Open sql0, adoConnect, adKeySet, adLockOptimistic, adCmdText
    sql1 = "SELECT c.id_c AS id FROM client c, intervenir intr WHERE c.id_c=intr.id_c AND YEAR(date)>(YEAR(now())-1) AND YEAR(date)<(YEAR(now())+1) GROUP BY c.id_c ORDER BY c.id_c"
    req1.Open sql1, adoConnect, adKeySet, adLockOptimistic, adCmdText
    While Not req1.EOF
        sql2 = "SELECT date, modepaiement, intt.nom AS nom, sum(ints.duree) AS duree, sum(ints.prix_prest) AS prest FROM intervenir AS intr, interventions AS ints, intervenant AS intt, comprendre AS com WHERE intr.id_intr = com.id_intr AND com.id_i=ints.id_i AND intr.id_intt=intt.id_intt AND intr.id_c=" & req1!id & " GROUP BY date, modepaiement, intt.nom ORDER BY date"
        req2.Open sql2, adoConnect, adKeySet, adLockOptimistic, adCmdText
        chAttest_dates = ""
        chAttest_paies = ""
        chAttest_couts = ""
        chAttest_intts = ""
        dur_tot = 0
        cout_tot = 0
        While Not req2.EOF
            dur_tot = dur_tot + req2!duree
            cout_tot = cout_tot + req2!prest
            chAttest_dates = chAttest_dates & req2!date & vbCrLf
            chAttest_paies = chAttest_paies & req2!modepaiement & vbCrLf
            chAttest_couts = chAttest_couts & req2!prest & vbCrLf
            chAttest_intts = chAttest_intts & req2!Nom & vbCrLf
            req2.MoveNext
        Wend
        sql3 = "INSERT INTO attestation ( id_c, total_duree, total_prest, modepaiement_inter, date_inter, cout_inter, intervenant) VALUES ( " & req1!id & ", " & dur_tot & ", " & cout_tot & ", " & req2!paies & ", " & req2!dates & ", " & req2!couts & ", " & req2!intts & ");"
        DoCmd.RunSQL sql3
        req1.MoveNext
    Wend
    req2.Close
    req1.Close
    req0.Close

Il me sort "Erreur 3001 - Les arguments sont de type incorrect, en dehors des limites autorisées ou en conflit les uns avec les autres."
J'ai mis un  :fleche: là où le débogage m'envoie.

Merci d'avance pour vos avis, je continue de chercher de mon côté. :happy:
 

Asiany

Best Member
Exploitation de requêtes SQL sous VBA avec Access

Tu as définis adoConnect ? Essaye sans le point virugle : sql0 = "DELETE * FROM attestation"
 

morice

Best Member
Exploitation de requêtes SQL sous VBA avec Access

J'ai déjà fait sans le point-virgule.

Par contre, la définition d'adoConnect...euh...je fais comment?
 

Asiany

Best Member
Exploitation de requêtes SQL sous VBA avec Access

Dim adoConnect As ADODB.Connection
Set adoConnect = New ADODB.Connection

adoConnect.Open "Driver={SQL Server}; Uid="sa"; Pwd=""; Server="SERVER_TEST";Database="BASE_TEST";"

Dans ce cas-ci, je me connecte à un serveur SQL et à la base de donnée auquel je m'intéresse mais tu peux aussi te connecter à des fichiers excel, access etc..

NB: N'oubli pas de fermer, à la fin des que tu as fini, adoConnect.Close puis Set adoConnect = Nothing si nécessaire.
 

morice

Best Member
Exploitation de requêtes SQL sous VBA avec Access

Vu que le code VBA qui utilise ça appartient à la base de données Access (et ouais, application entièrement développée sous Access...), je devrais pouvoir mettre currentdatabase dans "adoconnect.open", non?

Parce que là ça me soule de remplir ça en fait :laugh:
Merci pour tous ces éléments de réponse en tout cas :happy:
 

Asiany

Best Member
Exploitation de requêtes SQL sous VBA avec Access

Hum, essaye toujours :biggrin:

Sinon, voilà un code qui correspondrait à ton application en access

Dim Cur_db As Database

Dim req0 As Recordset 'Efface la table des attestations
Dim req1 As Recordset 'Récupère les clients qui ont eu des interventions
Dim req2 As Recordset 'Récupère les données des interventions d'un client précis
Dim sql0 As String
Dim sql1 As String
Dim sql2 As String


Set Cur_db = CurrentDb

sql0 = "DELETE * FROM attestation;"
Set req0 = Cur_db.OpenRecordset(sql0, dbOpenDynaset)

sql1 = "SELECT c.id_c AS id FROM client c, intervenir intr WHERE c.id_c=intr.id_c AND YEAR(date)>(YEAR(now())-1) AND YEAR(date)<(YEAR(now())+1) GROUP BY c.id_c ORDER BY c.id_c"
Set req1 = Cur_db.OpenRecordset(sql1, DB_OPEN_DYNASET)

While Not req1.EOF
sql2 = "SELECT date, modepaiement, intt.nom AS nom, sum(ints.duree) AS duree, sum(ints.prix_prest) AS prest FROM intervenir AS intr, interventions AS ints, intervenant AS intt, comprendre AS com WHERE intr.id_intr = com.id_intr AND com.id_i=ints.id_i AND intr.id_intt=intt.id_intt AND intr.id_c=" & req1!id & " GROUP BY date, modepaiement, intt.nom ORDER BY date"
Set req1 = Cur_db.OpenRecordset(sql2, DB_OPEN_DYNASET)
chAttest_dates = ""
chAttest_paies = ""
chAttest_couts = ""
chAttest_intts = ""
dur_tot = 0
cout_tot = 0
While Not req2.EOF
dur_tot = dur_tot + req2!duree
cout_tot = cout_tot + req2!prest
chAttest_dates = chAttest_dates & req2!Date & vbCrLf
chAttest_paies = chAttest_paies & req2!modepaiement & vbCrLf
chAttest_couts = chAttest_couts & req2!prest & vbCrLf
chAttest_intts = chAttest_intts & req2!Nom & vbCrLf
req2.MoveNext
Wend
sql3 = "INSERT INTO attestation ( id_c, total_duree, total_prest, modepaiement_inter, date_inter, cout_inter, intervenant) VALUES ( " & req1!id & ", " & dur_tot & ", " & cout_tot & ", " & req2!paies & ", " & req2!dates & ", " & req2!couts & ", " & req2!intts & ");"
DoCmd.RunSQL sql3
req1.MoveNext
Wend
Set req2 = Nothing
Set req1 = Nothing
Set req0 = Nothing

Désolé j'avais pas compris que tu te connectais à une la base access déjà ouverte :happy:
 

morice

Best Member
Exploitation de requêtes SQL sous VBA avec Access

Pas grave, je vais tester ce que tu m'as produit, je te ferais un calin si ça marche :laugh:
 

morice

Best Member
Exploitation de requêtes SQL sous VBA avec Access

Salut,

ça marche pas...
je te mets mon code actuel:
Dim req0 As Recordset 'Efface la table des attestations
Dim req1 As Recordset 'Récupère les clients qui ont eu des interventions
Dim req2 As Recordset 'Récupère les données des interventions d'un client précis
Dim sql0 As String
Dim sql1 As String
Dim sql2 As String

Set db = CurrentDb

sql0 = "DELETE * FROM attestation"
DoCmd.RunSQL sql0

sql1 = "SELECT c.id_c AS id FROM client c, intervenir intr WHERE c.id_c=intr.id_c AND YEAR(date)>(YEAR(now())-1) AND YEAR(date)<(YEAR(now())+1) GROUP BY c.id_c ORDER BY c.id_c;"
:fleche: Set req1 = db.OpenRecordset(sql1)

While Not req1.EOF
sql2 = "SELECT date, modepaiement, intt.nom AS nom, sum(ints.duree) AS duree, sum(ints.prix_prest) AS prest FROM intervenir AS intr, interventions AS ints, intervenant AS intt, comprendre AS com WHERE intr.id_intr = com.id_intr AND com.id_i=ints.id_i AND intr.id_intt=intt.id_intt AND intr.id_c=" & req1!id & " GROUP BY date, modepaiement, intt.nom ORDER BY date"
Set req2 = db.OpenRecordset(sql2, DB_OPEN_DYNASET)
chAttest_dates = ""
chAttest_paies = ""
chAttest_couts = ""
chAttest_intts = ""
dur_tot = 0
cout_tot = 0
While Not req2.EOF
dur_tot = dur_tot + req2!duree
cout_tot = cout_tot + req2!prest
chAttest_dates = chAttest_dates & req2!date & vbCrLf
chAttest_paies = chAttest_paies & req2!modepaiement & vbCrLf
chAttest_couts = chAttest_couts & req2!prest & vbCrLf
chAttest_intts = chAttest_intts & req2!Nom & vbCrLf
req2.MoveNext
Wend
sql3 = "INSERT INTO attestation ( id_c, total_duree, total_prest, modepaiement_inter, date_inter, cout_inter, intervenant) VALUES ( " & req1!id & ", " & dur_tot & ", " & cout_tot & ", " & req2!paies & ", " & req2!dates & ", " & req2!couts & ", " & req2!intts & ");"
DoCmd.RunSQL sql3
req1.MoveNext
Wend
Set req2 = Nothing
Set req1 = Nothing
Set req0 = Nothing
Maintenant il me fait une erreur 13: incompatibilité de type
j'ai essayé avec Dbopendynaset, dynaset et tout le bazar qui peut suivre, mais ça passe jamais... :wacko:

T'as une idée? merci encore
 

morice

Best Member
Exploitation de requêtes SQL sous VBA avec Access

Eh eh, solution trouvée :happy:

C'est vraiment un métier de mer*e qu'on fait mon gars. Même quand le code est bon, il suffit qu'une option dans l'outil de développement soit mal réglée pour tout faire planter...la misère quoi... :knuppel:

Code corrigé si ça peut aider:
Dim req0 As DAO.Recordset 'Efface la table des attestations
Dim req1 As DAO.Recordset 'Récupère les clients qui ont eu des interventions
Dim req2 As DAO.Recordset 'Récupère les données des interventions d'un client précis
Dim sql0 As String
Dim sql1 As String
Dim sql2 As String
Dim sql3 As String
Dim db As DAO.Database

Set db = CurrentDb

sql0 = "DELETE * FROM attestation"
DoCmd.RunSQL sql0
'Set req0 = CurrentDb.OpenRecordset(sql0, dbOpenDynaset)

sql1 = "SELECT c.id_c as id FROM client as c, intervenir as intr WHERE c.id_c=intr.id_c AND YEAR(date)>(YEAR(now())-1) AND YEAR(date)<(YEAR(now())+1) GROUP BY c.id_c ORDER BY c.id_c;"
'Set req1 = CurrentDb.OpenRecordset(sql1, Dynaset)
Set req1 = db.OpenRecordset(sql1)
Il fallait bien faire appel à DAO, mais pour l'avoir et que ça marche, il faut l'activer, tout simplement XD

Pour activer DAO, il faut aller dans "Outils", "Références" et cochez la bonne ligne. Ah ça se passe dans la fenêtre de développement VBA hein, pas dans celle d'Access :wink2: :laugh:
 

Asiany

Best Member
Exploitation de requêtes SQL sous VBA avec Access

:biggrin: Moi j'utilise Recordset sans DAO devant et ça marche bizarre, en même temps il est étais déjà coché moi... puis tu peux utiliser Recordset de ADO aussi :laugh: Ah lalala VB et ACCESS :beuh: