Wie kann ich MS Access-Abfrageparameter optional machen?

Ich habe eine Frage, die ich zu verschiedenen Zeiten auf verschiedene Arten filtern möchte. Die Art und Weise, wie ich dies jetzt getan habe, indem ich Parameter in das Kriterienfeld der relevanten Abfragefelder gelegt habe, gibt es jedoch viele Fälle, in denen ich nicht nach einem bestimmten Feld, sondern nur nach den anderen Feldern filtern möchte. Gibt es eine Möglichkeit, wie ein Platzhalter irgendeiner Art an den Kriterienparameter übergeben werden kann, so dass ich die Filterung für diesen bestimmten Aufruf der Abfrage umgehen kann?

0
hinzugefügt bearbeitet
Ansichten: 2

6 Antworten

Ich bin mir nicht sicher, ob das hilft, da ich vermute, dass Sie dies lieber mit einer gespeicherten Abfrage als in VBA tun möchten. Am einfachsten können Sie jedoch eine Abfrage zeilenweise in VBA erstellen und dann ein Recordset daraus erstellen.

Ein ziemlich hackischer Weg wäre, die gespeicherte Abfrage im laufenden Betrieb neu zu schreiben und dann darauf zuzugreifen; Wenn Sie jedoch mehrere Benutzer haben, die dieselbe Datenbank verwenden, können Konflikte auftreten, und Sie werden den nächsten Entwickler auf der ganzen Linie verwirren.

Sie könnten auch den Standardwert programmatisch an die Abfrage übergeben (wie in Ihrer vorherigen Frage besprochen).

0
hinzugefügt

Zurück zu meinem vorherigen Beispiel in Ihrer vorherigen Frage. Ihre parametrisierte Abfrage ist eine Zeichenfolge, die folgendermaßen aussieht:

qr = "Select Tbl_Country.* From Tbl_Country WHERE id_Country = [fid_country]"

Abhängig von der Art von fid_Country (Nummer, Text, GUID, Datum, usw.) müssen Sie es durch einen Joker-Wert und spezifische Begrenzungszeichen ersetzen:

qr = replace(qr,"[fid_country]","""*""")

Um Wildcards vollständig zuzulassen, könnte Ihre ursprüngliche Abfrage auch lauten:

qr = "Select Tbl_Country.* From Tbl_Country _
      WHERE id_Country LIKE [fid_country]"

Sie können dann Wildcard-Werte für fid_Country wie z

qr = replace(qr,"[fid_country]","G*")

Sobald Sie damit fertig sind, können Sie mit der Zeichenfolge ein Recordset öffnen

set rs = currentDb.openRecordset(qr)
0
hinzugefügt

Wenn Sie Ihre Abfrage wie folgt konstruieren:

PARAMETERS ParamA Text ( 255 );
SELECT t.id, t.topic_id
FROM SomeTable t
WHERE t.id Like IIf(IsNull([ParamA]),"*",[ParamA])

Alle Datensätze werden ausgewählt, wenn der Parameter nicht ausgefüllt ist.

0
hinzugefügt
Funktioniert das gleiche für eine optionale GROUP BY?
hinzugefügt der Autor Chad, Quelle
@Chad Ich bin mir nicht sicher, was du meinst, vielleicht PARAMETERS ParamA Text (255); SELECT IIf (IsNull ([ParamA]), "*", [ParamA]) AS Ausdr1, t.id FROM Tabelle1 AS t GROUP BY IIf (IsNull ([ParamA]), "*", [ParamA]), t. id HAVING (((t.id) Wie IIf (IsNull ([ParamA]), "*", [ParamA])));
hinzugefügt der Autor Fionnuala, Quelle

Ich glaube nicht, dass du es kannst. Wie führen Sie die Abfrage aus?

Ich würde sagen, wenn Sie eine Abfrage benötigen, die so viele offene Variablen enthält, fügen Sie sie in ein VBA-Modul oder eine Klasse ein und rufen Sie sie auf, damit sie die Zeichenfolge jedes Mal erstellen kann.

0
hinzugefügt

Nun, Sie können Nicht-Null-Werte zurückgeben, indem Sie * als Parameter für Felder übergeben, die Sie im aktuellen Filter nicht verwenden möchten. In Access 2003 (und möglicherweise früheren und späteren Versionen), wenn Sie wie [paramName] als Kriterium für ein numerisches Feld, Text, Datum oder boolesches Feld verwenden, zeigt ein Stern alle Datensätze an stimmen Sie mit den anderen von Ihnen angegebenen Kriterien überein. Wenn Sie auch Nullwerte zurückgeben möchten, können Sie wie [paramName] oder Is Null als Kriterium verwenden, damit alle Datensätze zurückgegeben werden. (Dies funktioniert am besten, wenn Sie die Abfrage im Code erstellen. Wenn Sie eine vorhandene Abfrage verwenden und keine Nullwerte zurückgeben möchten, wenn Sie einen Wert für die Filterung haben, funktioniert dies nicht.)

