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, 12: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 13:04 Uhr)
  Mit Zitat antworten Zitat
lowmax_5

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

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

  Alt 29. Okt 2015, 13: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 13: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, 13: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 13:54 Uhr)
  Mit Zitat antworten Zitat
RonniS

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

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

  Alt 29. Okt 2015, 14: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
HeZa

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

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

  Alt 29. Okt 2015, 16: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
RonniS

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

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

  Alt 29. Okt 2015, 14: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
lowmax_5

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

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

  Alt 29. Okt 2015, 17: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
RonniS

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

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

  Alt 29. Okt 2015, 23:00
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...
Das mit dem

if I_TAB1='True' then

hab ich leider nicht so ganz verstanden. Wärst Du so nett und könntest mir das noch ein wenig genauer erklären? Danke Dir schon mal..
  Mit Zitat antworten Zitat
lowmax_5

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

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

  Alt 30. Okt 2015, 15:58
Folgende Tabellen sind gegeben:

Code:
CREATE TABLE KUNDEN (
    KUNDENID INTEGER,
    NAME     VARCHAR(10)
);

CREATE TABLE RECHNUNG (
    ID       INTEGER,
    KUNDENID INTEGER,
    NR       VARCHAR(10),
    BETRAG   INTEGER
);

CREATE TABLE TABELLE3 (
    IDTAB3  INTEGER
);

Und folgende Stored Prodecure als Beispiel:


Code:
SET TERM ^ ;

CREATE OR ALTER PROCEDURE TEST_PROCEDURE (
    I_RECH INTEGER,
    I_TAB3 INTEGER)
RETURNS (
    O_KUNDENID INTEGER,
    O_NAME VARCHAR(10),
    O_ID INTEGER,
    O_NR VARCHAR(10),
    O_BETRAG INTEGER,
    O_PAR1 INTEGER,
    O_IDTAB3 INTEGER,
    O_PAR2 INTEGER)
AS
begin
for
 select KUNDENID,NAME from KUNDEN
 into :O_KUNDENID,:O_NAME
do
begin

    if (I_RECH=1) then
    for
     select ID, NR,BETRAG from RECHNUNG
     WHERE KUNDENID=:O_KUNDENID
     into :O_ID,:O_NR,:O_BETRAG
    do
    begin
     O_PAR1=100;
    end

    if (I_TAB3=1) then
    for
     select IDTAB3 FROM Tabelle3
     into :O_IDTAB3
    DO
    begin
     O_PAR2=200;
    end
end

end^

SET TERM ; ^

Du kannst nun mittels der Eingangsparameter 'I_RECH' und 'I_TAB3' die Datenmengen quasi dazuschalten.

I_RECH=1 : Rechnungdaten da AUFRUF:SELECT * FROM TEST_PROCEDURE(1, 0)
I_TAB3=1 : Daten aus Tabelle 3 da AUFRUF:SELECT * FROM TEST_PROCEDURE(0, 1)

Innerhalb der Stored Procedure kann so die Logik einfach verändert werden. Als Ausgabe gibt es immer eine entsprechende Tabelle.
Ich hoffe, dass cih es einigermassen erklären konnte...
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.387 Beiträge
 
Delphi 10.4 Sydney
 
#10

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

  Alt 29. Okt 2015, 14: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 14:15 Uhr)
  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 18:03 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