Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi IIF mit SQLite (https://www.delphipraxis.net/210762-iif-mit-sqlite.html)

ThomasWB 6. Jun 2022 15:11

Datenbank: SQLite • Version: 3? • Zugriff über: TSQLDataSet

IIF mit SQLite
 
Hallo,

ich habe eine SQLite-Datenbank. Über ein SQL in TSQLDataSet erstelle ich eine Abfrage. Abhängig vom Inhalt eines Feldes soll entweder der Inhalt eines Feldes oder die Kombination zweiter Felder in einem DBEdit-Feld angezeigt werden.

Code:
SELECT R.Titel AS Titel,
       R.Bild AS Bild,
       R.Zubereitung AS Zubereitung,
       R.Bemerkungen AS Bemerkungen,
       IIF(RU.UnterbereichName='',RB.BereichName,RB.BereichName||" - "||RU.UnterbereichName) AS Bereich
   FROM REZEPTE AS R
   LEFT JOIN RezeptBereich AS RB on (RB.RKategorieID=R.RKatergorieID)
   LEFT JOIN RezeptUnterbereich AS RU ON (RU.RUKategorieID=R.RUKategorieID)
   WHERE R.RezeptID=1
Leider wird beim Aktivieren von TSQLDataSet eine Exception "TDBXError" ausgeworfen. In dem Datenbank-Tool "SQLite Expert Personal" funktioniert das SQL-Statement fehlerfrei. Es scheint so, dass TSQLDataSet "IIF" (habe es auch schon nur mit "IF" versucht) nicht versteht. Ich würde aber gerne das Ganze über ein SQL-Statement steuern und nicht noch explizit Code in Delphi schreiben.
Vielleicht hat jemand eine Idee oder das richtige Wissen.

ThomasWB 6. Jun 2022 15:17

AW: IIF mit SQLite
 
Hallo,

gerade habe ich auch noch festgestellt, dass "AS Bereich" auch nicht erkannt wird.

Gib es irgendwo eine Beschreibung, welchen SQL-Befehle die Delphi-Komponente TSQLDataSet versteht?

DeddyH 6. Jun 2022 15:17

AW: IIF mit SQLite
 
Hast Du es mal mit einem CASE versucht?
SQL-Code:
(CASE WHEN RU.UnterbereichName=''
  THEN RB.BereichName
  ELSE RB.BereichName||' - '||RU.UnterbereichName
END) AS Bereich

Delphi.Narium 6. Jun 2022 16:17

AW: IIF mit SQLite
 
Tippe mal darauf, dass das Problem eher bei den '' liegt:

Mach mal spasseshalber aus den '' einfach '''', dann könnte es klappen.

Da wir nicht wissen, wie Du im Delphiquelltext das SQL übergibst, können wir nur raten, ob hier ein ''-Problem vorliegen kann.

Bei einer Stringzuweisung in der Form

Delphi-Quellcode:
sql.text := 'select IIF(RU.UnterbereichName='',RB.BereichName,RB.BereichName||" - "||RU.UnterbereichName) AS Bereich';


muss es

Delphi-Quellcode:
sql.text := 'select IIF(RU.UnterbereichName='''',RB.BereichName,RB.BereichName||" - "||RU.UnterbereichName) AS Bereich from tabelle';


heißen. Ein einzelnes ' führt in Delphi zu einem Fehler, weil bei den ' für den String irgendwas nicht stimmt. Mit '' ist dieser Fehler weg, da dann der String letztlich ein ' enthält. Für das SQL ist das aber ein ' zu wenig, was zum Fehler bei As Bereich führt.

ThomasWB 6. Jun 2022 16:43

AW: IIF mit SQLite
 
Doppelte Anführungszeichen anstatt einfachen hat nicht geholfen.

"... wie Du im Delphiquelltext das SQL übergibst ...": Ich gebe den SQL direkt in der Property "CommandText" der Komponente ein.

"CASE ..." Hier kommt nun nicht der TDBXError. Anscheinend akzeptiert die Komponente den CASE-Befehl. Jedoch - wie in meinem 2. Kommentar erwähnt - kann TSQLDataSet mit "AS" nichts anfangen. Daher führt der CASE-Befehl mit abschliessendem "AS Bereich" bei der DBEdit-Komponente zu der Fehlermeldung "Das Feld 'Bereich' wurde nicht gefunden".

Delphi.Narium 6. Jun 2022 17:47

AW: IIF mit SQLite
 
Der Fehler tritt auf, weil bei den '' ein Problem auftritt.

Schön, dass Du das SQL der Property CommandText übergibst. Zeig' doch einfach mal den entsprechenden Delphi-Quelltext, dann kann man sehen, ob es da eventuell hakt.

Da der Fehler bei "AS Bereich" auftritt, die "AS ..." davor aber nicht bemängelt werden, muss der Fehler irgendwo zwischen "AS Bemerkungen" und "AS Bereich" liegen. Da könnte dann eventuell auch noch das ||" - "|| ein Problem darstellen.

Ändere bitte die Zeile (auch wenn es das SQL erstmal verfälscht) in

SQL-Code:
IIF(RU.UnterbereichName is null,RB.BereichName,RB.BereichName||RU.UnterbereichName) AS Bereich


Ist der Fehler dann weg?

Dann gibt es ein Problem bei der Übergabe der Zeichenfolgen an die Datenbank.

himitsu 6. Jun 2022 18:05

AW: IIF mit SQLite
 
Schade, dass Sqlite kein CONCAT kennt, so wie nahezu jedes andere ordentliche DBMS.
SQL-Code:
concat_ws(" - ", BereichName, UnterbereichName) AS Bereich


aber als Alternatove geht es auch so
SQL-Code:
BereichName || coalesce(UnterbereichName||" - ", "") AS Bereich


[EDIT]
neee, das trifft nur zu, wenn es NULL und nicht '' ist :oops:


Ist UnterbereichName wirklich '' oder vielleicht doch NULL.


aus '' mach NULL (falls noch nicht) und dann
SQL-Code:
concat_ws(" - ", BereichName, nullif(UnterbereichName,"")) AS Bereich


aber als Alternatove geht es auch so
SQL-Code:
BereichName || coalesce(nullif(UnterbereichName,"")||" - ", "") AS Bereich

ThomasWB 7. Jun 2022 06:01

AW: IIF mit SQLite
 
Zitat:

"Zeig' doch einfach mal den entsprechenden Delphi-Quelltext"
Das dies fest im Programm eingestellt wird, wird der SQL-Befehl nicht während der Laufzeit definiert, sondern in der Entwicklungsumgebung schon von vorne herein eingegeben ("WEHRE ..." kommt dann später noch raus :)).

