Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Fastreport 4 Welchen Bandtyp zum wahlweise einblenden? (https://www.delphipraxis.net/115003-fastreport-4-welchen-bandtyp-zum-wahlweise-einblenden.html)

Kostas 4. Jun 2008 10:29


Fastreport 4 Welchen Bandtyp zum wahlweise einblenden?
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo Zusammen,

ich habe ein GROSSES Problem und komme einfach nicht weiter.

Das Problem vorab: Wie schaffe ich es in Abhängigkeit von dem aktuelle Datensatz
des MasterDataBand ein ChildBand OBERHALB von MasterDataBand zu aktivieren?


Den Report habe ich angehängt.

Ich möchte Mahnungen drucken. Abhängig von der Mahnstufe soll oberhalb des MasterDataBand
ein Text stehen und nach dem MasterDataBand eine Auflistung. Das ganze habe ich Organisiert
in Child Bänder. Ich hatte es auch versucht mit Header und Footer Bänder, bekam jedoch die
Fehlermeldung Master und Child sind nicht verbunden.

Das Problem ist nun, die Child Bänder unterhalb des MasterDataBand werden richtig aktiviert
jedoch nicht die oberhalb des MasterDataBand. Warum das so ist, ist eigentlich klar. Die Child
Bänder müssen immer einem Übergeordneten Band als Child angegeben werden. In meinem Fall ist das
das PageHeaderBand. Das PageHeaderBand ist natürlich längst gedruckt bevor es das MastaDataBand
zu drucken beginnt. Natürlich habe ich versucht das aktivieren der Bänder nicht beim
MasterDataBand.OnBeforePrint sondern bei PageHeaderBand.OnAfterPrint zu setzten. Das geht leider
auch nicht die Bänder werden einfach nicht aktiviert in der richtigen Reihenfolge.

Hat jemand eine Idee was ich tun kann?

Gruß Kostas

franktron 4. Jun 2008 10:35

Re: Fastreport 4 Welchen Bandtyp zum wahlweise einblenden?
 
Hast du schon mal davon gehört das man die Inhalte der Bänder auch zu Laufzeit ändern kann ?

Und ein Band kannst du ja in OnBeforePrint auf Visible:=False setzten dann ist es nicht mehr sichtbar.

Kostas 4. Jun 2008 11:03

Re: Fastreport 4 Welchen Bandtyp zum wahlweise einblenden?
 
Zitat:

Zitat von franktron
Hast du schon mal davon gehört das man die Inhalte der Bänder auch zu Laufzeit ändern kann ?

Und ein Band kannst du ja in OnBeforePrint auf Visible:=False setzten dann ist es nicht mehr sichtbar.

Hallo Frank,

den Inhalt würde ich nicht so gerne zur Laufzeit ändern. Der Hintergrund ist, der Kunde soll die Möglichkeit haben
die Texte nach Bedarf anpassen zu können.

Die Sache mit der Sichtbarkeit ist genau mein Problem. Ich finde nicht den richtigen Zeitpunkt die Bänder zu aktivieren.
Möglicherweise verwende ich auch die den falschen BandTyp?
Denn wenn der MasterDataBand gedruckt wird, ist der PageHeaderBand schon längst gedruckt und ich kann das ChildBand nicht mehr dem
PageHeader als Child angeben. Ich meine ich kann es schon, aber es wirkt sich natürlich erst beim nächsten Record aus.

Gruß Kostas

Union 4. Jun 2008 14:58

Re: Fastreport 4 Welchen Bandtyp zum wahlweise einblenden?
 
Aktiviere doch das Child abhängig von der Bedingung vorher. Dazu musst Du nur ein TFrxDataSet verwenden, welches die Bedingung des Master "vorwegnimmt". Beispiel in PascalScript:
Delphi-Quellcode:
var
  MahnStufe : integer;
begin
  Ch1.Visible := False;
  Ch2.Visible := False;
  Ch3.Visible := False;

  MahnStufe := TfrxDBDataset(Report.GetDataset('rechnungen')).FieldByName('MahnStufe').AsInteger;
  if MahnStufe = 1 then
     Ch1.Visible := True
  else
  if MahnStufe = 2 then
     Ch2.Visible := True
  else
  if MahnStufe = 3 then
     Ch3.Visible := True;

Kostas 4. Jun 2008 16:23

Re: Fastreport 4 Welchen Bandtyp zum wahlweise einblenden?
 
Liste der Anhänge anzeigen (Anzahl: 4)
Zitat:

Zitat von Union
Aktiviere doch das Child abhängig von der Bedingung vorher. Dazu musst Du nur ein TFrxDataSet verwenden, welches die Bedingung des Master "vorwegnimmt". Beispiel in PascalScript:
Delphi-Quellcode:
var
  MahnStufe : integer;
begin
  Ch1.Visible := False;
  Ch2.Visible := False;
  Ch3.Visible := False;

  MahnStufe := TfrxDBDataset(Report.GetDataset('rechnungen')).FieldByName('MahnStufe').AsInteger;
  if MahnStufe = 1 then
     Ch1.Visible := True
  else
  if MahnStufe = 2 then
     Ch2.Visible := True
  else
  if MahnStufe = 3 then
     Ch3.Visible := True;

oh, das hört sich sehr vielversprechend an. Leider kennt Fastreport TFrxDataSet und auch
TfrxIBODataset nicht. Ich arbeite mit TfrxIBODataset wegen den IBO Komponenten. Unter Delphi
gibt es natürlich die Komponenten TfrxIBODataset. Möglicherweise habe ich bei der Installation
etwas falsch gemacht. Ich kann mich auch schwach erinnern das bei früheren Versionen im Designer
die Dataset Komponenten verfügbar wahren. In der aktuellen Installation fr4_6_28_d5p eben nicht.

Ich werde versuchen ob ich das nachinstallieren kann.
Bitte noch zwei Punkte:
-welches Event soll Dein Script ausführen? PageHeader.OnBeforePrint oder MasterData.OnBeforePrint oder an einer anderen Stelle?
-Du verwendest z.B.: Ch2.Visible := True was ist das bitte für ein Bandtyp?
Bei mir reagiert ein TfrxChild erst dann auf visible wenn ich vorher einem übergeordneten Band das Child
eingetragen habe z.B.: PageHeader.Child := Ch2; Solange die Childs nicht einem Band untergeordnet werden,
werden sie nicht angezeigt.

Gruß Kostas

[EDIT] hab die aktuelle Version installiert. Wie war das bitte nochmal, welche Unit müsste ich einbinden
um TfrxDBDataset in Designer verwenden zu können?

[EDIT2]
Jetzt bin ich ein Stück weiter gekommen :-)
Auf der IBO Website habe ich eine Komponenten gefunden für FastReport. jetzt habe ich auch ein TfrxIBODataset.
Jetzt bleibt nur noch die Frage, an welcher Stelle müssen die Childs zugeordnet werden.


