Bonjour,
J'utilise un formulaire "SF_Recos_new_period" où le contenu est rempli à l'aide d'une requête SQL composée de 2 tables :
- TF_reco ( champs id, Functional domain) et
TF_reco_updated ( champs id, Functional domain,date maj )
qui sont jointes par la référence "id".
L'utilisateur voit restituer les informations "id", "TF_reco.Functional domain","TF_reco_updated.Functional domain"."Tf_reco_updated.date maj". (1)
L'utilisateur doit comparer le contenu des 2 champs "functional domain" et mettre à jour le 2ème champ de la table "TF_reco_updated".
Une fois la mise à jour effectuée, il devrait voir dans le formulaire "SF_Recos_new_period" les mêmes champs qu'en (1) avec le champ "functional domain" modifié et le champ date_maj renseigné à la date du jour.
Mais à chaque mise à jour du champ "TF_reco_updated.functional domain", j'ai le message d'erreur "Cette enregistrement a été modifié par un autre utilisateur depuis que vous avez commencé à le modifier. ...."
Au niveau du code, voici comment cela se passe.
1) Au niveau du formulaire, sur modification, nous recherchons l'enregistrement sélectionné et conservons la valeur de l'ancien domaine fonctionnel
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 Private Sub Form_Dirty(Cancel As Integer) Dim db As Database Dim reconew As Recordset Dim sQL As String 'si modification sur le formulaire, ' 1. récupération de l'ID qui fait l'objet d'une modification "recoid" ' 2. Conservation de l'ancienne DF modifiée "DF previous" With Me.RecordsetClone .MoveLast: .MoveFirst Maposition = Me.CurrentRecord End With Set db = CurrentDb 'recherche de l'id de la ligne sélectionnée sQL = "SELECT R_Recommandations.* FROM [TR_reporting date], R_Recommandations " sQL = sQL + "WHERE (((R_Recommandations.[Creation date]) >= [TR_reporting date].[Previous Reporting date] And " sQL = sQL + "(R_Recommandations.[Creation date]) <= [TR_reporting date].[Reporting date])) ORDER BY R_Recommandations.Id;" Set reconew = db.OpenRecordset(sQL) For i = 1 To Maposition recoid = reconew.Fields(1) reconew.MoveNext Next DF_previous = Me.Functional_domain End Sub
2) avant mise à jour du champ Domaine fonctionnel de la table TF_reco_updated, je conserve la nouvelle valeur du Domaine fonctionnel
3) sur changement dans le même champ Domaine fonctionnel de la table TF_reco_updated
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 Private Sub Functional_domain_BeforeUpdate(Cancel As Integer) ' prise en compte de la nouvelle DF DF_New = Me.Functional_domain End Sub
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
54
55
56 Private Sub Functional_domain_Change() 'traitement associé de changement du domaine Fonctionnel Dim db As Database Dim mirs, rs, efureco As Recordset Dim sQL As String Dim lngEnrActif As Long Set db = CurrentDb Set mirs = db.OpenRecordset("TF_Recos_updated") Dim MaVariableTampon As String Dim i As Integer 'mise à jour du domaine fonctionnel et la date de mise à jour pour la reco sélectionnée On Error GoTo erreur For i = 1 To mirs.RecordCount If mirs.Fields(0) = recoid Then If DF_New <> DF_previous Then DoCmd.SetWarnings False 'recherche de l'information EFU sQL = "SELECT TR_BU.[BU Id], TR_DF.[DF Id], TR_EFU.[EFU id] FROM TR_DF INNER JOIN (TR_BU INNER " sQL = sQL + "JOIN TR_EFU ON TR_BU.[Identifiant BU] = TR_EFU.[Business Unit]) ON TR_DF.[ID Domaine fonctionnel] = TR_EFU.[Domaine Fonctionnel] " sQL = sQL + "WHERE (((TR_BU.[BU Id])=""" & Me.BU & """) AND ((TR_DF.[DF Id])=""" & DF_New & """));" Set efureco = db.OpenRecordset(sQL) erreur: ' MsgBox Err.Number If Err.Number = 3021 Then MsgBox "pas de mise à jour EFU à réaliser" Else mirs.Edit mirs![Functional Domain] = Me.Functional_domain mirs![Updated date] = Date mirs![Elementary Functional Unit] = efureco.Fields(2) mirs.Update End If End If Exit For Else mirs.MoveNext End If Next i mirs.Close Set mirs = Nothing Set db = Nothing End Sub
4) Après mise à jour formulaire, rafraichissement
En final, je n'arrive à éliminer ce message de conflit d'écriture et en plus je constate que la mise à jour de la table "Tf_reco_updated" ne s'est pas effectuée correctement puisque je ne retrouve pas la date mise à jour renseignée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Private Sub Form_AfterUpdate() Form_SF_Recos_new_period.Refresh End Sub
Pourriez-vous m'indiquer des idées de correction du problème?
En vous remerciant par avance
Partager