Requête jointure sql dans une procédure VBA de 2 fichiers externes DBF

rcan7412

XLDnaute Occasionnel
Bonjour,

Je souhaiterais obtenir un résulat obtenu par une requête sql avec ms-query dans une procédure vba, et je sèche quelque peu.

Ma requête ms-query :
SELECT BALANCE.COMPTES, BALANCE.INTITULE, BALANCE.SOLDE, comptes.NATU
FROM `C:\evolution\SOCIETE`\BALANCE.DBF BALANCE, `C:\evolution\SOCIETE`\comptes.dbf comptes
WHERE comptes.COMP = BALANCE.COMPTES AND ((comptes.NATU<>'0'))

La requête fonctionne sans problème.
Mais j'aimerais pouvoir rendre variable le répertoire source des données.
Les noms des 2 tables "Balance.dbf" et "comptes.dbf" sont toujours les mêmes mais pas le répertoire qui lui est variable.


J'ai voulu reproduire la requête sql au sein d'une procédure mais ça ne renvoie aucun résultat ?
Voici le code :

Code:
Private Sub ImportDna()
'Procédure d'importation des dna requête entre le fichier balance.dbf et le fichier comptes.dbf
Dim Cn As ADODB.Connection
Dim Rs As ADODB.Recordset
Dim Chemin As String, Cible As String, laBase As String
Dim Fld As ADODB.Field
Dim i As Integer
If ComboBox1.ListIndex = -1 Then Exit Sub
Chemin = "C:\evolution\" & ComboBox1.List(ComboBox1.ListIndex, 1)
laBase = "Balance.dbf"
laBase2 = "comptes.dbf"
 
'efface la feuille Dna
Sheets("Dna").Select
Range("A1").Select
Selection.CurrentRegion.Select
Selection.ClearContents
Range("A1").Select
 
Set Cn = New ADODB.Connection
Cn.Open _
"Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=" & _
Chemin & ";"
 
Cible = "SELECT NATU, COMPTES, INTITULE, SOLDE FROM " & laBase & ", COMP FROM " & laBase2 & " WHERE COMP = COMPTES AND NATU<>'0'ORDER BY NATU, COMP "
 
Set Rs = New Recordset
Rs.Open Cible, Cn, adOpenKeyset, adLockOptimistic
For Each Fld In Rs.Fields
i = i + 1
Sheets("Dna").Cells(1, i) = Fld.Name
Next Fld
 
Do While Not Rs.EOF
Sheets("Dna").Range("A2").CopyFromRecordset Rs
Loop
End Sub


A noter que je réussis la procédure en me connectant qu'à une seule table (balance.dbf), dont voici le code :

Code:
Private Sub ImportBalance()
'Procédure d'importation du fichier balance.dbf
Dim Cn As ADODB.Connection
Dim Rs As ADODB.Recordset
Dim Chemin As String, Cible As String, laBase As String
Dim Fld As ADODB.Field
Dim i As Integer
If ComboBox1.ListIndex = -1 Then Exit Sub
Chemin = "C:\evolution\" & ComboBox1.List(ComboBox1.ListIndex, 1)
laBase = "Balance.dbf"
'efface la feuille Balance
Sheets("Balance").Select
Range("A1").Select
Selection.CurrentRegion.Select
Selection.ClearContents
Range("A1").Select
 
Set Cn = New ADODB.Connection
Cn.Open _
"Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=" & _
Chemin & ";"
 
Cible = "SELECT COMPTES, INTITULE, SOLDE FROM " & laBase & ""
Set Rs = New Recordset
Rs.Open Cible, Cn, adOpenKeyset, adLockOptimistic
For Each Fld In Rs.Fields
i = i + 1
Sheets("Balance").Cells(1, i) = Fld.Name
Next Fld
 
Do While Not Rs.EOF
Sheets("Balance").Range("A2").CopyFromRecordset Rs
Loop
End Sub

Quelqu'un peut-il m'aider sur ce coup là ?

Rodolphe
 
Dernière édition:

tototiti2008

XLDnaute Barbatruc
Re : Requête jointure sql dans une procédure VBA de 2 fichiers externes DBF

Bonjour rcan,

Pourquoi avoir changé le SQL entre Query et ADO ?
Tu ne peux pas avoir 2 FROM après un SELECT

Essayes de respecter l'écriture de Query

Code:
SELECT BALANCE.COMPTES, BALANCE.INTITULE, BALANCE.SOLDE, comptes.NATU
FROM BALANCE.DBF BALANCE, comptes.dbf comptes
WHERE comptes.COMP = BALANCE.COMPTES AND ((comptes.NATU<>'0'))
 