Delphi-Quellcode:
procedure PageHeader1OnBeforePrint(Sender: TfrxComponent);
begin
  MahnStufe := TfrxIBODataset(Report.GetDataset('Mahnvorschlagsliste')).FieldByName('MAHNSTUFE').AsInteger;
   
  case MahnStufe of
  0:begin
      H1.child := Ch0;        
    end;
  1:begin
      H1.child := Ch1;        
    end;
  2:begin
      H1.child := Ch2;        
    end;
  3:begin
      H1.child := Ch3;        
    end;
  end;{case}                 
     
end;

Nachdem das auch nicht funktioniert hat, habe ich den Report komplett
gelöscht und neu Schritt für Schritt aufbauen wollen. Dabei ist das
eigentliche Problem ist in Erscheinung getreten.
Das HeaderBand greift auf die Daten des letzen Records zu,
obwohl ich definitiv vor den ReportStart den Datensatzzeiger an den Anfang stelle.


Wenn ich den Report starte wobei das Property StartNewPage=false
bei MasterDataBand steht, sehe ich die richtige Reihenfolge der Daten
im MasterDataBand. Das HeaderBand hat jedoch den ArtikelNr vom letzten Datensatz!
Ich würde erwarten das der header die ArtikelNr vom ersten Datensatz anzeigt.
Schalte ich nun das Property StartNewPage=true bei MasterDataBand ist die erste
Seite wieder falsch mit dem letzen Datensatz, und die anderen drei Seiten stimmen.

