Parameterabfrage mit "OR # IS NULL" gibt Fehler zurück

Base ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit LibreOffice zu bearbeiten.
Antworten
Zerberus
Beiträge: 2
Registriert: Di 11. Feb 2020, 10:44

Parameterabfrage mit "OR # IS NULL" gibt Fehler zurück

Beitrag von Zerberus » Di 11. Feb 2020, 12:00

Hallo,
Ich habe schon oft hier im Forum gelesen, und dieses Forum hat mir schon oft weitergeholfen. Ich habe auch schon mal mit früheren LO Versionen die ein oder andere Mini-DB zusammengeschustert.
Nun komm ich mit suchen/lesen einfach nicht mehr weiter

Ich bin gerade dabei eine einfache Geräteverwaltung zu stricken, und stoße nun auf folgendes Problem bei der Verwendung von Filtern über Parametern.

Die LO Version ist 6.2.8.2 (x64)
Die Datenbank ist eine eingebettete Firebird
OS ist WIN10 Home

Ich habe eine Relationstabelle, in der ich bestimmte Geräte anderen übergeordneten Geräten zuweise.

Für ein Formular habe ich eine Abfrage mit Parameter :Geraetetyp erstellt um mir per Listenfeld die Geräte anzeigen zu lassen, die noch nicht zugeordnet sind (abhängig von ID.Geraetetyp)

Das Listenfeld steckt in einem Formular auf einer Filtertabelle
Die Abfrage steckt in einem darunter liegendem Formular, Im Unterformular ist von dem entsprechenden Feld der Filtertabelle auf den Parameter "ptypeID" verknüpft.

Die Abfrage sieht so aus:

Code: Alles auswählen

SELECT 
"tab_geraete"."ID.geraete", 
"tab_typen"."txt_type", 
"tab_geraete"."txt_mac-adresse", 
"tab_geraete"."txt_seriennummer", 
"tab_geraete"."txt_info1", 
"tab_geraete"."txt_info2", 
"tab_geraete"."txt_info3" 

FROM 
"tab_typen", 
"tab_geraete" 

WHERE NOT "tab_typen"."txt_prefix" = 's' 
AND "tab_geraete"."ID.geraete" NOT IN ( SELECT DISTINCT "rel_geraet-SC"."fk_geraet" FROM "rel_geraet-SC" ) 
AND "tab_geraete"."fk_geraetetyp" = "tab_typen"."ID.typen" 
AND "tab_typen"."ID.typen" = :ptypeID 
Das funktioniert auch so, allerdings kann ich mir die Datensätze ja eben nur gefiltert ansehen.
Ich möchte aber alle sehen wenn kein Parameter eingegeben wird
Im Base Handbuch steht dazu dass man die Abfrage mit dem Parameter um das Konstrukt

Code: Alles auswählen

"OR :parameter IS NULL"
erweitern muss.
Die letzte Zeile aus meiner Abfrage sähe also so aus:

Code: Alles auswählen

AND ("tab_typen"."ID.typen" = :ptypeID OR :ptypeID IS NULL)
Nun funktioniert die Abfrage, wenn der Parameter ausgelassen wird, werden alle geforderten Datensätze angezeigt,
wird aber ein Parameter eingegeben kommt folgende Fehlermeldung.
db-Fehler.JPG
db-Fehler.JPG (28.86 KiB) 572 mal betrachtet
Das passiert unabhängig davon, ob man die Abfrage per Formular ausführt, oder im SQL-Editor der Abfrage
händisch einen entsprechenden Wert einträgt..
Ich schätze also es liegt nicht am Formular.

Funktioniert das mit "OR :# IS NULL" nur bei der HSQLDB, nicht bei Firebird?
mache ich einen Fehler, oder ist das gar ein Bug?


EDIT:
Hier noch eine kleine Beispiel Datenbank nur mit Tabellen und den zwei unterschiedlichen Parameterabfragen als .zip
Parameterabfrage_Test.zip
(4.68 KiB) 5-mal heruntergeladen

RobertG
Beiträge: 2022
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Parameterabfrage mit "OR # IS NULL" gibt Fehler zurück

Beitrag von RobertG » Di 11. Feb 2020, 16:30

Hallo Zerberus,

das hat etwas damit zu tun, dass die Parametereingabe nur bestimmte Datentypen wiedergibt. Ich habe das einmal ohne IS NULL probiert und dazu ein Feld genommen, das Text enthält:

Code: Alles auswählen

 "tbl_typen"."txt_typ" = COALESCE(:ptypeID , "tbl_typen"."txt_typ") 
Dort funktioniert dann die Eingabe eines Strings und der NULL-Wert.
Ändere ich das Ganze auf

Code: Alles auswählen

 ("tbl_typen"."txt_typ" = :ptypeID OR :ptypeID IS NULL) 
so kommt
Incorrect type for setString
Daraus ergibt sich, dass die Abfrage mit :parameter IS NULL in Firebird zur Zeit wohl grundsätzlich scheitert.

