[VBA][DAO] Update via Delete + Add : Astuces ?
Bonjour à tous.
Je travaille sur une appli frontale ayant une base IMAGE sur HP3000 via ODBC32.
Je dois Updater des champs d'une table qui sont des "Sort Items" dans la base Image; ces champs ne sont pas modifiables directement via dt.update; il faut Deleter l'enregistrement pus le reécrire avec la valeur modifiée.
Etant "feignant" sur le code et n'ayant pas envie de réecrire une procédure pour chaque table, voyez vous une solution maline ?
Plusieurs solutions sont envisageables, vu de ma petite culture Access:
1 - Utilisation d'une table "locale" Access copie de la base Image; vidage; ajout des enregistrements voulus; modifs data (en local, pas de pb); sup des enregistrements de la table ODBC; ajouts de ceux de la table locale dans la table ODBC.
2 - Dim de variables correspondantes aux champs, stockage du record ODBC dans les variables, modif de la variable, delete du record ODBC et ADD à partir des variables mémoires.
La 1ére méthode me pose le soucis de la sécurité de la transaction, comment être sûr que les 5 enregistrements concernés ont bien été mémorisés / détruits / ajoutés quand on utilise des requetes ? (je ne connais pas le moyen de sécuriser la chose); par contre elle n'est pas lourde en code.
La 2éme méthode pose le soucis de la perso du code (un peu long) à chaque table à traiter de la sorte; a moins de trouver une méthode "générique" de stockage dans un tampon (pour modif) d'un enregistrement (énumération des champs ??).
Merci de vos lumières et toutes mes félicitations aux contributeurs de ce site qui aident les développeurs occasionnels isolés comme moi.
Philippe.
Solution Universelle (!) à un Update non directement possible
Bonjour.
Code définitif qui permet de faire un Update là où on ne peut pas via la méthode Update sur des tables attachées ODBC avec des SortsItems ou des SearchItems.
Principe : dans les commentaires.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
|
Sub dt_update(table As String, filtre As String, champ As String, valeur As Variant)
'
' table : Table lu, deletée et modifiée
' filtre : condition permettant de sélectionner les enr à modifier
' attention : si critère String : cod_art='toto'
' champ : nom du champ dont la valeur doit être modifiée
' valeur : Nouvelle valeur du champ précité
'
' on ouvre 2 fois la table :
' une fois au travers d'une requete qui filtre les enregistrements à traiter pour mémo / delete
' une fois en direct pour l'écriture
Dim instsql As String
Dim i As Byte
'Dim t As String, x As String
Dim db As DATABASE
Dim dt As Recordset, dt2 As Recordset
instsql = "select * from " & table & " where " & filtre & ";"
Set db = DBEngine.Workspaces(0).Databases(0)
' sélection pour copie et delete
Set dt = db.OpenRecordset(instsql, DB_OPEN_DYNASET)
' pour écrire
Set dt2 = db.OpenRecordset(table, DB_OPEN_DYNASET)
dt.MoveFirst
Do Until dt.EOF
' mémo
dt2.AddNew
For i = 0 To dt.Fields.Count - 1
dt2(i) = dt(i)
Next i
' modif champ
dt2(champ) = valeur
' delete ancien
dt.Delete
dt2.Update
dt.MoveNext
Loop
End Sub |
Cela mérite-t-il la FAQ ??
Merci.