Supportnet Computer
Planet of Tech

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:

    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] = ..."
                           ^ Fehler


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

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

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

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!

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:

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.yyyy


In 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 :)


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

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

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):
? 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) Then

Welche 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

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:

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 Function


Kopiere 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

Antwort 13 von El Bobbele

Drücke die Tastenkombination Strg+G, dann kommst du automatisch dorthin.

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

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

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

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 möchte kostenlos eine Frage an die Mitglieder stellen:


Ähnliche Themen:


Suche in allen vorhandenen Beiträgen: