Supportnet / Forum / Datenbanken
Userverhalten innerhalb der Datenbank
Frage
Hallo zusammen,
Da ich in einem großen Betrieb für diverse Kunden Access DB´s erstelle, ist mir die Idee gekommen, das Userverhalten innerhalb einer Datenbank zu protokollieren, um die Qualität und das Handling der DB zu verbessern. Wie gesagt nur so ne Idee!
Jetzt würde ich gerne noch andere Meinungen dazu hören. Pro und Contra. Wäre nett Eure Meinung dazu zu lesen.
Gruß Ralf
Antwort 1 von RalfH
Bitte nicht alle auf einmal ;-)
Antwort 2 von Gudrun11
Hallo,
ich protokolliere so manches mit, ausgehend von Veränderungen in Formularen.
Im Modul1 - allgemein habe ich mir Routinen geschaffen, die dann von mehreren Formularen benutzt werden können.
Im Formuler:
Private Sub Form_BeforeUpdate(Cancel As Integer)
SetLastModUser (UserName)
SetLastModDate Now()
SetModText ("geändert")
Private Sub Form_AfterUpdate()
Call AddModifiedDataToTable
End Sub
Private Sub Form_AfterDelConfirm(Status As Integer)
Dim ss, sWouldBeDeleted As String
If (Status = vbOKOnly) Then
ss = sWouldBeDeleted & "gelöscht"
ElseIf (Status = vbAbortRetryIgnore) Then
ss = sWouldBeDeleted & "Löschversuch"
End If
SetLastModUser (UserName)
SetLastModDate Now()
SetModText (ss)
In Modul1
Es wird alles in die Tabelle "tblModifiziert" eingetragen, die ich dann zu Berichten verwende.
Public Sub AddModifiedDataToTable()
Dim rsMod As DAO.Recordset
Rem Tabelle beschränken
Dim Limit, LimitU As Long
Limit = 200
LimitU = 100
Set rsMod = CurrentDb.OpenRecordset("tblModifiziert")
rsMod.MoveLast
Rem später aktion hier TODO
If (rsMod.RecordCount > Limit) Then
MsgBox Limit & " modifizierte da "
Dim ii As Integer
For ii = 1 To LimitU
rsMod.MoveFirst
rsMod.Delete
Next ii
End If
With rsMod
.AddNew
!ModDate = DLastModDate
!ModUser = sLastModUser
!ModPersNr = LModPersNr
!ModText = SModText
!ModForm = SModForm
.Update
End With
rsMod.Close
End Sub
In Modul1 Um den Usernamen zu erhalten:
Private Declare Function GetUserName Lib "advapi32.dll" Alias _
"GetUserNameA" (ByVal lpBuffer As String, nSize As Long) _
As Long
Public Function UserName() As String
Dim strName As String
Dim nSize As Long
Dim lngResult As Long
nSize = 100
strName = Space$(100)
lngResult = GetUserName(strName, nSize)
If lngResult <> 0 Then
UserName = Left$(strName, nSize - 1)
End If
End Function
Vielleicht hat ja jemand eine elegantere Lösung. Manchmal ist es nervig, weil z.B. Beim DeleteConfirm Dialog im Formular schon auf den nächsten Datensatz gespringen wird.
Gruß
Gudrun
ich protokolliere so manches mit, ausgehend von Veränderungen in Formularen.
Im Modul1 - allgemein habe ich mir Routinen geschaffen, die dann von mehreren Formularen benutzt werden können.
Im Formuler:
Private Sub Form_BeforeUpdate(Cancel As Integer)
SetLastModUser (UserName)
SetLastModDate Now()
SetModText ("geändert")
Private Sub Form_AfterUpdate()
Call AddModifiedDataToTable
End Sub
Private Sub Form_AfterDelConfirm(Status As Integer)
Dim ss, sWouldBeDeleted As String
If (Status = vbOKOnly) Then
ss = sWouldBeDeleted & "gelöscht"
ElseIf (Status = vbAbortRetryIgnore) Then
ss = sWouldBeDeleted & "Löschversuch"
End If
SetLastModUser (UserName)
SetLastModDate Now()
SetModText (ss)
In Modul1
Es wird alles in die Tabelle "tblModifiziert" eingetragen, die ich dann zu Berichten verwende.
Public Sub AddModifiedDataToTable()
Dim rsMod As DAO.Recordset
Rem Tabelle beschränken
Dim Limit, LimitU As Long
Limit = 200
LimitU = 100
Set rsMod = CurrentDb.OpenRecordset("tblModifiziert")
rsMod.MoveLast
Rem später aktion hier TODO
If (rsMod.RecordCount > Limit) Then
MsgBox Limit & " modifizierte da "
Dim ii As Integer
For ii = 1 To LimitU
rsMod.MoveFirst
rsMod.Delete
Next ii
End If
With rsMod
.AddNew
!ModDate = DLastModDate
!ModUser = sLastModUser
!ModPersNr = LModPersNr
!ModText = SModText
!ModForm = SModForm
.Update
End With
rsMod.Close
End Sub
In Modul1 Um den Usernamen zu erhalten:
Private Declare Function GetUserName Lib "advapi32.dll" Alias _
"GetUserNameA" (ByVal lpBuffer As String, nSize As Long) _
As Long
Public Function UserName() As String
Dim strName As String
Dim nSize As Long
Dim lngResult As Long
nSize = 100
strName = Space$(100)
lngResult = GetUserName(strName, nSize)
If lngResult <> 0 Then
UserName = Left$(strName, nSize - 1)
End If
End Function
Vielleicht hat ja jemand eine elegantere Lösung. Manchmal ist es nervig, weil z.B. Beim DeleteConfirm Dialog im Formular schon auf den nächsten Datensatz gespringen wird.
Gruß
Gudrun
Antwort 3 von RalfH
Hallo Gudrun,
Ich habe so etwas in der Art erstellt aber ich mache mir das ganze einfacher.
Eine Tabelle erstellen= tblLogDatei
Da fülle man ein:
1 Portion EinLogDatum als Datum/Uhrzeit >>>Standartwert= Jetzt()
1 Portion AusLogDatum als Datum/Uhrzeit >>> Beim Schliessen des "Begrüssungs-Formular" (wird geschlossen beim Verlassen der DB) den Now() Wert setzen.
Würze das ganze mit einer Prise
UserName als Text
Bei Standartwert =Umgebung$("Username")
Computername als Text
Bei Standartwert = Umgebung$("Computername")
Und wenn Du möchtest kannste das ganze noch als Logdatei in einer Text Datei ausgeben lassen.
DoCmd.TransferText acExportDelim, "", "Log", "c:\Versuche auf c\Log.txt", False, ""
Jetzt könnte man noch, so als gelangweilter DB Ersteller eine Anfüge-Abfrage erstellen,( diese fügt dann in der tblLogDatei unter Bemerkung etwas an) die dann ausgelöst wird, sobald irgennt etwas auf einem Formular angeklickt wird,
z.B. User versuchte Datum zu ändern.
Ich habe so etwas in der Art erstellt aber ich mache mir das ganze einfacher.
Eine Tabelle erstellen= tblLogDatei
Da fülle man ein:
1 Portion EinLogDatum als Datum/Uhrzeit >>>Standartwert= Jetzt()
1 Portion AusLogDatum als Datum/Uhrzeit >>> Beim Schliessen des "Begrüssungs-Formular" (wird geschlossen beim Verlassen der DB) den Now() Wert setzen.
Würze das ganze mit einer Prise
UserName als Text
Bei Standartwert =Umgebung$("Username")
Computername als Text
Bei Standartwert = Umgebung$("Computername")
Und wenn Du möchtest kannste das ganze noch als Logdatei in einer Text Datei ausgeben lassen.
DoCmd.TransferText acExportDelim, "", "Log", "c:\Versuche auf c\Log.txt", False, ""
Jetzt könnte man noch, so als gelangweilter DB Ersteller eine Anfüge-Abfrage erstellen,( diese fügt dann in der tblLogDatei unter Bemerkung etwas an) die dann ausgelöst wird, sobald irgennt etwas auf einem Formular angeklickt wird,
z.B. User versuchte Datum zu ändern.
Antwort 4 von Gudrun11
Ja, dieses:
Funktioniert bei mir leider nicht. Die Funktion Umgebung wird in Environment übersetzt .. und ist dann unbekannt.
Bei einer Suche im Internet fand ich hier eine Lösung:
http://www.administrator.de/Fehler_%B4environ%B4_bei_Microsoft_Access_XP.html
aber ich möchte hier nicht an der Registry herumschrauben.
Von mir selbst geschriebene Funktionen in einem Modul sind auch unbekannt.
Gudurn
Zitat:
UserName als Text
Bei Standartwert =Umgebung$("Username")
Computername als Text
Bei Standartwert = Umgebung$("Computername")
UserName als Text
Bei Standartwert =Umgebung$("Username")
Computername als Text
Bei Standartwert = Umgebung$("Computername")
Funktioniert bei mir leider nicht. Die Funktion Umgebung wird in Environment übersetzt .. und ist dann unbekannt.
Bei einer Suche im Internet fand ich hier eine Lösung:
http://www.administrator.de/Fehler_%B4environ%B4_bei_Microsoft_Access_XP.html
aber ich möchte hier nicht an der Registry herumschrauben.
Von mir selbst geschriebene Funktionen in einem Modul sind auch unbekannt.
Gudurn
Antwort 5 von RalfH
Hallo Gudrun11,
Was für ne Access Version hast Du denn ?
Gruß Ralf
Was für ne Access Version hast Du denn ?
Gruß Ralf
Antwort 6 von Gudrun11
Hallo,
Ich habe Microsoft Access 2002 SP3.
Gruß Gudrun
Ich habe Microsoft Access 2002 SP3.
Gruß Gudrun
Antwort 7 von RalfH
Vieleicht hilft das weiter
http://www.office-hilfe.com/support/topic,2661,-systemvariable-undq...
Gruß Ralf
http://www.office-hilfe.com/support/topic,2661,-systemvariable-undq...
Gruß Ralf

