IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros Access Discussion :

conflit d'écriture sur formulaire avec 2 tables différentes dont l'une est mise à jour


Sujet :

Macros Access

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2009
    Messages
    159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 159
    Points : 62
    Points
    62
    Par défaut conflit d'écriture sur formulaire avec 2 tables différentes dont l'une est mise à jour
    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
    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
    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
    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
    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
    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.

    Pourriez-vous m'indiquer des idées de correction du problème?
    En vous remerciant par avance

  2. #2
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2009
    Messages
    159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 159
    Points : 62
    Points
    62
    Par défaut
    Bonjour,

    finalement, j'ai résolu mon problème
    Comme indiqué dans le lien suivant : https://access.developpez.com/faq/?p...onflitEcriture
    il suffisait de sauvegarder l'enregistrement du formulaire avant d'effectuer la mise à jour de la table. J'ai rajouté la commande acCmdSaveRecord au début de routine gérant le changement du 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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    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
    
    DoCmd.RunCommand acCmdSaveRecord  '<= ajout de la sauvegarde de l'enregistrement du formulaire 
     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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2010] Filtre sur formulaire avec copie dans une autre table
    Par alainnolahc dans le forum VBA Access
    Réponses: 1
    Dernier message: 09/10/2010, 19h26
  2. [AC-2003] Problème de lag sur formulaire avec table liée
    Par benjamin002 dans le forum IHM
    Réponses: 0
    Dernier message: 04/02/2010, 09h42
  3. Réponses: 8
    Dernier message: 13/03/2006, 17h37
  4. Réponses: 19
    Dernier message: 26/01/2006, 08h44
  5. Test sur formulaire avec liste des erreurs
    Par Nicos77 dans le forum Langage
    Réponses: 37
    Dernier message: 17/11/2005, 10h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo