Discussion:
Abfragekriterium aus Auswahlfeld
(zu alt für eine Antwort)
Frank Lauter
2004-02-19 15:10:58 UTC
Permalink
Hallo NG!

Ich möchte in einer Abfrage ein Kriterium aus einem Auswahlfeld eines
Formulars nutzen. Das klappt problemlos, solange das Auswahlfeld einen
einzelnen Wert übergibt. Ich möchte jetzt aber mit dem selben Auswahlfeld
auch zwei Werte übergeben, die mit "Oder" verknüpft sind.

Das Kriterium der Abfrage soll je nach Auswahl folgende Ausdrücke annehmen
können:

"WertA"
"WertB"
"WertA" Oder "WertB"

Wie läßt sich das realisieren?

Vielen Dank für Eure Hilfe im Voraus.

Viele Grüße

Frank
Mark Doerbandt
2004-02-19 16:01:31 UTC
Permalink
Hallo, Frank,
Ich moechte in einer Abfrage ein Kriterium aus einem Auswahlfeld
eines Formulars nutzen. Das klappt problemlos, solange das
Auswahlfeld einen einzelnen Wert uebergibt.
Wie machst Du es denn bisher?
Ich moechte jetzt aber
mit dem selben Auswahlfeld auch zwei Werte uebergeben, die mit
"Oder" verknuepft sind.
Setze Dir einen SQL-String zusammen und weise diesen der .SQL-
Eigenschaft des QueryDef-Objektes zu.

Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Set db = CurrentDB
Set qdf = db.QueryDefs("DeinAbfrageName")
qdf.SQL = "" ' hier Dein Statement
qdf.Close
Set qdf = Nothing
Set db = Nothing

Gruss - Mark
--
Informationen fuer Neulinge in den Access-Newsgroups unter
http://www.doerbandt.de/Access/Newbie.htm

Bitte keine eMails auf Newsgroup-Beiträge senden.
Frank Lauter
2004-02-19 21:44:55 UTC
Permalink
Hallo Mark!
Post by Mark Doerbandt
Ich moechte in einer Abfrage ein Kriterium aus einem Auswahlfeld
eines Formulars nutzen. Das klappt problemlos, solange das
Auswahlfeld einen einzelnen Wert uebergibt.
Wie machst Du es denn bisher?
Unter Kriterien folgendes eintragen:
[Formulare]![MaskenAbfragen]![fldBezeichnung]
Post by Mark Doerbandt
Setze Dir einen SQL-String zusammen und weise diesen der .SQL-
Eigenschaft des QueryDef-Objektes zu.
Mir wäre es lieber, wenn man in der Abfrage erkennen könnte, daß
unterschiedliche Kriterien verwendet werden können, da evtl. noch mal ein
anderer Anwender die Abfrage modifizieren können soll, der nicht im
VBA-Quelltext sucht.

Geht das garnicht?

Das Problem liegt anscheinend darin, daß das Schlüsselwort "Oder" nicht
erkannt wird, sondern als String-Bestand interpretiert wird.

Vielen Dank für Deine Hilfe und viele Grüße

Frank
Mark Doerbandt
2004-02-21 13:27:48 UTC
Permalink
Hallo, Frank,
Das Problem liegt anscheinend darin, dass das Schluesselwort "Oder"
nicht erkannt wird, sondern als String-Bestand interpretiert
wird.
Nein, das sollte schon gehen. Ich hatte gedacht, Du meinst mit "zwei"
mehrere, d.h. eine unbestimmte Zahl. Das waere dann schwieriger und imo
besser mit VBA zu regeln. Oder allerdings bei den Abfragekriterien
sollte funktionieren...

Gruss - Mark
--
Informationen fuer Neulinge in den Access-Newsgroups unter
http://www.doerbandt.de/Access/Newbie.htm

