RECOUPEMENT ENTRE DEUX BASES DE DONNÉES ACCESS

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 28 nov. 2005 à 12:39
m2rtech Messages postés 239 Date d'inscription mercredi 9 octobre 2002 Statut Membre Dernière intervention 20 février 2012 - 27 déc. 2007 à 09:02
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/34823-recoupement-entre-deux-bases-de-donnees-access

m2rtech Messages postés 239 Date d'inscription mercredi 9 octobre 2002 Statut Membre Dernière intervention 20 février 2012
27 déc. 2007 à 09:02
Bonjour, une amélioration 2 ans après.

il suffit d'une commande SQL du genre :

UPDATE table1 set table1.champs1 = table2.champs1 where table1.champ_reference
not in (SELECT table2.champ_reference
FROM table1 INNER JOIN table2 ON table1.champ_reference = table2.champ_reference )

RG
cs_asimengo Messages postés 280 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 18 mars 2009
30 nov. 2005 à 09:41
@M000004965: En bidouillant juste un peu ta source je te propose une petite amelioration qui te permettra de faire la mise à jour d'une tableB dune BD_B par rapport à une tableA de la BD_A quelconque.

L'essentiel de la modif est faite dans ta procédure "Verification_traitement"

'PNomTableA est le nom de la tableA dans la BD_A
'PNomTableB est le nom de la tableB dans la BD_B
'PNomChampClePrimaire est le nom du champ qui fait office de clé primaire pour les 2 tables.

Public Sub Verification_traitement(PNomtableA As String, PNomTableB As String, PNomChampClePrimaire As String)
Dim fld As Field

PathFileDB_A = App.Path & "" 'même chemin que ton appli
PathFileDB_B = App.Path & ""
NameFileDB_A = "baseA.mdb"
NameFileDB_B = "baseB.mdb"

SQLA = "SELECT * FROM [" & PNomtableA & "]" 'tous les enregistrements de la tableA

Call Open_Connection
Call Open_RecordSetA

If RsAccessA.EOF = False Then ' Vérifie qu'il existe au moins un enregistrement

RsAccessA.MoveFirst 'se place sur le premier enregistrement

Do 'ammorce une boucle "tant que..."
'Suivant le type du champ clé primaire formaté la valeur du critère
Select Case RsAccessA.Fields(PNomChampClePrimaire).Type
Case adVarChar, adVarWChar, ...: CriterFiltre_B = Chr$(34) & RsAccessA.Fields(PNomChampClePrimaire).Value & Chr$(34)
Case adDate, adDBDate, ...: CriterFiltre_B = "#" & Format(RsAccessA.Fields(PNomChampClePrimaire).Value, "mm/dd/yy") & "#"
Case Else:CriterFiltre_B = RsAccessA.Fields(PNomChampClePrimaire).Value

End Select

SQLB = "SELECT * FROM [" & PNomTableB & "]" & _
" WHERE [" & PNomChampClePrimaire & "]=" & CriterFiltre_B & _
" ORDER BY [" & PNomChampClePrimaire & "]"


Call Open_RecordSetB

If RsAccessB.EOF = False Then 'Verifier si enregistrement existe
GoTo SUITE_A 'Il existe donc on passe à la recherche suivante
Else
' il n'existe pas, on rajoute dans base B
RsAccessB.AddNew 'Ajouter un enregistrement

'Chaque enregistrement ajouté à la tableB doit être identique à la tableA
For Each fld In RsAccessB.Fields
fld.Value = RsAccessA.Fields(fld.Name).Value
Next fld

RsAccessB.Update 'Valider l'ajout en mettant à jour la base

End If
SUITE_A:
Call Close_RecordSetB

RsAccessA.MoveNext 'passer à l'enregistrement suivant
Loop While RsAccessA.EOF = False

End If

Call Close_RecordSetA
Call Close_Connection

End Sub

Donc, dans la procedure Command1_Click tu fera un appel de ce genre: Call Verification_traitement("TableA", "TableB", "Produits")
NB : En tenant compte de tes 2 BD (BaseA et BaseB) le reste n'est pas efficace car le champ "Produits" n'est pas la clé primaire des 2 tables. il faudra donc ajouter dans chaque table un champ clé primaire de même nom.

Vu le niveau débutant de ta source, je pense que cette reflexion est suffisante pour entrevoir la suite. Mais rassures toi ce n'est pas top, c'est juste pour un petit plus

juste une petite remarque, après avoir ajouté les enregistrements manquants, pour les enregistrements existants il faudra penser à une mise à jour.

j'espère t'avoir apporté un petit plus, c'est qu'en ce moment je travaille sur le synchronisation de plusieurs BD ACCESS pour une appli multi site, surtout que BRUNEWS a jeté un oeil la dessus j'étais bien curieux de voir ce que c'était.

A+
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
28 nov. 2005 à 12:39
Une simple requête "INSERT INTO" n'aurait pas suffi ?
"Provider=Microsoft.JET.OLEDB.4.0" va bon pour moi avec les Access 2 jusque 2003.
Rejoignez-nous