Formular + Optionen zur Suche über eine Abfrage

Liebe/-r Experte/-in,

ich habe in einem Formular drei Optionsfelder

Der Nutzer wählt sich Optionen aus jedem Feld aus, dann wird eine Abfrage gestartet, die die Angaben aus dem Formular verwendet und daraus die Abfrage erstellt.

Klappt prima - einziger Nachteil, man muss bei allen drei Optionsfeldern in dem Formular Werte wählen, um aus der Abfrage Ergebnisse zu erzielen.

Wie kann ich es schaffen, dass ein Nutzer mal nur eine Option in dem Formular wählen kann oder zwei und trotzdem die Abrfage Ergebnisse liefert, auch wenn die anderen Optionsfelder nicht zur Suche mit herangezogen wurden.

Danke für die Hilfe.

Gruß Uwe

Hallo Uwe,
da ich nicht weiß, wie deine Abfrage generiert wird, hier nur ein allgemeiner Hinweis:
Die Abfrage muss so generiert werden, dass nur ausgefüllte Optionen in der Where-Bedingung des SQL-Strings erfasst werden.
Das geht evtl. nur durch eine Generierung der Abfrage mittels VBA.
Wie man das mit gespeicherten Abfragen machen kann, weiß ich jetzt nicht.
Evtl. kann man auf eine nicht gesetzte Option testen und dann „*“ oder „%“ als Vergleichswert für die Spalte setzten.

Gruß
Vincenz

Frage zunächst:
Meinst du wirklich ‚Optionsfelder‘ (=Radiobutton)?
Optionsfelder sind doch in einer Optionsgruppe zusammen gefasst, und aus dieser Gruppe kann man nur 1 Optionsfeld auswählen.
Mit den genannten 3 Optionsfeldern komme ich nicht klar.

Hallo Uwe

Ich gehe davon aus, dass die entsprechenden Kombinations- oder Optionsfelder als Kriterien in Abfragen herangezogen werden sollen. Wenn diese nicht gefüllt werden, sollten entsprechend für dieses Feld auch keine Filter gesetzt werden, es erscheinen also ALLE Datensätze.

Für diese Fälle biege ich die Abfrage etwas um. Du lässt einfach die Felder in der Abfrage drin, löschst aber das Kriterium und verwendest dazu neue Formelfelder in der Abfrage. Darin ist in der ersten Zeile als Beispiel:

Ausdr1: Wenn(istnull(Formulare![Formname]![OptName]);999;Spaltenname)

Wenn also im Formular nichts eingegeben wird, dann ist der Inhalt immer 999, wenn ein Filter im Form gesetzt wird, soll er das ursprüngliche Feld, also deine jetzige Spalte mit dem Kriterium quasi gesetzt werden.

Als Kriterium gibst du in dieser neuen Spalte wie folgt ein:

Formulare![FormName]![Optname] ODER 999

Damit wird entweder gefiltert nach Eingabe im Form (reagiert, wenn im Form etwas gewählt wurde) oder es wird gefiltert nach 999, wobei JEDER Feldinhalt ja 999 hat wenn im Form nichts im Optionsfeld eingegeben wurde. Das funktioniert so, da in dieser neuen Spalte ja nur der Filter geregelt wird. Im ersten Teil dieser Antwort habe ich ja noch beschrieben, dass die alte Spalte belassen werden soll mit dem korrekten Feldinhalt, lediglich das Kriterium soll entfernt werden.

Beachte, diese Lösung war für Zahlenfelder. Dies funktioniert natürlich auch mit Textfelder, einfach immer schön in " " setzen :wink:

Dieses Vorgehen musst du für alle 3 Felder machen, also je eine zusätzliche Spalte.

Bei mir funktioniert dies so problemlos und schon in vielen Anwendungen :wink:

Gruss, Dani

Sorry mein Fehler

Es wird durch den Nutzer aus drei Kombinationsfeldern ausgewählt, dann wird die Abfrage gestartet, die die gewählten Felder übernimmt.

Gruß Uwe

Supi

ganz herzlichen Dank für den guten TIPP ich werd es gleich ausprobieren

Grüße
Uwe

Hallo Uwe, danke für die Klarstellung.

Ich würde mir die Abfrage als SQL-String zusammen stellen; solcher String lässt sich nämlich gut stückweise aufbauen.
Bilde also zunächst eine Abfrage, die alle Felder enthält, die in den drei Kombinationsfeldern vorkommen (Vereinigungsmenge ). Diese Abfrage namens wird Ausgangspunkt der Zielabfrage, etwa wie folgt:
strSQL = "SELECT * FROM "

Jetzt kommt es darauf an, aus dieser Abfrage nur diejenigen Felder auszuwählen, die in einem der Kombifelder angeklickt werden.

Auslösendes Ereignis ist der Klick in ein Kombifeld. Das Ergebnis dieses Klicks ist eines der Felder, also ein Feldname .
str SQL = "SELECT FROM "

Falls es eine weiteren Kombifeld-Klick gibt:
str SQL = "SELECT , FROM "

Evtl. erweitern zu
str SQL = "SELECT , , FROM "

Danach muss nur noch dieser SQL-Ausdruck angewendet werden zur Ausgabe in Tabellenform oder als Grundlage eines Formulars.

Ich hoffe, es wird klar, was ich meine.

Viel Erfolg und Geduld beim Basteln,
Tronicrot