Bitte keine eMails auf Newsgroup-Beiträge senden.
Frank Lauter
2004-02-21 21:54:47 UTC
Permalink
Hallo Mark,
Post by Mark Doerbandt
Nein, das sollte schon gehen. Ich hatte gedacht, Du meinst mit "zwei"
mehrere, d.h. eine unbestimmte Zahl. Das waere dann schwieriger und imo
besser mit VBA zu regeln. Oder allerdings bei den Abfragekriterien
sollte funktionieren...
Nein, es soll genau 3 Möglichkeiten geben, von der nur eine ein "Oder"
erfordert.
Ich habe sogar schon versucht, dies mit einer Wenn-Bedingung als Kriterium
zu
lösen,
das gelingt aber nicht, da die Abfrage dann laut Fehlermeldung zu
kompliziert wird.
Hast Du noch eine Idee, wie man das umsetzen kann?

Viele Grüße

Frank
Mark Doerbandt
2004-02-22 21:04:33 UTC
Permalink
Hallo, Frank,
da die Abfrage dann laut Fehlermeldung zu kompliziert wird.
Bitte poste doch mal den SQL-Code der Abfrage.

Gruss - Mark
--
Informationen fuer Neulinge in den Access-Newsgroups unter
http://www.doerbandt.de/Access/Newbie.htm

Bitte keine eMails auf Newsgroup-Beiträge senden.
Frank Lauter
2004-02-22 23:50:11 UTC
Permalink
Hallo Mark
Post by Mark Doerbandt
Bitte poste doch mal den SQL-Code der Abfrage.
SELECT [Vorabfrage].Objektnummer, [Vorabfrage].Hersteller,
[Vorabfrage].Bezeichnung, [Vorabfrage].LE, [Vorabfrage].Fahrzeug,
[Vorabfrage].[nächste Prüfung], [Vorabfrage].Prüfung, [Vorabfrage].Termin,
[Vorabfrage].Prüfungsart, [Vorabfrage].[Sichtprüfung OK],
[Vorabfrage].[Flaschendruck OK], [Vorabfrage].Hochdruckdichtprüfung,
[Vorabfrage].[Anspr Warneinrichtung], [Vorabfrage].Prüfunganmerkung
FROM [Vorabfrage]
WHERE
((([Vorabfrage].Prüfung)=[Formulare]![ObjektAbfragen]![fldhalbjährlichePrüfu
ng]));

Dazu kämen noch weitere Kriterien, (auch aus Kombinationsfeldern) die
allerdings leer sein können. Umgesetzt wird das über den Trick aus den FAQs.
Hier habe ich das weggelassen, da die Abfrage sonst nicht mehr lesbar ist.

Vorabfrage:
SELECT tabObjekt.Objektnummer, tabObjekt.Hersteller, tabObjekt.Bezeichnung,
tabObjekt.LE, tabObjekt.Fahrzeug, [Termin]+fctSendVar("conFrist") AS
[nächste Prüfung],
IIf(IsNull([Termin]),"erforderlich",IIf([Termin]+fctSendVar("confrist")<Now(
),"überfällig",IIf([Termin]+fctSendVar("confrist")-fctSendVar("conMeldezeit"
)<Now(),"erforderlich"," "))) AS Prüfung, [abf letzte halbjährliche
Prüfung].Termin, [abf letzte halbjährliche Prüfung].Prüfungsart, [abf letzte
halbjährliche Prüfung].[Sichtprüfung OK], [abf letzte halbjährliche
Prüfung].[Flaschendruck OK], [abf letzte halbjährliche
Prüfung].Hochdruckdichtprüfung, [abf letzte halbjährliche Prüfung].[Anspr
Warneinrichtung], [abf letzte halbjährliche Prüfung].Prüfunganmerkung
FROM [abf letzte halbjährliche Prüfung] RIGHT JOIN tabObjekt ON [abf letzte
halbjährliche Prüfung].ID = tabObjekt.ID
ORDER BY tabObjekt.Objektnummer;

Viele Grüße

Frank
Mark Doerbandt
2004-02-23 21:47:30 UTC
Permalink
Hallo, Frank,
WHERE
((([Vorabfrage].Pruefung)=[Formulare]![ObjektAbfragen]![fldhalbjaehr
lichePruefung]));
hier muesste stehen

WHERE
((([Vorabfrage].Pruefung)=[Formulare]![ObjektAbfragen]!
[fldhalbjaehrlichePruefung]) OR (([Vorabfrage].Pruefung)=
[Formulare]![ObjektAbfragen]![fld2]));

