Seite 2 von 2

Re: Abfragekriterium Ist Null und Ist Nicht Null anhand Bedi

BeitragVerfasst: 24. Aug 2021, 17:32
von Namedernochfreiwar
Aber sagt mal Jungs, führt das nicht wieder zu der Ausgangssitutaion in der Entwurfsansicht die ich Eingangs für das Feld hatte: Wenn(fctTest()=1;Ist Null;Ist Nicht Null)
Wo jeder hier erstmal die Augen gerunzelt hat, was das nun sein soll und was ich verrücktes mach?

Aber gut dass wir mal drüber gesprochen haben.
Seid ihr auch sicher, dass das in der Praxis läuft?
Hatte nicht den Eindruck, aber ich bastel da jetzt auch nicht mehr groß dran rum, da ich die Fallunterscheidung doch nicht benötige.

Danke trotzdem
Namedernochfreiwar

Re: Abfragekriterium Ist Null und Ist Nicht Null anhand Bedi

BeitragVerfasst: 24. Aug 2021, 17:51
von ComputerVersteher
Namedernochfreiwar hat geschrieben:führt das nicht wieder zu der Ausgangssitutaion in der Entwurfsansicht die ich Eingangs für das Feld hatte: Wenn(fctTest()=1;Ist Null;Ist Nicht Null)
Schau's Dir doch mal in der Entwurfsansicht an und lies nochmal Bitsqueezers erste Antwort.

Gruß CV

Re: Abfragekriterium Ist Null und Ist Nicht Null anhand Bedi

BeitragVerfasst: 24. Aug 2021, 19:21
von Bitsqueezer
Hallo,

Du siehst den Unterschied immer noch nicht?

"WHERE" dient einzig und allein dazu, auf True oder False zu testen. Alles was danach kommt, muß zusammen in True oder False münden. Wenn True, ist der Datensatz im Ergebnis, sonst nicht.

Nimm doch mal ein Beispiel mit "=".

Du versuchst:

Code: Alles auswählen
Wenn(fctTest()=1;= 4;= 27)


Was soll das sein?

Da kommt kein True oder False raus. "= 4" ist doch kein Ausdruck, der auswertbar ist.

Was Du willst ist, daß Du einmal "Anlage Is Null" testest und einmal "Anlage Is Not Null". Aber Du versuchst, nur "Is Null" oder "Is Not Null" zurückzugeben, um es dann mit dem vorderen Teil zu verbinden, und das machst Du dann auch noch mit "=". Als ob Du SQL-Text von IIf zurückerhalten könntest, den Du einfach "hintendranklebst". Und mit dem "=" käme, sofern das ginge, nicht mal ein sinnvolles Ergebnis dabei raus, wie oben bereits geschrieben.

Das zuletzt von CV verbesserte IIf-Konstrukt dagegen prüft erst, ob die Funktion 1 oder nicht 1 zurückgibt. Wenn es 1 ist, wird der erste Ausdruck ausgewertet, also "Anlage Is Null" - das ist ein auswertbarer Ausdruck, der sich auf den aktuellen Datensatz bezieht. Der gibt dann entweder True oder False zurück. Und wenn Deine Funktion etwas anderes als 1 zurückgibt, wird der andere Ausdruck ausgewertet, also "Anlage Is Not Null", wieder mit entweder True oder False. Und WHERE lächelt und ist glücklich über sein True oder False.

Willst Du wirklich sagen, das sei das gleiche.....?

Gruß

Christian

Re: Abfragekriterium Ist Null und Ist Nicht Null anhand Bedi

BeitragVerfasst: 24. Aug 2021, 22:44
von knobbi38
Hallo,

ComputerVersteher hat geschrieben:
Code: Alles auswählen
WHERE IIf(fcttest() = 1, qry_test.Anlage Is Null, qry_test.Anlage Is Not Null)

eigentlich würde man so etwas doch einfach mit etwas boolescher Logik lösen
Code: Alles auswählen
Where (fctTest = 1 and Anlage is Null) or (fctTest = 0 and Anlage is not null)

oder habe ich da etwas übersehen?

Gruß Ulrich

Re: Abfragekriterium Ist Null und Ist Nicht Null anhand Bedi

BeitragVerfasst: 25. Aug 2021, 00:15
von Bitsqueezer
Hallo,

kann man natürlich auch so machen. Wobei hier allerdings der gesamte Ausdruck ausgewertet werden müßte, bei IIf nur zwei. Aber der Unterschied dürfte marginal sein, wahrscheinlich sogar trotzdem besser, weil es so kein IIf braucht, was ja kein SQL ist.

Gruß

Christian

Re: Abfragekriterium Ist Null und Ist Nicht Null anhand Bedi

BeitragVerfasst: 25. Aug 2021, 08:20
von Gast
IIf ... was ja kein SQL ist

Michael Zimmermann spricht bereits 2005 in seinem AEK-Script zu Abfrageperformance davon, dass es in Jet-SQL ein eingebautes IIf gibt, zu unterscheiden von jenem in VBA.

Persönlich würde ich das in Abfragekriterien eher nicht einsetzen. Wenn man schon VBA-Funktionalität (Funktion) einsetzt, kann man auch gleich wie von ekkehard gezeigt den SQL-String dynamisch zusammensetzen und somit nur genau das Kriterium abfragen, was man benötigt. Der "Schaden" durch einen nicht genutzten vorhandenen Ablaufplan der gespeicherten Abfrage ist sehr wahrscheinlich unbemerk- und messbar.

Bei einer möglichen Performancebetrachtung würde man zwecks Indexnutzung(?) auf ein "NOT NULL" verzichten und bei einem Stringfeld etwas wie " Anlage > '' " verwenden.