Hallo,
ich erstelle Gerade eine Zeiterfassungsdatenbank.
Es gibt keinen Login, sondern der Nutzer wird durch auslesen des Windows Logins identifiziert.
(Function fosUserName = Windows Username)
Wenn der Nutzer auf den Button frmZeit klickt öffnet sich das Unterformular frmZeit was die Tabelle EZIS in Tabellenform darstellt.
Ich möchte das die Personalnummer der Mitarbeiters automatisch an das Unterformular übergeben wird und nur die Daten mit den Zeiten des Mitarbeiters angezeigt werden.
Wenn ich im ButtonZeiterfassung --> Daten --> Where-Klausel für Navigation: "Personalnummer=PersNr" eingebe öffnet sich ein Fenster in dem ich die PErsonalnummer händisch eingeben muss. Ich möchte das aber gerne automatisch über die Tabelle tblMitarbeiter auslesen und übergeben lassen.
Tabellen:
tblMitarbeiter (Stammdaten)
Anmeldename (Text), Vorname(Text), Nachname(Text), Personalnummer(Zahl)
EZIS: (Zeiten pro Mitarbeiter)
Personalnummer(Zahl), Datum, Anwesenheit (Stunden)
Formulare:
frmNavigation = Navigationsformular (Start, frmZeit, Reports, Admin)
frmZeiterfassung = Tabelle EZIS
Der Button ButZeiterfassung startet das Fomular frmZeit.
Ich habe es auch schon über ein Makro versucht, hat aber nicht geklappt:
Private Sub ButZeiterfassung_Click()
Dim PersNr As Integer
PersNr = DLookup("[MA_Nummer]", "tblMitarbeiter", "[Anmeldename]='" & fOSUserName & "'")
Me.Filter = "Personalnummer Like '" & PersNr & "'"
End Sub
Hallo,
wo soll denn die PERSNR wohl herkommen bzw. genommen werden?!
Versuche es mal mit dem folgenden Kriterium:Anmeldename=Forms!Navigationsformular!login
also mit Bezug auf das Formularfeld mit dem Benutzernamen.
Der sollte dann allerdings gleich beim Öffnen des Formulars dort eingestellt werden.
Hallo,
danke, aber ich habe die Antwort leider nicht ganz verstanden.
Was ich meinte war:
bei klick auf den Button "ButtonZeiterfassung" sollte die Personalnummer über die Tabelle tblMitarbeiter ermittelt werden. Der Login Name ist ja schon bekannt (fosUsername).
z.b. könnte die Abfrage zur Ermittlung der Personalnummer so aussehen:
PersNr = DLookup("[MA_Nummer]", "tblMitarbeiter", "[Anmeldename]='" & fOSUserName & "'")
Danach müsste das Unterfomular ftmZeiterfassung geöffnet und dabei nach "Personalnummer=PersNr" gefiltert werden.
Hallo,
versuche einmal:
Private Sub ButZeiterfassung_Click()
Dim PersNr As Integer
PersNr = DLookup("[MA_Nummer]", "tblMitarbeiter", "[Anmeldename]='" & fOSUserName & "'")
If Not IsNull(PersNr) Then
DoCmd.OpenForm "frmZeiterfassung",,,"Personalnummer=" & PersNr
Else
MsgBox "Personalnummer existiert nicht!"
End If
End Sub
Hallo,
kleiner Hinweis:
Dim PersNr As Variant
und
..."[Anmeldename]='" & fOSUserName() & "'")
falls fOSUserName eine Funktion ist.
Hi,
wenn die PersNr keine Integerzahl ist passt die Where-Klausel auch nicht ???
Tja...
Hmm... :D
Hallo Peter,
vielen Dank das hat super geklappt.
Leider öffnet sich aber beim klicken ein neues Formularfenster und das Formular ist komischerweise nicht mehr in Tabellenformat sondern im Datensatzformat.
Gibt es eine Möglichkeit das Formular innerhalb des Navigationsmenüs zu öffnen ?
So wie im Screenshot DB3.
Danke
Zitat von: ere72070 am Januar 22, 2015, 12:16:01danke, aber ich habe die Antwort leider nicht ganz verstanden.
Was ich meinte war:
stelle das Kriterium der Abfrage für das Unterformular so wie von mir vorgeschlagen ein oder alternativ so:
Anmeldename=fOSUserName()
Das Datenfeld "Anmeldname" muss natürlich in der Datenherkunft der Abfrage enthalten sein.
Eine andere Möglichkeit wäre, ein Hilfsfeld mit folgendem Steuerelementinhalt ins Hauptformular zu setzen:
=DomWert("[MA_Nummer]"; "tblMitarbeiter"; "[Anmeldename]=fOSUserName()")
und sich in der Abfrage darauf zu beziehen.
Danke es hat geklappt !
VBA Navigationsformular:
Dim PersNr As Integer
PersNr = DLookup("[MA_Nummer]", "tblMitarbeiter", "[Anmeldename]='" & fOSUserName & "'")
Forms![frmNavigation]![txtPersNr] = PersNr
Und im Entwufsmodus in Navigationsformular auf das Textfeld verlinken:
WHERE Klausel für Navigation: Personalnummer=txtPersNr
so klappt das im Naviformular.
Besten Dank
OK, das direkte Navigieren zu einem Register eines Navi-Forms sollte auch so gehen
Private Sub ButZeiterfassung_Click()
Dim PersNr As Integer
PersNr = DLookup("[MA_Nummer]", "tblMitarbeiter", "[Anmeldename]='" & fOSUserName & "'")
If Not IsNull(PersNr) Then
'Das Navigationsformular öffnen
DoCmd.OpenForm "frmNavigation"
'zur gewünschten Registerkarte navigieren
DoCmd.BrowseTo ObjectType:=acBrowseToForm, _
ObjectName:="frmZeiterfassung", _
'im Folgenden den Namen des Navigationsunterformulars eintragen,
'wenn du diesen nach der Erstellung geändert hast
PathToSubformControl:="frmNavigation.Navigationsunterformular", _
'Nur Daten der ausgewählten PersNr anzeigen
WhereCondition:="Personalnummer=" & PersNr, _
Page:="", _
DataMode:=acFormEdit
Else
MsgBox "Personalnummer existiert nicht!"
End If
End Sub
probier das bitte mal aus
Hi,
kleine Anmerkung:
Eine Integer-Variable kann nicht den Wert NULL annehmen.
An der Stelle würde es dann knallen, besser also als Variant deklarieren oder NZ() einsetzen.
Hi,
stimmt natürlich, danke für den Nachtrag!
Daher:
Dim PersNr As Variant