Gruss - Mark
--
Informationen fuer Neulinge in den Access-Newsgroups unter
http://www.doerbandt.de/Access/Newbie.htm

Bitte keine eMails auf Newsgroup-Beiträge senden.
Frank Lauter
2004-02-24 00:06:04 UTC
Permalink
Hallo Mark!
Post by Mark Doerbandt
hier muesste stehen
WHERE
((([Vorabfrage].Pruefung)=[Formulare]![ObjektAbfragen]!
[fldhalbjaehrlichePruefung]) OR (([Vorabfrage].Pruefung)=
[Formulare]![ObjektAbfragen]![fld2]));
Dabei gehst du aber davon aus, dass es zwei Felder
([fldhalbjaehrlichePruefung], [fld2]) im Formular gibt. Ich habe jedoch nur
ein Kombinationsfeld, in dem ich 3 Möglichkeiten anbieten möchte.

Eine Zelle der Spalte der Abfrage kann einen von 3 verschieden Werten
annehmen
("überfällig", "erforderlich" oder " ") . Im Kombinationsfeld möchte ich die
Möglichkeiten anbieten, mit der Abfrage alle Datensätze anzuzeigen, die in
der Spalte

1. "überfällig"
2. "erforderlich"
3. "überfällig" oder "erforderlich"

enthalten.

Ich benötige das "Oder" also nur bei einer Kombination. Deshalb müßte ich es
mit übergeben und kann es nicht vorher fest in die SQL-Abfrage schreiben.
Dabei tritt dann das Problem auf, dass, egal wie ich es bisher probiert
habe, das "Oder" immer mit als Textbestandteil interpretiert wird. Siehe
auch mein Posting auf Thomas Möller's Posting.

Ich werde wohl dazu übergehen, den SQL-String doch durch VBA zu ändern, das
scheint viel praktikabler zu sein.

Das Problem, dass die Abfrage zu kompliziert sei, ist dann nämlich auch
gelöst. Es kommt dadurch, dass Access die Kriterien nicht so stehen läßt,
wie sie eingegeben wurden, sondern sie automatisch umschreibt.

Aus der Eingabe
Feld 1 | Feld 2
WertA oder WertB | WertC oder WertD

erzeugt Access alle möglichen Kombinationen.
Feld 1 | Feld 2
WertA | WertC
WertA | WertD
WertB | WertC
WertB | WertD

Warum macht Access das eigentlich? Dass die Abfrage bei weiteren Kriterien
dann ja schnell kompliziert wird, ist klar.

Vielen Dank für eure Hilfe und viele Grüße

Frank
Mark Doerbandt
2004-02-25 09:33:44 UTC
Permalink
Hallo, Frank,
Ich habe jedoch nur ein Kombinationsfeld, in dem ich 3 Möglichkeiten
anbieten möchte. Eine Zelle der Spalte der Abfrage kann einen von 3
verschieden Werten annehmen ("überfällig", "erforderlich" oder " ").
Im Kombinationsfeld möchte ich die Möglichkeiten anbieten, mit der
Abfrage alle Datensätze anzuzeigen, die in der Spalte
1. "überfällig"
2. "erforderlich"
3. "überfällig" oder "erforderlich"
enthalten.
Ich benötige das "Oder" also nur bei einer Kombination.
Und warum kommst Du mit dieser Info erst jetzt rueber?

Kannst Du das Feld Pruefung der Abfrage nicht numerisch machen, sagen wir
mal 0 für " ", 1 für "überfällig" und 2 für "erforderlich". Dann könntest
Du in Deiner Kombobox eine zweite Spalte einfuegen, deren Breite dur auf
null setzt und die Du als gebundene Spalte definierst. Diese haette dann
die Werte 1, 2 oder 3 (fuer ueberfaellig oder erforderlich) und als
Kriterium schreibst Du

WHERE (Pruefung AND Forms!...) > 0

Der Kniff liegt hierbei in der binaeren Logik...

