Hallo Manfred,
zuerst einmal einige allgemeine Anmerkungen:
* Wenn man Anfragen an „Experten“ schickt, wird man in der Regel Antworten erhalten, die für einen „Anfänger“ schwer verständlich sind. Möglicherweise kann man mit den Antworten „Fortgeschrittener“ mehr anfangen.
* Man sollte bei Anfragen immer auch die Software-Version mit angeben. Es macht meist große Unterschiede, ob man z.B. in Access 2.0 oder in Access 2007 arbeitet!
Wenn ich die Anfrage richtig verstanden habe, geht es hier gar nicht um „Parameterabfragen“. Letztlich hat man ein Formular, auf Basis dessen Angaben man eine gefilterte Abfrage erstellen will. Parameterabfragen nutze ich, wenn der Benutzer beim Aufruf einer Abfrage per „Message Box“ um eine Angabe für einen Parameter gebeten wird.
Hier hingegen macht der Benutzer seine Auswahl(en) in einem Formular, auf Druck z.B. auf einen Button kann dann die Abfrage individuell erstellt werden. Ich mache das immer direkt im Programmcode (wo man die Bedingungen per SQL nutzt), es geht aber wohl auch per Filter.
Man sollte sich vorab einige Gedanken machen. Meist reicht es nicht, wenn man nur die Optionen „0“ und „1“ anbietet. Will man doch oft alle Werte sehen (also das aktuelle Kriterium unbeachtet lassen)! Also muss man dem Benutzer auch die dritte Option („Wert ignorieren“ o.ä.) anbieten! Die Filterbedingung wäre dann so etwas im Stil von "(CAP = " & Me.FilterCAP & „) OR (“ & Me.FilterCAP & „=2);“.
Hier meine Standard-Antwort zur Erstellung von Abfragen - etwas komplizierter, aber hier findest Du alle benötigten Informationen für den „Königsweg“:
Erstellen einer Abfrage mit komplexen Suchkriterien:
Im Prinzip kann die Abfrage direkt auf ein Eingabeformular zugreifen - dort kann man auch alle existierenden Werte eines Feldes als Combobox anbieten.
Die Abfrage würde dann für jede Bedingung ein Feld des Formulars abprüfen im Stil von
SELECT * FROM Tabelle WHERE
(Kriterium = Forms!Filter!ControlName) OR (Forms!Filter!ControlName IS NULL);
(IS NULL sollte man zulassen, damit man nicht GEZWUNGEN ist, einen Wert einzugeben!)
Du kannst Dir aber vorstellen, dass das schon bei drei Kriterien unglaublich schwer wird - man hat dann schon 2^3 = 8 Bedingungszeilen, um alle möglichen Kombinationen auszuwerten!
Zudem hat Access ein echtes Problem, wenn in etwas komplexeren Abfragen (Kreuztabelle usw.) auf ein Formular zugegriffen wird!
Ich mache so etwas deshalb immer per Programmcode - das ist zwar auf den ersten Blick viel komplizierter, aber auf jeden Fall flexibler und schneller!
Das Prinzip:
- In einem Formular werden alle notwendigen Auswahlmöglichkeiten bereitgestellt (wie oben).
- Erstellen einer Muster-Abfrage (mit allen Parametern, ruhig als Konstante), Speichern
- Auf Druck eines Button wird je nach ausgewählten Optionen der SQL-Text der Musterabfrage geändert!
Beispiel zu 3.:
Dim SQLText$, QD as QueryDef
SQLText = „“
If Not IsNull(Kriterium1) Then
'Suche nach Text
If Len(SQLText) > 0 Then SQLText = SQLText & " AND "
SQLText = SQLText & „(Haupttabelle.Feldname=“"" & Kriterium & „“")"
End If
If Not IsNull(Kriterium2) Then
'Suche Text mit Ähnlichkeitssuche (Joker)
If Len(SQLText) > 0 Then SQLText = SQLText & " AND "
SQLText = SQLText & „(Haupttabelle.Feldname LIKE „“*“ & Kriterium2 & „*“")"
End If
If Not IsNull(Kriterium3) Then
'Suche nach Zahl, Suche in Untertabelle
If Len(SQLText) > 0 Then SQLText = SQLText & " AND "
SQLText = SQLText & "( EXISTS (SELECT * FROM Tabelle WHERE "
SQLText = SQLText & "(Haupttabelle.ID = Tabelle.ID) AND "
SQLText = SQLText & „(Haupttabelle.Feldname=“ & Kriterium3 & „)))“
End If
If Len(SQLText) > 0 Then SQLText = " WHERE " & SQLText
SQLText = „SELECT * FROM Haupttabelle“ & SQLText & „;“
Set QD = CurrentDB.QueryDefs(„Abfragename“)
QD.SQL = SQLText
Set QD = Nothing
Das schöne an dieser Variante ist, dass man nicht benutzte Kriterien einfach weglassen kann - das macht die Abfrage deutlich schneller!
Liebe Grüße,
Kurt