TSQLQuery und subTabellen

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

TSQLQuery und subTabellen

Beitrag von Joh »

Moin,

Ich überlege schon länger, wie unter Lazarus/Firebird das Beste Vorgehen ist, um subTabellen abzufragen.

Beispiel:
Tabelle 1: Kundenstamm (id: Integer, Name: Varchar(30))
Tabelle 2: Ansprechpartner (id: integer, KundenID: Integer, Name: Varchar(30))

Jetzt habe ich eine TSQLQuery namens SQLKunden mit

Code: Alles auswählen

SQL.Text := 'SELECT * FROM Kunden';
Für die TSQLQuery namens SQLAnsprechpartner behelfe ich mich mit

Code: Alles auswählen

SQL.Text := 'SELECT * FROM Ansprechpartner WHERE KundenID=' + intToStr(SQLKunden.FieldByName('id').AsInteger);
Da muß es doch eine einfachere Möglichkeit geben. Ich finde nur nicht das richtige.
Irgend so etwas wie (im Objektinspektor):

Code: Alles auswählen

SELECT * FROM Ansprechpartner WHERE KundenID = :Kunden.id  ORDER BY id
, wobei der Parameter sich auf die Haupttabelle bezieht?

Ach so, die Haupttabelle soll mit einem TDBNavigator verbunden sein.
Kann mir da mal jemand aufs Pferd helfen?

Danke fürs lesen
Joh

Benutzeravatar
theo
Beiträge: 9185
Registriert: Mo 11. Sep 2006, 19:01

Re: TSQLQuery und subTabellen

Beitrag von theo »


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

Re: TSQLQuery und subTabellen

Beitrag von Joh »

Nein, kein Join.

Ich möchte einfach nur auf einem Formular 2 TSQLQueries haben, wobei die Abfrage der 2. Query von der ersten abhängig ist.
Das ganze mit Lazarus-Bordmitteln ohne ZEOS oder ähnlichem.

Socke
Lazarusforum e. V.
Beiträge: 3054
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: TSQLQuery und subTabellen

Beitrag von Socke »

Dann bist du beim Master-Detail richtig: https://wiki.freepascal.org/MasterDetail
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

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

Re: TSQLQuery und subTabellen

Beitrag von Joh »

Das heißt für mich aber letztlich dann: ich habe nichts gewonnen.

Ob ich jetzt (im DBNavigator.OnClick) die Query schließe, den Parameter manuell eingebe und die Query wieder öffne

Code: Alles auswählen

SQLAnsprechpartner.Active := False;
SQLAnsprechpartner.Params.ParamByName('KundenID').AsInteger := SQLKunden.FieldByName('ID').AsInteger;
SQLAnsprechpartner.ExecSQL;
SQLAnsprechpartner.Active := true; 
oder

oder ob ich jetzt die Query schließe, den SQL-Text manuell anpasse und die Query wieder öffne

Code: Alles auswählen

SQLAnsprechpartner.Active := False;
SQLAnsprechpartner.SQL.Text := 'SELECT * FROM Ansprechpartner WHERE KundenID=' + intToStr(SQLKunden.FieldByName('id').AsInteger);
SQLAnsprechpartner.ExecSQL;
SQLAnsprechpartner.Active := true; 
ist vom Arbeitsablauf dann ja quasi wumpe. Ich hatte auf irgendetwas Datenbankorientiertes in dem SQLQuery-Objekt gehofft, welches automagisch erkennt, das der Master-Datensatz sich geändert hat oder nicht und dabei den subTabellenRefresh selber übernimmt. Deshalb ja der Bezug auf :Kunden.id als Parameter.

PS: nach SQL-Syntax hatte ich extra nicht gefragt.

Socke
Lazarusforum e. V.
Beiträge: 3054
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: TSQLQuery und subTabellen

Beitrag von Socke »

Joh hat geschrieben:
Mo 13. Jun 2022, 12:20
Das heißt für mich aber letztlich dann: ich habe nichts gewonnen.
Genau das ist doch im Wiki beschrieben.
Wiki: MasterDetail hat geschrieben:On the form:

use one connection, 1 transaction, but 2 queries, 2 data sources
a master query called qryCustomers selects from the CUSTOMER table
a detail query called qrySales that selects from the SALES table

In the detail query qrySales:

set the database property as usual
set the datasource property to point to the master datasource
in the query SQL, use a WHERE query to limit the select; use the detail fieldname and limit it to a parameter with the name of the field in the master table
Wie das ganze aussieht habe ich im Anhang mit SQLite3 zusammengefasst. Für Firebird musst du nur die Verbindung austauschen (Referenzen nicht vergessen!) und ggf. die Syntax im SQLanpassen. Es gibt dort nur ein Event um die Datenbank zu öffnen und per SQLScript zu Initialisieren. Der Wechsel zwischen den Detail-Datensätzen erfolgt automatisch.


Tipp: Arbeite immer mit Parametern. Das ist sicher und spart dir jede Menge Fehler im Escaping von Texten.
Dateianhänge
demo_sqlite3_masterdetail.zip
(106.02 KiB) 15-mal heruntergeladen
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

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

Re: TSQLQuery und subTabellen

Beitrag von Joh »

Danke... :oops:

wer lesen kann ist klar im Vorteil. Das habe ich (wohl wegen mangelnder Englischkenntnisse) glatt überlesen.
Aber aus deinem Beispiel heraus ist's klar geworden.

Joh

Antworten