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...