Sobald ich dann in der funktionierenden Abfrage mit COALESCE ein Feld verbinde, das in diesem Fall einen Integer-Wert beinhaltet, dann schlägt die gleiche Fehlermeldung wie vorher wieder zu.

Auf die Bugs zur Nutzung von Parameterabfragen komme ich nur, wenn jemand wie Du sie hier meldest. Ich selbst nutze Parameterabfragen überhaupt nicht sondern arbeite grundsätzlich mit Filtertabellen. So eine Abfrage würde bei Dir auch das Problem lösen:

Code: Alles auswählen

"tbl_geraete"."fk_typen" = COALESCE((SELECT "Int" FROM "tbl_filter" WHERE "ID" = TRUE),"tbl_geraete"."fk_typen" )
Die Filtertabelle bestände hier aus den Feldern Int und ID, wobei ID als Primärschlüssel ein Ja/Nein-Feld ist, Int ein Integer-Feld.

Die Firebird-Version innerhalb von LibreOffice hat leider noch so viele Bugs, dass ich auch neue interne Datenbanken nur mit der HSQLDB zusammenbaue.

Nachtrag: Ich habe das gleich in 2 Bugs gepackt:
https://bugs.documentfoundation.org/sho ... ?id=130595
https://bugs.documentfoundation.org/sho ... ?id=130596
... nachdem ich in der LO 6.4.0.3 auch noch einen Bug für die Tabellenerstellung mit Firebird melden konnte.

Gruß

Robert
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare

RobertG
Beiträge: 2022
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Parameterabfrage mit "OR # IS NULL" gibt Fehler zurück

Beitrag von RobertG » Mi 12. Feb 2020, 16:35

Hallo Zerberus,

ich habe jetzt die (etwas umständliche) Lösung für das Problem:

Code: Alles auswählen

AND ("tab_typen"."ID.typen" = :ptypeID OR CAST(:ptypeID AS INTEGER) IS NULL)
Die Behandlung des Parameters scheint grundsätzlich für Firebird bei den Datentypen Probleme zu bereiten, sobald da eine Funktion oder eine NULL-Abfrage erfolgt. Also muss der Typ auf jeden Fall in den entsprechenden Datentyp umgewandelt werden, den Du erwartest. Hat also "tab_typen"."ID.typen" den Feldtyp INTEGER, dann musst Du dies auch in der Abfrage dem Parameter in der IS NULL - Zuweisung zuweisen, obwohl die ja eigentlich keine Beziehung zum Feld hat ...

Ich werde das auch im Handbuch dazu schreiben.

Gruß

Robert
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare

Zerberus
Beiträge: 2
Registriert: Di 11. Feb 2020, 10:44

Re: Parameterabfrage mit "OR # IS NULL" gibt Fehler zurück

Beitrag von Zerberus » Do 13. Feb 2020, 10:40

Hallo Robert,

vielen Dank für die ausführliche Auskunft und Hilfe!
Wer hätte das gedacht!

Kann es sein das es was hiermit zu tun hat?
https://firebirdsql.org/file/documentat ... al-de.html

Ich verstehe zwar kaum was da steht :lol: , aber solang es einen "Workaround" gibt bin ich schonmal zufrieden.

Ich habe auch noch ein bisschen rumprobiert, die ursprüngliche Konstruktion mit "IS NULL" funktioniert wenn man die Parameter durch das Feld der Filtertabelle ersetz, allerdings nur wenn man die Spalte und Tabelle in die Abfrage mit einbindet. Man erhält dadurch eine weiter Spalte hinter den Ergebnissen in der der aktuelle Wert der Filtertabelle steht.
Vermutlich, weil der Datentyp dann ja durch das Feld der Filtertabelle eindeutig ist. Man müsste im Formular (z.B. Tabellenkontrollfeld) dann nur die Spalte mit dem Filterwert "verstecken".
Auch umständlich aber es funtkioniert.

Beste Grüße

Helmut

RobertG
Beiträge: 2022
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Parameterabfrage mit "OR # IS NULL" gibt Fehler zurück

Beitrag von RobertG » Do 13. Feb 2020, 15:52

Hallo Helmut,
Zerberus hat geschrieben:
Do 13. Feb 2020, 10:40
Kann es sein das es was hiermit zu tun hat?
https://firebirdsql.org/file/documentat ... al-de.html
Das klärt zumindest etwas darüber auf, warum es da ein Problem geben kann. Die Parameter sind für die empfangende Datenbank nicht als gleiche Variable zu erkennen. Aus den zwei Nennungen von :ptype werden automatisch zwei (unabhängig verarbeitbare) Parameter. Dem zweiten Parameter fehl daher jede Beziehung zu einem Datentyp.

Leider ist es aber nicht möglich, an dieser Stelle dann den Datentyp SQL_NULL zuzuweisen. Im Moment hilft nichts außer den Datentyp des vorher genannten Feldes einzusetzen.

Gruß

Robert
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare

Antworten