"IIF(RU.UnterbereichName is null,RB.BereichName,RB.BereichName||RU.Unterbereic hName) AS Bereich" hat leider keine Änderung bewirkt. Delphi kommt noch immer mit einem TDBXError :(.

Zitat:

"Da der Fehler bei "AS Bereich" auftritt, die "AS ..." davor aber nicht bemängelt werden, muss der Fehler irgendwo zwischen "AS Bemerkungen" und "AS Bereich" liegen."
Nein

Mit der Aktivierung von TSQLDataSet wirft Delphi bei "IIF" die Exception "TDBXError". Mit "CASE" ist dies nicht mehr der Fall. Somit ist CASE die Alternative zu IIF - auch wenn mir IFF sympathischer wäre.

Nach der Aktivierung von TSQLDataSet weist Delphi den DB-Komponenten die Felder zu. Hier kommt es zu einem Fehler bei "AS Bereich". Ich habe den "AS-Fehler" auch schon durch folgenden Code getestet:
Code:
SELECT R.Titel AS Titel2 FROM REZEPTE AS R
Hier kommt Delphi mit dem Fehler "Das Feld 'Titel2' wurde nicht gefunden".

Frickler 7. Jun 2022 11:22

AW: IIF mit SQLite
 
Zitat:

Zitat von ThomasWB (Beitrag 1506880)
Code:
SELECT R.Titel AS Titel2 FROM REZEPTE AS R
Hier kommt Delphi mit dem Fehler "Das Feld 'Titel2' wurde nicht gefunden".

Aber
Code:
SELECT R.Titel AS Titel2 FROM REZEPTE R
geht?

Btw. "TSQLDataSet" ist noch dbExpress, nicht FireDAC. Da kanns sein, dass die verwendete SQLite Version unglaublich alt ist und viele Konstrukte einfach nicht versteht.

Edit: das verwendete Tool "SQLite Expert Personal" verwendet seine eigene SQLite DLL.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:43 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz