Firebird 4.x; Ansicht BlobFeld Subtype Text

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

Firebird 4.x; Ansicht BlobFeld Subtype Text

Beitrag von Joh »

Moin,

ich habe hier eine Firebird-View

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;
 
Die soll nichts anderes machen, als kleine Texte zu einem String zusammenzuführen.
Das macht die Abfrage genau so, wie sie soll:

Code: Alles auswählen

id	KurzBez
130	H222, H229
131	H222, H229, H411, H315, H319, H336
132	H225
133	H304
136	H229
Aaber: der Typ des Feldes LIST(KurzBez, ', ') AS KurzBez ist "BLOB SUB_TYPE TEXT" und wird mir im DB-Grid als (MEMO) angezeigt. => Klar...
Wie bekomme ich jetzt (MEMO) als (natürlich ReadOnly) Inhalt in das Grid?

Unter Foxpro habe ich mich annodunnemals mit SUBSTR(KurzBez + SPACE(100), 100) beholfen, aber das will mir nicht in die Datenbank...

PS: ich habe das Gefühl, die Frage vor Wochen bereits gestellt zu haben. Oder wollte ich das nur?
just my two Beer

Sieben
Beiträge: 202
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
CPU-Target: i386

Re: Firebird 4.x; Ansicht BlobFeld Subtype Text

Beitrag von Sieben »

Zum einen gibt es die TDBGridOption dgDisplayMemoText, die im vorliegenden Falle schon ausreichen dürfte. Du könntest alternativ aber auch den DataType eines entsprechenden persistenten TFields auf zB ftString setzen, was im Programmverlauf vielleicht noch weitere Möglichkeiten bietet.

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: Firebird 4.x; Ansicht BlobFeld Subtype Text

Beitrag von Joh »

Danke...

wenn man's weiß, kann es doch so einfach sein.
Da steckt man Stunden in die Idee der Abfrage und wenn man sie fertig hat, sieht man den (Code-)Wald vor lauter Optionen nicht.
just my two Beer

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: Firebird 4.x; Ansicht BlobFeld Subtype Text

Beitrag von Joh »

hmmm, da das ja zum eigentlichen Thema passt:

gegeben sind 3 Dateien:
- Artikel - Felder id, Bez, etc.
- hSaetzeArtikel - n:m Zuordnungstabelle; Felder id, ArtikelID, HSatzID
- hSaetze - Felder id, KurzBez etc.

In der Datenbank existiert die View

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;
Diese View kann ich, wie vorgesehen in jede Abfrage einbauen.
Abfragen im Tool DBeaver laufen korrekt durch.
Selbst im Total-Commander-Viewer läuft alles, wie vorgesehen:
TC-Lister.PNG
TC-Lister.PNG (17.63 KiB) 4462 mal betrachtet
In Lazarus gibt es schon bei der Minimum-Abfrage

Code: Alles auswählen

  sql := 'SELECT ArtikelID, KurzBez FROM VIEWHSAETZEARTIKEL';
  sqlQuery.SQL.text := sql;
  sqlQuery.Open;
  while not sqlQuery.EOF do
  begin
    writeln(sqlQuery.FieldByName('KurzBez').AsString);
    sqlQuery.Next;
  end;
eine Access-Violation im sqlQuery.Open. Ändere ich die Abfrage hingegen in eine (überflüssige?) Funktion:

Code: Alles auswählen

  sql := 'SELECT ArtikelID, LIST(KurzBez) AS KurzBez FROM VIEWHSAETZEARTIKEL GROUP BY ArtikelID';
                            ^^^^                                             ^^^^^^^^
läuft der Code sauber durch und ich kann mit den Daten arbeiten.

Leider ist die Originalabfrage etwas länger (44 Felder aus insgesamt 5 Tabellen) und ich muß dann nach allen Feldern gruppieren.
Aber damit läuft alles sauber durch.

Das Problem besteht unter Lazarus 2.2.4, 2.2.6 und 3.0.
BTW: Auch lazdatadesktop unter 3.0 stürzt beim Zugriff auf die View ab...
just my two Beer

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: Firebird 4.x; Ansicht BlobFeld Subtype Text

Beitrag von Joh »

PS: auch FlameRobin zeigt die Daten der View sauber an
just my two Beer

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6216
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: Firebird 4.x; Ansicht BlobFeld Subtype Text

Beitrag von af0815 »

Die Frage ist, was wird da an Metadaten zurückgeliefert, die den Schluckauf von sqlDB.

Eventuell kannst du es explzit mit cast() auf einen (var)char im select wandeln.
SELECT ArtikelID, cast(KurzBez as varchar) AS KurzBez FROM ....
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: Firebird 4.x; Ansicht BlobFeld Subtype Text

Beitrag von Joh »

das casten des BLOB als VARCHAR führt leider zu einem Fehler.
just my two Beer

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: Firebird 4.x; Ansicht BlobFeld Subtype Text

Beitrag von Joh »

hmmmm...
ein

Code: Alles auswählen

sql := 'SELECT ArtikelID, TRIM(KurzBez) FROM VIEWHSAETZEARTIKEL';
führt zu einem Field not Found: "Kurzbez" - Fehler.
Allerdings wiederum nur unter Lazarus.
just my two Beer

Antworten