Hat da jemand eine Idee?

Gruß Kostas

Union 5. Jun 2008 07:33

Re: Fastreport 4 Welchen Bandtyp zum wahlweise einblenden?
 
Vielleicht solltest Du dann die Struktur Deiner Daten anders gestalten. In dem ersten Report sehe ich nur ein Dataset. Verwende doch zwei (oder mehr) Abfragen, die mit Master-Detail verbunden sind. Dann könntest Du das mit Gruppen erledigen. Und um die Mahntexte flexibel zu gestalten, würde ich sie in einer Konfigurationstabelle speichern. Dann brauchst Du sie nicht durch 3 verschiedene hardcodierte Reportbänder darzustellen.

Kostas 5. Jun 2008 08:32

Re: Fastreport 4 Welchen Bandtyp zum wahlweise einblenden?
 
Ich habe ja eigentlich festgestellt dass ich ein völlig anderes Problem habe als ursprünglich.
(Vielleicht sollte ich deshalb einen neuen Thread eröffnen)

Das Problem ist ja jetzt das ich ein DataSet mit vier Records habe und
das MasterDataBand zeigt die Daten in der richten Reihenfolge an. Der Header
NUR beim ersten Datensatz ist falsch. Er zeigt die Daten vom letzten Record.
In den Screen Shots von meinem letzen posting ist das zu sehen.

Nochmals zusammengefasst: vier Datensätze, jeder Datensatz soll eine neue Seite
beginnen. Beim drucken ist auf der Seite1 der Header von Seite4. Seite2 bis Seite4
werden richtig gedruckt. Die Frage ist also, warum holt sich der Report den Header vom
letzten Record jedoch in MasterData hat er den ersten Record?

Wenn ich das gelöst habe, wird mein Report für die Mahnungen vermutlich einwandfrei funktionieren.
Damit der Report nach jedem Record eine neue Seite beginnt, habe ich das Property
masterData.StartNewPage=true gesetzt.

Gruß Kostas

[EDIT] hab soeben die Lösung gefunden. :-)

Ich darf die Mahntexte oberhalb vom DataBand NICHT auf das PageHeaderBand ablegen sonder muss ein
GroupHeader anlegen und dort die Mahntexte ablegen. Der GroupHeader ist groupiert nach RechnungID und
GroupHeader.StartNewPage=true. MasterData.StartNewPage habe ich auf false gesetzt. Jetzt funkt es einwandfrei. Zumindest der testreport. Ich werde sogleich den kompletten Report umsetzen.


Gruß Kostas

Union 5. Jun 2008 09:41

Re: Fastreport 4 Welchen Bandtyp zum wahlweise einblenden?
 
Zitat:

Zitat von Union
Dann könntest Du das mit Gruppen erledigen

Schön dass Du es hinbekommen hast ;)

Kostas 5. Jun 2008 09:56

Re: Fastreport 4 Welchen Bandtyp zum wahlweise einblenden?
 
Zitat:

Zitat von Union
Zitat:

Zitat von Union
Dann könntest Du das mit Gruppen erledigen

Schön dass Du es hinbekommen hast ;)

Ja das war schon ein Kampf. Jetzt muss ich alle meine Reports überprüfen ob ich diesen "Fehler"
auch noch wo anders eingebaut habe. Bei den Rechnungen habe ich ja das gleiche Problem. Nur
da ist es nicht aufgefallen weil die Datenmenge selectiert wird auf die zu druckende Rechnung.
Somit habe ich nur ein Record in der MasterData. Würde ich jedoch eine Paket an Rechnungen
drucken wollen, hätte ich das gleiche Problem. Das heißt also ein PageHeader ist nicht geeignet
dafür Datengetriebene Felder zu benutzen wenn das PageHeaderBand mehr wie ein Datensatz beinhaltet.


Gruß Kostas


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:00 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-2025 by Thomas Breitkreuz