AuditTrail su dati maschera

di il
16 risposte

AuditTrail su dati maschera

Buongiorno,

nei giorni scorsi mi sono imbattuto in un codice che faceva al caso mio. Dopo averlo applicato e testato un paio di giorni per essere sicuro, ho avuto un'idea malsana. L'idea é quella di modificare il codice per apportare, a parer mio, delle migliorie.

Il codice l'ho trovato su un sito esterno (link: http://www.fontstuff.com/access/acctut21.ht).

La seconda scelta ovviamente fa al caso mio, ovvero, mi permette di sapere se l'azione che é stata eseguita é una modifica, un'edit oppure una cancellazione, niente di più utile.

L'idea però é rapida e, oltre al segnare sulla tabella la USERNAME, ho fatto si che si visualizzasse anche il COMPUTERNAME. Questo torna utile quando si lavora in una rete con un migliaio di computer collegati alla stessa rete lan...

Comunque, ho aggiunto il "nome del computer" e fin qui niente di particolare.
Ora volevo fare una cosa malsana ma che, per necessità mie, mi serve.

Questa tabella tblAuditTrail registra tutte le modifiche ma non le nuove entrate e le cancellazioni.
Il risultato che vorrei ottenere é che mi dica esattamente cosa é stato inserito nei tre casi singoli: cosa viene inserito come dato nuovo nella maschera x, cosa viene modificato nella maschera x e per ultimo, ma non meno importante, cosa viene cancellato nella maschera x.

Le modifiche le registrava gia da sè.
I nuovi dati, ora, tramite una piccola modifica nel codice, vengono registrati.
Mi mancano i dati di un record che viene cancellato, in modo tale che se qualcuno cancella qualcosa, io posso sapere con precisione, non solo da quale maschera ma, anche cosa ha cancellato.

