m2rtech
Messages postés239Date d'inscriptionmercredi 9 octobre 2002StatutMembreDernière intervention20 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és280Date d'inscriptionjeudi 24 mars 2005StatutMembreDernière intervention18 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
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és21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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.
27 déc. 2007 à 09:02
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
30 nov. 2005 à 09:41
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+
28 nov. 2005 à 12:39
"Provider=Microsoft.JET.OLEDB.4.0" va bon pour moi avec les Access 2 jusque 2003.