Abfragekriterium Ist Null und Ist Nicht Null anhand Bedingun

Antwort erstellen

Smilies
:D :) :( :o :shock: :? 8-) :lol: :x :P :razz: :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: :badgrin: :doubt:
BBCode ist eingeschaltet
[img] ist eingeschaltet
[flash] ist ausgeschaltet
[url] ist eingeschaltet
Smilies sind eingeschaltet
Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Abfragekriterium Ist Null und Ist Nicht Null anhand Bedingun

Re: Abfragekriterium Ist Null und Ist Nicht Null anhand Bedi

Beitrag von Gast » 25. Aug 2021, 08:20

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.

Re: Abfragekriterium Ist Null und Ist Nicht Null anhand Bedi

Beitrag von Bitsqueezer » 25. Aug 2021, 00:15

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

Beitrag von knobbi38 » 24. Aug 2021, 22:44

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

Beitrag von Bitsqueezer » 24. Aug 2021, 19:21

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

Beitrag von ComputerVersteher » 24. Aug 2021, 17:51

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

Beitrag von Namedernochfreiwar » 24. Aug 2021, 17:32

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

Beitrag von Bitsqueezer » 24. Aug 2021, 16:41

Hallo CV,

schöner kann ja jeder... :lol:

Du hast natürlich vollkommen recht, einfacher und eleganter...;)

Gruß

Christian

Re: Abfragekriterium Ist Null und Ist Nicht Null anhand Bedi

Beitrag von ComputerVersteher » 24. Aug 2021, 16:18

Hi,

Code: Alles auswählen
WHERE IIf(fcttest() = 1, qry_test.Anlage Is Null, qry_test.Anlage Is Not Null)
scheint mir einfacher ;)

Gruß CV

Re: Abfragekriterium Ist Null und Ist Nicht Null anhand Bedi

Beitrag von Namedernochfreiwar » 24. Aug 2021, 16:15

Super vielen Dank Bitsqueezer, da wär ich ja nie drauf gekommen.
Hat das irgendwer wo dokumentiert? Das sieht ja ganz schön special aus von der Syntax her.
Werd ich mal bei Gelegenheit ausprobieren.

Re: Abfragekriterium Ist Null und Ist Nicht Null anhand Bedi

Beitrag von Bitsqueezer » 24. Aug 2021, 16:08

Hallo,

nee, so geht's natürlich nicht!

Du kannst nicht mit IIf einen Teil des SQL-Textes als Ergebnis liefern. Darüber hinaus auch noch mit "=", wenn es funktionieren würde, wäre das Ergebnis:

Code: Alles auswählen
WHERE qry_test.Anlage = Is NULL


Also totaler Kokolores und hat mit Logik nichts zu tun.

Was geht ist:

Code: Alles auswählen
WHERE 1 = IIf(fcttest() = 1, Iif(qry_test.Anlage IS NULL, 1, 0), IIf(qry_test.Anlage IS NOT NULL, 1, 0))


Gruß

Christian

Re: Abfragekriterium Ist Null und Ist Nicht Null anhand Bedi

Beitrag von Namedernochfreiwar » 24. Aug 2021, 15:58

P.s. jetzt wo ich das so sehe, dass s = "Is Null" und so: Ich hatte versucht ihm das in der Abfrage in Anführungszeichen zu verkaufen. Klar Datentypkonflikt ist ja kein Text, aber zur Auflösung der beiden enthaltenen Kriterien dacht ich.
Aber wenn ich das hier so sehe, ich weiß ja nicht vielleicht wollte er es auch so haben: Wenn(fctTest()=1;""Ist Null"";""Ist Nicht Null""). Aber ich will an meiner Schaltung jetzt nichts mehr versehentlich kaputtbasteln, daher probier
ich jetzt nicht weiter. Sieht komisch aus, aber man weiß ja nie, ich werd das mal im Auge behalten. In VBA ist ja manchmal auch so mit "'" & Variable & "'". Irgend so ein Zeichensetzungsmist vermute ich mal.

