bonjour,

je deviens fou... J'aimerais gérer mes RecordSet à l'intérieur de transaction.

J'ai donc préparé une classe DataContext pour travailler dans un Workspace donné :
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
Option Compare Database
Option Explicit
 
Private Enum RecordsetLevel
    Parent
    Child
End Enum
 
Private ws As DAO.Workspace
Private db As DAO.Database
 
Private Sub Class_Initialize()
 
    Set ws = DBEngine.CreateWorkspace("ws", "Admin", vbNullString)
    Set db = ws.OpenDatabase(CurrentDb.Name)
    ws.BeginTrans
End Sub
 
Public Function OpenChildRecordset(dataSourceName As String, foreignKey As Long) As Recordset
 
    Set OpenChildRecordset = OpenRecordset(dataSourceName, foreignKey, Child)
End Function
 
Public Function OpenParentRecordset(dataSourceName As String, primaryKey As Long) As Recordset
 
    Set OpenParentRecordset = OpenRecordset(dataSourceName, primaryKey, Parent)
End Function
 
Public Sub RollBack()
 
    ws.RollBack
    ws.BeginTrans
End Sub
 
Public Sub Commit()
 
    ws.CommitTrans
    ws.BeginTrans
End Sub
 
Private Function OpenRecordset(dataSourceName As String, key As Long, level As RecordsetLevel) As Recordset
 
    Dim qdf As DAO.QueryDef
 
    Set qdf = db.QueryDefs(dataSourceName)
    qdf.Parameters(IIf(level = Child, "FK", "PK")) = key
    Set OpenRecordset = qdf.OpenRecordset(dbOpenDynaset)
End Function
J'utilise cette classe comme ceci :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
'code d'un formulaire qui appel un autre formulaire :
 
Private dc As New DataContext
Private contactEditor As Form
 
Private Sub OuvreForm
    Set contactEditor.Recordset = dc.OpenParentRecordset("RequêteSourceParamétrée", Me.Liste0)
    Set contactEditor.DataContext = dc
    contactEditor.Modal = True
    contactEditor.Visible = True
End Sub
Voici le code du form appelé :

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
Private dc As DataContext
 
 
Public Property Set DataContext(ByRef context As DataContext)
    Set dc = context
End Property
 
 
Private Sub Commande44_Click()
    '
    'Valide les modifications en cours.
    '
    dc.Commit
    Me.Dirty = False
    btcAnnuler.SetFocus
    Commande44.Enabled = False
End Sub
 
Private Sub Commande9_Click()
    '
    'Valide les modifications en cours et ferme le form.
    'Ici le code de fermeture du form suppose que le form soit l'objet actif
    '
    dc.Commit
    DoCmd.Close
End Sub
 
Private Sub btcAnnuler_Click()
    '
    'Ici le code de fermeture du form suppose que le form soit l'objet actif
    '
    DoCmd.Close
End Sub
Voilà, je deviens fou parce que j'ai bien fait attention de créer une transaction quand j'initialise ma classe DataContext, ensuite je travaille toujours avec la même instance de DataContext, mon recordset est créé par DataContext, donc devrait être soumis à la transaction.

Or, que je commit ou non, les données sont toujours enregistrées...