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

VBA Access Discussion :

Audit trail sur un sous formulaire


Sujet :

VBA Access

  1. #1
    Membre à l'essai
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2014
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2014
    Messages : 40
    Points : 18
    Points
    18
    Par défaut Audit trail sur un sous formulaire
    Bonjour à tous,

    J'arrive au bout de la conception de ma base de données pour laquelle j'ai mis en place un suivi des modifications (audit trail) sur chacun des mes formulaires. J'ai pu mettre en place cet audit trail grâce au code suivant :
    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
     
    Sub AuditChanges(IDField As String, UserAction As String)
        On Error GoTo AuditChanges_Err
        Dim cnn As ADODB.Connection
        Dim rst As ADODB.Recordset
        Dim ctl As Control
        Dim datTimeCheck As Date
        Dim strUserID As String
        Set cnn = CurrentProject.Connection
        Set rst = New ADODB.Recordset
        rst.Open "SELECT * FROM tblAuditTrail", cnn, adOpenDynamic, adLockOptimistic
        datTimeCheck = Now()
        strUserID = Environ("USERNAME")
        Select Case UserAction
            Case "EDIT"
                For Each ctl In Screen.ActiveForm.Controls
                    If ctl.Tag = "Audit" Then
                        If Nz(ctl.Value) <> Nz(ctl.OldValue) Then
                            With rst
                                .AddNew
                                ![DateTime] = datTimeCheck
                                ![UserName] = strUserID
                                ![FormName] = Screen.ActiveForm.Name
                                ![Action] = UserAction
                                ![RecordID] = Screen.ActiveForm.Controls(IDField).Value
                                ![FieldName] = ctl.ControlSource
                                ![OldValue] = ctl.OldValue
                                ![NewValue] = ctl.Value
                                .Update
                            End With
                        End If
                    End If
                Next ctl
            Case Else
                With rst
                    .AddNew
                    ![DateTime] = datTimeCheck
                    ![UserName] = strUserID
                    ![FormName] = Screen.ActiveForm.Name
                    ![Action] = UserAction
                    ![RecordID] = Screen.ActiveForm.Controls(IDField).Value
                    .Update
                End With
        End Select
    AuditChanges_Exit:
        On Error Resume Next
        rst.Close
        cnn.Close
        Set rst = Nothing
        Set cnn = Nothing
        Exit Sub
    AuditChanges_Err:
        MsgBox Err.Description, vbCritical, "ERROR!"
        Resume AuditChanges_Exit
    End Sub
    Le problème est que ce code ne me renvoi que les modifications ou les ajouts qui ont lieu sur le formulaire actif (Screen.ActiveForm.Controls dans le code) et pas dans les sous-formulaires du formulaire principal. Existe-t-il une syntaxe du genre "Screen.ActiveSubForm.Controls" qui me permettent de modifier mon code afin d'avoir l'audit trail pour tous les sous-formulaires de mon formulaire principal ?

    Merci beaucoup,

    Tagada_or

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 594
    Points : 34 266
    Points
    34 266
    Par défaut
    Salut,

    lorsque tu passes sur un control, regarde son Controltype. Le sous-formulaire retournera une valeur acSubform.
    Il te "suffira" alors de pointer dessus pour "descendre" d'un niveau hiérarchique

    http://www.developpez.net/forums/d72...mulaire-cours/
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Membre à l'essai
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2014
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2014
    Messages : 40
    Points : 18
    Points
    18
    Par défaut
    Bonjour jpcheck,

    Merci pour votre retour, cependant je ne suis pas certaine d'avoir tout compris...

    Citation Envoyé par jpcheck Voir le message
    lorsque tu passes sur un control, regarde son Controltype. Le sous-formulaire retournera une valeur acSubform.
    Je ne comprends pas exactement comment trouver la valeur acSubform, que voulez-vous dire par "passer sur un control" ?


    Citation Envoyé par jpcheck Voir le message
    Il te "suffira" alors de pointer dessus pour "descendre" d'un niveau hiérarchique
    Si j'ai bien compris, il faudra que dans la ligne de mon code se transforme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For Each ctl In Screen.ActiveForm.Controls
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For Each ctl In Screen.ActiveForm.Controls and In "la valeur acSubForm"
    Et de même à chaque fois que Screen.ActiveFrom.Controls apparait dans mon code ?
    Est-ce bien cela ?

    Merci beaucoup,

    Tagada_or

  4. #4
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 594
    Points : 34 266
    Points
    34 266
    Par défaut
    C'est presque ca oui.

    Dans ta boucle tu passerais par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    For Each ctl In Screen.ActiveForm.Controls
    Select Case ctl.ControlType
    Case acSubForm:'code specifique pour le sous-formulaire
    Case Else :'code pour les controls autres
    End Select
    Next
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  5. #5
    Membre à l'essai
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2014
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2014
    Messages : 40
    Points : 18
    Points
    18
    Par défaut
    Bonjour jpcheck,

    Dans le code ci-dessous, quand vous marquez "'code spécifique pour le sous-formulaire et 'code spécifique pour les controls autres", cela signifie recopier l'intégralité de mon code dans chacun des cas ou bien la valeur acSubForm retourner par le sous-formulaire ? (d'ailleurs,je ne sais toujours pas comment trouver cette valeur...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    For Each ctl In Screen.ActiveForm.Controls
    Select Case ctl.ControlType
    Case acSubForm:'code specifique pour le sous-formulaire
    Case Else :'code pour les controls autres
    End Select
    Next
    Merci,

    Tagada_or

  6. #6
    Membre à l'essai
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2014
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2014
    Messages : 40
    Points : 18
    Points
    18
    Par défaut
    Bonjour à tous,

    Malheuresuement, je ne parviens pas à faire fonctionner la solution proposée par jpcheck, et malgré toutes mes recherches, je ne parviens pas à résoudre mon problème, quelqu'un aurait-t-il un solution svp ?

    Merci,

    Tagada_or

  7. #7
    Futur Membre du Club
    Homme Profil pro
    autre
    Inscrit en
    Octobre 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afghanistan

    Informations professionnelles :
    Activité : autre
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2014
    Messages : 3
    Points : 6
    Points
    6
    Par défaut
    Bonjour à tous,

    Après quelques recherches j'ai réussi à obtenir un résultat qui me convient:
    Lors de l'appel à la fonction 'AuditChanges' je passe en paramètres les Controls de mon Sous-Formulaire grâce à 'Me.Controls'

    Voici le code que j'ai pour un de mes sous-formulaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Private Sub Form_BeforeUpdate(Cancel As Integer)
        If Me.NewRecord Then
            Call AuditChanges("NUMPAT", "NEW", Me.Controls)
        Else
            Call AuditChanges("NUMPAT", "EDIT", Me.Controls)
        End If
    End Sub

    Voici le code de AuditChanges modifié:

    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
     
    Sub AuditChanges(IDField As String, UserAction As String, ctls As Controls)
        On Error GoTo AuditChanges_Err
        Dim cnn As ADODB.Connection
        Dim rst As ADODB.Recordset
        Dim ctl As Control
        Dim datTimeCheck As Date
        Dim strUserID As String
        Set cnn = CurrentProject.Connection
        Set rst = New ADODB.Recordset
        rst.Open "SELECT * FROM tblAuditTrail", cnn, adOpenDynamic, adLockOptimistic
        datTimeCheck = Now()
        strUserID = Environ("USERNAME")
        Select Case UserAction
            Case "EDIT"
                For Each ctl In ctls ' !!! Not Screen.ActiveForm.Controls !!!
                    If ctl.Tag = "Audit" Then
                        If Nz(ctl.Value) <> Nz(ctl.OldValue) Then
                            With rst
                                .AddNew
                                ![DateTime] = datTimeCheck
                                ![UserName] = strUserID
                                ![FormName] = Screen.ActiveForm.Name
                                ![Action] = UserAction
                                ![RecordID] = ctls(IDField).Value '!!! Not Screen.ActiveForm.Controls !!!
                                ![FieldName] = ctl.ControlSource
                                ![OldValue] = ctl.OldValue
                                ![NewValue] = ctl.Value
                                .Update
                            End With
                        End If
                    End If
                Next ctl
            Case Else
                With rst
                    .AddNew
                    ![DateTime] = datTimeCheck
                    ![UserName] = strUserID
                    ![FormName] = Screen.ActiveForm.Name
                    ![Action] = UserAction
                    ![RecordID] = ctls(IDField).Value ' !!! Not Screen.ActiveForm.Controls !!!
                    .Update
                End With
        End Select
    AuditChanges_Exit:
        On Error Resume Next
        rst.Close
        cnn.Close
        Set rst = Nothing
        Set cnn = Nothing
        Exit Sub
    AuditChanges_Err:
        MsgBox Err.Description, vbCritical, "ERROR!"
        Resume AuditChanges_Exit
    End Sub

    Voilà, j'espère avoir été au plus clair.

  8. #8
    Membre à l'essai
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2014
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2014
    Messages : 40
    Points : 18
    Points
    18
    Par défaut
    Bonjour Playdo,

    Merci pour ce retour.
    Cependant, mon code d'appel dans mes sous-formulaire diffère légèrement du votre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Form_BeforeUpdate(Cancel As Integer)
        If Me.NewRecord Then
            Call AuditChanges("NUMPAT", "NEW")
        Else
            Call AuditChanges("NUMPAT", "EDIT")
        End If
    End Sub
    De plus, lorsque je modifie mon deuxième argument par "Me.Controls" comme suggéré dans votre code ci-dessous, Access me renvoit l'erreur "Erreur de compilation, argument non facultatif".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Private Sub Form_BeforeUpdate(Cancel As Integer)
        Call AuditChanges("ID", Me.Controls)
    End Sub
    Savez_vous d'où peut venir cet erreur ?

    Merci beaucoup,

    Tagada_or

  9. #9
    Futur Membre du Club
    Homme Profil pro
    autre
    Inscrit en
    Octobre 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afghanistan

    Informations professionnelles :
    Activité : autre
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2014
    Messages : 3
    Points : 6
    Points
    6
    Par défaut
    Bonjour,

    Voir au dessus mon dernier message que j'ai modifié pour coller à votre cas de figure. La fonction 'AuditChanges' prend trois (3) arguments:

    "NUMPAT", "NEW/EDIT" et Me.Controls

    Cordialement.

  10. #10
    Membre à l'essai
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2014
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2014
    Messages : 40
    Points : 18
    Points
    18
    Par défaut
    Bonjour Playdo,

    Merci beaucoup de prendre le temps de me répondre.

    Malheureusement, j'ai essayé le code modifié que vous avez posté et access me renvoi l'erreur suivante : "Erreur de compilation : Nombre d'arguments incorrect ou affectation de propriété incorrecte".

    Il semble que la fonction CALL ne puisse prendre que deux arguments...

    Existe-t-il une autre possibilité ?

    Merci beaucoup,

    tagada_or

  11. #11
    Futur Membre du Club
    Homme Profil pro
    autre
    Inscrit en
    Octobre 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afghanistan

    Informations professionnelles :
    Activité : autre
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2014
    Messages : 3
    Points : 6
    Points
    6
    Par défaut
    Bonjour,

    De mon coté tout fonctionne. je me suis servis de ce topique pour m'orienter car j'avais le même problème avec les sous formulaires.
    il faut bien faire attention à l'appel de la fonction AuditChanges qui doit prendre trois arguments >>> Call AuditChanges("NUMPAT", "NEW", Me.Controls)
    ainsi qu'à la définition de cette fonction qui doit également présenter trois arguments >>> Sub AuditChanges(IDField As String, UserAction As String, ctls As Controls)

    Ensuite il faut bien faire attention de ne pas se mélanger entre la variable ctl qui définit un 'control' et ctls qui est la liste de tout les 'controls' du sous formulaire.

    Ça devrait marcher!

  12. #12
    Membre à l'essai
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2014
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2014
    Messages : 40
    Points : 18
    Points
    18
    Par défaut
    Merci Beaucoup Playdo, cela marche maintenant, il me manquait bien un argument dans la fonction AuditChanges !

    Merci encore !!

    Tagada_or

Discussions similaires

  1. Compter les enr sur un sous-formulaire
    Par popof60 dans le forum Access
    Réponses: 4
    Dernier message: 15/02/2007, 11h40
  2. Eviter MAJ lors de focus sur le sous-formulaire
    Par vcattin dans le forum IHM
    Réponses: 4
    Dernier message: 02/02/2007, 16h49
  3. requery sur le sous-formulaire
    Par @rkane dans le forum Access
    Réponses: 14
    Dernier message: 14/08/2006, 13h37
  4. Réponses: 1
    Dernier message: 11/04/2006, 12h43
  5. Problème d'id sur des sous formulaires.
    Par antier dans le forum Access
    Réponses: 4
    Dernier message: 07/01/2006, 16h53

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