Lieber Uwe, das Problem begreife ich, aber es fehlen mir noch einige weiteren Angaben: gibt es in den Optionsfelder eine Standardvorgabe oder muss zwingend eine Option angewählt werden? Werden die Angaben im Formular als Kriterien in einer Abfrage verwendet oder wird eine SQL Abfrage generiert?
Falls Abfrage: Hast Du schon eine IIF Abfrage probiert? zB. iif(isnull(opt2); -mache nichts damit-; -mache etwas damit-)).
Falls SQL: da habe ich mal testhalber für einen Kunden etwas Ähnliches mit mehrfach-Kombinationsfelder konstruiert, das könnte ich dir zustellen (ist allerdings eine accdb).

Gruss
Fonti46

Hallo Uwe,

ich habe in einem Formular drei Optionsfelder

sind die in Optionsgruppen angeordnet?

Klappt prima - einziger Nachteil, man muss bei allen drei
Optionsfeldern in dem Formular Werte wählen, um aus der
Abfrage Ergebnisse zu erzielen.

Ist ja von Dir so gewollt. Du verweist in der Abfrage auf die Werte der Optionssgruppen.

Wie kann ich es schaffen, dass ein Nutzer mal nur eine Option
in dem Formular wählen kann oder zwei und trotzdem die Abrfage
Ergebnisse liefert, auch wenn die anderen Optionsfelder nicht
zur Suche mit herangezogen wurden.

wenn Du die Abfrage etwas anders gestaltest, kannst Du auch zum Ziel kommen.
Trage in die Zeile Kriterien das ein:

\>Wenn(IstNull([Formulare]![Formular1]![Rahmen0]);0)

und in die gleiche Spalte eine Zeile tiefer bei „ODER“

=Wenn(Nicht (IstNull([Formulare]![Formular1]![Rahmen0]));[Formulare]![Formular1]![Rahmen0])

Wobei [Formulare]![Formular1]![Rahmen0 Dein Steuerelement (Optionsgruppe)im Formular ist.

Fruß
Erwin
PS: Wenn das Dir nicht weiterhilft, dann solltst Du mir mal das näher beschreiben (manchmal hilft ein Bild auch weiter.)

Moin Moin,

mangels genauer Informationen gehe ich davon aus, das es sich um Kombifelder für die Auswahl handelt.

D.h. der nicht gewählte Wert wäre dann NULL.

Wenn du nun deine Abfrage entsprechend änderst, und in der zweiten Zeile der Kriterien einfach für alle drei Felder dort den Wert NULL einträgst, sollte es funktionieren.

Die zweite Zeile in den Kriterien bedeutet eine ODER - Verknüpfung.

Per VBA könnte man die SQL-Bedingung noch besser programmieren. Wenn deine Kenntnisse in diese Richtung gehen sollten.

Grüße aus Rostock
Wolfgang
(Netwolf)

Hallo Uwe,
ist schon lange her die Anfrage. Ich denke, Du wirst inzwischen eine Lösung gefunden haben.

Das Vorgehen, dass ich in solchen Fällen wähle ist die sog. NZ-Funktion. Sie liefert bei fehlenden Werten einen Ersatzwert.
Syntax: NZ(erwarteter Wert , Ersatzwert).

In der SQL-Anweisung musst Du dann nur noch dafür sorgen, dass der Ersatzwert immer „WAHR“ ist, also keinen Fehler produziert.
Hierzu verwende ich den Ausdruck: 1 = 1

Dies kombiniert mit der zusammengesetzten SQL-Anweisungen würde z. B. ergeben:

SQLTEXT = "select * from tab_abcd where nz( " & Suchfeld1 & ", 1=1) and nz( " & Suchfeld2 & ", 1=1) and nz( " & Suchfeld3 & „, 1=1)“
DoCmd RunSQL SQLTEXT

So würdest Du die Abfrage auch mit fehlenden Werten aufbauen können.
Sofern die Suchfelder nicht aus Zahlenwerten, sondern aus Charakter/Zeichen-Werten bestehen, dann eben noch die Anführungsstriche vor und nach der Variablen Suchfeld1-3 ergänzen, damit es passt, also:

SQLTEXT = „select * from tab_abcd where nz( '“ & Suchfeld1 & „’, 1=1) and nz( '“ & Suchfeld2 & „’, 1=1) and nz( '“ & Suchfeld3 & „’, 1=1)“

Sofern Du an das SQL nur den Vergleichswert übergibst und die Variable selbst bereits im SQL stehen soll, geht es so natürlich nicht, sondern dann muss Du modifizieren:

SQLTEXT = "select * from tab_abcd where " & iif(isnull(Formularfeld1),„1 = 1“, "DBFeld1 = ’ & Formularfeld1 & „’“ ) & " and " &
iif(isnull(Formularfeld2),„1 = 1“, "DBFeld2 = ’ & Formularfeld2 & „’“ ) & " and " &
iif(isnull(Formularfeld3),„1 = 1“, "DBFeld3 = ’ & Formularfeld3 & „’“ )

Hiebei wird die IIF-Funktion genutzt (ist wie ein normales If then else, nur in einem Ausdruck ohne die Worte Then und Else.

Gruß
Ulrich St

ich habe in einem Formular drei Optionsfelder

Wie kann ich es schaffen, dass ein Nutzer mal nur eine Option
in dem Formular wählen kann oder zwei und trotzdem die Abrfage
Ergebnisse liefert