Vba ms access bijhouden van gebruikerslog bestand
Geplaatst: do 17 dec 2009, 08:18
Ik heb een probleempje met VBA in Access en ik loop er nu al dagen mee te klooien, en toch blijf ik mijn fout maar niet zien. Het gaat om het volgende. Ik heb een database gemaakt, waarin elke keer als een gebruiker inlogt, zijn naam + inlogtijd in een tabel worden bijgeschreven. Gegevens tabel:
tblUserloggedIn met daarin de volgende fields:
Alle bovenstaande fields zijn tekst gebaseerd.
Wanneer iemand inlogt met zijn Username, wordt in de database opgezocht wat zijn echte naam is, en deze twee namen worden dan in de tabel bijgeschreven, samen met de tijd/datum van inloggen. Dit werkt voor zover. De code voor deze handeling is hierachter als verborgen inhoud gegeven omdat ik hier dus géén problemen mee heb (Username2 is een public constant die gelijk is aan de username van de gebruiker)
Echter, nu zou ik willen bijhouden wanneer mensen uitloggen, en hoe lang ze ingelogd zijn. En laat ik hier nou problemen mee hebben. Mijn wens: Op het moment dat de gebruiker bij de vraag "Weet u zeker dat u wilt uitloggen" op de knop "Ja" drukt, moet er in tblUsersLoggedIn het record opgezocht worden waarin het field strUsername gelijk is aan de username van de gebruiker, dan de tijd van dat moment (Now) bijschrijven in het field strTimeOut, vervolgens moet er berekend worden hoeveel minuten er zijn verstreken tussen strTime en strTimeOut en dat moet dan weer weggeschreven worden in het field strMinutesLoggedIn.
Een bijkomend probleem is dat een gebruiker meerdere keren na elkaar kan in/uitloggen, en dat de lijst niet wordt leeggehaald (behalve als ik dat als beheerder doe). Het komt dus voor dat een bepaalde gebruikersnaam meerdere keren in de lijst staat. Het is uiteraard de bedoeling dat records waar al een waarde voor strTimeOut staat, deze niet veranderd wordt (dit zijn "oude" records die correct zijn ingevuld, oftewel het UserLog).
Een laatste probleem: De Access database speelt zich af in een maximized window, zodat gebruikers geen ander window te zien krijgen dan dat van mij. Ik "dwing" gebruikers dus om via de correcte manier uit te loggen (zoals ik het voor ogen heb). Echter, het kan voorkomen dat een gebruiker via taakbeheer Access afsluit zodat geen waarde wordt bijgeschreven voor strTimeOut. Als de gebruiker de volgende keer inlogt, wordt zijn username weer in de tabel strUsersLoggedIn opgenomen. Er zijn op dat moment twee records in de tabel met dezelfde username, en waarbij voor beide records geen strTimeOut is ingevuld. Dit gebeurt uiteraard pas op het moment van uitloggen van de gebruiker. Het zou helemaal mooi zijn, als er bij het oudste record in het field strTimeOut "Foutief Uitgelogd" komt te staan (of iets dergelijks).
Goed, ik hoop dat de bedoeling een beetje duidelijk is (ik heb het zo uitgebreid mogelijk proberen op te schrijven), maar als iets niet helemaal duidelijk is hoor ik het graag. Nog een laatste opmerking: Ik heb mijzelf VBA geleerd en ik begrijp best dat alles efficiënter of handiger geprogrammeerd kan worden. Bij voorbaat excuses voor mijn programmeerkunsten :eusa_whistle: .
Nu last but not least, de code zoals ik hem heb uitgevogeld (maar dus niet werkt (sterker nog, het programma komt in een loop of slaat vast)):
tblUserloggedIn met daarin de volgende fields:
Code: Selecteer alles
strUsername strEchtenaam strTime strTimeOut strMinutesLoggedIn
Wanneer iemand inlogt met zijn Username, wordt in de database opgezocht wat zijn echte naam is, en deze twee namen worden dan in de tabel bijgeschreven, samen met de tijd/datum van inloggen. Dit werkt voor zover. De code voor deze handeling is hierachter als verborgen inhoud gegeven omdat ik hier dus géén problemen mee heb (Username2 is een public constant die gelijk is aan de username van de gebruiker)
Verborgen inhoud
Echter, nu zou ik willen bijhouden wanneer mensen uitloggen, en hoe lang ze ingelogd zijn. En laat ik hier nou problemen mee hebben. Mijn wens: Op het moment dat de gebruiker bij de vraag "Weet u zeker dat u wilt uitloggen" op de knop "Ja" drukt, moet er in tblUsersLoggedIn het record opgezocht worden waarin het field strUsername gelijk is aan de username van de gebruiker, dan de tijd van dat moment (Now) bijschrijven in het field strTimeOut, vervolgens moet er berekend worden hoeveel minuten er zijn verstreken tussen strTime en strTimeOut en dat moet dan weer weggeschreven worden in het field strMinutesLoggedIn.
Een bijkomend probleem is dat een gebruiker meerdere keren na elkaar kan in/uitloggen, en dat de lijst niet wordt leeggehaald (behalve als ik dat als beheerder doe). Het komt dus voor dat een bepaalde gebruikersnaam meerdere keren in de lijst staat. Het is uiteraard de bedoeling dat records waar al een waarde voor strTimeOut staat, deze niet veranderd wordt (dit zijn "oude" records die correct zijn ingevuld, oftewel het UserLog).
Een laatste probleem: De Access database speelt zich af in een maximized window, zodat gebruikers geen ander window te zien krijgen dan dat van mij. Ik "dwing" gebruikers dus om via de correcte manier uit te loggen (zoals ik het voor ogen heb). Echter, het kan voorkomen dat een gebruiker via taakbeheer Access afsluit zodat geen waarde wordt bijgeschreven voor strTimeOut. Als de gebruiker de volgende keer inlogt, wordt zijn username weer in de tabel strUsersLoggedIn opgenomen. Er zijn op dat moment twee records in de tabel met dezelfde username, en waarbij voor beide records geen strTimeOut is ingevuld. Dit gebeurt uiteraard pas op het moment van uitloggen van de gebruiker. Het zou helemaal mooi zijn, als er bij het oudste record in het field strTimeOut "Foutief Uitgelogd" komt te staan (of iets dergelijks).
Goed, ik hoop dat de bedoeling een beetje duidelijk is (ik heb het zo uitgebreid mogelijk proberen op te schrijven), maar als iets niet helemaal duidelijk is hoor ik het graag. Nog een laatste opmerking: Ik heb mijzelf VBA geleerd en ik begrijp best dat alles efficiënter of handiger geprogrammeerd kan worden. Bij voorbaat excuses voor mijn programmeerkunsten :eusa_whistle: .
Nu last but not least, de code zoals ik hem heb uitgevogeld (maar dus niet werkt (sterker nog, het programma komt in een loop of slaat vast)):
Code: Selecteer alles
Public Sub AddUserLog()
Dim dbs As Database
Dim rst As Recordset
Dim UsernameCheck, TimeOut, TimeOutCheck, MinutesLoggedIn, Time, Naam As Variant
Dim strTime, strNaam, strTimeOut, StrMinutesLoggedIn As Field
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("tblUsersloggedin", dbOpenDynaset)
TimeOut = Format(Now, "dd mmm yyyy hh:mm:ss")
Time = rst.Fields("strTime")
TimeOutCheck = rst.Fields("StrTimeOut")
UsernameCheck = rst.Fields("StrUsername")
MinutesLoggedIn = DateDiff("n", Time, Now)
rst.MoveFirst
rst.MoveLast
rst.MoveFirst
Do While rst.EOF = False
If UsernameCheck = Username2 And (IsNull(TimeOutCheck) Or TimeOutCheck = "") Then
EnterUserLogInList rst, TimeOut, MinutesLoggedIn, strTimeOut, StrMinutesLoggedIn
rst.MoveNext
End If
Loop
Set dbs = Nothing
End Sub
____________________________________________
Function EnterUserLogInList(rstTemp As Recordset, TimeOut, MinutesLoggedIn As Variant, strTimeOut, StrMinutesLoggedIn As Variant)
With rstTemp
.Edit
!StrMinutesLoggedIn = MinutesLoggedIn
!strTimeOut = TimeOut
.Update
.Bookmark = .LastModified
End With
End Function