collapse

* Benutzer Info

 
 
Willkommen Gast. Bitte einloggen oder registrieren. Haben Sie Ihre Aktivierungs E-Mail übersehen?

* Wer ist Online

  • Punkt Gäste: 60
  • Punkt Versteckte: 0
  • Punkt Mitglieder: 0

Es sind keine Mitglieder online.

* Forenstatistik

  • stats Mitglieder insgesamt: 13996
  • stats Beiträge insgesamt: 66787
  • stats Themen insgesamt: 9006
  • stats Kategorien insgesamt: 5
  • stats Boards insgesamt: 17
  • stats Am meisten online: 415

Autor Thema: Aktuellen Benutzer abfragen  (Gelesen 5322 mal)

Offline H_Stadler

  • Access-User
  • *
  • Beiträge: 60
Aktuellen Benutzer abfragen
« am: Juli 28, 2015, 15:03:52 »
Hallo zusammen!

Ich bastle mir momentan eine Login-Funktion für meine DB zusammen. Dazu habe ich folgende Anleitung benutzt:
http://www.access-im-unternehmen.de/688
Das funktioniert auch alles super.

Nun würde ich gerne eine Abfrage erstellen, die mir den Benutzernamen des aktuell angemeldeten Nutzers anzeigt. Ich habe den VBA Code im tutorial nicht ganz verstanden, allerdings wird die BenutzerID nach Anmeldung als Optionswert in der tblOptionen gespeichert. Das erfolgt durch diesen Code (Wenn ich das richtig verstehe):

Listing 1: Mit dieser Funktion speichern Sie Optionen in der Tabelle tblOptionen.

Public Function OptionEinstellen(strOptionsname As String, strOptionswert As String) As Boolean

    Dim db As DAO.Database
    Set db = CurrentDb
    db.Execute "UPDATE tblOptionen SET Optionswert = '" & strOptionswert _
    & "' WHERE Optionsname = '" & strOptionsname & "'", dbFailOnError
    If db.RecordsAffected = 1 Then
        OptionEinstellen = True
        Exit Function
    Else
        If db.RecordsAffected > 1 Then
          db.Execute "DELETE FROM tblOptionen WHERE Optionsname = '" _
            & strOptionsname & "'", dbFailOnError
        End If
        db.Execute "INSERT INTO tblOptionen(Optionsname, Optionswert) VALUES('" & strOptionsname _
        & "', '" & strOptionswert & "')", dbFailOnError
        If db.RecordsAffected = 1 Then
            OptionEinstellen = True
            Exit Function
        End If
    End If
End Function
OptionEinstellen "CurrentUserID", 1

Eine Beziehung zwischen den Feldern Optionswert(tblOptionen) und Benutzername(tblBenutzer) kann ich leider nur ohne referentielle Integrität erstellen (Zumal ich mir nicht sicher bin ob das sinnig ist, da keines der beiden Felder ein Primärschlüssel ist...). Erstelle ich also eine Abfrage mit den Feldern "Optionswert"(tblOptionen) und "Benutzername"(tblBenutzer) werden mir alle Benutzernamen und für jeden Benutzer der aktuelle Optionswert angegeben.

Sollte es euch das deutlich einfacher machen, wenn ich einfach die DB anhänge, dann ändere ich schnell die Namen ab und lade die Datei gerne hoch.

Vielen Dank für eure Mühen!
Der_Praktikant
« Letzte Änderung: Juli 28, 2015, 15:16:21 von Der_Praktikant »
LG,
Hubert
 

Offline DF6GL

  • Global Moderator
  • Access-Oberguru
  • *****
  • Beiträge: 23363
Re: Aktuellen Benutzer abfragen
« Antwort #1 am: Juli 28, 2015, 17:44:35 »
Hallo,

ich denke mal, dass in tblOptionen lediglich die akt. Benutzerid "gemerkt" wird, um sie später bei Bedarf zur Verfügung zu haben.... Wegen der Struktur der Optionstabelle ist keine Beziehung zur tblBenutzer möglich.

