Neuigkeiten:

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

Mobiles Hauptmenü

etwas kompliziertere (?) Filterfunktion

Begonnen von ellinho, April 27, 2015, 17:37:29

⏪ vorheriges - nächstes ⏩

ellinho

Hallo zusammen.
Ich möchte in einem Formular, das zum Überprüfen/Editieren von vorhandenen Datensätzen dient, eine Filterfunktion einbauen. Die Tabelle, die zugrunde liegt, enthält die Namen der Mitarbeiter (Vorname, Nachname, Personalnummer) und Abwesenheitszeiträume (Datumvon und Datumbis). Nun würde ich gerne über ein Drop-Down-Menü den Mitarbeiter auswählen und daraufhin einen Zeitraum eingrenzen. Es wäre theoretisch brauchbar, wenn man "Monat" und "Jahr" über Dropdown-Menüs auswählen kann. Beim Klick auf "Suchen" sollten dann sämtliche Datensätze ausgegeben werden, die den ausgewählten Mitarbeiter betreffen und in den ausgewählten Zeitraum fallen. Z.B. wähle ich Mitarbeiter Schmidt aus und habe eine Abwesenheitszeit vom 28.03.2015 bis 03.04.2015 sollte dieser Datensatz sowohl bei der Auswahl von März 2015 als auch bei der Auswahl von April 2015 ausgegeben werden, weil der Abwesenheitszeitraum in beide Monate fällt. Ich hoffe, es ist klar geworden, was umgesetzt werden soll und habt eine Idee, wie sich das realisieren lässt.

el_gomero

Hallo,

Zitat
Nun würde ich gerne über ein Drop-Down-Menü den Mitarbeiter auswählen und daraufhin einen Zeitraum eingrenzen. Es wäre theoretisch brauchbar, wenn man "Monat" und "Jahr" über Dropdown-Menüs auswählen kann.

Du brauchst also mindestens 3 Kombifelder. Das erste beinhaltet die Personendaten, das 2. Monat und Jahr für die Eingrenzung des Zeitraums von und das 3. Monat und Jahr für bis. Als Datenherkunft für die Monat / Jahr Kombis bietet sich eine Hilfstabelle an, die jeweils zB den 1. des Monats ausgibt. Die Anzeige wird mit Hilfe Format in ein taugliches Anzeigeformat ausgegeben.
Gruß
Jürgen


Hilfe nach bestem Wissen, ohne Anspruch auf Richtigkeit und Vollständigkeit.
*feedback erwünscht*
Bitte Tipps lesen

ellinho

Hallo Jürgen.

Danke erstmal für Deine Antwort.
Habe ich das richtig verstanden? Monat und Jahr in jeweils einem Kombifeld? Muss man das nicht immer getrennt auswählen? Für "Deine" Variante hätte ich jetzt mit insgesamt 5 Kombifeldern gerechnet. Hast Du vielleicht auch einen Tipp, wie ich es dann in VBA mit den Befehlen mache?
Bisher war es nur ein ungebundenes Textfeld, dass nach den Nachnamen gefiltert hat.

Private Sub Befehl25_Click()
Me.Filter = "Nachname Like '" & Me!Suchfeld_Nachname & "'"
  Me.FilterOn = True
End Sub

Nun wird es ja doch um einiges komplizierter.
Habe da aktuell allerdings noch keine Idee.
Kannst Du mir da vielleicht ein bißchen auf die Sprünge helfen?

el_gomero

ich denke es wird einfacher, nicht komplizierter. Die Suche nach der Person solltest du aber über die ID lösen. Auch wenn es bei dir (noch) nicht der Fall ist, es kann Personen geben, die den gleichen Vor- und Nachnamen haben. Die Auswahl kann ruhig über die Namen erfolgen, allerdings sollte bei Namensgleichheit ein weiteres Kriterium zur eindeutigen Identifikation zur Verfügung stehen.

Was hast du denn bisher?
Gruß
Jürgen


Hilfe nach bestem Wissen, ohne Anspruch auf Richtigkeit und Vollständigkeit.
*feedback erwünscht*
Bitte Tipps lesen

ellinho

Bisher habe ich nur das, was ich geschrieben habe.
Muss jetzt erst das Textsuchfeld für die Person in ein Kombifeld umwandeln und die Kombifelder mit Monat/Jahr einbauen. Dann geht es ans "Eingemachte". ;)

