1 van 1

Vba ms access bijhouden van gebruikerslog bestand

Geplaatst: do 17 dec 2009, 08:18
door Raspoetin
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:

Code: Selecteer alles

strUsername	 strEchtenaam	 strTime	 strTimeOut	 strMinutesLoggedIn
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)
Verborgen inhoud

Code: Selecteer alles

Public Sub AddUserInList()

Dim dbs As Database

Dim rst As Recordset

Dim strEchteNaam As Variant

Dim strTime As Variant

Set dbs = CurrentDb

Set rst = dbs.OpenRecordset("tblUsersloggedin", dbOpenDynaset)

strEchteNaam = DLookup("[strEchteNaam]", "tblOverview", "[strUsername] = '" & Username2 & "'")

strUsername = Username2

strTime = Format(Now, "dd mmm yyyy hh:mm:ss")

AddNewUserInList rst, strUsername, strEchteNaam, strTime

End Sub

_____________________________________________

Function AddNewUserInList(rstTemp As Recordset, strUsername, strEchteNaam As Variant, strTime As Variant)

With rstTemp

.Addnew

!strUsername = strUsername

!strNaam = strEchteNaam

!strTime = strTime

!strTimeOut = Null

.Update

.Bookmark = .LastModified

End With

End Function


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

Re: Vba ms access bijhouden van gebruikerslog bestand

Geplaatst: ma 21 dec 2009, 00:40
door Nvt

Code: Selecteer alles

Function EnterUserLogInList(rstTemp As Recordset, TimeOut, MinutesLoggedIn As Variant, strTimeOut, StrMinutesLoggedIn As Variant)
Hoe zit het met de parameters TimeOut en strTimeOut, moet er niet iets van type bij staan -> naam As type ?

Re: Vba ms access bijhouden van gebruikerslog bestand

Geplaatst: ma 21 dec 2009, 09:39
door Raspoetin
Die staan toch als variant type aangeduid? strTimeOut as Variant......

Maar misschien begrijp ik je verkeerd.

Re: Vba ms access bijhouden van gebruikerslog bestand

Geplaatst: ma 11 jan 2010, 09:42
door Raspoetin
Verder helemaal niemand die mij helpen kan?

Re: Vba ms access bijhouden van gebruikerslog bestand

Geplaatst: do 14 jan 2010, 10:47
door Raspoetin
Ondanks de 200+ bezichtigingen die mijn vraag heeft getrokken heeft helaas niemand mij kunnen helpen. Na heel wat geklooi ben ik er dan toch zelf achter gekomen (het heeft alleen ruim een maand geduurd :eusa_whistle: ):

Code: Selecteer alles

Public Sub AddUserLog()

Dim dbs As Database

Dim rst As Recordset

Dim FstrTime, FstrUsername, FstrTimeOut, FstrMinutesLoggedIn  As Field

Dim MinutesLoggedIn, strTimeTemp, strTimeOut, CountNumber As Variant

Set dbs = CurrentDb

Set rst = dbs.OpenRecordset("tblUsersloggedin", dbOpenDynaset)





rst.MoveFirst

rst.MoveLast

rst.MoveFirst

rst.MoveLast

CountNumber = 0

Do

MinutesLoggedIn = 0



FstrTimeOut = rst.Fields("strTimeOut")

FstrTime = rst.Fields("StrTime")



strUsernameCheck = rst.Fields("strUsername")

If strUsernameCheck = Username2 And (IsNull(FstrTimeOut) Or FstrTimeOut = "") Then

			CountNumber = CountNumber + 1

			strTimeOut = Format(Now, "dd mmm yyyy hh:mm:ss")

			MinutesLoggedIn = DateDiff("n", FstrTime, Now)

			If CountNumber > 1 Then

			EnterUserLogInList rst, FstrTimeOut, FstrMinutesLoggedIn, strTimeOut, MinutesLoggedIn

			Else:

			EnterUserLogInListWrongLogout rst, FstrTimeOut, FstrMinutesLoggedIn, strTimeOut, MinutesLoggedIn

			End If

		End If

	

rst.MovePrevious

Loop Until rst.BOF = True



Set dbs = Nothing

End Sub

______________________________________________



Function EnterUserLogInList(rstTemp As Recordset, FstrMinutesLoggedIn, FstrTimeOut As Field, strTimeOut, MinutesLoggedIn As Variant)

With rstTemp

	.Edit

	!strMinutesLoggedIn = MinutesLoggedIn

	!strTimeOut = strTimeOut

	.Update

	.Bookmark = .LastModified

End With

End Function

______________________________________________



Function EnterUserLogInListWrongLogout(rstTemp As Recordset, FstrMinutesLoggedIn, FstrTimeOut As Field, strTimeOut, MinutesLoggedIn As Variant)

With rstTemp

	.Edit

	!strMinutesLoggedIn = "Fout Uitgelogd!"

	!strTimeOut = strTimeOut

	.Update

	.Bookmark = .LastModified

End With

End Function