AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken TQuery (TIBCQuery) - mehrere Master-Detailverbindungen komplett durchlaufen
Thema durchsuchen
Ansicht
Themen-Optionen

TQuery (TIBCQuery) - mehrere Master-Detailverbindungen komplett durchlaufen

Ein Thema von RonniS · begonnen am 29. Okt 2015 · letzter Beitrag vom 3. Nov 2015
Antwort Antwort
Seite 1 von 2  1 2      
RonniS

Registriert seit: 5. Feb 2010
9 Beiträge
 
#1

TQuery (TIBCQuery) - mehrere Master-Detailverbindungen komplett durchlaufen

  Alt 29. Okt 2015, 11:45
Datenbank: Firebird • Version: 2.5 • Zugriff über: IBDac
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.

Würde mich über jede Idee oder jeden Ansatz freuen.

Danke schon mal.

Geändert von RonniS (29. Okt 2015 um 12:04 Uhr)
  Mit Zitat antworten Zitat
lowmax_5

Registriert seit: 9. Mai 2003
Ort: Münster, NRW
257 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: TQuery (TIBCQuery) - mehrere Master-Detailverbindungen komplett durchlaufen

  Alt 29. Okt 2015, 12:24
...warum dieses nicht innerhalb einer FB-StoredProcedure realisieren:

Code:
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
Das klappt prima ist schnellund die Businesslogik ist gleich in die DB ausgelagert...

Geändert von lowmax_5 (29. Okt 2015 um 12:27 Uhr)
  Mit Zitat antworten Zitat
HeZa

Registriert seit: 4. Nov 2004
Ort: Dortmund
182 Beiträge
 
Delphi 10 Seattle Professional
 
#3

AW: TQuery (TIBCQuery) - mehrere Master-Detailverbindungen komplett durchlaufen

  Alt 29. Okt 2015, 12:51
Hallo,

Zitat:
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.
Um eine Lösung zu vorzuschlagen, muss du auch etwas zu den CSV-Dateien sagen.

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
...

???

Geändert von HeZa (29. Okt 2015 um 12:54 Uhr)
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.366 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: TQuery (TIBCQuery) - mehrere Master-Detailverbindungen komplett durchlaufen

  Alt 29. Okt 2015, 13:04
Zitat:
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..
dann bau dir das als ganz normale (Monster)SQL zusammen und lass es ausführen. WEnn dann alles in eine CSV Datei soll, brauchst Du eh alle Daten.

Geändert von Lemmy (29. Okt 2015 um 13:15 Uhr)
  Mit Zitat antworten Zitat
RonniS

Registriert seit: 5. Feb 2010
9 Beiträge
 
#5

AW: TQuery (TIBCQuery) - mehrere Master-Detailverbindungen komplett durchlaufen

  Alt 29. Okt 2015, 13:12
Hallo,

Zitat:
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.
Um eine Lösung zu vorzuschlagen, muss du auch etwas zu den CSV-Dateien sagen.

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
...

???
Ja Du hast recht, das habe ich bei meiner Geschichte gar nicht beschrieben. Die Ausgabe der csv-Dateien soll dann auch den Tabellen entsprechen, also so, wie
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..
  Mit Zitat antworten Zitat
RonniS

Registriert seit: 5. Feb 2010
9 Beiträge
 
#6

AW: TQuery (TIBCQuery) - mehrere Master-Detailverbindungen komplett durchlaufen

  Alt 29. Okt 2015, 13:15
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..

dann bau dir das als ganz normale (Monster)SQL zusammen und lass es ausführen. WEnn dann alles in eine CSV Datei soll, brauchst Du eh alle Daten.
Daran hatte ich auch schon gedacht, aber wie eben schon geschrieben, sollen die einzelnen Tabellen dann nicht in einer einzigen, sondern jeweils einzelnen
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
  Mit Zitat antworten Zitat
RonniS

Registriert seit: 5. Feb 2010
9 Beiträge
 
#7

AW: TQuery (TIBCQuery) - mehrere Master-Detailverbindungen komplett durchlaufen

  Alt 29. Okt 2015, 13:19
...warum dieses nicht innerhalb einer FB-StoredProcedure realisieren:

Code:
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
Das klappt prima ist schnellund die Businesslogik ist gleich in die DB ausgelagert...

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..
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.366 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: TQuery (TIBCQuery) - mehrere Master-Detailverbindungen komplett durchlaufen

  Alt 29. Okt 2015, 14:03

Daran hatte ich auch schon gedacht, aber wie eben schon geschrieben, sollen die einzelnen Tabellen dann nicht in einer einzigen, sondern jeweils einzelnen
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
dann bau dir eine KLasse

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
  Mit Zitat antworten Zitat
HeZa

Registriert seit: 4. Nov 2004
Ort: Dortmund
182 Beiträge
 
Delphi 10 Seattle Professional
 
#9

AW: TQuery (TIBCQuery) - mehrere Master-Detailverbindungen komplett durchlaufen

  Alt 29. Okt 2015, 15:36
Ja Du hast recht, das habe ich bei meiner Geschichte gar nicht beschrieben. Die Ausgabe der csv-Dateien soll dann auch den Tabellen entsprechen, also so, wie
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..
Das macht aus meiner Sicht die Sache einfacher. Du brauchst gar nicht mit Master Detail arbeiten, sondern baust Dir stattdessen pro Tabelle ein SQL.

Belege
Code:
SELECT b.* FROM belege b WHERE b.belegdatum >= '2015-04-01' AND b.belegdatum < '2015-05-01'
Positionen
Code:
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')
Kunden
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')
  Mit Zitat antworten Zitat
lowmax_5

Registriert seit: 9. Mai 2003
Ort: Münster, NRW
257 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: TQuery (TIBCQuery) - mehrere Master-Detailverbindungen komplett durchlaufen

  Alt 29. Okt 2015, 16:02
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..
Code:
if I_TAB1='True' then
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...
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:47 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz