TDBGrid auf gejointe Daten

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Lorca
Beiträge: 196
Registriert: Di 3. Nov 2020, 12:25

TDBGrid auf gejointe Daten

Beitrag von Lorca »

Hallo zusammen,

es gibt mal wieder ein dickes Fragezeichen über meinen Kopf.

Zur Anzeige von DB Tabellen Daten verwende ich ein DB Grid.
Zum Einsatz kommt SQLite 3

Nun mache ich einen SELECT Join auf zwei Tabellen und möchte die gelesenen Daten nun im TDBGrid anschauen.
Jedoch werden die Felder nicht erkannt.
Das TDBGrid habe ich mit den Spalten die ich haben möchte angelegt. (Also die Columns)
Der Lesebefehl funktioniert sauber. Es werden die jeweils gesuchten Sätze gefunden.
Aber die Spalten in der TDBGrid sind leer

Das SQL Statement:
SELECT Tab_1.ID, Tab_1.Name, LNK_Tab.ID_Referenz FROM Tab_1
INNER JOIN LNK_Tab ON ID_Referenz = Tab_1.ID
WHERE LNK_Tab.ID_Referenz = :Link_ID

Danach füttre ich den Parameter und führe EXECSQL aus.
Die jeweils gefundenen Zeilen werden auch im TDBGrid angezeigt, jedoch ohne Inhalt. Sind also leer.
Also mal sind drei Zeilen im GRID zu sehen, mal fünf oder ein andermal zwei. Das ist auch korrekt so.
Nur die Spalten sind leer.

Was mache ich falsch, bzw. was kann ich tun damit das Feld Name auch in der zugeordneten Spalte angezeigt wird.
Ich habe die benötigte GRID Spalte im Feld "Fieldname" mit den Feldnamen: NAME verbunden. Keine Anzeige.
Dann habe ich das Feld "Fieldname" mit den expliziten Namen "Tab_1.Name" gefüllt. Wieder nix.

Es muss doch möglich sein auch gejointe Daten im TDBGrid anzuzeigen.
Wenn ich mit diesen daten eine Stringgrid fülle ist alles da.


Gruß
Lorca
Zuletzt geändert von Lorca am Do 30. Sep 2021, 13:20, insgesamt 1-mal geändert.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
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: TDBGrid auf gejointe Daten

Beitrag von af0815 »

Code: Alles auswählen

SELECT Tab_1.ID AS XID, Tab_1.Name AS XName, LNK_Tab.ID_Referenz AS XReferenz FROM Tab_1
INNER JOIN LNK_Tab ON ID_Referenz = Tab_1.ID
WHERE LNK_Tab.ID_Referenz = :Link_ID
Nicht das da nur Probleme in der Zuordnung gibt. Ich teste das oft im LazDataDesktop im Lazarus/tools Verzeichnis. Wenn dort was erscheint, dann sollte es auch unter Lazarus gehen.

Edit: Mit ExecSQL kommt KEIN Datenset retour. Wenn du Select verwendest ist zwingend ein Open/Close notwendig.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Lorca
Beiträge: 196
Registriert: Di 3. Nov 2020, 12:25

Re: TDBGrid auf gejointe Daten

Beitrag von Lorca »

Hallo af0815,

ja open ist nach EXECSQL ausgeführt worden.
Danke für die Info. Das "LazDataDesktop" kannte ich noch nicht.