Um zum Benutzernamen zu kommen, muss zuerst die Benutzerid  (Wert beim Datensatz mit Optionsname = <<unbekannterName>>) ausgelesen werden und danach der Benutzername aus der tblBenutzer geholt werden

etwa so:

dim strBName as String
strBName = dlookup ("Benutzername","tblBenutzer", "Benutzerid = " & Dlookup("OptionsWert","tblOptionen", "Optionsname = '<<unbekannterOptionsname>>'"))


Alternativ kann auch eine Abfrage mit Unterabfrage erzeugt werden....

Offline H_Stadler

  • Access-User
  • *
  • Beiträge: 60
Re: Aktuellen Benutzer abfragen
« Antwort #2 am: Juli 28, 2015, 19:01:23 »
Hallo,

Vielen Dank für die Antwort! Ich probiere das morgen früh sofort aus!

LG
LG,
Hubert
 

Offline H_Stadler

  • Access-User
  • *
  • Beiträge: 60
Re: Aktuellen Benutzer abfragen
« Antwort #3 am: Juli 29, 2015, 08:42:09 »
Guten Morgen!

Leider tue ich mich schwer den Code zu verstehen, den du gepostet hast. Dabei handelt es sich um einen VBA code, richtig? Wenn ja, muss der in ein Modul eingefügt werden?

Über Unterabfragen habe ich mich etwas schlau gemacht, tue mich aber auch hier schwer den richtigen SQL Code zu formulieren. Folgender Versuch scheitert leider...

LG,
Hubert
 

Offline DF6GL

  • Global Moderator
  • Access-Oberguru
  • *****
  • Beiträge: 23363
Re: Aktuellen Benutzer abfragen
« Antwort #4 am: Juli 29, 2015, 09:38:44 »
Hallo,

naja....


<<unbekannterOptionsname>>


ist natürlich nur ein Platzhalter für die Benennung des Benutzerid-Wertes  in tblOptionen. Die hast Du bislang ja nicht genannt.

Was willst Du denn anschliessend mit dem Benutzernamen anfangen?

Allein die Anzeige als Abfrageergebnis bringt es ja auch nicht...

Offline H_Stadler

  • Access-User
  • *
  • Beiträge: 60
Re: Aktuellen Benutzer abfragen
« Antwort #5 am: Juli 29, 2015, 10:28:46 »
Hallo,

Hmm schade!  :D Ich dachte <<unbekannterOptionsname>> sei eine Schreibweise die man in SQL so nutzen kann.

Der Wert BenutzerID ist ein Autowert in tblBenutzer. Der wird dann wie beschrieben in tblOptionen abgerufen. Heißt das also, dass ich den BenutzerID Wert in der Abfrage sozusagen manuell eintragen müsste? Dann würde die Abfrage ja nicht aktualisiert, wenn sich ein anderer Benutzer anmeldet...

