Discussion:
Access aus Microsoft 365: Kriterien in Feld mit VBA in Abfrage nicht möglich!?
(zu alt für eine Antwort)
Louis Noser
2020-09-26 08:39:42 UTC
Permalink
Grüss Euch

Wenn ich in einem Abfragefeld den Ausdruck

Sollklasse: Links([SollKtoNr];1)

mitsamt einem Kriterium erfasse, erscheint der Dialog 'Parameterwert
eingeben', wo 'SollKtoNr' gefragt ist. Wenn ich das Kriterium rausnehme,
wird die Abfrage ohne Meldung ausgeführt.

Entwurfsansicht mit einer von zwei Fehlermeldungen:
https://workupload.com/file/mWAQ4GXvg22

SQL:
SELECT tbl_Kontenplan.KtoNr AS SollKtoNr, tbl_Kontenplan_1.KtoNr AS
HabenKtoNr, Left([SollKtoNr],1) AS Sollklasse, Left([HabenKtoNr],1) AS
Habenklasse
FROM ((tbl_buchen_laufendes_Jahr INNER JOIN tbl_Kontenplan AS
tbl_Kontenplan_1 ON tbl_buchen_laufendes_Jahr.Haben =
tbl_Kontenplan_1.KtoName) LEFT JOIN tbl_Budgetbetreff_2020 ON
tbl_buchen_laufendes_Jahr.BuchNr = tbl_Budgetbetreff_2020.BuchNr) INNER
JOIN tbl_Kontenplan ON tbl_buchen_laufendes_Jahr.Soll =
tbl_Kontenplan.KtoName
WHERE (((Left([SollKtoNr],1))=3 Or (Left([SollKtoNr],1))=4)) OR
(((Left([HabenKtoNr],1))=3 Or (Left([HabenKtoNr],1))=4));

Ist mein Access kaputt?
Oder was mache ich falsch?

Vielen Dank.

Grüsse
Louis
Louis Noser
2020-09-26 15:41:08 UTC
Permalink
Ich habe jetzt die Kriterien wie folgt gesetzt:
Wie "3*" Oder Wie "4*"

Screenshot Entwurfsansicht:
https://workupload.com/file/pyhk9z7qk89

So funktioniert es.

Es würde mich aber interessieren, warum die Lösung mit einer
VBA-Funktion und einem Kriterium auf dem Ergebnis nicht geht.

Grüsse
Louis
Karl Donaubauer
2020-09-26 21:52:13 UTC
Permalink
Hallo!
Post by Louis Noser
Wenn ich in einem Abfragefeld den Ausdruck
Sollklasse: Links([SollKtoNr];1)
mitsamt einem Kriterium erfasse, erscheint der Dialog 'Parameterwert
eingeben', wo 'SollKtoNr' gefragt ist. Wenn ich das Kriterium rausnehme,
wird die Abfrage ohne Meldung ausgeführt.
https://workupload.com/file/mWAQ4GXvg22
SELECT tbl_Kontenplan.KtoNr AS SollKtoNr, tbl_Kontenplan_1.KtoNr AS
HabenKtoNr, Left([SollKtoNr],1) AS Sollklasse, Left([HabenKtoNr],1) AS
Habenklasse
FROM ((tbl_buchen_laufendes_Jahr INNER JOIN tbl_Kontenplan AS
tbl_Kontenplan_1 ON tbl_buchen_laufendes_Jahr.Haben =
tbl_Kontenplan_1.KtoName) LEFT JOIN tbl_Budgetbetreff_2020 ON
tbl_buchen_laufendes_Jahr.BuchNr = tbl_Budgetbetreff_2020.BuchNr) INNER
JOIN tbl_Kontenplan ON tbl_buchen_laufendes_Jahr.Soll =
tbl_Kontenplan.KtoName
WHERE (((Left([SollKtoNr],1))=3 Or (Left([SollKtoNr],1))=4)) OR
(((Left([HabenKtoNr],1))=3 Or (Left([HabenKtoNr],1))=4));
...
Wenn man einen Alias (hier SollKtoNr) in einer berechneten Spalte in der
WHERE-Klausel verwendet, wird er immer als Parameter betrachtet . Du
müsstest daher auch für "HabenKtoNr" ein Parameterfenster bekommen.