Gruss - Mark
Frank Lauter
2004-02-25 22:54:06 UTC
Permalink
Hallo Mark!
Post by Mark Doerbandt
Post by Frank Lauter
Ich benötige das "Oder" also nur bei einer Kombination.
Und warum kommst Du mit dieser Info erst jetzt rueber?
So war es eigentlich von Anfang an gemeint, sorry, wenn wir aneinander
vorbei geschrieben haben.
Post by Mark Doerbandt
Kannst Du das Feld Pruefung der Abfrage nicht numerisch machen, sagen wir
mal 0 für " ", 1 für "überfällig" und 2 für "erforderlich". Dann könntest
Du in Deiner Kombobox eine zweite Spalte einfuegen, deren Breite dur auf
null setzt und die Du als gebundene Spalte definierst. Diese haette dann
die Werte 1, 2 oder 3 (fuer ueberfaellig oder erforderlich) und als
Kriterium schreibst Du
WHERE (Pruefung AND Forms!...) > 0
Der Kniff liegt hierbei in der binaeren Logik...
Wenn ich aber dann im Kombinationsfeld "2" wähle, erhalte ich aber in der
Abfrage schon die Datensätze mit den Werten 0 und 1 .

Gewünscht wäre aber:

1. nur überfällig =1
2. nur erforderlich =2
3. überfällig oder erforderlich 1 oder 2 also ohne 0


Ich habe alternativ noch versucht, ein ">" mit in das Kombinationsfeld
aufzunehmen, aber auch das führt nur zu einer Fehlermeldung, die Abfrage sei
zu komplex.

Vielen Dank für Deine Mühe und viele Grüße

Frank
Mark Doerbandt
2004-02-25 23:18:38 UTC
Permalink
Hallo, Frank,
Post by Mark Doerbandt
WHERE (Pruefung AND Forms!...) > 0
Der Kniff liegt hierbei in der binaeren Logik...
Wenn ich aber dann im Kombinationsfeld "2" waehle, erhalte ich
aber in der Abfrage schon die Datensaetze mit den Werten 0 und 1 .
Nein, da steht AND... Hast Du es probiert?

2 AND 0 = 0
2 AND 1 = 0
2 AND 2 = 0
2 AND 3 = 1

Beachte die Klammern.

Gruss - Mark
--
Informationen fuer Neulinge in den Access-Newsgroups unter
http://www.doerbandt.de/Access/Newbie.htm

Bitte keine eMails auf Newsgroup-Beiträge senden.
Mark Doerbandt
2004-02-25 23:23:06 UTC
Permalink
Post by Mark Doerbandt
2 AND 2 = 0
LOL - 2

Gruss & gute Nacht - Mark
Frank Lauter
2004-02-27 17:33:13 UTC
Permalink
Hallo Mark!
Post by Mark Doerbandt
Post by Mark Doerbandt
WHERE (Pruefung AND Forms!...) > 0
Der Kniff liegt hierbei in der binaeren Logik...
Wenn ich aber dann im Kombinationsfeld "2" waehle, erhalte ich
aber in der Abfrage schon die Datensaetze mit den Werten 0 und 1 .
Nein, da steht AND... Hast Du es probiert?
Probiert schon, aber anfänglich nicht kapiert.

Ich habe es aber noch weiter probiert, aber bisher noch keine
funktionierende Lösung gefunden.
Post by Mark Doerbandt
2 AND 0 = 0
2 AND 1 = 0
2 AND 2 = 0
2 AND 3 = 1
Der AND-Operator liefert mir aber folgende Werte:

2 AND 0 = 0
2 AND 1 = 0
2 AND 2 = 2
2 AND 3 = 2

Wie erziele ich denn damit eine 1?

Den AND-Operator kannte ich bisher nur im Zusammenhang mit Wahrheitswerten,
wie funktioniert er genau mit Zahlen? Ist folgende Idee richtig?

Die Zahlen werden binär dargestellt und dann bitweise verglichen. Wenn beide
bits 1 sind, ist das Ergebnis auch 1, sonst 0. Das dabei entstehende
Bitmuster
wird in eine dezimale Zahl umgewandelt.

Zur Umsetzung in Access habe ich eine möglichst einfache Testdb erstellt.
Trotzdem führt es nicht zum gewünschten Ergebnis. Was ist verkehrt?