Letztlich würde ich gerne in jedem Formular oben rechts den Benutzer, der angemeldet ist vermerken (Siehe Bild). Das geht nur mit dem bei Windows angemeldeten Benutzer relativ einfach (http://www.office-loesung.de/ftopic54751_0_0_asc.php). Dazu habe ich ein Modul eingefügt und lasse mir über die Funktion
=fOSUserName()
den bei Windows angemeldeten Nutzer anzeigen. Sollte aber ein Nutzer von dem PC eines anderen zugreifen wollen ist das natürlich nicht akurat.
Viel wichtiger ist mir dabei allerdings, dass ich für jede Datensatz-Änderung den entsprechenden Nutzer und das Zugriffsdatum aufzeichnen möchte. Hierzu habe ich auch schon eine Möglichkeit gefunden, aber auch nur mit dem Windows User. Dazu soll dann die neue Abfrage erstellt werden, die dann den Benutzernamen abfragt und im Formular anzeigt und bei letztem Zugriff speichert.

Macht das Sinn, wie ich mir das vorstelle oder gibt es da sogar eine naheliegendere/bessere Lösung?
LG,
Hubert
 

Offline MaggieMay

  • Global Moderator
  • Access Guru
  • *****
  • Beiträge: 3109
Re: Aktuellen Benutzer abfragen
« Antwort #6 am: Juli 29, 2015, 12:07:05 »
Hallo,
Die hast Du bislang ja nicht genannt.
OptionEinstellen "CurrentUserID", 1die unbekannte Option heißt also "CurrentUserId".

Allerdings scheint mir das Konstrukt mit den Optionen diesbezüglich etwas umständlich zu sein.
Warum also nicht den Windows-User abfragen?
Zitat
Sollte aber ein Nutzer von dem PC eines anderen zugreifen wollen ist das natürlich nicht akurat.
Willst du den Benutzer oder den PC-Namen auslesen? Natürlich geht auch letzteres, ist aber mAn nichtssagend in diesem Zusammenhang.
Freundliche Grüße
MaggieMay
 

Offline DF6GL

  • Global Moderator
  • Access-Oberguru
  • *****
  • Beiträge: 23363
Re: Aktuellen Benutzer abfragen
« Antwort #7 am: Juli 29, 2015, 13:04:34 »
Hallo,

ich denke, es sollte erst mal das Konzept, bzw. Vorgehensweise der Useranmeldung überdacht werden..

Im akt. Fall kannst Du dies in den Steuerelementinhalt eines Textfeldes schreiben:

= DomWert ("Benutzername";"tblBenutzer"; "Benutzerid = " & nz(Domwert("OptionsWert";"tblOptionen"; "Optionsname = 'CurrentUserId'");0))
Eine Lösung mit einer public-Function ("fktGetLoginUserName") und einer Abfrage (SQL-String) könnte so aussehen:


in einem Standard-Modul:

Public Function fktGetLoginUserName ()
Dim strSQL as String
strSQL = "Select Benutzername from tblBenutzer where BenutzerID in (Select Optionswert from tblOptionen as B where B.Optionsname = 'CurrentUserId') "

fktGetLoginUserName = Currentdb.Openrecordset (strSQL,dbOpenSnapShot)(0)

End Function

Entspr. käme dann in den Steuerelementinhalt eines Form-Textfeldes:

= fktGetLoginUserName ()

Offline H_Stadler

  • Access-User
  • *
  • Beiträge: 60
Re: Aktuellen Benutzer abfragen
« Antwort #8 am: Juli 29, 2015, 13:54:39 »
Hallo!

@Maggie May:
Danke für den Tipp!
Du hast wahrscheinlich absolut Recht und die ganze Geschichte ist recht umständlich, aber da ich mich noch nicht genug auskenne, um eine funktionierende Alternative auf die Beine zu stellen muss es erstmal so gehen...
Außerdem gefällt es mir am besten, wenn ich mich am PC von Mitarbeiter X mit meinen eigenen Anmeldedaten IN Access anmelden kann und dann auch so alles angezeigt bzw. gespeichert werden kann.

@Franz:
Vielen lieben Dank, wiedermal! So macht Access lernen Spaß  ;)
Beide Varianten funktionieren sehr gut. Jetzt muss ich mich nur noch schlau machen und nachvollziehen was die NZ-Funktion bewirkt/bedeutet. Dann kann ich mich daran versuchen den letzten Nutzer und das Zugriffsdatum bei DS-Änderungen zu speichern!
Melde mich dann zurück, ob auch das geklappt hat.

LG vom Niederrhein  ;D
LG,
Hubert
 

Offline H_Stadler

  • Access-User
  • *
  • Beiträge: 60
Re: Aktuellen Benutzer abfragen
« Antwort #9 am: Juli 29, 2015, 14:10:28 »
Hallo nochmal,

Hat schon geklappt!  :) Kann jetzt also beispielsweise in tblGeräte sowohl den User als auch den Zeitpunkt der letzten DS-Änderung festhalten

