![]() |
Datenbank: Firebird • Version: 2.5 • Zugriff über: IBDac
TQuery (TIBCQuery) - mehrere Master-Detailverbindungen komplett durchlaufen
Hallo zusammen,
ich zerbreche mir seit Tagen darüber den Kopf und habe mich nun dazu entschieden, einmal hier im Forum nachzufragen. Eigentlich bin ich mir auch nicht sicher, ob ich nun hier beim Thema Datenbanken oder eher beim Thema Algorithmen posten soll. Nun versuche ich es einfach mal hier. (Kurze evtl. weiterführende Information : Das ganze Konstrukt basiert auf einer FB-Datenbank, ich verwende Delphi XE2, und habe die Devart TIBCQuerys im Einsatz.) Es geht um folgendes Problem. Es sollen variabel verschiedene Tabellen mit einer Master-Detailverknüpfung miteinander verbunden werden und aus jeder Tabelle sollen alle abhängigen Datensätze ausgelesen und anschließend als csv-Dateien exportiert werden.. Hier mal eine schematische Darstellung (wie gesagt, die Anzahl der Tabellen ist dynamisch und variabel) : Tabelle 1 --- Tabelle 2 --- Tabelle 3 --- Tabelle 4 --- Tabelle 5 --- Tabelle 6 Tabelle 7 --- Tabelle 8 --- Tabelle 9 --- Tabelle 10 Tabelle 1 und Tabelle 7 sind jeweils die Mastertabellen, daran hängen in einer Master-Detailverknüpfung (1:n) jeweils die Tabellen, ähnlich wie die Skzizze zeigt.. Ein Beispiel .. (nur auf Tabelle 1,2,3 und 4 bezogen) : Tabelle 1 enhält z.B. alle Belege , Tabelle 2 könnte z.B. die Belegpositionen enthalten (1 Beleg / 10 Positionen), Tabelle 3 wäre z.B. eine Artikeltabelle und Tabelle 4 wiederum könnte z.B. die Tabelle Kunden sein, die auch mit der Tabelle Beleg verknüpft ist. Und nun ist die Herausforderung, alle Belege zu durchlaufen, dazu zu jedem Beleg alle Positionen, zu jeder Position alle Artikel (blödes Beispiel, weil das ja nur ein Artikel sein kann, aber ist ja auch nur ein Beispiel) und ebenfalls ein blödes Beispiel der Kunde, der an der Beleg hängt. Dabei gilt, dass die Anzahl der Tabellen variabel sein kann.. Also es müsste nun so sein, dass - erst der erste Datensatz von Tabelle 1, - dann der erste Datensatz von Tabelle 2, - dann alle Datesätze von Tabelle 3 - dann der zeite Datensatz von Tabelle 2, - dann wieder alle Datensätze von Tabelle 3 .... - der zweite Datensatz von Tabelle 1 ... durchlaufen werden.. Vielleicht gibts aber auch noch nen ganz anderen Ansatz.. Nun ist es ja so, dass man von Tabelle 1 (TQuery) keinen Bezug auf Tabelle 2 (TQuery) erhält (also rein über das Objekt TQuery, TIBCQuery,.. ).. da gibts ja nix mit Clientsource oder so sondern nur von dem jeweils untergeordneten Objekt die Mastersource.. ist ja auch klar, weil es ja mehrere ClientSources geben kann. Wie durchläuft man die Tabellen am besten.. Ich dachte erst an eine rekursive Funktion, aber da man sich ja anhand der fehlenden ClientSource nicht von oben nach unten durchreihen kann, geht das wohl eher nicht.. Das kann doch eigentlich nicht so schwer sein, aber irgendwie hab ich mich da komplett verlaufen. :oops::cry: Würde mich über jede Idee oder jeden Ansatz freuen. Danke schon mal. |
AW: TQuery (TIBCQuery) - mehrere Master-Detailverbindungen komplett durchlaufen
...warum dieses nicht innerhalb einer FB-StoredProcedure realisieren:
Code:
Das klappt prima ist schnellund die Businesslogik ist gleich in die DB ausgelagert...
for select Tabelle 1 do
begin for select Tabelle 2 do begin .. end if I_TAB1='True' then for select Tabelle 3 do begin .. end end |
AW: TQuery (TIBCQuery) - mehrere Master-Detailverbindungen komplett durchlaufen
Hallo,
Zitat:
Meinst du z.B. etwas wie folgendes: 2015-04-Belege.csv 2015-04-Positionen-Beleg-001.csv 2015-04-Positionen-Beleg-002.csv ... oder so etwas: 2015-04-Belege.csv 2015-04-Positionen.csv ... ??? |
AW: TQuery (TIBCQuery) - mehrere Master-Detailverbindungen komplett durchlaufen
Zitat:
|
AW: TQuery (TIBCQuery) - mehrere Master-Detailverbindungen komplett durchlaufen
Zitat:
Du es im Beispiel 2 schon sehr treffend notiert hast : 2015-04-Belege.csv 2015-04-Positionen.csv 2015-04-Artikel.csv 2015-04-Kunden.csv Also alle Datensätze einer Tabelle sollen auch in einer csv landen.. |
AW: TQuery (TIBCQuery) - mehrere Master-Detailverbindungen komplett durchlaufen
Zitat:
csv-Dateien ausgegeben werden : 2015-04-Belege.csv // Alle Belege 2015-04-Positionen.csv // Alle zugehörigen Positionen aller selektierten Belege 2015-04-Artikel.csv // Alle zugehörigen Artikel aller selektierten Positionen 2015-04-Kunden.csv // // Alle zugehörigen Kunden aller selektierten Belege |
AW: TQuery (TIBCQuery) - mehrere Master-Detailverbindungen komplett durchlaufen
Zitat:
Im Prinzip keine schlechte Idee, aber diese Lösung liefert mir ja auch "nur" alle Daten auf einen Rutsch und nicht getrennt.. leider.. ansonsten eine echt gute Idee, die Logik auszulagern.. vielleicht lässt die Idee dahinter doch irgendwie verwenden.. |
AW: TQuery (TIBCQuery) - mehrere Master-Detailverbindungen komplett durchlaufen
Zitat:
Delphi-Quellcode:
TExportItem = class()
... property SQL: String; property FileName: String; Dann stellst Du eine Collection von Items zusammen, jede bekommt ihre Individuelle SQL (und ist damit entsprechend anpassbar / optimiert. Die Collection übergibst du dann deinem CSV-Exporter und gut ist... Die SQLs sollten ja nicht das Problem sein, oder? Grüße |
AW: TQuery (TIBCQuery) - mehrere Master-Detailverbindungen komplett durchlaufen
Zitat:
Belege
Code:
Positionen
SELECT b.* FROM belege b WHERE b.belegdatum >= '2015-04-01' AND b.belegdatum < '2015-05-01'
Code:
Kunden
SELECT p.* FROM
positionen p WHERE p.belegid IN (SELECT b.belegid FROM belege b WHERE b.belegdatum >= '2015-04-01' AND b.belegdatum < '2015-05-01')
Code:
SELECT k.* FROM
kunden k WHERE k.kundenid IN (SELECT b.kundenid FROM belege b WHERE b.belegdatum >= '2015-04-01' AND b.belegdatum < '2015-05-01') |
AW: TQuery (TIBCQuery) - mehrere Master-Detailverbindungen komplett durchlaufen
Zitat:
Code:
Dieses liefert Dir bedingt die Abfrage, ob die Tabelle dabei ist.Wenn beim Input-Parameter 'True' übergeben wird, wedren die Daten abgefragt, ansonsten nicht. So lässt sich die Logik in der SP prima schalten. Und es ist vor allen Dingen SEHR schnell...
if I_TAB1='True' then
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz