SQLdb und Firebird - Funktion: Laszarus-Crash

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Joh
Lazarusforum e. V.
Beiträge: 191
Registriert: Sa 26. Mai 2012, 17:31
OS, Lazarus, FPC: Win 10 (L 2.2.6 x64 FPC 3.2.2)
CPU-Target: 64Bit

SQLdb und Firebird - Funktion: Laszarus-Crash

Beitrag von Joh »

Moin,

ich habe ein Projekt mit einer Artikel-Tabelle, einer m:n-Tabelle und einer subTabelle (HSaetze)
so weit, so gut.

Jetzt sollen im Artikelformular alle Strings der subTabelle in einem Feld angezeigt werden.
eigentlich auch ganz einfach:
Ich habe eine View erstellt, die die Artikelnummer mit den Bezeichnungen aus der subTabelle kombiniert:

Code: Alles auswählen

CREATE OR ALTER VIEW VIEWHSAETZEARTIKEL (ARTIKELID, KURZBEZ)
AS
SELECT HSaetzeArtikel.ArtikelID, LIST(KurzBez, ', ') AS KurzBez   FROM HSaetzeArtikel LEFT JOIN HSaetze ON HSaetzeArtikel.HSatzID = HSaetze.ID  GROUP BY ArtikelID;
Soweit läuft alles.
Allerdings: gebe ich jetzt in einer Query auf der Form ein SELECT Artikel, VIEW... ein, crasht Lazarus.
Hier das Kurzbeispiel für die SQL-Abfrage:

Code: Alles auswählen

SELECT Artikel.id,
       viewHSaetzeArtikel.KurzBez
  FROM Artikel
  LEFT JOIN viewHSaetzeArtikel ON Artikel.ID = viewHSaetzeArtikel.ArtikelID
 ORDER BY Artikel.id  
Also: alles läuft eigentlich, aber mit der Abfrage in einer TSQLQuery, die ich für ein Grid benötige stürzt Lazarus ab, sobald die Funktion LIST() in der VIEW benutzt wird.
Ist das jetzt ein Lazarus-Bug oder sitzt der Fehler vor dem Gerät?

Lazarus 2.2.6, FPC 3.2.2

Gruß
Joh

Ich habe das Beispielprogramm mal angehängt.
Und zusätzlich die Firebird-Runtime (muß ins Programmverzeichnis, dann läuft Firebird ohne Installation)
Dateianhänge
firebird40.toCopy.zip
(3.34 MiB) 80-mal heruntergeladen
project1.zip
(140.25 KiB) 72-mal heruntergeladen
just my two Beer

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6217
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: SQLdb und Firebird - Funktion: Laszarus-Crash

Beitrag von af0815 »

Ich gehe stark davon aus, das das Ergebnis von List() ganz einfach nicht von SQLdb verwertet werden kann.
Die Funktion ist sehr spezifisch für Firebird, soweit ich das auf die schnelle nachgelesen habe.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Soner
Beiträge: 624
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: SQLdb und Firebird - Funktion: Laszarus-Crash

Beitrag von Soner »

Bei mir ist dein Code merkwürdigerweise ohne Fehler durchgelaufen.
Weil, wie schon af0815 erwähnt hat, musste man bei " LIST(KurzBez, '', '') " hoch Kommas verdoppeln. Wenn du SQL-Befehle mit String-Parameter schreiben möchtest, dann musst du Codieren:

Code: Alles auswählen

  sql := ' CREATE VIEW viewHSaetzeArtikel AS'
       + ' SELECT HSaetzeArtikel.ArtikelID, LIST(KurzBez, '''', '''') AS KurzBez' 
       + '   FROM HSaetzeArtikel LEFT JOIN HSaetze ON HSaetzeArtikel.HSatzID = HSaetze.ID'
       + '  GROUP BY ArtikelID';  
Edit:
Vergiss es was ich oben geschrieben habe, du hast es in Quelltext richtig gemacht.
Bei mir hat dein Code keinen Fehler erzeugt.

Joh
Lazarusforum e. V.
Beiträge: 191
Registriert: Sa 26. Mai 2012, 17:31
OS, Lazarus, FPC: Win 10 (L 2.2.6 x64 FPC 3.2.2)
CPU-Target: 64Bit

Re: SQLdb und Firebird - Funktion: Laszarus-Crash

Beitrag von Joh »

af0815 hat geschrieben:
Fr 7. Jul 2023, 19:49
Ich gehe stark davon aus, das das Ergebnis von List() ganz einfach nicht von SQLdb verwertet werden kann.
Die Funktion ist sehr spezifisch für Firebird, soweit ich das auf die schnelle nachgelesen habe.
Schade...
Ich muß diese Sammelstrings genau so anzeigen und dann darauf einen Filter anwenden können.
Das geht zwar auch von hinten durch die Brust ins Auge, aber eigentlich ist die List-Funktion schon genau das, was ich benötige.

Außerdem sollte Lazarus doch gar nichts von der Funktion mitbekommen.

Ich machee doch nur ein SELECT Datei.?, View.?...
Da sollte es doch Lazarus völlig egal sein, welche Funktionen hinter der View stehen.

Eigentlich sollte es doch sogar egal sein, ob eine Tabelle oder eine View da steht?!
just my two Beer

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6217
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: SQLdb und Firebird - Funktion: Laszarus-Crash

Beitrag von af0815 »

Das Recordset was SQLdb versteht ist bei Fpc relativ empfindlich und wird jetzt im fpc trunk erst um weitere Feldtypen aufgebohrt. Auch multirecordsets gehen bei MSSQL nicht. Auch Stored procedures sind nicht so 100 pro in den Möglichkeiten unterstützt.

Ich gehe davon aus, das ganz einfach der Typ der durch List() erzeugt wird, nicht oder falsch decodiert wird. Und dort scheitert Lazarus. Die basisfunktionallität steck aber in fpc, Lazarus legt nur einen Wrapper drüber.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Joh
Lazarusforum e. V.
Beiträge: 191
Registriert: Sa 26. Mai 2012, 17:31
OS, Lazarus, FPC: Win 10 (L 2.2.6 x64 FPC 3.2.2)
CPU-Target: 64Bit

Re: SQLdb und Firebird - Funktion: Laszarus-Crash

Beitrag von Joh »

Der Typ ist:
BLOB SUB_TYPE 1 (Read_Only: No corresponding Table column)
Aber interessanterweise funktioniert das ganze, wenn ich den SQL-Befehl der TSQLQuery direkt eingebe:

Code: Alles auswählen

SELECT Artikel.id, LIST(viewHSaetzeArtikel.KurzBez) AS KurzBez
  FROM Artikel
  LEFT JOIN viewHSaetzeArtikel ON Artikel.ID = viewHSaetzeArtikel.ArtikelID
 GROUP BY Artikel.id
 ORDER BY Artikel.id
Dann nimmt Lazarus den List-Befehl sauber und zeigt mir im Grid die Felder richtig an.
Nur habe ich nicht nur 2 Tabellen und 2 Felder ;-(
just my two Beer

Antworten