Deine andere Variante funktioniert, weil du dort die Kriterien nicht
mehr auf berechnete Spalten anwendest, sondern direkt auf die Felder.
Die LIKE-Variante mit Asterisk hintennach ist eh besser, weil sie einen
evtl. vorhandenen Index am Feld verwenden kann.
--
Servus
Karl
*********
http://AccessDevCon.com
Access FAQ: http://donkarl.com
Louis Noser
2020-09-26 22:01:18 UTC
Permalink
Hallo Karl
Post by Karl Donaubauer
Wenn man einen Alias (hier SollKtoNr) in einer berechneten Spalte in der
WHERE-Klausel verwendet, wird er immer als Parameter betrachtet . Du
müsstest daher auch für "HabenKtoNr" ein Parameterfenster bekommen.
Das ist so.
Post by Karl Donaubauer
Deine andere Variante funktioniert, weil du dort die Kriterien nicht
mehr auf berechnete Spalten anwendest, sondern direkt auf die Felder.
Wenn ich recht verstehe, funktionieren also Kriterien auf berechnete
Spalten nicht bzw. nie.
Post by Karl Donaubauer
Die LIKE-Variante mit Asterisk hintennach ist eh besser, weil sie einen
evtl. vorhandenen Index am Feld verwenden kann.
Ich nehme an, das heisst, dass die Ausführung - hier von Like - mit
Index schneller vonstatten geht als ohne.

Vielen Dank für die Hinweise.

Grüsse
Louis
Karl Donaubauer
2020-09-26 23:07:53 UTC
Permalink
Hallo!
Post by Louis Noser
Post by Karl Donaubauer
Wenn man einen Alias (hier SollKtoNr) in einer berechneten Spalte in
der WHERE-Klausel verwendet, wird er immer als Parameter betrachtet .
Du müsstest daher auch für "HabenKtoNr" ein Parameterfenster bekommen.
Das ist so.
Post by Karl Donaubauer
Deine andere Variante funktioniert, weil du dort die Kriterien nicht
mehr auf berechnete Spalten anwendest, sondern direkt auf die Felder.
Wenn ich recht verstehe, funktionieren also Kriterien auf berechnete
Spalten nicht bzw. nie.
Nein. Kriterien auf berechnete Spalten funktionieren schon. Du könntest
z.B. in deiner neuen, funktionierenden Variante (mit Kriterium direkt
auf das Feld) auch wieder Links(Feldname; 1) und "3 oder 4" als
Kriterium verwenden.

Was nicht funktioniert, ist ein Kriterium auf eine berechnete Spalte,
wenn in dieser berechneten Spalte ein Alias vorkommt. Am konkreten Beispiel:

Du hattest zuerst "SollKtoNr" als Alias im SELECT festgelegt und ihn
danach in der berechneten Spalte "Sollklasse" verwendet. Das geht noch.

Sobald du aber ein Kriterium auf diese Spalte anwendest, d.h. wenn die
Sache im SQL-WHERE-Abschnitt vorkommt, kann Access diesen
weiterverwendeten Alias nicht mehr auflösen und fragt nach. Das ist eine
Beschränkung der Datenbankengine ACE.
Post by Louis Noser
Post by Karl Donaubauer
Die LIKE-Variante mit Asterisk hintennach ist eh besser, weil sie
einen evtl. vorhandenen Index am Feld verwenden kann.
Ich nehme an, das heisst, dass die Ausführung - hier von Like - mit
Index schneller vonstatten geht als ohne.
Ja, wenn es einen entsprechenden Index gibt und wenn der * hinten steht,
nicht vorne. Sonst müssen wieder alle Datensätze durchsucht werden, wie
es bei einer berechneten Spalte mit Left() auf jeden Fall passiert.
--
Servus
Karl
*********
http://AccessDevCon.com
Access FAQ: http://donkarl.com
Loading...