rcan7412

XLDnaute Occasionnel
Merci pour la réponse,

mais avec ce code, j'obtiens l'erreur 1004

Code:
Cible = "SELECT BALANCE.COMPTES, BALANCE.INTITULE, BALANCE.SOLDE, comptes.NATU FROM BALANCE.DBF BALANCE, comptes.dbf comptes WHERE comptes.COMP = BALANCE.COMPTES AND ((comptes.NATU<>'0'))"

Je ne sais pas comment écrire un code correct pour faire une reûête sur 2 tables externes qui portent le même nom mais qui ont pour variable le nom du dossier qui les contiennent ?
 

rcan7412

XLDnaute Occasionnel
Merci pour ton intérêt to²ti² 2008,

Je précise que ne suis pas du tout un habitué du code vba.
J'essaie d'utiliser et adapter du code existant n'ayant pas l'âme d'un programmeur.
Merci d'être indulgent :eek:

La combobox récupère les données d'une table dbf qui a comme champ, notamment, le fameux répertoire variable qui doit être utilisé pour récupérer les tables balance.dbf et comptes.dbf.

Voici le code du userform

Code:
Private Sub Userform_Initialize()
'Private Sub CommandButton1_Click()
'necessite d'activer la reference Microsoft ActiveX Data Objects x.x Lib rary
Dim Cn As ADODB.Connection
Dim Rs As ADODB.Recordset
Dim Chemin As String, Cible As String, laBase As String
'Chemin = ThisWorkbook.Path
Chemin = Sheets("Calcul").Range("REPEVOL")
laBase = "societes.dbf"
With ComboBox1
.Clear 'suppression anciennes données dans combobox
.ColumnCount = 4 'nombre de colonnes
'Il y aura 4 colonnes dans ComboBox
.ColumnWidths = "130;0;0;0" 'largeur colonnes
End With
Set Cn = New ADODB.Connection
Cn.Open _
"Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=" & _
Chemin & ";"
'pour la recuperation des champs RAIS ,PATH ,DATEDEB,DATEFIN
Cible = "SELECT RAIS,PATH,DATEDEB,DATEFIN FROM " & laBase & " ORDER BY RAIS ;"
Set Rs = New Recordset
Rs.Open Cible, Cn, adOpenKeyset, adLockOptimistic
Do While Not Rs.EOF
ComboBox1.AddItem Rs.Fields(0).Value 'champ RAIS
ComboBox1.List(ComboBox1.ListCount - 1, 1) = Rs.Fields(1).Value 'champ PATH
If Not Rs.Fields(2).Value = "" Then _
ComboBox1.List(ComboBox1.ListCount - 1, 2) = Rs.Fields(2).Value 'DATEDEB
If Not Rs.Fields(3).Value = "" Then _
ComboBox1.List(ComboBox1.ListCount - 1, 3) = Rs.Fields(3).Value 'DATEFIN
Rs.MoveNext
Loop
Rs.Close
Cn.Close
End Sub
 

tototiti2008

XLDnaute Barbatruc
Re : Requête jointure sql dans une procédure VBA de 2 fichiers externes DBF

Re,

J'ai pas de fichier dbf sous la main, je ne peux donc pas tester
Je me contente d'essayer d'imaginer ce qui ne passe pas

peut-être

Code:
Cible = "SELECT BALANCE.COMPTES, BALANCE.INTITULE, BALANCE.SOLDE, cptes.NATU FROM BALANCE.DBF BALANCE, comptes.dbf cptes WHERE cptes.COMP = BALANCE.COMPTES AND ((cptes.NATU<>'0')) ;"
 

tototiti2008

XLDnaute Barbatruc
Re : Requête jointure sql dans une procédure VBA de 2 fichiers externes DBF

Re,

Dernier essai, pas facile en aveugle

Code:
Cible = "SELECT BALANCE.COMPTES, BALANCE.INTITULE, BALANCE.SOLDE, cptes.NATU FROM BALANCE.DBF BALANCE inner join comptes.dbf cptes on cptes.COMP = BALANCE.COMPTES where cptes.NATU<>'0' ;"
 

rcan7412

XLDnaute Occasionnel
Je suis extrêmement confus, car les 2 lignes de code fonctionnent parfaitement.
J'avais oublié de noter l'appel de la procédure en cause dans le userform.

Vraiment un tout grand merci pour ton aide qui va me faire gagner un précieux temps :eek:
 

Discussions similaires

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 165
Messages
2 085 880
Membres
103 009
dernier inscrit
dede972