Ich habe einen Report erstellt (Einnahmen Überschuß Rechnung), der auch wunderbar funktioniert.
Jetzt ist es so, daß manchmal alles auf eine Seite passt und manchmal nicht.
Sowohl Master Foot Band als auch Page Foot Band sind für eine Übertragsausgabe nicht wirklich geeignet, da es diesen im Fall von einer Seite ja gar nicht gibt.
Wie bekomme ich es hin, daß im Falle eines mehrseitigen Ausdrucks auf der alten Seite eine Summenzeile gedruckt wird, welche in der nächsten Seite als Übertrag angezeigt werden kann? Aber eben auch nur bei einem mehrseitigen Ausdruck.
Frage zu Lazreport
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1741
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
- Zvoni
- Beiträge: 522
- Registriert: Fr 5. Jul 2024, 08:26
- OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
- CPU-Target: 64Bit
- Wohnort: BW
Re: Frage zu Lazreport
Kenne mich mit LazReport jetzt gar nicht aus, aber theoretisch müsste man das auch ausrechnen können per Div und Mod, da du ja eigentlich vorher weisst, wieviele Datenzeilen in deinen Report pro Seite reinpassen
1) AnzahlZeilen Div MaxZeilenSeite --> ergibt das 0, dann passt alles auf eine Seite. ergibt das z.B. 2, dann brauchst du min. 3 Seiten
2) Jetzt wirds knifflig. Du musst obige Berechnung nochmal machen, jedoch erweitert um deine "zusätzlichen" Übertragszeilen.
Die erste Seite (Seite "0") erhält eine zusätzliche Zeile (Übertragssumme unten) als letztmögliche Zeile
Die letzte Seite (Seite "?") erhält eine zusätzliche Zeile (Übertragssumme oben) als erstmögliche Zeile
Die Seiten dazwischen erhalten zwei zusätzliche Zeilen (Übertragssumme oben und unten)
Beispiel:
Pro Seite passen 20 Datenzeilen
Du hast 57 (=X) "originale" Datenzeilen
1. Schritt
X Div 20 = 2 (Dieses Ergebnis in einer Variablen speichern) --> du brauchst 3 Seiten
2. Schritt
Seite 1 --> +1 Zeile (Übertragssumme unten) --> 21 Datenzeilen
Seite 2 --> +2 Zeilen (Übertragssumme oben+unten) --> 22 Datenzeilen
//Seite x --> +2 Zeilen (Übertragssumme oben+unten) --> 22 Datenzeilen
Seite 3 --> +1 Zeile (Übertragssumme oben) --> 21 Datenzeilen
ergibt jetzt in Summe 64 Datenzeilen
Wiederhole Schritt 1 mit Übergabe des neuen "X" (=64)
Solange wiederholen, bis neues Ergebnis mit altem Ergebnis (In Variable gespeichert) gleich ist
Ist jetzt nur aus dem linken Ärmel gezogen
Wie gesagt: Kenne mich mit Lazreport nicht aus, aber du erwähnst Master/Page Foot Band (ich geh mal von aus, es gibt auch nen "Head" oder sowas), welches anscheinend nur bei Mehrseitigem Report zur Verfügung steht.
Wenn Page Foot/Head Band keinen Platz im Datenbereich wegnimmt, dann brauchste obigen Schritt 2 nicht, sondern nur Schritt 1.
Ergibt Schritt 1 >0, dann müssten Foot/Head zur Verfügung stehen.
Der Rest ist dann nur Mathe
EDIT: Obigen Schritt 2 kann man auch iterativ machen
Wenn Schritt 1 als Ergebnis >0 liefert:
Seite 1 --> 19 Datenzeilen + 1 Übertrag
Seite 2 --> 18 Datenzeilen + 2 Übertrag
Seite x --> 18 Datenzeilen + 2 Übertrag
solange wiederholen, wie restl. Datenzeilen >19
Letzte Seite --> Restl. Datenzeilen + 1 Übertrag
1) AnzahlZeilen Div MaxZeilenSeite --> ergibt das 0, dann passt alles auf eine Seite. ergibt das z.B. 2, dann brauchst du min. 3 Seiten
2) Jetzt wirds knifflig. Du musst obige Berechnung nochmal machen, jedoch erweitert um deine "zusätzlichen" Übertragszeilen.
Die erste Seite (Seite "0") erhält eine zusätzliche Zeile (Übertragssumme unten) als letztmögliche Zeile
Die letzte Seite (Seite "?") erhält eine zusätzliche Zeile (Übertragssumme oben) als erstmögliche Zeile
Die Seiten dazwischen erhalten zwei zusätzliche Zeilen (Übertragssumme oben und unten)
Beispiel:
Pro Seite passen 20 Datenzeilen
Du hast 57 (=X) "originale" Datenzeilen
1. Schritt
X Div 20 = 2 (Dieses Ergebnis in einer Variablen speichern) --> du brauchst 3 Seiten
2. Schritt
Seite 1 --> +1 Zeile (Übertragssumme unten) --> 21 Datenzeilen
Seite 2 --> +2 Zeilen (Übertragssumme oben+unten) --> 22 Datenzeilen
//Seite x --> +2 Zeilen (Übertragssumme oben+unten) --> 22 Datenzeilen
Seite 3 --> +1 Zeile (Übertragssumme oben) --> 21 Datenzeilen
ergibt jetzt in Summe 64 Datenzeilen
Wiederhole Schritt 1 mit Übergabe des neuen "X" (=64)
Solange wiederholen, bis neues Ergebnis mit altem Ergebnis (In Variable gespeichert) gleich ist
Ist jetzt nur aus dem linken Ärmel gezogen
Wie gesagt: Kenne mich mit Lazreport nicht aus, aber du erwähnst Master/Page Foot Band (ich geh mal von aus, es gibt auch nen "Head" oder sowas), welches anscheinend nur bei Mehrseitigem Report zur Verfügung steht.
Wenn Page Foot/Head Band keinen Platz im Datenbereich wegnimmt, dann brauchste obigen Schritt 2 nicht, sondern nur Schritt 1.
Ergibt Schritt 1 >0, dann müssten Foot/Head zur Verfügung stehen.
Der Rest ist dann nur Mathe
EDIT: Obigen Schritt 2 kann man auch iterativ machen
Wenn Schritt 1 als Ergebnis >0 liefert:
Seite 1 --> 19 Datenzeilen + 1 Übertrag
Seite 2 --> 18 Datenzeilen + 2 Übertrag
Seite x --> 18 Datenzeilen + 2 Übertrag
solange wiederholen, wie restl. Datenzeilen >19
Letzte Seite --> Restl. Datenzeilen + 1 Übertrag
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.
- lcb-User
- Beiträge: 60
- Registriert: Di 15. Jul 2014, 13:18
- OS, Lazarus, FPC: Linux Mint 22.2 Cinnamon Lazarus 4.3 (rev lazarus_4_2-11-g4374647103) FPC 3.2.2
- CPU-Target: 64Bit
- Wohnort: München
- Kontaktdaten:
Re: Frage zu Lazreport
Hallo,
ich hatte ein ähnliches Problem mit der Ausgabe einer Rechnung.
Mein Report besteht aus frei Bänder
Seiten-Kopfzeile
Master-Daten
Seiten-Fußzeile
Der wesentliche Mechanismus ist
Du kannst dir mal mein Projekt anschauen, unter Report findest Du die nötigen Infos
https://gitlab.com/bibsi/LazDaveso
Der Report wird quasi 2 mal aufgerufen und da bekommt er die nötigen Infos ob es mehrseitig wird.
Vielleicht hilft`s Dir.
ich hatte ein ähnliches Problem mit der Ausgabe einer Rechnung.
Mein Report besteht aus frei Bänder
Seiten-Kopfzeile
Master-Daten
Seiten-Fußzeile
Der wesentliche Mechanismus ist
Code: Alles auswählen
[if([TOTALPAGES]>1,'Seite '+[PAGE#]+' von '+[TOTALPAGES]+' Seiten','')]https://gitlab.com/bibsi/LazDaveso
Der Report wird quasi 2 mal aufgerufen und da bekommt er die nötigen Infos ob es mehrseitig wird.
Vielleicht hilft`s Dir.
Sonnige Grüße
Bibsi
Traue keiner Statistik die du nicht selbst gefälscht hast (Sir Winston Churchill 1874 - 1965)
Linux Mint 22.2 Cinnamon 6.4.8, Kernel 6.8.0-79-generic
Lazarus 4.3 (rev lazarus_4_2-11-g4374647103) FPC 3.2.2 x86_64-linux-gtk2
Bibsi
Traue keiner Statistik die du nicht selbst gefälscht hast (Sir Winston Churchill 1874 - 1965)
Linux Mint 22.2 Cinnamon 6.4.8, Kernel 6.8.0-79-generic
Lazarus 4.3 (rev lazarus_4_2-11-g4374647103) FPC 3.2.2 x86_64-linux-gtk2
-
Soner
- Beiträge: 774
- Registriert: Do 27. Sep 2012, 00:07
- OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
- CPU-Target: x86_64-win64
- Wohnort: Hamburg
Re: Frage zu Lazreport
Icb-User hat schon richtige Tipps gegeben. Du musst in deinem Programm nichts ändern, das alles kannst du in Report-Designer erledigen.
Am einfachsten ist es man erstellt ein PageFooter-Band und plaziert dort ein Textobject(Memo) und macht gleiche Farbe wie Hintergrund und gibt als Highlight bedingung "[TOTALPAGES]>1" und als Highlight wählt man sichtbare Farbe.
Oder man kann mit Script arbeiten und gibt als Bedingung so etwas wie "Visible:=[TOTALPAGES]>1". Das ist auch besserer Weg.
Jetzt muss man natürlich in Memo Übertrag schreiben, dass kannst du z.B. so:
Übertrag = [Sum([DeinDataSetVonMasterBand."DEINFELD"], NameVonDeinMasterDataBand)]
Am einfachsten ist es man erstellt ein PageFooter-Band und plaziert dort ein Textobject(Memo) und macht gleiche Farbe wie Hintergrund und gibt als Highlight bedingung "[TOTALPAGES]>1" und als Highlight wählt man sichtbare Farbe.
Oder man kann mit Script arbeiten und gibt als Bedingung so etwas wie "Visible:=[TOTALPAGES]>1". Das ist auch besserer Weg.
Jetzt muss man natürlich in Memo Übertrag schreiben, dass kannst du z.B. so:
Übertrag = [Sum([DeinDataSetVonMasterBand."DEINFELD"], NameVonDeinMasterDataBand)]
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1741
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
Re: Frage zu Lazreport
Danke für eure Antworten. So ähnlich habe ich es auch gelöst.
Da meine Datenquelle nicht aus einer Datenbank stammt, habe ich die Datenbereitstellung sowieso über das frUserDataset machen müssen und im OnGetValue Event verschiedene Status- und Zählvariablen zur Verfügung gestellt.
Über Script wird dann die Sichtbarkeit der Übertragselemente gesteuert.
Das hat den Vorteil, daß die Farben frei mit dem Designer eingestellt werden können.
Da meine Datenquelle nicht aus einer Datenbank stammt, habe ich die Datenbereitstellung sowieso über das frUserDataset machen müssen und im OnGetValue Event verschiedene Status- und Zählvariablen zur Verfügung gestellt.
Über Script wird dann die Sichtbarkeit der Übertragselemente gesteuert.
Code: Alles auswählen
Visible := [LfdNr] < [Anzahl];