Wenn Sie ein Memofeld filtern, müssen Sie einen anderen Ansatz ausprobieren.

0
hinzugefügt

Beachten Sie, dass das Platzhalterzeichen * mit dem Schlüsselwort LIKE im ANSI-89-Abfragemodus nur den gewünschten Effekt hat.

Viele Leute vermuten fälschlicherweise, dass das Platzhalterzeichen in Access/Jet immer * ist. Nicht so. Jet hat zwei Platzhalter:% im ANSI-92-Abfragemodus und * im ANSI-89-Abfragemodus.

ADO ist immer ANSI-92 und DAO ist immer ANSI-89, aber die Access-Schnittstelle kann beides sein.

Wenn Sie das LIKE-Schlüsselwort in einem Datenbankobjekt verwenden (d. H. Etwas, das in der MDB-Datei beibehalten wird), sollten Sie sich überlegen: Was würde passieren, wenn jemand diese Datenbank mit einem anderen Abfragemodus als dem normalerweise verwendeten verwenden würde? Angenommen, Sie wollten ein Textfeld nur auf numerische Zeichen beschränken und haben Ihre Validierungsregel wie folgt geschrieben:

NOT LIKE "*[!0-9]*"

Wenn jemand unwissentlich (oder anderweitig) über ADO mit Ihrer MDB verbunden ist, dann würde die obige Validierungsregel es ihnen erlauben, Daten mit nicht-numerischen Zeichen hinzuzufügen und Ihre Datenintegrität würde aufgenommen werden. Nicht gut.

Besser IMO, um immer für beide ANSI-Abfrage-Modi zu codieren. Vielleicht wird dies am besten erreicht, indem explizit für beide Modi, z.B.

NOT LIKE "*[!0-9]*" AND NOT LIKE "%[!0-9]%"

Aber mit mehr beteiligter Jet SQL DML/DDL kann dies sehr schwer präzise zu erreichen sein. Aus diesem Grund empfehle ich, das ALIKE-Schlüsselwort zu verwenden, das das ANSI-92 Query Mode-Platzhalterzeichen unabhängig vom Abfragemodus z.

NOT ALIKE "%[!0-9]%"

Hinweis: ALIKE ist undokumentiert (und ich nehme an, das ist der Grund, warum mein ursprünglicher Post abgemeldet wurde). Ich habe dies in Jet 3.51 (Access97), Jet 4.0 (Access2000 bis 2003) und ACE (Access2007) getestet und es funktioniert gut. Ich habe dies bereits in den Newsgroups gepostet und hatte die Genehmigung von Access MVPs. Normalerweise würde ich mich selbst undokumentierten Features entziehen, aber in diesem Fall eine Ausnahme machen, da Jet seit fast einem Jahrzehnt nicht mehr weiterentwickelt wird und das Access-Team, das es am Leben hält, nicht daran interessiert zu sein scheint, tiefgreifende Änderungen an den Engines vorzunehmen (oder Bugfixes! ), wodurch der Jet-Motor zu einem sehr stabilen Produkt wird.

Weitere Informationen zu den ANSI-Abfragemodi von Jet finden Sie unter Informationen zum ANSI SQL-Abfragemodus .

0
hinzugefügt
Tatsächlich hängt der Platzhalter auch davon ab, welche Datenschnittstelle Sie verwenden. In SQL, das über ADO mit SQL Server ausgeführt wird, verwenden Sie beispielsweise "%" anstelle von Jet SQL "*".
hinzugefügt der Autor David-W-Fenton, Quelle
Tatsächlich hat Jet zwei Platzhalter: "%" im ANSI-92-Abfragemodus und "*" im ANSI-89-Abfragemodus. ADO ist immer ANSI-92, DAO ist immer ANSI-89 und die Access-Schnittstelle kann beides sein. Sie sind sich dessen möglicherweise nicht bewusst, weil Sie immer DAO verwenden.
hinzugefügt der Autor onedaywhen, Quelle
@Air Link jetzt behoben.
hinzugefügt der Autor onedaywhen, Quelle
Vielen Dank. Ich hatte die größte Zeit, eine aktuelle URL zu finden, die den beschriebenen Inhalt zu haben schien - aber vielleicht gibt es keinen. Kann nicht viele Informationen darüber finden, inwieweit dies in 2010 und späteren Versionen von Access ein Problem ist.
hinzugefügt der Autor Air, Quelle