Falls das irgendwann mal jemandem hilft:
In der entsprechenden Tabelle (Entwurfsansicht) das Feld "LetzterZugriff" als "Datum/Uhrzeit" anlegen. Dann im Register Entwurf ein Datenmakro "vor Änderung" erstellen. Hier dann "FestlegenFeld" auswählen und den Wert mit:
=Jetzt()...bestimmten.
Ähnlich auch für den Benutzer, hier dann ebenfalls Datenmakro "vor Änderung" erstellen und bei "FestlegenFeld" den Code von Franz:
=DomWert("Benutzername";"tblBenutzer";"Benutzerid = " & Nz(DomWert("OptionsWert";"tblOptionen";"Optionsname = 'CurrentUserId'");0))Entsprechend abgeändert einfügen.
Damit sollte es das schon gewesen sein  ;D

Es gibt mit Sicherheit elegantere Lösungen, aber diese hier funktioniert für mich.

LG
LG,
Hubert
 

Offline denni

  • Newbie
  • Beiträge: 3
Re: Aktuellen Benutzer abfragen
« Antwort #10 am: April 28, 2018, 13:14:16 »
Hallo zusammen
Ich habe das gleiche Problem wie H_Stalder nur möchte ich nicht den Benutzernamen sondern Vor und Nachnamen in dem Textfeld angezeigt bekommen.
Versuche mit:
=DomWert("Vorname" & " " & "Nachname";"tblBenutzer";"Benutzerid = " & Nz(DomWert("OptionsWert";"tblOptionen";"Optionsname = 'CurrentUserId'");0))oder auch
=DomWert([Vorname] & " " & [Nachname];"tblBenutzer";"Benutzerid = " & Nz(DomWert("OptionsWert";"tblOptionen";"Optionsname = 'CurrentUserId'");0))Bringen nicht den gewünschten Erfolg.
Ebenso wird im Falle eines Benutzerwechsels durch den ich im aktuellen Formular durch einen Button das Loginformular öffne, das Feld nicht aktualisiert, sondern erst nachdem es neu geöffet wird.

Ziel der ganzen Geschichte ist einerseits Den aktuell angemeldetet Benutzer in den Formularen anzuzeigen und ebenfalls bei einem Bericht die Unterschrift des jeweiligem Benutzer in einem Feld einzufügen. Die Unterschrift ist als OLE Objekt ebenfalls in der tblBenutzer hinterlegt.

Danke für eure Tips
 

Offline Lachtaube

  • Access Guru
  • ****
  • Beiträge: 1261
Re: Aktuellen Benutzer abfragen
« Antwort #11 am: April 28, 2018, 13:46:57 »
Grüße von der (⌒▽⌒)
 

Offline denni

  • Newbie
  • Beiträge: 3
Re: Aktuellen Benutzer abfragen
« Antwort #12 am: April 28, 2018, 14:12:25 »
Siehe Anführungszeichen und Apostrophe.

Hallo Lachtaube

Sorry aber das sagt mir gerade gar nix auch nicht nach mehrmaligem lesen :-(
 

Offline Lachtaube

  • Access Guru
  • ****
  • Beiträge: 1261
Re: Aktuellen Benutzer abfragen
« Antwort #13 am: April 28, 2018, 14:41:43 »
Der Lesbarkeit wegen hier mit Zeilenumbrüchen gepostet:
=DomWert("Vorname & ' ' & Nachname"; "tblBenutzer";
         "Benutzerid = " & Nz(DomWert("OptionsWert"; "tblOptionen";
                                  "Optionsname = 'CurrentUserId'"); 0)
Vermutlich geht's aber auch so:
=DomWert("Vorname & ' ' & Nachname"; "tblBenutzer";
         "Benutzerid = Nz(DLookup('OptionsWert', 'tblOptionen',
                                  'Optionsname = ''CurrentUserId'''), 0)")
Grüße von der (⌒▽⌒)