Einzelnen Beitrag anzeigen

Benutzerbild von erich.wanker
erich.wanker

Registriert seit: 31. Jan 2008
Ort: im schönen Salzburger Land
461 Beiträge
 
Delphi XE4 Professional
 
#1

Filtern von 3 Tabellen für Report

  Alt 14. Dez 2018, 13:29
Datenbank: Firebird • Version: 2.5 • Zugriff über: ZeosLib
Hallo, ich werd noch wahnsinnig ..

ich muss für einen Report 3 Tabellen filtern:

Betroffene Personen -> die Verträge der Person - die Leistungen lt. Vertrag

Wenn ich DBGrids auf die 3 Tabellen hänge funktioniert alles einwandfrei,
WENN DER REPORT DIE DATEN DRUCKT kommen nach Seitenwechsel Datensätze doppelt oder mehrfach


Drucken will ich:
************************************************** *****************
customer 1
____________contract A
_______________Produkt 1 from Contract A of customer 1
_______________Produkt 2 from Contract A of customer 1
____________contract B
_______________Produkt 1 from Contract B of customer 1
_______________Produkt 2 from Contract B of customer 1
customer 2
____________contract A
_______________Produkt 1 from Contract A of customer 2
_______________Produkt 2 from Contract A of customer 2

************************************************** *****************
die Personen Tabelle wird gefilter mit "Select * from Personen where INR in (-1,155,24,656,...)
Person-TZquery "onDataChange" filtert Verträge "Select * from Vertrag where INR in (-1,155,24,656,...)
Verträge-Tzquery "onDataChange" filtert Leistungen (weiter unten ist ein Auschnitt der Procedure)

Wenn ich 3 DBGrids auf die 3 TDataSource verbinde und in den dbGrids rumklicke funktioniert alles einwandfrei


Eigentlich total einfach .. ABER:

Der eingesetzte Reportdesigner (Reportbuilder 19) zickt mächtig rum - und druckt Leistungen des Vertrags mehrfach bei Seitenwechsel (teilweise endlos-loop) -Infos vom Hersteller: http://rbwiki.digital-metaphors.com/...g-sql-queries/

Jetzt habe ich herausgefunden:



Wenn ich die Leistungen wie folgt filtere FUNKTIONIERT DER REPORT NICHT RICHTIG
Delphi-Quellcode:
procedure TF_DRUCK.dxdruck_vertragDataChange(Sender: TObject; Field: TField);
...
  if UniMainModule.fakturierungs_umfang <> 'ENTSCHAEDIGUNGthen
  begin
    xdruck_entsch.SQL.Clear;
    xdruck_entsch.SQL.Append('SELECT * FROM ANTEILE WHERE ANTEILE.FAKTURIERUNG_MONAT = ' + #39 + kunden_fakturieren.fakturierungsmonat + #39 + ' AND ANTEILE.VERTRAG_NR = :INR AND ANTEILE.MANDANT_INR = ' + inttostr(UniMainModule.aktueller_mandant_nummer) + ' AND ANTEILE.GUNST_INR = ' + s + ' ORDER BY ANTEILE.VERTRAG_NR desc ');
    xdruck_entsch.Open;
  end;

  if UniMainModule.fakturierungs_umfang = 'ENTSCHAEDIGUNGthen
  begin
    xdruck_entsch.SQL.Clear;
    xdruck_entsch.SQL.Append(UniMainModule.markierte_anteile + ' AND ANTEILE.MANDANT_INR = ' + inttostr(UniMainModule.aktueller_mandant_nummer) + ' AND ANTEILE.VERTRAG_NR = :INR ORDER BY ANTEILE.VERTRAG_NR desc');
    xdruck_entsch.Open;
  end;
...
Zitat:
Erklärung: User hat manuell was ausgewählt:= UniMainModule.fakturierungs_umfang = 'ENTSCHAEDIGUNG'
ansonsten alle zum Vertrag gehörenden Leistungen drucken
Zitat:
Erklärung: der String "UniMainModule.markierte_anteile" wird verwendet, wenn der User nur markierte Leistungen drucken will - dann schaut der zusammengesetzte String so aus:
"SELECT * FROM ANTEILE WHERE INR IN (-1,331413,331186,331179,331174,331171,331176)"




Wenn ich das "procedure TF_DRUCK.dxdruck_vertragDataChange" deaktiviere und ZUR DESIGZEIT folgendes unter Eigenschaften bei xdruck_entsch mache FUNKTIONIERT DER REPORT RICHTIG
Delphi-Quellcode:
xdruck_entsch.MasterSource = dxdruck_vertrag
xdruck_entsch.SQL = SELECT * FROM ANTEILE WHERE ANTEILE.VERTRAG_NR = :INR




ABER: Eine einfache " where Nummer = Nummer aus Mastertabelle" hilft mir nicht..

Wie bitte soll ich die Funktionalität von procedure TF_DRUCK.dxdruck_vertragDataChange in Parameter verpacken ?

Hat jemand eine Idee?

Vielen Dank
Erich
Erich Wanker - for life:=1971 to lebensende do begin ..
O
/H\
/ \

Geändert von erich.wanker (14. Dez 2018 um 13:35 Uhr)
  Mit Zitat antworten Zitat