Die Tabelle "tabTabelle" erhält in der Spalte "Wert" die Werte, nach denen
gefiltert werden soll. ( Diesmal per Hand in der Tabelle eingegeben und
nicht in einer Abfrage berechnet.)

SELECT [tabTabelle].[Nummer], [tabTabelle].[Wert]
FROM tabTabelle
WHERE ([tabTabelle].[Wert] And Formulare!frm1!fldhalbjährlichePrüfung)>0;

Das Kombinationsfeld bezieht seine Werte aus dieser Wertliste:
3;"anstehende";2;"nur erforderliche";1;"nur überfällig"
Davon gebunden ist die erste Spalte.

Vielen Dank für die Hilfe und viele Grüße

Frank
Mark Doerbandt
2004-02-27 20:43:20 UTC
Permalink
Hallo, Frank,
Post by Frank Lauter
Post by Mark Doerbandt
2 AND 3 = 1
2 AND 3 = 2
Ja, klar! Wichtig aber nur, dass
Post by Frank Lauter
Wie erziele ich denn damit eine 1?
die Bedingung > 0 lautet...
Post by Frank Lauter
Die Zahlen werden binaer dargestellt und dann bitweise verglichen.
Wenn beide bits 1 sind, ist das Ergebnis auch 1, sonst 0. Das
dabei entstehende Bitmuster
wird in eine dezimale Zahl umgewandelt.
Ja.
Post by Frank Lauter
Zur Umsetzung in Access habe ich eine moeglichst einfache Testdb
erstellt. Trotzdem fuehrt es nicht zum gewuenschten Ergebnis. Was
ist verkehrt?
Maile mir doch mal Deine gezippte MDB (und ignoriere dabei den
Autoresponder).

Gruss - Mark
--
Informationen fuer Neulinge in den Access-Newsgroups unter
http://www.doerbandt.de/Access/Newbie.htm

Bitte keine eMails auf Newsgroup-Beiträge senden.
Mark Doerbandt
2004-02-27 23:04:30 UTC
Permalink
Hallo, Frank,
Maile mir doch mal Deine gezippte MDB ...
Ist zurueck unterwegs.

Hier fuer Josef:

Function BAND(ParamArray Var()) As Variant
Dim i As Integer
Dim varResult As Variant
varResult = Null
If LBound(Var) <= UBound(Var) Then
varResult = Var(LBound(Var))
End If
For i = LBound(Var) To UBound(Var)
varResult = varResult And Var(i)
Next i
BAND = varResult
End Function

Sub testBAND()
MsgBox "BAND():" & Nz(BAND(), "#NULL#")
MsgBox "9 and 12 and 8" & Str(BAND(9, 12, 8))
MsgBox "2 and 0" & Str(BAND(2, 0))
MsgBox "2 and 1" & Str(BAND(2, 1))
MsgBox "2 and 2" & Str(BAND(2, 2))
MsgBox "2 and 3" & Str(BAND(2, 3))
End Sub

Gruss - Mark
--
Informationen fuer Neulinge in den Access-Newsgroups unter
http://www.doerbandt.de/Access/Newbie.htm

Bitte keine eMails auf Newsgroup-Beiträge senden.
Josef Poetzl
2004-02-27 18:28:42 UTC
Permalink
Hallo!
Post by Mark Doerbandt
WHERE (Pruefung AND Forms!...) > 0
Der Kniff liegt hierbei in der binaeren Logik...
... in einer Access-Abfrage?

(Pruefung AND Forms!...) liefert immer -1 (True) solange keiner der
beiden Werte 0 ist. => true ist aber < 0

Bitvergleich geht imo nur den über Umweg einer VBA-Funktion.
(Oder in ADO per BAND)

Aber wenn ich das Problem richtig verstanden haben, dann steht im Feld
Prüfung 0,1 oder 2
das Feld im Form enthält 1,2,3 wobei 3 für 1+2 steht.

Was passiert wenn ich nun diesen Vergleich mache:
Where (Forms!... = 3 And (Prüfung>0)) Or (Prüfung = Forms!...)

Ist zwar kein Bitvergleich aber das Ergebnis sollte doch stimmen,
oder?

