Fehler in Logik bzw. Programmablauf

01/06/2010 - 16:59 von Michael Alexander | Report spam
Hallo!

Ich habe ein "Logprotokoll" in einem Programm, wo die Login-Zeit und -dauer
je User ermittelt und aufgezeichnet wird.

Irgendwo habe ich einen Fehler im Ablauf, bzw. ein unverstàndliches
Verhalten des Code und ich laufe im Kreis und finde das Problem leider
nicht.
Daher ersuche ich Euch um Hilfe.

Gegeben ist eine Tabelle mit folgenden Feldern und Inhalten:

vonDatZeit bisDatZeit User LogInDauer PC Programm
29.05.2010 14:28:10 29.05.2010 14:28:11 x1 0 PC1 RP
29.05.2010 07:13:07 29.05.2010 07:13:10 x2 0 PC1 RP
28.05.2010 15:22:40 28.05.2010 15:22:41 x1 0 PC1 RP


vonDatZeit: Login
bisDatZeit: Logout
LoginDauer: Zeit, die der User eingeloggt war.

So, das Problem ist nun, dass beim Einloggen die bisDatZeit natürlich leer
bleiben muß, die LogInDauer daher Null ist.

Bei nachfolgendem Code wird aber bereits auch die bisDatZeit gesetzt (!) und
die Differenz (LogInDauer ) gerechnet, ich kann aber nicht herausfinden, wo
und warum das überhaupt passiert! Das Feld bisDatZeit in der tbl ist NICHT
auf Jetzt() gestellt!

Weiters ist zu sagen, dass der Code aus einem Anmeldeformular heraus
ausgeführt wird, wo Password-Eingabe und -überprüfung erfolgt, um nach deren
Abhandlung ein Reservierungsformular zu öffnen (diese Teile habe ich der
Übersicht halber aus dem Code gelöscht). Wenn nun ein anderer User sich
einloggen will, dann wird nicht das gesamte Programm geschlossen, sondern
nur das Reservierungsfrm (d.h. auch, dass die Variable 'strUser' bereits
durch das zuvor erfolgte Login belegt ist) und erst durch die Eingaben des
neuen Users im Anmeldeformular wird der strUser neu belegt.

Ich hoffe, das halbwegs klar beschrieben zu haben.

Nach Auswahl des Users und Eingabe des Passwortes klickt man im
Anmeldeformular auf OK:

Private Sub OK_Click()
'On Error GoTo Err_OK_Click
Dim rs As Recordset, rs2 As Recordset, rs3 As Recordset
Dim FindString As String
Dim strOldUser As String

If Len(strUser) > 0 Then
' wird für Logprotokoll gebraucht, strUser kommt aus vorheriger Anmeldung,
bei erster Anmeldung am Tag natürlich leer, strOldUser auch leer
strOldUser = strUser
End If

Set rs = CurrentDb.OpenRecordset("tblUser", dbOpenSnapshot)
FindString = "[Anwender] = '" & Me.Anwender & "'"
rs.FindFirst FindString
intUser = rs("ID") 'UserID dieser Sitzung
strUser = rs("Anwender") 'UserName dieser Sitzung
strUserName = rs("Anwendername") 'voller UserName dieser Sitzung
intBerechtigung = rs("Berechtigung") 'Berechtigungsstufe
strPC = atCNames(2) 'Name des PC


If (strOldUser <> strUser) Then 'bei Userwechsel wird alter eingetragen
If Len(strOldUser) > 0 Then
Call LogProtokollschreiben(strOldUser)
End If
End If

If Len(strUser) > 0 Then 'nach Programmstart, erstmaliges Anlegen des
Logprotokolls für den User
Set rs3 = CurrentDb.OpenRecordset("LogProtokoll", dbOpenDynaset)
rs3.AddNew
rs3("vonDatZeit") = Now
rs3("User") = strUser
rs3("PC") = strPC 'NameOfPC(PCName)
rs3("Programm") = "RP"
rs3.Update
rs3.Close
End If


Set rs = Nothing
Set rs3 = Nothing

DoCmd.OpenForm "frmReservierung", acNormal

DoCmd.Close acForm, Me.Name, acSaveNo

Exit_OK_Click:
Exit Sub

Err_OK_Click:
MsgBox Err.Description
Resume Exit_OK_Click

End Sub

***********
Sub LogProtokollschreiben(User As String)
Dim dbs As Database
Dim rs2 As Recordset
Dim strsql As String

strsql = "SELECT TOP 1 LogProtokoll.vonDatZeit, LogProtokoll.bisDatZeit,
LogProtokoll.User, LogProtokoll.LogInDauer FROM LogProtokoll " _
& "WHERE (((LogProtokoll.User)='" & User & "') AND
((LogProtokoll.bisDatZeit) Is Null) AND ((LogProtokoll.Programm)='RP'))
ORDER BY LogProtokoll.vonDatZeit DESC;"
Debug.Print strsql
Set dbs = CurrentDb()
Set rs2 = dbs.OpenRecordset(strsql, dbOpenDynaset)
If Not rs2.EOF Then
rs2.Edit
rs2("bisDatZeit") = Now
rs2("LogInDauer") = DateDiff("n", rs2("vonDatZeit"), Now)
rs2.Update
rs2.Close
End If
Set rs2 = Nothing

ExitHere:
Exit Sub
HandleErr:
Resume ExitHere
End Sub
********

Durch die Eingabe der bisDatZeit gleich beim Login wird beim Userwechsel
(bzw. beim Beenden des Programms, da wird auch die Sub LogProtokollschreiben
aufgerufen) natürlich kein richtiger Wert mehr eingegeben und keine
LogInDauer berechnet. Warum?

Anm.: Ich habe einen Workarround, indem ich in der Sub in der SQL nicht auf
AND ((LogProtokoll.bisDatZeit) Is Null) abfrage, dann wird nur der letzte DS
genommen und der Wert für bisDatZeit überschrieben, aber mir ist nicht klar,
wo der Fehler steckt.

Danke
Michael

A2k, SP3
 

Lesen sie die antworten

#1 Peter Doering
01/06/2010 - 21:43 | Warnen spam
Hallo,

Michael Alexander wrote:

Ich habe ein "Logprotokoll" in einem Programm, wo die Login-Zeit und -dauer
je User ermittelt und aufgezeichnet wird.

vonDatZeit bisDatZeit User LogInDauer PC Programm
29.05.2010 14:28:10 29.05.2010 14:28:11 x1 0 PC1 RP
29.05.2010 07:13:07 29.05.2010 07:13:10 x2 0 PC1 RP
28.05.2010 15:22:40 28.05.2010 15:22:41 x1 0 PC1 RP

vonDatZeit: Login
bisDatZeit: Logout
LoginDauer: Zeit, die der User eingeloggt war.

So, das Problem ist nun, dass beim Einloggen die bisDatZeit natürlich leer
bleiben muß, die LogInDauer daher Null ist.

Bei nachfolgendem Code wird aber bereits auch die bisDatZeit gesetzt (!)



Ohne jetzt ins Detail zu gehen, warum gehst du ueberhaupt so vor und
schreibst nicht pro Event, also einmal fuer Login und ein zweites mal fuer
den Logout getrennte Datensaetze? Fuer die Auswertung von-bis reicht eine
Abfrage.

Gruss - Peter

Mitglied im http://www.dbdev.org
FAQ: http://www.donkarl.com

Ähnliche fragen