Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Problem mit Suchmaske

Begonnen von Carlos_C, Juni 10, 2015, 16:50:18

⏪ vorheriges - nächstes ⏩

Carlos_C

Guten Tag liebes Forum,

Ich bin dabei, ein Suchformular in meiner Datenbank einzurichten und stoße gerade mit einem Problem.

Also, vom Anfang:

Ich habe eine Tabelle Namens tblBerichte, wo die Stammdaten meiner Testberichten eingetragen werden. Unter anderen Felder gibt es in dieser Tabelle die Felder BerichtNummer, lngPruefer und lngTest. Das Feld BerichtNummer ist nicht der Primärschlüssel, sondern ein Feld Namens IDBericht.

Ins Feld BerichtNummer kommt eine laufende Nummer von 1001 bis 9999.

Die Tabelle tblPruefer (bestehend aus Feldern IDPruefer, Vorname und Nachname) ist die Basis für die Abfrage qryPruefer (bestehend aus Feldern IDPruefer und GanzerName (GanzerName: [Vorname] & " " & [Nachname])).

In der Entwurfsansicht der Tabelle tblBerichte, bei Felddatentyp des Felds lngPruefer, in die Registerkarte Nachschlagen, habe ich folgendes eingegeben (u.a.):

Steuerelement anzeigen: Kombinationsfeld
Herkunfstyp: Tabelle/Abfrage
Datensatzherkunft: qryPruefer
Gebundene Spalte: 1
Spaltenanzahl: 2
Spaltenbreiten: 0; 3
Nur Listeneinträge: Ja
Mehrere Werte zulassen: Nein (da ein Bericht von NUR EINEM PRUEFER gemacht werden kann).

Die Tabelle tblPTests (bestehend Feldern IDTest, TestNummer, Testname) ist die Basis für die Abfrage qryTests (bestehend aus Feldern IDTest und TestNummerUndName (TestNummerUndName: [TestNummer] & " " & [TestName])).

In der Entwurfsansicht der Tabelle tblBerichte, bei Felddatentyp des Felds lngTest, in die Registerkarte Nachschlagen, habe ich folgendes eingegeben (u.a.):

Steuerelement anzeigen: Kombinationsfeld
Herkunfstyp: Tabelle/Abfrage
Datensatzherkunft: qryTests
Gebundene Spalte: 1
Spaltenanzahl: 2
Spaltenbreiten: 0; 3
Nur Listeneinträge: Ja
Mehrere Werte zulassen: Ja (da in einem Bericht mehrere Tests gemacht werden können).

Der Unterschied zwischen den Feldern Prüfer und Test ist dann nur, dass bei Prüfer nur ein Wert eingegeben werden kann (da pro Bericht NUR 1 PRÜFER) und bei Tests mehrere Werte eingegeben werden können (da pro Bericht mehrere Tests möglich).

Jetzt bin ich dabei ein Suchformular einzurichten, und zwar mit Haupt- und Unterformular.

