Windows 2000 Pro/Access 2000
Soit un formulaire dont la source est une requête listant
les enregistrements d'une table.
Ce formulaire permet de renseigner des noms de personnes
les uns après les autres :
Dupont
Martin
Durand
etc...
Dans le cas où l'on a supprimé malencontreusement une
ligne (même après un message de confirmation), peut-on
utiliser la méthode "Undo" pour annuler la suppression ?
Si non, existe-t-il un moyen (simple) d'annuler la
dernière opération effectuée sachant que dans ce type de
formulaire je crois que la table est mise à jour au fur et
à mesure des saisies et diverses opérations ?
Merci beaucoup par avance.
JPG
Avec un formulaire (sous formulaire) lié, Access démarre une transaction implicite qui n'est
pas sous le contrôle de DAO. Par contre, depuis Access 2000, il est possible de bidouiller quelque
chose. Le scénario est le suivant: permettre à l'utilisateur de modifier un ou plusieurs
enregistrements, d'en ajouter, d'en affacer et, après mure réflexion, décider de ne pas vouloir
tous ces changements, qu'il vient d'apporter (depuis l'ouverture du formulaire lié).
C'est toujours la même chose, avec un transaction, il nous faut un workspace. Dans le code qui
suit, je répète que cela ne fonctionne que sous 2000 et plus récent, le code est sous un
formulaire. Le formulaire, en vue continue ou autre, possède deux boutons, en pied de formulaire,
Commit et RollBack. De plus, en mode design, fournir le nom de la table liée au formulaire dans la
propriété RecordSource.
On remarque qu'il y a peu de code, il n'en faut pas beaucoup, en effet.
En chargement du formulaire, on démarre une transaction sur un nouveau ws, et on crée un
recordset sur ce que désire le formulaire (on s'informe auprès de Me.RecordSource). La ligne
importante est:
Set Me.Recordset= rst
ce qui débarque le formulaire de son mode pépère et le lie à NOTRE transaction (via notre
recordset sur notre db sur notre ws ). Le formulaire est alors à notre merci: toutes les
modifications apportées depuis ce moment, sur ce formulaire, peuvent être "annulées" (remise à ce
que c'était lors de l'ouverture), que l'utilisateur ait apporté une ou deux cents
modifications/effaçage/ajouts, ou commises (cas standard).
La variable booléenne done permet de faire un commit ( on peut modifier pour un rollback,
voir Sub Form_Close ) si l'utilisateur ferme le formulaire, sans passer par un des deux boutons
"commit" ou "rollback".
====================
Option Compare Database
Option Explicit
Private ws As Workspace
Private xdb As Database
Private rst As DAO.Recordset
Private done As Boolean
Private Sub Form_Load()
Set ws = DBEngine.CreateWorkspace("myws", "Admin", vbNullString)
Set xdb = ws.OpenDatabase(CurrentDb.Name)
ws.BeginTrans
Set rst = xdb.OpenRecordset(Me.RecordSource, dbOpenDynaset)
Set Me.Recordset = rst
done = False
End Sub
Private Sub Commit_Click()
ws.CommitTrans
done = True
DoCmd.Close acForm, Me.Name
End Sub
Private Sub Form_Close()
If Not done Then ws.CommitTrans
End Sub
Private Sub Rollback_Click()
ws.Rollback
done = True
DoCmd.Close acForm, Me.Name
End Sub
==================
Espérant le tout utile,
Vanderghast, Access MVP
"Jean-Pierre" <jean-pi...@wanadoo.fr> wrote in message
news:074f01c33ee7$d4ade700$a101...@phx.gbl...
Je teste de ce pas.
Merci infiniment.
JPG
>-----Message d'origine-----
>.
>
Juste un petit plantage sur le Form_Close ... Je cherche
le pourquoi.
Merci encore.
JPG
>-----Message d'origine-----
>.
>
"Jean-Pierre" <jean-pi...@wanadoo.fr> a écrit dans le message de news:
07ae01c33efc$f9ee71a0$a301...@phx.gbl...