RECOUPEMENT ENTRE DEUX BASES DE DONNÉES ACCESS

Signaler
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
-
Messages postés
239
Date d'inscription
mercredi 9 octobre 2002
Statut
Membre
Dernière intervention
20 février 2012
-
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

Messages postés
239
Date d'inscription
mercredi 9 octobre 2002
Statut
Membre
Dernière intervention
20 février 2012

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
Messages postés
281
Date d'inscription
jeudi 24 mars 2005
Statut
Membre
Dernière intervention
18 mars 2009

@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+
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
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.