Supportnet / Forum / Datenbanken
Suchen mit Formularen??
Frage
Hallo,
ich habe eine Datenbank mit einem Suchformular und einem Eingabeformular.
In dem Eingabeformular können meine Datensätze der Haupttabelle bearbeitet werden. (Es sind ca. 20 Felder)
Auf dem Suchformular habe ich 4 ungebundene Textfelder erstellt. Jetzt möchte ich folgendes erreichen:
Gibt ein user in eines oder mehrere der 4 Textfelder Suchkriterien ein, so soll durch Klick auf einen Button das Eingabeformular aufspringen und die gesuchten Datensätze enthalten.
Wie kann ich das erreichen?
Danke für eure Hilfe, Susi
Antwort 1 von El Bobbele
Hallo Susi!
In deinem Fall würde ich folgende Vorgehensweise empfehlen:
Trage in die Marke-Eigenschaft der vier Textfelder die Feldnamen (in eckige Klammern) ein, die gefiltert werden sollen:
Marke......: [P_Vorname]
Füge folgenden Code in das Klick-Ereignis des Buttons ein:
Die ersten beiden Parameter habe ich willkürlich zum Text deklariert, um die Werte in die dafür notwendigen Hochkommas packen zu können.
Die Zeichenverkettung mit dem +-Operator hat den Vorteil, dass keine Verkettung stattfindet, wenn einer der Werte NULL ist. Und nicht angegebene Parameter sollen ja auch nicht berücksichtigt werden. Würde stattdessen wie üblich der &-Operator eingesetzt werden, dann würden auf jeden Fall die vorhandenen Textabschnitte angehängt werden und der NULL-Wert bliebe leer
Beispiel:
Abschliessend wird der Filter in der Docmd.OpenForm-Anweisung an den Parameter "WhereCondition" übergeben und prompt wird das sich öffnende Formular gefiltert.
Gruss
El Bobbele
In deinem Fall würde ich folgende Vorgehensweise empfehlen:
Trage in die Marke-Eigenschaft der vier Textfelder die Feldnamen (in eckige Klammern) ein, die gefiltert werden sollen:
Marke......: [P_Vorname]
Füge folgenden Code in das Klick-Ereignis des Buttons ein:
Dim strFilter As String
With Me
strFilter = Nz(.txtDeinTextfeld1.Tag + " = '" + .txtDeinTextfeld1 + "' AND ", vbNullString)
strFilter = strFilter & Nz(.txtDeinTextfeld2.Tag + " = '" + .txtDeinTextfeld2 + "' AND ", vbNullString)
strFilter = strFilter & Nz(.txtDeinZahlenFeld1.Tag + " = " + .txtDeinZahlenFeld1 + " AND ", vbNullString)
strFilter = strFilter & Nz(.txtDeinZahlenfeld2.Tag + " = " + .txtDeinZahlenfeld2 + " AND ", vbNullString)
End With
strFilter = Left(strFilter, InStrRev(strFilter, " AND ") - 1)
DoCmd.OpenForm "DeinFormular", acNormal, , strFilter
Die ersten beiden Parameter habe ich willkürlich zum Text deklariert, um die Werte in die dafür notwendigen Hochkommas packen zu können.
Die Zeichenverkettung mit dem +-Operator hat den Vorteil, dass keine Verkettung stattfindet, wenn einer der Werte NULL ist. Und nicht angegebene Parameter sollen ja auch nicht berücksichtigt werden. Würde stattdessen wie üblich der &-Operator eingesetzt werden, dann würden auf jeden Fall die vorhandenen Textabschnitte angehängt werden und der NULL-Wert bliebe leer
Beispiel:
"... AND [P_IstGeloescht] = AND [P_Sonstnochwas] = ..."
^ FehlerAbschliessend wird der Filter in der Docmd.OpenForm-Anweisung an den Parameter "WhereCondition" übergeben und prompt wird das sich öffnende Formular gefiltert.
Gruss
El Bobbele
Antwort 2 von hans9267
hallo susi
das feld in deinem formular, nennen wir es einmal param1.
wenn du die werte deines formulares in eine abfrage übergeben möchtest, musst du in der abfrage folgende zeile in die kriterien eintragen
[formulare]![formularname]![param1]
ich hoffe das hilft
das feld in deinem formular, nennen wir es einmal param1.
wenn du die werte deines formulares in eine abfrage übergeben möchtest, musst du in der abfrage folgende zeile in die kriterien eintragen
[formulare]![formularname]![param1]
ich hoffe das hilft
Antwort 3 von Susi_84
Hallo!
Danke erstmal für deine Hilfe!
Das mit dem Filtern klappt soweit ganz gut, das einzige Problem ist jetzt noch, dass wenn ich meinen Button klicke öffnet sich eine Dialogbox 'Parameterwerte eingeben'. Über der eingabezeile steht dann der name, den ich zuvor einmgegeben habe.
Gebe ich ihn in die Dialogbox NOCHMAL ein, so öffnet sich mein Formular erst.
Wie kann ich den Zwischenschritt wegbringen?
Gruß, Susi
Danke erstmal für deine Hilfe!
Das mit dem Filtern klappt soweit ganz gut, das einzige Problem ist jetzt noch, dass wenn ich meinen Button klicke öffnet sich eine Dialogbox 'Parameterwerte eingeben'. Über der eingabezeile steht dann der name, den ich zuvor einmgegeben habe.
Gebe ich ihn in die Dialogbox NOCHMAL ein, so öffnet sich mein Formular erst.
Wie kann ich den Zwischenschritt wegbringen?
Gruß, Susi
Antwort 4 von Susi_84
und nochmal ich:
das problem mit der Dialogbox hat sich erledigt.
Nun noch eine andere Frage:
Ich möche auch ein Suchfeld 'Datum' haben, jedoch sagt Access dann 'Laufzeitfehler 13, Datentypen unverträglich'.
Wie editiere ich den Code so, dass ich nach Datum suchen kann?
und ist es auch irgendwie möglich, nach einer Zeitspanne (´wobei Anfangsdatum und Enddatum angegeben wird) zu suchen?
Danke für die Hilfe!
das problem mit der Dialogbox hat sich erledigt.
Nun noch eine andere Frage:
Ich möche auch ein Suchfeld 'Datum' haben, jedoch sagt Access dann 'Laufzeitfehler 13, Datentypen unverträglich'.
Wie editiere ich den Code so, dass ich nach Datum suchen kann?
und ist es auch irgendwie möglich, nach einer Zeitspanne (´wobei Anfangsdatum und Enddatum angegeben wird) zu suchen?
Danke für die Hilfe!
Antwort 5 von El Bobbele
Hallo Susi!
Das mit dem Datum wird etwas kniffliger, es muss in einem SQL-kompatiblen Format vorliegen:
#9/6/2004#
Diese Formatierung nimmt dir immerhin die BuildCriteria-Funktion ab:
In den With-Block aus Antwort 1 fügst du dann eine entsprechende BuildCriteria-Zeile ein:
Dummerweise wird ein Laufzeitfehler von BuildCriteria() ausgelöst, wenn txtDeinDatumsfeld leer (NULL) ist. Spätestens jetzt müssten wir z.B. mit einer If/Then-Prüfung nachschauen, ob überhaupt ein Wert vorhanden ist. Stattdessen reicht aber auch das Abschalten der Fehlerbehandlung. Alle Zeilen, die dann ein Problem verursachen, führen dann keine Aktionen aus und das Programm arbeitet die nächste Zeile ab.
Welche Lösung du nimmst, ist völlig egal. Beide kommen zum selben Ergebnis. Jedoch kann man Lösung 2 getrost als "sauber" bezeichnen. Sie erfordert nur mehr Tipparbeit. :-)
Gruss
El Bobbele
Das mit dem Datum wird etwas kniffliger, es muss in einem SQL-kompatiblen Format vorliegen:
#9/6/2004#
Diese Formatierung nimmt dir immerhin die BuildCriteria-Funktion ab:
BuildCriteria("[MeinDatum]", dbDate, Me.MeinDatumsfeld) 'liefert z.B. [MeinDatum]=#9/6/2004#
BuildCriteria("[MeinDatum]", dbDate, "<=" & Me.MeinDatumsfeld) 'liefert [MeinDatum]<=#9/6/2004#
BuildCriteria("[MeinDatum]", dbDate, "Between " & Me.Datum1 & " And " & Me.Datum2)
'liefert [MeinDatum] Between xx.xx.xxxx And yy.yy.yyyyIn den With-Block aus Antwort 1 fügst du dann eine entsprechende BuildCriteria-Zeile ein:
strFilter = strFilter & BuildCriteria(.txtDeinDatumsfeld.Tag, dbDate, .txtDeinDatumsfeld) + " AND "Dummerweise wird ein Laufzeitfehler von BuildCriteria() ausgelöst, wenn txtDeinDatumsfeld leer (NULL) ist. Spätestens jetzt müssten wir z.B. mit einer If/Then-Prüfung nachschauen, ob überhaupt ein Wert vorhanden ist. Stattdessen reicht aber auch das Abschalten der Fehlerbehandlung. Alle Zeilen, die dann ein Problem verursachen, führen dann keine Aktionen aus und das Programm arbeitet die nächste Zeile ab.
Lösung 1 mit deaktivierter Fehlerbehandlung:
On Error Resume Next 'Fehlerbehandlung abschalten
With Me
'Hier der bisherige Code aus Antwort 1
strFilter = strFilter & BuildCriteria(.txtDeinDatumsfeld.Tag, dbDate, .txtDeinDatumsfeld) + " AND "
End With
On Error Goto 0 'Fehlerbehandlung einschalten
Lösung 2 mit If-Bedingung:
With Me
'Hier der bisherige Code aus Antwort 1
If Not IsNull(.txtDeinDatumsfeld) Then
strFilter = strFilter & BuildCriteria(.txtDeinDatumsfeld.Tag, dbDate, .txtDeinDatumsfeld) + " AND "
End If
End With
Welche Lösung du nimmst, ist völlig egal. Beide kommen zum selben Ergebnis. Jedoch kann man Lösung 2 getrost als "sauber" bezeichnen. Sie erfordert nur mehr Tipparbeit. :-)
Gruss
El Bobbele
Antwort 6 von Susi_84
Hallo Bobbele!
Danke dass du dir soviel mühe mit mir gibst :)
Leider klappt das ganze immer noch nciht ganz...
Hier nochmal mein ganzer code:
Private Sub Befehl37_Click()
Dim strFilter As String
With Me
strFilter = Nz(.Patientenname.Tag + " = '" + .Patientenname + "' AND ", vbNullString)
strFilter = strFilter & Nz(.Land.Tag + " = '" + .Land + "' AND ", vbNullString)
strFilter = strFilter & Nz(.Größe.Tag + " = '" + .Größe + "' AND ", vbNullString)
strFilter = strFilter & Nz(.Seite.Tag + " = '" + .Seite + "' AND ", vbNullString)
strFilter = strFilter & Nz(.Vorname.Tag + " = '" + .Vorname + "' AND ", vbNullString)
strFilter = strFilter & Nz(.Sanitätshaus.Tag + " = '" + .Sanitätshaus + "' AND ", vbNullString)
If Not IsNull(.Lieferdatum) Then
strFilter = strFilter & BuildCriteria(.Lieferdatum.Tag, dbDate, "Between " & Me.Lieferdatum & " And " & Me.Lieferdatum_bis)
End If
End With
strFilter = Left(strFilter, InStrRev(strFilter, " AND ") - 1)
DoCmd.OpenForm "Eingabe_MSP", acNormal, , strFilter
End Sub
...wobei Lieferdatum das Anfangsdatum sien soll und Lieferdatum_bis das Enddatum. Jedoch kommt dann die Fehlermeldung, dass die BuildCriteria-Zeile syntatktisch falsch ist. Was hab ich falsch eingegeben?
Danke für die Hilfe,
Gruß Susi :)
Danke dass du dir soviel mühe mit mir gibst :)
Leider klappt das ganze immer noch nciht ganz...
Hier nochmal mein ganzer code:
Private Sub Befehl37_Click()
Dim strFilter As String
With Me
strFilter = Nz(.Patientenname.Tag + " = '" + .Patientenname + "' AND ", vbNullString)
strFilter = strFilter & Nz(.Land.Tag + " = '" + .Land + "' AND ", vbNullString)
strFilter = strFilter & Nz(.Größe.Tag + " = '" + .Größe + "' AND ", vbNullString)
strFilter = strFilter & Nz(.Seite.Tag + " = '" + .Seite + "' AND ", vbNullString)
strFilter = strFilter & Nz(.Vorname.Tag + " = '" + .Vorname + "' AND ", vbNullString)
strFilter = strFilter & Nz(.Sanitätshaus.Tag + " = '" + .Sanitätshaus + "' AND ", vbNullString)
If Not IsNull(.Lieferdatum) Then
strFilter = strFilter & BuildCriteria(.Lieferdatum.Tag, dbDate, "Between " & Me.Lieferdatum & " And " & Me.Lieferdatum_bis)
End If
End With
strFilter = Left(strFilter, InStrRev(strFilter, " AND ") - 1)
DoCmd.OpenForm "Eingabe_MSP", acNormal, , strFilter
End Sub
...wobei Lieferdatum das Anfangsdatum sien soll und Lieferdatum_bis das Enddatum. Jedoch kommt dann die Fehlermeldung, dass die BuildCriteria-Zeile syntatktisch falsch ist. Was hab ich falsch eingegeben?
Danke für die Hilfe,
Gruß Susi :)
Antwort 7 von El Bobbele
Hallo Susi!
Die BuildCriteria-Zeile ist soweit in Ordnung, jedenfalls ist kein Problem zu erkennen. Enthält die Marke-Eigenschaft von Lieferdatum auch wirklich den Feldnamen?
Gruss
El Bobbele
Die BuildCriteria-Zeile ist soweit in Ordnung, jedenfalls ist kein Problem zu erkennen. Enthält die Marke-Eigenschaft von Lieferdatum auch wirklich den Feldnamen?
Gruss
El Bobbele
Antwort 8 von Susi_84
Hallo!
Ja, hab nachgesehen, beim Anfangsdatum steht bei Name Lieferdatum und bei Marke [Lieferdatum].
Beim Enddatum steht bei Name Lieferdatum_bis und bei Marke [Lieferdatum_bis].
Oder muss in die Marke noch sowas wie '#' rein?
Susi
Ja, hab nachgesehen, beim Anfangsdatum steht bei Name Lieferdatum und bei Marke [Lieferdatum].
Beim Enddatum steht bei Name Lieferdatum_bis und bei Marke [Lieferdatum_bis].
Oder muss in die Marke noch sowas wie '#' rein?
Susi
Antwort 9 von El Bobbele
Hallo!
Nein, in die Marke darf nur der reine Feldname (optional mit Klammern). Die Rauten erzeugt die BuildCriteria-Funktion.
Führe mal diese Zeile im Direktfenster aus (Strg+G):
Was kommt da als Ergebnis heraus?
Wenn du Between/And als Bedingung verwendest, dann solltest du sicherstellen, dass beide Datumswerte vorhanden sind. Ersetze demnach deine If-Zeile durch diese hier:
Welche Access-Version verwendest du?
Gruss
El Bobbele
Nein, in die Marke darf nur der reine Feldname (optional mit Klammern). Die Rauten erzeugt die BuildCriteria-Funktion.
Führe mal diese Zeile im Direktfenster aus (Strg+G):
? BuildCriteria("[Lieferdatum]",dbDate, "Between " & Date & " And " & Date+1)Was kommt da als Ergebnis heraus?
Wenn du Between/And als Bedingung verwendest, dann solltest du sicherstellen, dass beide Datumswerte vorhanden sind. Ersetze demnach deine If-Zeile durch diese hier:
If Not IsNull(.Lieferdatum) And Not IsNull(.Lieferdatum_bis) ThenWelche Access-Version verwendest du?
Gruss
El Bobbele
Antwort 10 von Susi_84
Hallo Bobbele!
ich hab das ganze jetzt wie folgt zusammengesetzt:
Private Sub Befehl37_Click()
Dim strFilter As String
With Me
strFilter = Nz(.Patientenname.Tag + " = '" + .Patientenname + "' AND ", vbNullString)
strFilter = strFilter & Nz(.Land.Tag + " = '" + .Land + "' AND ", vbNullString)
strFilter = strFilter & Nz(.Größe.Tag + " = '" + .Größe + "' AND ", vbNullString)
strFilter = strFilter & Nz(.Seite.Tag + " = '" + .Seite + "' AND ", vbNullString)
strFilter = strFilter & Nz(.Vorname.Tag + " = '" + .Vorname + "' AND ", vbNullString)
strFilter = strFilter & Nz(.Sanitätshaus.Tag + " = '" + .Sanitätshaus + "' AND ", vbNullString)
If Not IsNull(!Lieferdatum) Then
strFilter = strFilter & !Lieferdatum.Tag & " Between #" & Format(!Lieferdatum, "yyyy-mm-dd") & "# And #" & Format(!Lieferdatum_bis, "yyyy-mm-dd") & "# And "
End If
End With
strFilter = Left(strFilter, InStrRev(strFilter, " AND ") - 1)
DoCmd.OpenForm "Eingabe_MSP", acNormal, , strFilter
End Sub
...mit dem resultat dass alles klappt :)
Oder siehst du an diesem Code noch etws, das 'unschön' ist für einen datenbank code...?
Auf alle Fälle vielen Dank für deine Hilfe, alleine hätte ich das nie hinbekommen und bin jetzt echt froh, dass das hinhaut! :)
Danke und Grüße Susi
ich hab das ganze jetzt wie folgt zusammengesetzt:
Private Sub Befehl37_Click()
Dim strFilter As String
With Me
strFilter = Nz(.Patientenname.Tag + " = '" + .Patientenname + "' AND ", vbNullString)
strFilter = strFilter & Nz(.Land.Tag + " = '" + .Land + "' AND ", vbNullString)
strFilter = strFilter & Nz(.Größe.Tag + " = '" + .Größe + "' AND ", vbNullString)
strFilter = strFilter & Nz(.Seite.Tag + " = '" + .Seite + "' AND ", vbNullString)
strFilter = strFilter & Nz(.Vorname.Tag + " = '" + .Vorname + "' AND ", vbNullString)
strFilter = strFilter & Nz(.Sanitätshaus.Tag + " = '" + .Sanitätshaus + "' AND ", vbNullString)
If Not IsNull(!Lieferdatum) Then
strFilter = strFilter & !Lieferdatum.Tag & " Between #" & Format(!Lieferdatum, "yyyy-mm-dd") & "# And #" & Format(!Lieferdatum_bis, "yyyy-mm-dd") & "# And "
End If
End With
strFilter = Left(strFilter, InStrRev(strFilter, " AND ") - 1)
DoCmd.OpenForm "Eingabe_MSP", acNormal, , strFilter
End Sub
...mit dem resultat dass alles klappt :)
Oder siehst du an diesem Code noch etws, das 'unschön' ist für einen datenbank code...?
Auf alle Fälle vielen Dank für deine Hilfe, alleine hätte ich das nie hinbekommen und bin jetzt echt froh, dass das hinhaut! :)
Danke und Grüße Susi
Antwort 11 von El Bobbele
Hallo Susi!
Interessiert hätte es mich schon, was in deinem Fall das Problem ist. Wenn du also zumindest die Zeile für das Direktfenster aus Antwort 9 mal ausführen würdest, wäre ich dankbar darum. :-)
Die Format-Funktion ist sicherlich ok, aber ich würde dir empfehlen, diese Zeichenfolgenverkettung in eine eigene Funktion zu verlagern. Das macht die Nutzung einfacher und leserlicher:
Kopiere die Funktion in ein Modul und nutze Sie:
Das ist jetzt der Kompromiss für den Kompromiss und damit kann man dann sicher leben. :-)
Gruss
El Bobbele
Interessiert hätte es mich schon, was in deinem Fall das Problem ist. Wenn du also zumindest die Zeile für das Direktfenster aus Antwort 9 mal ausführen würdest, wäre ich dankbar darum. :-)
Die Format-Funktion ist sicherlich ok, aber ich würde dir empfehlen, diese Zeichenfolgenverkettung in eine eigene Funktion zu verlagern. Das macht die Nutzung einfacher und leserlicher:
Public Function FormatSQLDate(Expression As Variant) As String
If Not IsEmpty(Expression) And Not IsNull(Expression) Then
FormatSQLDate = "#" & Format(Expression, "yyyy-mm-dd") & "#"
End If
End FunctionKopiere die Funktion in ein Modul und nutze Sie:
strFilter = strFilter & !Lieferdatum.Tag & " Between " & FormatSQLDate(!Lieferdatum) & " And " & FormatSQLDate(!Lieferdatum_bis)Das ist jetzt der Kompromiss für den Kompromiss und damit kann man dann sicher leben. :-)
Gruss
El Bobbele
Antwort 12 von Susi_84
Kein problem, aber sagst du mir was du mit 'Direktfenster' meinst?
Gruß Susi
Gruß Susi
Antwort 13 von El Bobbele
Drücke die Tastenkombination Strg+G, dann kommst du automatisch dorthin.
Gruss
El Bobbele
Gruss
El Bobbele
Antwort 14 von El Bobbele
Ups, ich habe die falsche Tastenkombination genannt! Das Direktfenster wird über Alt+G aufgerufen, nicht über die Strg-Taste. :-/
Antwort 15 von Susi_84
Guten morgen!
Also wenn ich das jetzt in das Direktfenster eingebe und den Button ausführe, funktioniert alles, vielleicht aber deshalb weil ich ja meinen anderen code drinhabe?
oder soll ich den rauslöschen bei dem Versuch?
Gruß Susi
Also wenn ich das jetzt in das Direktfenster eingebe und den Button ausführe, funktioniert alles, vielleicht aber deshalb weil ich ja meinen anderen code drinhabe?
oder soll ich den rauslöschen bei dem Versuch?
Gruß Susi
Antwort 16 von El Bobbele
Guten abend,
du darfst den Button nicht drücken, der führt den alten Code aus. Für dieses Experiment brauchst du auch kein Formular. Im Direktfenster werden einzelne Codezeilen eingegeben und mit der Eingabetaste ausgeführt. Damit kannst du z.B. die Inhalte von Variablen in angehaltenen Programmen ändern oder Prozeduren/Funktionen usw. zu Testzwecken direkt aufrufen.
Im Übrigen wollte ich noch gesagt haben, dass das Direktfenster doch über Strg+G aufgerufen wird. Ich muss wohl das Direktfenster und den VBA-Editor (Alt+F11) vermischt haben. Wird Zeit für Urlaub. :-)
Gruss
El Bobbele
du darfst den Button nicht drücken, der führt den alten Code aus. Für dieses Experiment brauchst du auch kein Formular. Im Direktfenster werden einzelne Codezeilen eingegeben und mit der Eingabetaste ausgeführt. Damit kannst du z.B. die Inhalte von Variablen in angehaltenen Programmen ändern oder Prozeduren/Funktionen usw. zu Testzwecken direkt aufrufen.
Im Übrigen wollte ich noch gesagt haben, dass das Direktfenster doch über Strg+G aufgerufen wird. Ich muss wohl das Direktfenster und den VBA-Editor (Alt+F11) vermischt haben. Wird Zeit für Urlaub. :-)
Gruss
El Bobbele
Antwort 17 von Susi_84
Guten Morgen,
tut mir leid, ich bin wohl echt zu doof!
wenn ichd ie Zeile in das Direktfenster eingebe und die Eingabetaste drücke passiert gar nichts! :(
Gruß susi
tut mir leid, ich bin wohl echt zu doof!
wenn ichd ie Zeile in das Direktfenster eingebe und die Eingabetaste drücke passiert gar nichts! :(
Gruß susi
Antwort 18 von kartographin
Hallo!
Ich habe die gleiche Ausgangssituation wie Susi und habe nun versucht, es mit dem Code von
El Bobbele zu lösen (Antwort 1) und habe ihn eingefügt und auf meine DB angepasst.
Allerdings erscheint die Fehlermeldung "Ungültiger Prozeduraufruf oder ungültiges Argument"
und es wird folgende Code-Zeile markiert:
strFilter = Left(strFilter, InStrRev(strFilter, " AND ") - 1)
Da ich absoluter Anfänger bin, wäre es schön, wenn mir jemand helfen könnte.
Liebe Grüße,
Anna
Ich habe die gleiche Ausgangssituation wie Susi und habe nun versucht, es mit dem Code von
El Bobbele zu lösen (Antwort 1) und habe ihn eingefügt und auf meine DB angepasst.
Allerdings erscheint die Fehlermeldung "Ungültiger Prozeduraufruf oder ungültiges Argument"
und es wird folgende Code-Zeile markiert:
strFilter = Left(strFilter, InStrRev(strFilter, " AND ") - 1)
Da ich absoluter Anfänger bin, wäre es schön, wenn mir jemand helfen könnte.
Liebe Grüße,
Anna