Habe gerade auch den Alias (AS) eingesetzt. Wieder nix :(
S'on Ärger

Achja, im SQLite Studio funktioniert der SQL Befehl einwandfrei.


Gruß
Lorca

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: TDBGrid auf gejointe Daten

Beitrag von Socke »

Lorca hat geschrieben:
Do 30. Sep 2021, 13:26
ja open ist nach EXECSQL ausgeführt worden.
Du brauchst bei SELECT gar kein ExecSQL. Einfach nur Open aufrufen.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
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: TDBGrid auf gejointe Daten

Beitrag von af0815 »

Lorca hat geschrieben:
Do 30. Sep 2021, 13:26
ja open ist nach EXECSQL ausgeführt worden.
Das verstehe ich nicht.

Entweder ich mache ein ExecSQL für "Insert, Update, Delete" oder Open für "Select" - Statements. ExecSQL führt KEIN Open aus, das Resultset in im Anschluss an ExecSQL leer.

Nochmals:
Query.open hält die Datenverbindung und liefert ein ResultSet zurück (wenn es eines gibt) bis man Query.close macht.
Query.ExecSQl führt den Befehl aus und liefert kein Resultset zurück. Das macht für "Insert, Update, Delete" Sinn, weil es dort kein Resultset gibt.

Am MS-SQL gibt es mit Stored Procedures und Paarametriebare Views noch weitere Spezialitäten, aber das ist bei SQLite nicht von belang.

Edit: Der Code würde beim Verständnis schon helfen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Lorca
Beiträge: 196
Registriert: Di 3. Nov 2020, 12:25

Re: TDBGrid auf gejointe Daten

Beitrag von Lorca »

Hallo zusammen,

Vielleicht stelle ich die Frage einmal anders:

Wie verbinde ich die Columns einer TDBGrid mit den Feldnamen eines Joins?
Bei mir funktioniert weder der echte Feldname der gejointen Tabelle, noch der Alias Name (im AS xxx) angegeben
noch der explizite Tabellen Name also Tabellenname.FeldName.

Wie verbindet ihr die Spalten mit einer gejointen Tabelle?


Gruß
Lorca

Benutzeravatar
gladio
Beiträge: 217
Registriert: Sa 21. Jun 2014, 06:15
OS, Lazarus, FPC: Win10-64 - aktuelle Lazarus/FPC Standard-Edition
CPU-Target: 64Bit
Wohnort: Rügen

Re: TDBGrid auf gejointe Daten

Beitrag von gladio »

Ist denn dein DBGrid auch mit der richtigen DataSource verbunden?

Links über dem Objetinspektor sollte unter dem Eintrag "DBGrid..."
"Colums: ..." stehen. Da mit der rechten Maustaste drauf und Einträge hinzufügen.
Auf den jeweiligen Eintrag klicken und im Objektinspektor den gewünschten FielName auswählen.

Ist übrigens völlig egal, ob in der SQL ein Join drin ist. Gleiche Vorgehensweise wie bei "einfachem" SQL-Statement.
Zuletzt geändert von gladio am Do 30. Sep 2021, 18:13, insgesamt 1-mal geändert.

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: TDBGrid auf gejointe Daten

Beitrag von wp_xyz »

In Ermangelung eines Beispiel-Projekts deinerseits habe ich mir das angehängt Mini-Projekt mit einem SQL-JOIN zusammengeklickt, aber das funktioniert einwandfrei.
Dateianhänge
sql_join.zip
(4 KiB) 77-mal heruntergeladen

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
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: TDBGrid auf gejointe Daten

Beitrag von af0815 »

Russentest:

Connection, Transaction, Query, Dataset und DBGrid auf ein Form. Alles Verbinden, dann die Connection Konfigurieren und mal testweise verbinden.

Test1:
Die Query mit einem normalen Select befüllen. Die Query aktivieren und die Daten sollten im Grid sein.

Test2:
Die Query wieder deaktivieren und den Join hineinkopieren. Dann die Query aktivieren und das Grid füllt sich mit Daten.

Bei der ganzen Sache keine extra Einstellungen über Felder etc. machen. Dann geht der Test und man sieht welche Felder verwendet werden.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
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: TDBGrid auf gejointe Daten

Beitrag von af0815 »

wp_xyz hat geschrieben:
Do 30. Sep 2021, 18:11
In Ermangelung eines Beispiel-Projekts deinerseits habe ich mir das angehängt Mini-Projekt mit einem SQL-JOIN zusammengeklickt, aber das funktioniert einwandfrei.
Kann ich bestätigen und kommt OHNE ExecSQL aus. Der wäre GANZ fehl am Platze.

Das von mir vorher geschriebene geht auch hier. Achtung wenn man das im Objektinspektor macht, so muss sich die richtige sqlite3.dll (32Bit oder &4 Bit je nach Lazarus) im selben Verzeichnis wie Lazarus.exe befinden !!
Screenshot 2021-09-30 183000.jpg
Screenshot 2021-09-30 183000.jpg (116.91 KiB) 2162 mal betrachtet
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Lorca
Beiträge: 196
Registriert: Di 3. Nov 2020, 12:25

Re: TDBGrid auf gejointe Daten

Beitrag von Lorca »

Hallo zusammen,

zuerst einmal danke schön für eure Hilfe. :)

Ja, ist alles korrekt Verbunden. Dier Verbindung erfolgt erst im Coding, aus für mich wichtigen Gründen. Und genau deshalb, weil es nicht während der Design Zeit erfolgt habe ich es x mal getestet und geprüft.
Sobald ich den normalen Select darauf lege, habe ich die Felder aus der Tabelle. ( Zur Designzeit erfolgreich getestet )
Übergebe ich jedoch den JOIN Select an ZQRY.SQL.TEXT, setzte ich die Parameter Values, und führe danach den (wie von euch empfohlen) den OPEN aus, findet die DBGrid die Felder nicht mehr. Es ist echt zum Mäuse melken.

Alle anderen Tabellen die angezeigt werden sollen, funktionieren. Nur bei einem JOIN macht die DBGrid die Grätsche
Ich habe es auch mit einer DB View versucht. Funktioniert aber auch nicht. Daher verzichte ich gerne auf ein derartiges Konstrukt wie eine View

Ich habe kapituliert und verwende jetzt eine normale StringGrid. Da klappt es ohne probs. Und es schont meine und eure Nerven enorm :D


@af0815: Wie ich gerade deinem Posting entnehme arbeitest Du mit TSQLQuery. Ich denke da könnte schon das Problem liegen.
Denn ich arbeite mit den ZEOS Komponenten (als TZConnection, TZQRY und die ganz normale TDataSource )