Re: Abfragekriterium Ist Null und Ist Nicht Null anhand Bedi

Beitrag von Namedernochfreiwar » 24. Aug 2021, 15:49

Hey folks,

nach einiger Bastelage stellt sich heraus, dass doch keine Fallunterscheidung von Nöten ist. :roll:

Meine letzte Idee hierzu war jetzt:

Code: Alles auswählen
  Dim q As DAO.QueryDef
    Dim s As String
   
    If Forms!frm_tralala= 1 Then
        s = "Is Null"
    Else
        s = "Is Not Null"
    End If

        Set q = CurrentDb.QueryDefs("qry_test")
        q.Parameters("Anlage") = s
        q.Close
        Set q = Nothing


Auch Luftcode, der nun nicht mher zum Einsatz kommt.
Vielleicht kann mir aber noch jemand abschliessend sagen, ob dies der einzig mögliche Ansatz war
oder ich einfach nur einen Syntaxfehler/Logikfehler in der Abfragebedingung drin hatte.
Wäre ja generell nice to know.

Dank vom Namendernochfreiwar

Re: Abfragekriterium Ist Null und Ist Nicht Null anhand Bedi

Beitrag von Namedernochfreiwar » 24. Aug 2021, 14:23

Hallo Beaker,

in die Richtung hab ich auch schon gedacht, würde das Kriterium aber eher über die Querydefinition setzen lassen, als die komplette Abfrage jedesmal über den Code erzeugen zu lassen.
Dann muss ich wohl doch noch einmal die Syntax raussuchen, wie das mit Querydefinition nochmal genau war. Im Kopf hab ich das jetzt auch nicht. :(

Gruß
vom Namendernochfreiwar

Re: Abfragekriterium Ist Null und Ist Nicht Null anhand Bedi

Beitrag von Beaker s.a. » 24. Aug 2021, 14:14

Hallo,
Luftcode:
Code: Alles auswählen
Private Sub DeinKombi_AfterUpdate()
    Dim s As String
    Dim sSQL
    If Me.DeinKombi = 1 Then
        s = "Is Null"
    Else
        s = "Is Not Null"
    End If
    sSQL = _
          "SELECT qry_test.Anlage " _
        & "FROM qry_test " _
        & "WHERE qry_test.Anlage " & s
    Debug.Print sSQL
End Sub


gruss ekkehard

Re: Abfragekriterium Ist Null und Ist Nicht Null anhand Bedi

Beitrag von Namedernochfreiwar » 24. Aug 2021, 13:45

Gut in SQl gesprochen anhand eines vereinfachten Beispiels, natürlich hat die Abfrage in echt mehr Felder.:

Das was funktioniert solo:

Code: Alles auswählen
SELECT qry_test.Anlage
FROM qry_test
WHERE (((qry_test.Anlage) Is Null));


Auch der umgekehrte Fall funktioniert:
Code: Alles auswählen
SELECT qry_test.Anlage
FROM qry_test
WHERE (((qry_test.Anlage) Is Null));


Was nicht geht ist das als Fallunterscheidung zu schalten, anhand der Nutzerauswahl
über genannte Wertspeicherung über Funktion tralala etc. wie beschrieben.
(Auswahl 1 aus Kombibox bitte Leerwerte ausgeben, Auswahl 2 bitte alle nicht Leerwerte ausgeben)

Code: Alles auswählen
SELECT qry_test.Anlage
FROM qry_test
WHERE (((qry_test.Anlage)=IIf(fcttest()=1,(qry_test.Anlage) Is Null,(qry_test.Anlage) Is Not Null)));


Was möchte Access hier haben? Kann ja sein, dass Besonderheiten in der Syntax zu berücksichtigen sind (Sonderzeichen etc., damit er das Null oder IsNull aus der Bedingung als Kriterium nimmt)
Gruß vom Namendernochfreiwar

Nach oben