Il codice iniziale lo trovate nel link che ho inserito sopra, il mio attuale é così:

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
    Dim strMachineID As String
    Set cnn = CurrentProject.Connection
    Set rst = New ADODB.Recordset
    rst.Open "SELECT * FROM tblAuditTrail", cnn, adOpenDynamic, adLockOptimistic
    
    datTimeCheck = Now()
    strUserID = Environ("USERNAME")
    strMachineID = Environ("COMPUTERNAME")
     
    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
                            ![MachineName] = strMachineID
                            ![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 "NEW"
            For Each ctl In Screen.ActiveForm.Controls
                If ctl.Tag = "Audit" Then
                    If Nz(ctl.OldValue) = "" Then
                    
                        With rst
                            .AddNew
                            ![DateTime] = datTimeCheck
                            ![UserName] = strUserID
                            ![MachineName] = strMachineID
                            ![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
    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
Spero di non chiedervi la luna se vi chiedo gentilmente un aiuto nel dirmi come diamine possa soddisfare il "Case "DELETE" ", mi servirebbe sapere se almeno é possibile farlo con un codice del genere.
Quale dovrebbe essere la condizione per il caso delle cancellazioni? magari é una cavolata immensa e non ho fatto caso che magari é più semplice di quento pensassi...

16 Risposte

  • Re: AuditTrail su dati maschera

    Scusa ma hai letto attentamente quanto riportato nel link da te indicato ?
    Nella parte finale viene proprio esplicitato come implementare il caso della cancellazione (delete) del record.
  • Re: AuditTrail su dati maschera

    willy55 ha scritto:


    Scusa ma hai letto attentamente quanto riportato nel link da te indicato ?
    Nella parte finale viene proprio esplicitato come implementare il caso della cancellazione (delete) del record.
    Quello ti registra che é stata eseguita una cancellazione ma non ti dice cosa con precisione. Intendo dire che voglio sapere anche quali sono i dati che sono stati cancellati. Sapere che quella determinata azione é stata una cancellazione mi sta bene ma devo sapere anche quali erano i dati della cancellazione... non so se mi spiego

    Se guardi nell'immagine non vedrai quali sono i dati che sono stati cancellati.
    I nuovi dati, ora, li registra senza problemi ma manca la registrazione dei dati che vengono cancellati...
    Cattura.JPG
    Cattura.JPG

    La parte di codice che dici te é questa:
    Private Sub Form_AfterDelConfirm(Status As Integer)
        If Status = acDeleteOK Then Call AuditChanges("EmployeeID", "DELETE")
    End Sub
    ed é vero, va a richiamare una data funzione nel momento in cui viene dato il comando "Si" per poter cancellare. Segnava solo alcuni dati.

    Questo codice:
            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
    vale solo per il caso in cui effettui una modifica.

    Questo, invece, fa gli altri due casi (nuovi dati e cancellazioni):
                With rst
                    .AddNew
                    ![DateTime] = datTimeCheck
                    ![UserName] = strUserID
                    ![FormName] = Screen.ActiveForm.Name
                    ![Action] = UserAction
                    ![RecordID] = Screen.ActiveForm.Controls(IDField).Value
                    .Update
                End With
        End Select
    ma pur avendo provato ad aggiungere i seguenti campi da registrare
                                ![FieldName] = ctl.ControlSource
                                ![OldValue] = ctl.OldValue
                                ![NewValue] = ctl.Value
    mi dava un errore e non registrava più ne le nuove entrate ne le cancellazioni...
  • Re: AuditTrail su dati maschera

    Se vuoi tener traccia di tutti i dati (e non solo l'identificativo ID del record) su cui effettui la cancellazione, puoi :
    - memorizzare tutti i dati attuali (del record cancellato) nella tabella tblAuditTrail ove registri le variazioni apportate (con un ciclo fra tutti gli elementi);
    - accorpare i dati in un campo memo (nella tabella implementata) in modo da avere una traccia di quale era il contenuto;
    - trasferire tutte le informazioni in una tabella con un tracciato per lo storico dei record cancellati;
    - gestire una eliminazione logica (con un campo specifico) in modo che i dati rimangano presenti in tabella ma vengano esclusi dalle selezioni della applicazione quelli cancellati (ma trovati nel caso di audit).
  • Re: AuditTrail su dati maschera

    willy55 ha scritto:


    Se vuoi tener traccia di tutti i dati (e non solo l'identificativo ID del record) su cui effettui la cancellazione, puoi :
    - memorizzare tutti i dati attuali (del record cancellato) nella tabella tblAuditTrail ove registri le variazioni apportate (con un ciclo fra tutti gli elementi);
    Praticamente é quello che vorrei ottenere con questa ulteriore modifica.
    Il problema, però, rimane: se é una modifica, la condizione é una; se é un nuovo valore, la condizione é un'altra.
    A me manca solo la condizione che mi permetta di far si che i dati, prima di essere cancellati, vengano memorizzati nella tabella tblAuditTrail con la dicitura DELETE nella colonna dell'azione. E' la condizione che non riesco a definire. Magari é anche più semplice di quel che penso.
  • Re: AuditTrail su dati maschera

    Per memorizzare tutti i dati del record che viene cancellato dovrai modificare il codice previsto per nuovi inserimenti e cancellazioni e procedere a ciclare i controlli come nel caso di "EDIT", facendo attenzione a non verificare la differenza fra Value ed OldValue (del controllo) e procedere a memorizzare ciascun valore (indipendentemente dal dato presente prima o dopo l’operazione).
    Considera, infatti che nel caso di:
    - nuovo inserimento avrai che la proprietà OldValue non sarà ancora valorizzata e il Value sarà quello appena aggiunto;
    - cancellazione i dati non saranno modificati (in quanto OldValue e Value avranno medesimo valore).
    Quindi verranno memorizzati in tabella (tblAuditTrail) tutti i valori dei controlli nella proprietà Value ed OldValue di ciascuno.
  • Re: AuditTrail su dati maschera

    willy55 ha scritto:


    Per memorizzare tutti i dati del record che viene cancellato dovrai modificare il codice previsto per nuovi inserimenti e cancellazioni e procedere a ciclare i controlli come nel caso di "EDIT", facendo attenzione a non verificare la differenza fra Value ed OldValue (del controllo) e procedere a memorizzare ciascun valore (indipendentemente dal dato presente prima o dopo l’operazione).
    Considera, infatti che nel caso di:
    - nuovo inserimento avrai che la proprietà OldValue non sarà ancora valorizzata e il Value sarà quello appena aggiunto;
    - cancellazione i dati non saranno modificati (in quanto OldValue e Value avranno medesimo valore).
    Quindi verranno memorizzati in tabella (tblAuditTrail) tutti i valori dei controlli nella proprietà Value ed OldValue di ciascuno.
    Per quanto riguarda l'inserimento di nuovi dati ho fatto questo e funziona alla grande, esattamente come dicevo io:
            Case "NEW"
                For Each ctl In Screen.ActiveForm.Controls
                    If ctl.Tag = "Audit" Then
                        If Nz(ctl.OldValue) = "" Then
                        
                            With rst
                                .AddNew
                                ![DateTime] = datTimeCheck
                                ![UserName] = strUserID
                                ![MachineName] = strMachineID
                                ![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
    Per quanto riguarda le cancellazioni ho fatto questo ma non funziona esattamente come dovrebbe:
            Case "DELETE"
                For Each ctl In Screen.ActiveForm.Controls
                    If ctl.Tag = "Audit" Then
                        If Nz(ctl.OldValue) = Nz(ctl.Value) Then
                            With rst
                                .AddNew
                                ![DateTime] = datTimeCheck
                                ![UserName] = strUserID
                                ![MachineName] = strMachineID
                                ![FormName] = Screen.ActiveForm.Name
                                ![Action] = UserAction
                                ![RecordID] = Screen.ActiveForm.Controls(IDField).Value
                                ![FieldName] = ctl.ControlSource
                                ![OldValue] = ctl.OldValue
                                .Update
                            End With
                          End If
                        End If
                Next ctl
    
    Il secondo codice, dovrebbe memorizzare i dati esattamente come fa il codice per i nuovi inserimenti ma non capisco dove sia l'errore... sarà che é tutto il giorno che ci sto dietro...

    Se guardi nell'immagine capisci cosa intendo dire.
    Cattura.JPG
    Cattura.JPG

    Come puoi vedere l'inserimento funziona, la cancellazione solo parzialmente.
  • Re: AuditTrail su dati maschera

    Si nota nella ultima immagine allegata che nella operazione di cancellazione manca il dato del RecordID ed i valori per le proprietà di Value e OldValue.
    Inoltre, per ciascuna azione ("EDIT", "NEW", "DELETE") viene memorizzata una sola operazione, come se un unico controllo (“Note”) venisse trattato.
    Da considerare che, qualora vi fossero più controlli trattati, con l’operazione di "EDIT" si avrebbe il dato di ciascun controllo aggiornato mentre per le operazioni "NEW" e "DELETE" si avrebbe l’elenco di tutti i controlli trattati.
    Inoltre (in base alla logica del codice originario) per identificare i controlli da trattare si agisce sulla proprietà "Tag" ponendolo al valore "Audit" (come riportato nel documento originario, al punto "Specifying Which Fields to Check").
    Quindi in base alla logica, è da verificare, nella maschera, che i controlli interessati abbiano nella finestra delle proprietà (ultimo nella serie) il "Tag" pari a "Audit" ed agire con il debug per seguire l'evoluzione del codice, al fine di determinare la condizione per la quale non si effettua la memorizzazione del dato interessato.
  • Re: AuditTrail su dati maschera

    Si nota nella ultima immagine allegata che nella operazione di cancellazione manca il dato del RecordID ed i valori per le proprietà di Value e OldValue.
    E' ciò che dovrei ottenere e non capisco perché non va, son qui proprio per questo...
    per ciascuna azione ("EDIT", "NEW", "DELETE") viene memorizzata una sola operazione, come se un unico controllo (“Note”) venisse trattato.
    In questo caso specifico si, é un solo controllo. In altre maschere vengono memorizzati molti più controlli con il singolo valore del campo in questione.
    Inoltre (in base alla logica del codice originario) per identificare i controlli da trattare si agisce sulla proprietà "Tag" ponendolo al valore "Audit" (come riportato nel documento originario, al punto "Specifying Which Fields to Check").
    Infatti, ho impostato il tag su tutti i controlli che mi interessavano e funzionano perfettamente.
    agire con il debug per seguire l'evoluzione del codice, al fine di determinare la condizione per la quale non si effettua la memorizzazione del dato interessato.
    Come si fa esattamente il debug? nel senso, consiste nell'apertura dell'editor di vba o c'é una procedura molto più specifica? hai un link con una guida per caso? chiedo prima di iniziare a fare ricerche senza trovare esattamente quello che intendi te.
  • Re: AuditTrail su dati maschera

    Paveyard ha scritto:


    Come si fa esattamente il debug?
  • Re: AuditTrail su dati maschera

    gibra ha scritto:


    Paveyard ha scritto:


    Come si fa esattamente il debug?
    Non so perché ma non scarica nulla... ho trovato questo e credo sia lo stesso, almeno spero.


    Comunque ho iniziato a leggerlo e c'é già un problema: ciò che dovrei modificare é il codice nel modulo ed é una sub, che secondo quello che dice il "manuale" non si può richiamare nella finestra immediata e quindi vedere effettivamente cosa fa la funzione.
    Cosa posso fare tanto per iniziare? cambio le sub? se si, con cosa?
  • Re: AuditTrail su dati maschera

    Dimenticavo di dirti che il link che ti salva lo devi rinominare in ZIP.
    Il file contenuto è un semplice PDF.
  • Re: AuditTrail su dati maschera

    Paveyard ha scritto:


    gibra ha scritto:


    Paveyard ha scritto:


    Come si fa esattamente il debug?
    Non so perché ma non scarica nulla... ho trovato questo e credo sia lo stesso, almeno spero.


    Comunque ho iniziato a leggerlo e c'é già un problema: ciò che dovrei modificare é il codice nel modulo ed é una sub, che secondo quello che dice il "manuale" non si può richiamare nella finestra immediata e quindi vedere effettivamente cosa fa la funzione.
    Cosa posso fare tanto per iniziare? cambio le sub? se si, con cosa?
    Che manuale hai letto...? Se è il mio Tutorial fammi vedere dove...!!!
    Se metti BreackPoint funziona... ma almeno PROVA prima...
  • Re: AuditTrail su dati maschera

    @Alex ha scritto:


    Paveyard ha scritto:


    gibra ha scritto:




    Comunque ho iniziato a leggerlo e c'é già un problema: ciò che dovrei modificare é il codice nel modulo ed é una sub, che secondo quello che dice il "manuale" non si può richiamare nella finestra immediata e quindi vedere effettivamente cosa fa la funzione.
    Cosa posso fare tanto per iniziare? cambio le sub? se si, con cosa?
    Che manuale hai letto...? Se è il mio Tutorial fammi vedere dove...!!!
    Se metti BreackPoint funziona... ma almeno PROVA prima...
    Questo qui: **
    Non sei mica tu??

    Per la funzione che mi hai dato, grazie mille... oggi quando torno a casa provo immediatamente.

    Per

    gibra ha scritto:


    Dimenticavo di dirti che il link che ti salva lo devi rinominare in ZIP.
    Il file contenuto è un semplice PDF.
    Ehm, il problema é che non mi scarica proprio nulla di ciò che dici...
    Cattura.PNG
    Cattura.PNG


    Aggiornamento--------------------------------------------------

    X Alex: ho dato un'occhiata al breakpoint... é quello di cui parli nella teoria del debug che serve per poter stoppare la funzione in un dato punto per poterla analizzare, giusto?
  • Re: AuditTrail su dati maschera

    Paveyard ha scritto:


    Ehm, il problema é che non mi scarica proprio nulla di ciò che dici...
    Non è così.
    Devi salvare il file UpdateDWN.asp_IdFAQ=298 con un nuovo nome, esempio DEBUG.ZIP
Devi accedere o registrarti per scrivere nel forum
16 risposte