mfg
Josef
--
EPT: (Access Error Prevention Table) http://access.joposol.com/
FAQ: (Access-FAQ von Karl Donaubauer) http://www.donkarl.com/
Mark Doerbandt
2004-02-27 20:55:54 UTC
Permalink
Hallo, Josef,
Post by Josef Poetzl
... in einer Access-Abfrage?
(Pruefung AND Forms!...) liefert immer -1 (True) solange keiner
der beiden Werte 0 ist. => true ist aber < 0
Umpf! Ich war mir sicher, das schon einmal so gemacht zu haben.
Wahrscheinlich hast Du aber Recht, dass ich es ueber eine Funktion
realisiert habe. Ein kurzer Test bestaetigt Deine Aussage.

Also gut, Frank: dann schreibe Dir eine kleine Prozedur, die
den bitweisen AND durchfuehrt... Sorry fuer den Holzweg.

Gruss - Mark
Frank Lauter
2004-02-28 02:56:29 UTC
Permalink
Hallo Mark!
Hallo Josef!

Vielen Dank! Es funktioniert!

Die Lösung mit der Prozedur und die Lösung mit dem Vergleich "Where
(Forms!... = 3 And (Prüfung>0)) Or (Prüfung = Forms!...)" funktionieren
beide super gut.

Noch mal vielen Dank und viele Grüße

Frank

Thomas Möller
2004-02-22 09:21:39 UTC
Permalink
Hallo Frank,
Post by Frank Lauter
Ich möchte in einer Abfrage ein Kriterium aus einem Auswahlfeld eines
Formulars nutzen. Das klappt problemlos, solange das Auswahlfeld einen
einzelnen Wert übergibt. Ich möchte jetzt aber mit dem selben
Auswahlfeld auch zwei Werte übergeben, die mit "Oder" verknüpft sind.
Das Kriterium der Abfrage soll je nach Auswahl folgende Ausdrücke
"WertA"
"WertB"
"WertA" Oder "WertB"
generell würde ich eine Lösung, die den SQL-String der Abfrage ändert,
bevorzugen.

Wenn Du aber "unbedingt" eine Lösung mit Verweis auf das Formular willst,
dann könntest Du folgendes ausprobieren (ungetestet):
Für die Auswahl des Kriteriums legst Du ein Kombinationsfeld an. Dies hat
zwei Spalten. Die erste ist gebunden und unsichtbar. Die zweite ist
sichtbar. Für WertA und WertB schreibst Du diesen in beide Spalten. Als
dritten Wert schreibst Du in die zweite Spalte "A oder B". In die erste
Spalte schreibst Du "'A' OR [Deinfeld]='B'".

HTH
--
***@Team-Moeller.de

Homepage: www.team-moeller.de

TM-AbhängigeObjekte: Update auf Version 2.40 (seit 18.01.04)
Addin: Abhängigkeiten zwischen den Datenbankobjekten ermitteln
Frank Lauter
2004-02-22 22:50:33 UTC
Permalink
Hallo Thomas,
Post by Thomas Möller
Wenn Du aber "unbedingt" eine Lösung mit Verweis auf das Formular willst,
Für die Auswahl des Kriteriums legst Du ein Kombinationsfeld an. Dies hat
zwei Spalten. Die erste ist gebunden und unsichtbar. Die zweite ist
sichtbar. Für WertA und WertB schreibst Du diesen in beide Spalten. Als
dritten Wert schreibst Du in die zweite Spalte "A oder B". In die erste
Spalte schreibst Du "'A' OR [Deinfeld]='B'".
vielen Dank für Deinen Tipp, aber leider funktioniert er nicht, da das "OR"
trotzdem als Textstringbestandteil interpetiert wird. Wenn es keinen Befehl
oder eine andere Möglichkeit gibt, in dem übergebenen Textstring einen Teil
als nicht Stringbestandteil zu kennzeichnen, glaube ich, gibt es keine
Lösung außer der Alternative, den SQL-Befehl zu modifizieren.
Ist jemandem eine Möglichkeit bekannt, einen Teil als nicht
Stringbestandteil zu kennzeichnen?

Viele Grüße

Frank
Loading...