el_gomero

gut, wenn's beim Einmachen klemmt, melden  ;D
Gruß
Jürgen


Hilfe nach bestem Wissen, ohne Anspruch auf Richtigkeit und Vollständigkeit.
*feedback erwünscht*
Bitte Tipps lesen

ellinho

Vielen Dank.
Ich werde es mal probieren.

ellinho

Ich bin jetzt an folgendem Punkt:
Habe ein Unterformular mit zum Testen mal 4 Textfeldern erstellt und folgenden Code hinterlegt:
Private Sub Form_Load()
RecordSource = "SELECT * FROM Abwesenheit ORDER BY Datumvon"
Text1.ControlSource = "Personalnummer"
Text2.ControlSource = "Datumvon"
Text3.ControlSource = "Datumbis"
Text4.ControlSource = "Abwesenheitsgrund"
End Sub

Somit werden mir im Unterformular schon mal alle Datensätze angezeigt. Nun möchte ich über das Hauptformular die Ausgabe des Unterformulars filtern können. Am liebsten über Kombifelder. Nach Auswahl von Name und Auswahl von Monat und Jahr sollten nach Klick auf eine Schaltfläche "Suchen" alle Datensätze im Unterformular ausgegeben werden, die den Namen betreffen und in den Auswahlzeitraum fallen.(entweder das Datumvon oder das Datumbis). Wenn ich also Mitarbeiter "Schmidt" und "März 2015" auswähle, sollten ein Abwesenheitszeitraum vom 28.02.2015 bis 03.03.2015 genauso angezeigt werden wie ein Abwesenheitszeitraum vom 28.03.2015 bis 04.04.2015. Das Hauptformular bezieht die Daten aus einer Abfrage und holt sich folgende Daten: "Personalnummer", "Vorname", "Nachname", "Datumvon", "Datumbis" und "Abwesenheitsgrund".

In den Ergebnissen im Unterformular sollten dann den ausgewählten Mitarbeiter und Zeitraum betreffenden Abwesenheitszeiten mitsamt des Abwesenheitsgrunds ausgegeben werden.
Was muss ich für einen Code für die Schaltfläche "Suchen" hinterlegen und wie muss ich noch ggfs. den Code für Haupt- bzw. Unterformular anpassen?

MaggieMay

Hallo,

ZitatWenn ich also Mitarbeiter "Schmidt" und "März 2015" auswähle
wenn du das Kombifeld zur Auswahl des Zeitraums um die Spalten "von" und "bis" erweiterst, also bei "Januar 2015" mit den Angaben "1.1.2015" und "31.1.2015", so kannst du die Spalten zum Filtern einsetzen.

Zitatund wie muss ich noch ggfs. den Code für Haupt- bzw. Unterformular anpassen?
An welchen Code denkst du da?
Freundliche Grüße
MaggieMay

ellinho

@MaggieMay
Sorry. Kam ein paar Tage nicht dazu, mich weiter damit zu beschäftigen.
Das ist eine gute Idee mit dem Hinzufügen der Spalten im Kombi bei Auswahl des Monats. Danke dafür. :)
An welchen Code hatte ich gedacht? Ich habe ja im UFO bereits testweise einen Code eingesetzt, mit dem momentan alle Datensätze im UFO angezeigt werden. Muss da nicht auch weiterhin ein Code drin stehen, damit gefilterte Datensätze im Hauptformular in bestimmten Feldern des UFOs angezeigt werden? Habe da einfach nur noch ein Verständnisproblem.  ;)

MaggieMay

#10
Hi,

den Code im Unterformular halte ich für absolut überflüssig. Binde das Unterformular an die Tabelle oder Abfrage und die Textfelder an die Datenfelder. Das dynamische Einstellen von RecordSource und ControlSource wird doch gar nicht benötigt.

Ein Button im Hauptformular könnte dann mit folgendem Code bestückt werden:
Private Sub btn_Filtern_Click()
    Dim strFilter As String
    If [color=blue]IsNull([/color]Me!cboMitarbeiter) Or IsNull(Me!cboMonat) Then
        MsgBox "Bitte erst Person und Monat auswählen!"
    Else
        strFilter = "Personalnummer=" & Me!cboMitarbeiter & " And " & CLng(DateValue(Me!cboMonat.Column(1))) & " Between DatumVon And DatumBis"
        Me!ufControlName.Form.Filter = strFilter
        Me!ufControlName.Form.FilterOn = True
    End If
