Re bonjour,
Le sujet étant lancer sur le post précédent que j'ai fait, cela m'a fait me rappeler que j'ai un soucis avec l'ordre des évènements de suppression dans access.
Petit récapitulatif :
Access propose 3 évènements lors d'une demande de suppression sur une base Jet de type .mdb. Sur les projets .adp les évènements se produisent dans un ordre différent:
1) Delete (se produit autant de fois qu'il y a d'enregistrement sélectionné)
2) BeforeDelConfirm (1 fois avant la boite de dialogue d'access)
3) AfterDelConfirm (Après la boite de dialogue d'access)
Les évènements se produisent dans cet ordre. Les évènements 2 et 3 sont optionnels et peuvent ne pas se produire si sur dans la page Outils/Option, onglet "Modifier/Rechercher", l'option "Modifications des enregistrements" dans le cadre "Confirmer" est décochée. Il est par ailleurs possible de forcer par code cette option.
L'évènement 1) Delete se produit donc pour chaque enregistrement, le 2) un fois avant qu'access demande la confirmation de suppression de l'ensemble des enregistrements sélectionnés comme supprimable à l'étape 1 et le 3) après cette demande de confirmation et ce dans tout les cas.
Le cas à résoudre :
Admettons maintenant que je désire effectuer un traitement quelconque lors de la suppression d'un enregistrement ou de plusieurs enregistrements.
Soit je code ce traitement lors de l'évènement Delete, mais rien ne garantit que l'utilisateur ne va pas refuser la suppression entre les évènements 2 et 3, impossible de présumer de cela et impossible d'effectuer facilement un roolback de mon traitement.
Soit je part du principe que je code ce traitement après l'évènement 3 mais dans ce cas, je ne sais pas quels sont les enregistrement qui ont été supprimés.
Soit je désactive la confirmation de la suppresion par access (menu option/....) et je suis sur que l'utilisateur ne refusera pas la suppression, par contre, il est donc de mon devoir de confirmer la suppression lors de l'évènement 1 (delete), mais ne sachant pas si l'utilisateur tente de supprimer 1 ou 10000 enregistrements, je vais lui poser la question autant de fois qu'il y a d'enregistrement.
La solution que je n'ai pas appronfi serait peut être de passer par une transaction que j'initialiserai manuellement, mais cela me semble lourd.
Si certains de vous ont une idée à me proposer pour résoudre cette tache, je suis fortement intéréssé.
[Edit]
Je viens de rapidement tester avec une transaction, cela a l'air de fonctionner, à condition que l'utilisateur n'est pas désactivé la confirmation de suppression dans les options. Par contre c'est assez lourd au niveau code.
N'y a t il pas plus simple ???
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
44
45
46
47
48
49
50
51
52
53 Option Compare Database Option Explicit Dim trans As Boolean Dim w As Workspace Private Sub Form_AfterDelConfirm(Status As Integer) If Status = acDeleteOK Then ' Si suppresion confirmé, valide la transaction w.CommitTrans Else w.Rollback End If trans = False Debug.Print "AfterDelConfirm" End Sub Private Sub Form_BeforeDelConfirm(Cancel As Integer, Response As Integer) Debug.Print "BeforeDelConfirm" End Sub Private Sub Form_Delete(Cancel As Integer) Dim db As Database Dim re As Recordset If Not trans Then ' Début la transaction si on ne l'a pas déjà fait w.BeginTrans trans = True ' flag qui indique que la transaction est active ' pour ne pas réactiver la transsaction si l'utilisateur ' a sélectionner plusieurs enregistrements End If ' le traitement quelconque qui devra être annulé Set db = CurrentDb() Set re = db.OpenRecordset("TEST1") re.AddNew re("TEST") = "suppression de " & IDTEST re.Update re.Close db.Close Debug.Print "Delete" End Sub Private Sub Form_Open(Cancel As Integer) SetOption "Confirm Record Changes", True ' Force la confirmation de suppression trans = False Set w = Workspaces(0) End Sub ' P.S. Code Quick & Dirty ^^
[/edit]
Partager