Im Hauptformular habe ich (u.a.) 3 Felder: BerichtNummer., Pruefer und Tests. Das Hauptformular hat als Datenquelle die Tabelle tblBerichte. Das Feld BerichtNummer ist ein Kombinationsfeld und basiert auf die Abfrage qryBerichtNummer, die auf die Tabelle tblBerichte basiert (Feld Berichtnummer). Das Feld Pruefer ist ein Kombinationsfeld und basiert auf die Abfrage qryPruefer. Das Feld Tests basiert auf das Feld lngTest der Tabelle tblBerichte (hier habe ich unter ,,Entwurf/Vorhandene Felder hinzufügen" das Feld lngTest ins Formular geschoben.

Im Unterformular sollen die Ergebnisse angezeigt werden von was ich in die 3 Felder im Hauptformular eingegeben habe. Das Unterformular basiert auf die Abfrage qryBerichte. qryBerichte basiert auf die Tabelle tblBerichte und zeigt (u.a.) die Felder BerichtNummer, lngPruefer und lngTest.

In der Abfrage qryBerichte (das Unterformular basiert auf diese Abfrage), unter BerichtNummer / Kriterien, habe ich folgendes eingegeben:

Wie Nz([forms]![frmHauptformular]![Kombinationsfeld53];"*")

Das Kombinationsfeld 53 ist das Feld BerichtNummer. Diese NZ-Funktion macht (wenn ich es richtig verstanden habe), dass, wenn ins Feld BerichtNummer im Hauptformular nichts eingegeben wird, alle Berichte gezeigt werden, egal ob unter BerichtNummer nichts oder irgendwas eingegeben wurde.

Wenn man das Suchformular öffnet, werden im Unterformular erstmal alle Berichte gezeigt. So ist es richtig.

Nachdem ich in ein, zwei oder alle drei Felder des Hauptformulars (BerichtNummer, Pruefer, Tests) Suchkriterien eingebe, soll nach Knopfdruck auf eine Schaltfläche die Ergebnisse im Unterformular angezeigt werden, die zu meinen Suchkriterien passen.

Ich habe eine Schaltfläche eingerichtet und folgendes Code eingegeben (Ereignis beim Klicken):

Private Sub Befehl55_Click()

On Error GoTo Err_Befehl55_Click


    DoCmd.DoMenuItem acFormBar, acRecordsMenu, 5, , acMenuVer70

Exit_Befehl55_Click:
    Exit Sub

Err_Befehl55_Click:
    MsgBox Err.Description
    Resume Exit_Befehl55_Click


End Sub

Für das Feld BerichtNUmmer habe ich das Problem mit dem Suchformular gelöst. Aber für die Felder Pruefer und Tests weiß ich nicht, wie ich das lösen kann.

Wenn ich die NZ-Funktion in der Abfrage qryBerichte unter lngPruefer / Kriterien eingebe, passiert folgendes:

Wenn ich unter Pruefer (im Hauptformular) nichts eingebe, kommen im Unterformular als Ergebnis alle Berichte, wo unter Prüfer nichts eingetragen wurde. Also die NZ-Funktion funktioniert hier nicht, was logisch ist, da das Feld Pruefer mit dem ID des Prüfers verbunden ist, nicht mit dem Namen des Prüfers. Wenn ich im Eigenschaftblatt des Felds Pruefer unter ,,Daten / Nur Listeneinträge" das Wert ,,Nein" eingeben möchte, meckert das System, also es geht nicht.

Wie kann ich dieses Problem am besten lösen? Und zwar für das Feld Pruefer und für das Feld Tests.

Ich freue mich auf jeden Vorschlag!

LG

Carlos
Gruß,

Carlos

MaggieMay

Hallo Carlos,

es wäre wohl einfacher, wenn du eine kleine Beispiel-DB mit ein paar Testdaten hochladen würdest, an der man sich das alles mal mit eigenen Augen ansehen kann.
Freundliche Grüße
MaggieMay

Carlos_C

Hallo MaggieMay,

anbei eine Beispiel Datenbank. Im Formular frmBerichtsuche hast Du die Felder ,,Bericht Nr.", ,,Prüfer" und ,,Tests". Wenn Du das Formular öffnest, siehst Du, dass das Unterformular alle Daten anzeigt. Wenn Du eine Bericht Nr. wählst und auf ,,Berichte suchen!" klickst, zeigt das Unterformular nur den gewählten Bericht. Wenn Du das Feld ,,Bericht Nr." wieder leer machst und wieder auf ,,Berichte suchen!" klickst, zeigt das Unterformular alle Berichte.

Also mit dem Thema ,,Bericht Nr." ist das Problem gelöst. Jetzt habe ich das Problem mit den Feldern ,,Prüfer" und ,,Tests". Das Feld ,,Prüfer" ist ein Kombifeld, dass auf die Abfrage qryMitarbeiterNamenSortiert basiert. Das Feld ,,Tests" basiert auf das Feld ,,lngTest" der Tabelle tblBerichte.

Mit den Feldern ,,Prüfer" ,,Berichte" möchte ich das Selbe wie mit dem Feld ,,Bericht Nr." verwirklichen. Also wenn ich was eingebe und auf ,,Berichte suchen!" klicke, sollen die Ergebnisse des U-Formulars nach den Suchkriterien im Hauptformular gezeigt weden. Wenn ich z.B. das Feld ,,Prüfer" wieder leer mache und wieder auf ,,Berichte suchen!" klicke, soll das Unterformular Berichte u.a. nach dem Kriterium ,,Prüfer = *" suchen. Das gleiche mit dem Feld Tests.

Ich freue mich auf jeden Vorschlag!

LG

Carlos
Gruß,

Carlos

MaggieMay

Hallo,

wie willst du die Suche nach den Tests gestalten, genügt es nach einem Test zu suchen oder soll auch eine Kombination (=Und-Verknüpfung) möglich sein oder eine Mehrfachauswahl mit Oder-Verknüpfung?

Der einfachste Fall ist natürlich der erste. Du kannst dir das vorläufige Ergebnis schon mal anschauen, das ist jetzt erstmal nur ein Schubs in die richtige Richtung. Das Unterformular wird nun nach Änderung eines der Felder gefiltert, eine Kombination der Suchfelder wird (noch) nicht unterstützt. Der Such-Button ist jetzt ohne Funktion und daher ausgeblendet.
Freundliche Grüße
MaggieMay

Carlos_C

Hallo Maggie,

vielen Dank für Deine Antwort! Ich habe mir die von Dir geänderte DB noch nicht angeschaut, weil ich erstmal Deine Frage beantworten möchte.

Die Suche nach den Tests möchte ich so gestalten, dass wenn ich z.B. im Suchfeld ,,Test01" eingebe, im Unterformular alle Berichte angezeigt werden, wo im Feld ,,Tests" unter anderen ,,Tests01" ist. Also, wo nur Test01 ist oder wo z.B. Test01; Test04 und Test10 sind.

Wenn ich z.B. Test01 und Tes02 ins Suchfeld eingebe, soll mir der Unterformular alle Ergebnisse zeigen, wo unter anderen Test01 und Test02 sind.

Ist das möglich???

Bei ,,Prüfer" ist das einfacher. In jedem Bericht ist NUR ein Prüfer eingetragen, dann kann man nur nach Berichten suchen, wo nur ein Prüfer eingetragen wurde.

Gruß,

Carlos
Gruß,

Carlos

MaggieMay

Wenn du mehrere Tests auswählen willst, musst du ein Listenfeld mit Mehrfachauswahl einsetzen, mit einem ungebundenen Kombifeld bekommst du das nicht hin. Und das Kombifeld (sowie das Hauptformular) muss ungebunden sein, sonst überschreibst du dir ja die Datensätze mit den Suchkriterien.
Freundliche Grüße
MaggieMay

Carlos_C

Alles klar! Danke, Maggie! Dann versuche ich eine Lösung nach Deinen Anweisungen zu implementieren. LG, Carlos.
Gruß,

Carlos

Carlos_C

Hallo Maggie,
ich komme irgendwie nicht weiter.

Vereinfachen wir das Ganze und sagen wir, dass man nur einen Test sucht, nicht mehrere. So, wir haben dann 3 Kombolisten: BerichtNr, Pruefer und Tests.

Der Code, den Du in dem NachAktualisierungsEreignis für jedes Feld geschrieben hast, hilft mir leider nicht, weil die Abfrage im Unterformular jedes Mal aktualisiert wird, nachdem man jedes einzelnes Feld aktualisiert.

Was ich haben möchte ich folgendes:

Ich gebe 1 Wert, oder keinen Wert in jedes der 3 Felder ein, dann klicke ich auf ,,Berichte suchen" und erst da aktualisiert sich das Unterformular, erst beim Knopfdruck, nicht nach der Aktualisierung jedes Felds.

Ist das möglich? Ich meine einen Code für das BeimKlickenEreignis zu schreiben, um das zu verwirklichen?

Danke und Gruß,

Carlos
Gruß,

Carlos

MaggieMay

Hallo Carlos,

ja, das habe ich schon erwartet, dass du mehr Flexibilität erreichen möchtest, aber ich habe dir erstmal ein einfaches Beispiel gemacht, damit du siehst wie das prinzipiell mit dem Filtern funktioniert. Wenn du die Auswahl kombinieren willst, so kannst du den Code aus den AfterUpdate-Ereignissen im Button-Klick zusammenführen.
Wie sieht es aus mit deinen Programmier- und VBA-Kenntnissen?

Welchen Sinn aber macht es nach BerichtNr und einem weiteren Kriterium zu filtern? Die BerichtNr (bzw. IDBericht) ist doch eindeutig.
Freundliche Grüße
MaggieMay

Carlos_C

Hallo Maggie,

danke für Deine Antwort!

Mit meinen VBA-Kenntnissen sieht es nicht so gut aus. Ich fange erst an, das zu lernen.

Also, was meinst Du mit "den Code aus den AfterUpdate-Ereignissen im Button-Klick zusammenführen?

Kannst Du es mir erklären?

Wenn ich alle 3 Codes (von den 3 AfterUpdate-Ereignissen) ins AfterClick-Ereignis reinschreibe, funktioniert es nicht, wie ich es mir gedacht hatte:

Private Sub btn_Filter_Click()

    If IsNull(Me.cbo_Bericht) Then
        Me.ufrmBerichtSuche.Form.Filter = ""
        Me.ufrmBerichtSuche.Form.FilterOn = False
    Else
        Me.ufrmBerichtSuche.Form.Filter = "IDBericht=" & Me.cbo_Bericht
        Me.ufrmBerichtSuche.Form.FilterOn = True
    End If
   
    If IsNull(Me.cbo_Pruefer) Then
        Me.ufrmBerichtSuche.Form.Filter = ""
        Me.ufrmBerichtSuche.Form.FilterOn = False
    Else
        Me.ufrmBerichtSuche.Form.Filter = "lngMitarbeiter=" & Me.cbo_Pruefer
        Me.ufrmBerichtSuche.Form.FilterOn = True
    End If
   
    If IsNull(Me.cbo_Test) Then
        Me.ufrmBerichtSuche.Form.RecordSource = "qryBerichte"
        Me.ufrmBerichtSuche.Form.Filter = ""
        Me.ufrmBerichtSuche.Form.FilterOn = False
    Else
        Me.ufrmBerichtSuche.Form.RecordSource = "qryBerichteTests"
        Me.ufrmBerichtSuche.Form.Filter = "lngTest.Value=" & Me.cbo_Test
        Me.ufrmBerichtSuche.Form.FilterOn = True
    End If

End Sub


Kannst Du mir bitte sagen, was ich genau ins AfterClick-Ereignis schreiben soll?

Danke und Gruß,

Carlos
Gruß,

Carlos

MaggieMay

Du hast vergessen, meine Frage zu beantworten.

Der Filter muss aus den einzelnen Teilen zusammengesetzt werden, nicht einzeln angewendet wie bisher, das war doch dein Wunsch.

So könnte das aussehen:
Private Sub btn_Filter_Click()
    Dim strFilter As String
    ' Filter zusammensetzen
    If Not IsNull(Me.cbo_Bericht) Then
        strFilter = strFilter & " AND IDBericht=" & Me.cbo_Bericht
    End If
    If Not IsNull(Me.cbo_Pruefer) Then
        strFilter = strFilter & " AND lngMitarbeiter=" & Me.cbo_Pruefer
    End If
    If Not IsNull(Me.cbo_Test) Then
        strFilter = strFilter & " AND lngTest=" & Me.cbo_Test
    End If
    ' Filter zuweisen
    If Len(strFilter) > 0 Then
        Me.ufrmBerichtSuche.Form.Filter = Mid(strFilter,6)
        Me.ufrmBerichtSuche.Form.FilterOn = True
    Else
        Me.ufrmBerichtSuche.Form.Filter = ""
        Me.ufrmBerichtSuche.Form.FilterOn = False
    End If
End Sub

Ich werde das mal austesten und das Ergebnis hochladen.
Freundliche Grüße
MaggieMay

Carlos_C

Hallo Maggie, habe Deinen Code getestet. Es klappt alles außer das mit dem Feld "Tests". Das System meckert und markiert die Zeile:

Me.ufrmBerichtSuche.Form.FilterOn = True

Gruß, Carlos

PS: Antworte Dir noch Deine Frage.
Gruß,

Carlos

MaggieMay

Die Frage war:
Welchen Sinn aber macht es nach BerichtNr und einem weiteren Kriterium zu filtern?
Die BerichtNr (bzw. IDBericht) ist doch eindeutig, wozu soll da noch weiter gefiltert werden?
Freundliche Grüße
MaggieMay

Carlos_C

Hallo Maggie,

also, Berichtnr, Prüfer und Tests sind eigentlich nicht die einzigen Suchkriterien, es gibt noch viele mehr wie Datum, MaterialTeil1, MaterialTeil2, ..., MaterialTeiln, Werk, Sprache, usw. Aber aus Einfachkeitsgründen habe ich in diesem Beispiel nur die 3 Kriterien Berichtnr, Prüfer und Tests betrachtet.

Das die Berichtsnr eindeutig ist, hast Du Recht, aber es kann sein, dass der Benutzer der Datenbank das Feld Berichtnr. leer lässt und Eingaben in andere Felder eingibt.

Habe ich Deine Frage  beantwortet?

Gruß,

Carlos
Gruß,

Carlos

Carlos_C

Konntest Du den Code testen?
Gruß,

Carlos