AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

IIF mit SQLite

Ein Thema von ThomasWB · begonnen am 6. Jun 2022 · letzter Beitrag vom 7. Jun 2022
Antwort Antwort
ThomasWB

Registriert seit: 21. Jun 2015
38 Beiträge
 
#1

IIF mit SQLite

  Alt 6. Jun 2022, 16:11
Datenbank: SQLite • Version: 3? • Zugriff über: TSQLDataSet
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.
  Mit Zitat antworten Zitat
ThomasWB

Registriert seit: 21. Jun 2015
38 Beiträge
 
#2

AW: IIF mit SQLite

  Alt 6. Jun 2022, 16:17
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?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#3

AW: IIF mit SQLite

  Alt 6. Jun 2022, 16:17
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
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.508 Beiträge
 
Delphi 7 Professional
 
#4

AW: IIF mit SQLite

  Alt 6. Jun 2022, 17:17
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

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

muss es

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.
  Mit Zitat antworten Zitat
ThomasWB

Registriert seit: 21. Jun 2015
38 Beiträge
 
#5

AW: IIF mit SQLite

  Alt 6. Jun 2022, 17:43
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".
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.508 Beiträge
 
Delphi 7 Professional
 
#6

AW: IIF mit SQLite

  Alt 6. Jun 2022, 18:47
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

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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

AW: IIF mit SQLite

  Alt 6. Jun 2022, 19:05
Schade, dass Sqlite kein CONCAT kennt, so wie nahezu jedes andere ordentliche DBMS.
concat_ws(" - ", BereichName, UnterbereichName) AS Bereich

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


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


Ist UnterbereichName wirklich '' oder vielleicht doch NULL.


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

aber als Alternatove geht es auch so
BereichName || coalesce(nullif(UnterbereichName,"")||" - ", "") AS Bereich
$2B or not $2B

Geändert von himitsu ( 6. Jun 2022 um 19:14 Uhr)
  Mit Zitat antworten Zitat
ThomasWB

Registriert seit: 21. Jun 2015
38 Beiträge
 
#8

AW: IIF mit SQLite

  Alt 7. Jun 2022, 07:01
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".
  Mit Zitat antworten Zitat
Frickler

Registriert seit: 6. Mär 2007
Ort: Osnabrück
599 Beiträge
 
Delphi XE6 Enterprise
 
#9

AW: IIF mit SQLite

  Alt 7. Jun 2022, 12:22
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.

Geändert von Frickler ( 7. Jun 2022 um 12:24 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:56 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