End Sub


{Edit: Fehlerkorrektur}
Freundliche Grüße
MaggieMay

ellinho

Vielen Dank für Deinen Tipp.
Ich habe es mal etwas modifiziert und nun sieht es folgendermaßen aus:

Private Sub btn_Filtern_Click()
    Dim strFilter As String
    If IsNull(Me!cbo_Mitarbeiter) Or IsNull(Me!cbo_Monat) Then
        MsgBox "Bitte erst Zeitraum auswählen!"
    Else
        strFilter = "Personalnummer=" & Me!cbo_Mitarbeiter.Column(2) & " And " & CLng(DateValue(Me!cbo_Monat.Column(1))) & " Between DatumVon And DatumBis  OR Personalnummer=" & Me!cbo_Mitarbeiter.Column(2) & " And " & CLng(DateValue(Me!cbo_Monat.Column(2))) & " Between Datumvon And DatumBis"
        Me!AbwesenheitloeUF.Form.Filter = strFilter
        Me!AbwesenheitloeUF.Form.FilterOn = True
        End If
    End Sub


Das funktioniert auch soweit klasse. Vielen Dank schon mal.
Mein aktuelles Problem liegt lediglich noch darin, dass bei Öffnen des Formulars sämtliche Datensätze im Unterformular angezeigt werden (am schönsten wäre eigentlich, das UFO würde erst nach Auswahl von Mitarbeiter und Zeitraum überhaupt sichtbar) und der Nachname des ersten Mitarbeiters (Personalnummer 000001) bereits im Dropdown cbo_Mitarbeiter ausgewählt ist. Wähle ich daraufhin einen anderen Mitarbeiter im cbo_Mitarbeiter aus, wird der Nachname der Personalnummer 000001 mit dem Nachnamen des ausgewählten Mitarbeiters überschrieben. (direkt in den Stammdaten in der Tabelle Mitarbeiter)  :(
Idealerweise sollten beide Kombis beim Öffnen des Formulars zunächst leer sein. Bekomme ich nur irgendwie nicht hin. Wahrscheinleich habe ich ein Brett vor dem Kopf.  :-\
Vielleicht hat jemand noch einen kleinen Tipp, der mich wieder auf den richtigen Weg bringt.  8)


MaggieMay

Hi,

das sieht ganz danach aus, als wären die Kombifelder gebunden, das dürfen sie natürlich nicht sein.
Zum Suchen setzt man ungebundene Kombi- oder auch Textfelder ein.

Und was das Unterformular betrifft, das kannst du ja standardmäßig ausblenden und erst beim Filtern über die Visible-Eigenschaft des Steuerelements einblenden.
Freundliche Grüße
MaggieMay

ellinho

Vielen Dank für Deine Hilfe.
Ein Kombi war wirklich gebunden. Nun funktioniert es fast einwandfrei.
Momentan "fange" ich allerdings noch nicht alle Datensätze...das liegt wohl an der Between-Funktion. Wenn ein Zeitraum z.B. vom 11.05.2015 bis 15.05.2015 in der zu filternden Tabelle/Abfrage steht, bekomme ich den nicht angezeigt, weil in der Zeile des Kombifelds in Spalte 1 ja der 01.05.2015 und in Spalte 2 der 31.05.2015 stehen. Diese beiden liegen ja nicht zwischen dem 11.05.2015 und 15.05.2015. Habe schon an die Funktion DatePart gedacht...weiß nur noch nicht, wie ich die Syntax aufbauen soll. Hast Du dazu noch eine Idee?

P.S.: Das mit den z.T. fehlenden Datensätzen ist mir gerade eben beim Testen erst aufgefallen... :-\

MaggieMay

Hallo,
ZitatDiese beiden liegen ja nicht zwischen dem 11.05.2015 und 15.05.2015.
umgekehrt passt's schon eher.

Das mit der Datumsüberprüfung ist ein wenig komplexer, du musst von und bis einzeln prüfen ob es Überschneidungen mit dem Auswahlzeitraum gibt.
Freundliche Grüße
MaggieMay