Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Navigationsformular - Where Klausel für Navigation - per Variable ansteuern

Begonnen von ere72070, Januar 22, 2015, 10:29:26

⏪ vorheriges - nächstes ⏩

ere72070

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



MaggieMay

Hallo,

wo soll denn die PERSNR wohl herkommen bzw. genommen werden?!

Versuche es mal mit dem folgenden Kriterium:Anmeldename=Forms!Navigationsformular!loginalso mit Bezug auf das Formularfeld mit dem Benutzernamen.

Der sollte dann allerdings gleich beim Öffnen des Formulars dort eingestellt werden.
Freundliche Grüße
MaggieMay

ere72070

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.


database

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


DF6GL

Hallo,


kleiner Hinweis:

Dim PersNr As Variant

und

..."[Anmeldename]='" & fOSUserName() & "'")

falls fOSUserName eine Funktion ist.

database

Hi,
wenn die PersNr keine Integerzahl ist passt die Where-Klausel auch nicht  ???



ere72070

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


MaggieMay

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.
Freundliche Grüße
MaggieMay

ere72070

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



database

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

MaggieMay

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.
Freundliche Grüße
MaggieMay

database

Hi,
stimmt natürlich, danke für den Nachtrag!

Daher:
Dim PersNr As Variant