@wp_xyz : Danke für Dein Beispiel. Währe schon echt klasse bekomme aber einen Ladefehler. !! Anhang unten


Dennoch euch allen, ganz herzlichen Dank

Lorca


Ladefehler
Ladefehler.PNG
Ladefehler.PNG (12.47 KiB) 2077 mal betrachtet

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: TDBGrid auf gejointe Daten

Beitrag von wp_xyz »

Ich habe das Programm mit Laz-main geschrieben. Bei älteren Versionen, 2.0.12 oder älter, solltest du die lfm-Datei in einen Editor laden und die drei Zeilen mit "Macros = <>" löschen.

Benutzeravatar
gladio
Beiträge: 217
Registriert: Sa 21. Jun 2014, 06:15
OS, Lazarus, FPC: Win10-64 - aktuelle Lazarus/FPC Standard-Edition
CPU-Target: 64Bit
Wohnort: Rügen

Re: TDBGrid auf gejointe Daten

Beitrag von gladio »

Wie ich gerade deinem Posting entnehme arbeitest Du mit TSQLQuery. Ich denke da könnte schon das Problem liegen.
Denn ich arbeite mit den ZEOS Komponenten (als TZConnection, TZQRY und die ganz normale TDataSource )
Das hat nichts mit Zeos oder TSQLQuery zu tun.
Ich arbeite seit Jahren mit Zeos und habe natürlich auch Joins in den SQL-Statements. Nie ein solches Problem beobachtet.
Seltsam ist, dass keine Fehlermeldung erscheint.
Was wird denn angezeigt, wenn du einen Doppelklich auf TZQRY machst. Sind da die Felder eingetragen?

charlytango
Beiträge: 843
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: TDBGrid auf gejointe Daten

Beitrag von charlytango »

Lorca hat geschrieben:
Fr 1. Okt 2021, 11:40
Es ist echt zum Mäuse melken.
Ja... ist es, aber vermutlich anders als er denkt.

Jetzt verfolge ich diesen Thread schon eine zeitlang weil meine hauptanwendung DB-Applikationen sind um einfach auch etwas dazu zu lernen oder Fehler zu vermeiden.

Für meine Applikationen benutze ich ein (Singleton)Objekt das wahlweise mit den OnBoard-Komponenten (SqlDB) oder mit ZEOS die Datenbankverbindung managed. Also auch alle Komponenten zur Laufzeit erstellt.
Das beschriebene Verhalten konnte ich nirgends beobachten. Alle Joins (und in Datenbanken mit mehr als 100 Tabellen kommen einige zusammen) laufen anstandslos in TDBGrids.

Aber das ist nicht der eigentliche Grund meines Posts.

Was ich nicht verstehe ist warum @lorca sich beharrlich weigert das auszuprobieren was ihm geraten wird.
Nämlich eine saubere Lazarus-Instanz als Referenz aufzusetzen und ein Testprogramm zur Verfügung zu stellen bei dem das unerwünschte Verhalten auftritt.
Ja, das ist bei einer großen Applikation oft kein Spass und mit Arbeit verbunden.
Aber zumindest zeigt es den Respekt für diejenigen von denen man Rat möchte.

wp_xyz hat bereits 2 Testprogramme (nämlich auch hier: viewtopic.php?f=18&t=13851) erstellt und zur Verfügung gestellt nur vom Fragesteller kommt da nix.

Ich gebe zu, dass ich im Moment nicht gut drauf bin und mein Langmut derzeit gegen Null geht.
Aber .... Bin ich da zu pingelig oder fällt das anderen auch auf?

Lorca
Beiträge: 196
Registriert: Di 3. Nov 2020, 12:25

Re: TDBGrid auf gejointe Daten

Beitrag von Lorca »

Hallo zusammen,

ich bitte um Verzeihung für die Verstimmungen die ich bei dem einen oder anderen von euch erzeugt habe.
@charlytango: Ich habe sehr großen Respekt für diese Community. Es liegt wohl eher an meinem Gesundheitsstatus der mir sehr wenig Zeit einräumt. Deshalb auch meine zuvor angekündigte Kapitulation gegenüber diesem Problem :)

Ich habe nun einmal das Programm, die DDL als TXT Datei für die Tabellen und auch die Datensätze als XML Datei angehängt.
Vllt kann man es so besser erkennen.

Im diesem Test DBGrid werden wie auch im Originalprogramm, keine Felder vorgeschlagen.
Ich denke Ihr werdet diesen Fehler schnell herausfinden. :)

Im Original Programm werden die Tabellen erst durch einen Button DB-Öffnen eingeschaltet und die SQL Statements sowie die Parameter
erst kurz vor dem Öffnen der Tabellen gesetzt.


Mit freundlichem und respektvollem Gruß
Lorca :)

Test_JOIN_DB_Grid.zip
(126.65 KiB) 73-mal heruntergeladen

Antworten