Springen naar inhoud

Vba ms access bijhouden van gebruikerslog bestand


  • Log in om te kunnen reageren

#1

Raspoetin

    Raspoetin


  • >1k berichten
  • 3514 berichten
  • VIP

Geplaatst op 17 december 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:
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
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)):
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
I'm not suffering from insanity - I'm enjoying every minute of it!!

Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.

#2

Nvt

    Nvt


  • >25 berichten
  • 99 berichten
  • Ervaren gebruiker

Geplaatst op 21 december 2009 - 00:40

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 ?

Veranderd door Nvt, 21 december 2009 - 00:41


#3

Raspoetin

    Raspoetin


  • >1k berichten
  • 3514 berichten
  • VIP

Geplaatst op 21 december 2009 - 09:39

Die staan toch als variant type aangeduid? strTimeOut as Variant......
Maar misschien begrijp ik je verkeerd.
I'm not suffering from insanity - I'm enjoying every minute of it!!

#4

Raspoetin

    Raspoetin


  • >1k berichten
  • 3514 berichten
  • VIP

Geplaatst op 11 januari 2010 - 09:42

Verder helemaal niemand die mij helpen kan?
I'm not suffering from insanity - I'm enjoying every minute of it!!

#5

Raspoetin

    Raspoetin


  • >1k berichten
  • 3514 berichten
  • VIP

Geplaatst op 14 januari 2010 - 10:47

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: ):
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

Veranderd door Raspoetin, 14 januari 2010 - 10:48

I'm not suffering from insanity - I'm enjoying every minute of it!!





0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures