[gelöst] Lazreport mehrspaltig Detail-Subdetail Side by Side
-
- Lazarusforum e. V.
- Beiträge: 999
- Registriert: Do 17. Apr 2008, 01:59
- OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
- CPU-Target: Intel i7-10750 64Bit
- Wohnort: Freiburg
[gelöst] Lazreport mehrspaltig Detail-Subdetail Side by Side
Hallo,
ich stehe vor einem - wie es mir scheint - nicht wirklich lösbaren Problem.
Ich habe drei Tabellen: Master Detail und Subdetail und benötige folgende Reportaufteilung:
Master auf oberer Seitenhälfte (OK, das Geht)
und dann in der unteren Seitenhälfte Links die Detailsätze und rechts die zugehörigen Subdetails
Ich habe alles mögliche versucht, aber noch keine Lösung gefunden. Ich habe auch mit SubReports versucht, dem Problem zu Leide zu rücken:
Subreport 1: Masterband mit den Details
Subreport 2: Masterband mit den Subdetails
(wenn ich hier nicht das Masterband nehme, werden keine Daten angezeigt)
und dann Subreport 1 neben Subreport 2 auf der Hauptseite (habe es auch auf verschiedenen Bändern versucht) platziert.
Der Subreport 1 kommt richtig, der Subreport 2 wird nur dem letzten Detail-Datensatz zugeordnet.
Anmerkung: Wenn ich Master - Detail - Subdetail nacheinander im Report auf die Entsprechenden Bänder setze, stimmen die ausgegebenen Daten.
Hat vielleicht jemand einen schlauen Hinweis oder eine Lösung für dieses Problem?
ich stehe vor einem - wie es mir scheint - nicht wirklich lösbaren Problem.
Ich habe drei Tabellen: Master Detail und Subdetail und benötige folgende Reportaufteilung:
Master auf oberer Seitenhälfte (OK, das Geht)
und dann in der unteren Seitenhälfte Links die Detailsätze und rechts die zugehörigen Subdetails
Ich habe alles mögliche versucht, aber noch keine Lösung gefunden. Ich habe auch mit SubReports versucht, dem Problem zu Leide zu rücken:
Subreport 1: Masterband mit den Details
Subreport 2: Masterband mit den Subdetails
(wenn ich hier nicht das Masterband nehme, werden keine Daten angezeigt)
und dann Subreport 1 neben Subreport 2 auf der Hauptseite (habe es auch auf verschiedenen Bändern versucht) platziert.
Der Subreport 1 kommt richtig, der Subreport 2 wird nur dem letzten Detail-Datensatz zugeordnet.
Anmerkung: Wenn ich Master - Detail - Subdetail nacheinander im Report auf die Entsprechenden Bänder setze, stimmen die ausgegebenen Daten.
Hat vielleicht jemand einen schlauen Hinweis oder eine Lösung für dieses Problem?
Zuletzt geändert von MacWomble am Mi 6. Dez 2017, 09:11, insgesamt 2-mal geändert.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
-
- Lazarusforum e. V.
- Beiträge: 999
- Registriert: Do 17. Apr 2008, 01:59
- OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
- CPU-Target: Intel i7-10750 64Bit
- Wohnort: Freiburg
Re: Lazreport mehrspaltig
Ich denke ich muss das mit Gruppen machen, aber mir ist nicht genau klar, was ich wie und wo gruppieren muss.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
Re: Lazreport mehrspaltig
Warum füllst du für Detail/Subdetail nicht ein Query mit einem Select (per Join etc.), welches die benötigten Daten zusammensammelt und gibst diese aus?
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
-
- Lazarusforum e. V.
- Beiträge: 999
- Registriert: Do 17. Apr 2008, 01:59
- OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
- CPU-Target: Intel i7-10750 64Bit
- Wohnort: Freiburg
Re: Lazreport mehrspaltig
Master = Akten
Detail = Adressen
SubDetail = Kommunikationsdaten (Tel-Nummern etc.)
Jede Adresse kann x Kommunikationsdaten beinhalten
Ich habe nicht wirklich eine Idee, wie ich das in eine Query packen sollte - aber mit dem Gedanken habe ich auch schon gespielt
Detail = Adressen
SubDetail = Kommunikationsdaten (Tel-Nummern etc.)
Code: Alles auswählen
Akte
--------------------------------------------
Adresse 1 | Tel 1
| bis Tel n
Adresse 2 | Tel A
| bis Tel Z
usw.
Jede Adresse kann x Kommunikationsdaten beinhalten
Ich habe nicht wirklich eine Idee, wie ich das in eine Query packen sollte - aber mit dem Gedanken habe ich auch schon gespielt
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
Re: Lazreport mehrspaltig
Da ich auch nicht genau wußte, wie man sowas machen könnte, habe ich mal ein Beispiel gemäß der vorliegenden Informationen gebaut (SQLite). Die 32bit SQLite.dll für Windows ist beigefügt, 64bit bzw. anderes OS, müsstest du entsprechend ersetzen.
Wenn man die Datenhaben will geht das recht umkompliziert (Bänder: MasterData, DetailData und SubDetailData auf den Report und fertig ist die Sache (siehe testsubdetail.lrf)).
Um die Ausgabe zu bekommenHabe ich die Bänder identisch auf den Report gelegt und fülle nur die Master- und SubDetail-Bänder. Mit einem Script frage ich ab, ob es sich um den ersten Telefoneintrag handelt, wenn ja, dann wird die Adresse gesetzt ansonsten bleibt diese leer. Nachteil, es muss mindestens ein Telefoneintrag vorhanden sein (notfalls ein Dummyeintrag, den man nicht mit ausgeben müsste), sonst würde die Adresse nicht ausgegeben.
Sieht dann so aus:
Wenn man die Daten
Code: Alles auswählen
Akte
--------------------------------------------
Adresse 1
| Tel 1
| bis Tel n
Adresse 2
| Tel A
| bis Tel Z
Um die Ausgabe zu bekommen
Code: Alles auswählen
Akte
--------------------------------------------
Adresse 1 | Tel 1
| bis Tel n
Adresse 2 | Tel A
| bis Tel Z
Sieht dann so aus:
- Dateianhänge
-
- LazReportMasterSubDetail.zip
- (331.59 KiB) 80-mal heruntergeladen
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
-
- Lazarusforum e. V.
- Beiträge: 999
- Registriert: Do 17. Apr 2008, 01:59
- OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
- CPU-Target: Intel i7-10750 64Bit
- Wohnort: Freiburg
Re: Lazreport mehrspaltig
Danke Michl, die Idee ist nicht schlecht - aber ...
wie es oft so ist, ist die Adresse natürlich auch mehrzeilig. Genau hier liegt das Problem,
Sorry, dass wir uns da missverstanden haben.
So wie in deiner ersten Darstellung habe ich es problemlos hinbekommen, aber genau diese ist unbrauchbar,
da nur eine Seite zur Verfügung steht. Es muss also Platz gespart werden.
Es bleibt vermutlich schon der Ansatz mit den nebeneinander platzierten SubReports, aber ich bekomme das
mit der - notwendigen - Gruppierung nicht auf die Reihe. Was muss gruppiert werden und wo (DB oder Report)?
Es geht um ein Aktendeckblatt,. Die allgemeinen Aktendaten sind im oberen Drittel der Seite, darunter sollen die
der Akte zugeordneten (Post-)Adressen (links) mit den zugehörigen Telefonnummern (rechts) gedruckt werden.
Dabei muss sich ein solcher Block jeweils der längeren Ausgabe (mehr Adresszeilen als Nummern oder umgekehrt)
anpassen.
Akten (Master), Adressen (Detail) und Telefonnummern (Subdetail) sind jeweils eine Tabelle, über Keys verknüpft.
wie es oft so ist, ist die Adresse natürlich auch mehrzeilig. Genau hier liegt das Problem,
Sorry, dass wir uns da missverstanden haben.
So wie in deiner ersten Darstellung habe ich es problemlos hinbekommen, aber genau diese ist unbrauchbar,
da nur eine Seite zur Verfügung steht. Es muss also Platz gespart werden.
Es bleibt vermutlich schon der Ansatz mit den nebeneinander platzierten SubReports, aber ich bekomme das
mit der - notwendigen - Gruppierung nicht auf die Reihe. Was muss gruppiert werden und wo (DB oder Report)?
Es geht um ein Aktendeckblatt,. Die allgemeinen Aktendaten sind im oberen Drittel der Seite, darunter sollen die
der Akte zugeordneten (Post-)Adressen (links) mit den zugehörigen Telefonnummern (rechts) gedruckt werden.
Dabei muss sich ein solcher Block jeweils der längeren Ausgabe (mehr Adresszeilen als Nummern oder umgekehrt)
anpassen.
Akten (Master), Adressen (Detail) und Telefonnummern (Subdetail) sind jeweils eine Tabelle, über Keys verknüpft.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
Re: Lazreport mehrspaltig
Na das ist eigentlich kein Problem. Du lässt das SubDetailBand weg und fütters nur ein DetailDataBand und liest die TelefonNummern händisch in einen String (per GetValue) und lässt das Band sich in der Höhe selbst anpassen.MacWomble hat geschrieben:wie es oft so ist, ist die Adresse natürlich auch mehrzeilig. Genau hier liegt das Problem,
Sieht dann so aus (Bsp-Source wie oben anbei).
- Dateianhänge
-
- LazReportDetailsUnterschiedlicherHoehe.zip
- (329.37 KiB) 72-mal heruntergeladen
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
-
- Lazarusforum e. V.
- Beiträge: 999
- Registriert: Do 17. Apr 2008, 01:59
- OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
- CPU-Target: Intel i7-10750 64Bit
- Wohnort: Freiburg
Re: Lazreport mehrspaltig
Danke, dass du dir so viel Mühe machst - da bekomme ich mit dem folgenden schon ein schlechtes Gewissen:
Das haut dann aber bei deiner Adresse 3 auch nicht hin.
Normalerweise sollte das ein Reportgenerator können. Das konnten Reportgeneratoren schon vor 30 Jahren ...
Es kommt auch auf keinen Fall eine programmierte Lösung in Betracht. Das muss so gehen, die Anwender sollen ja den Bericht auch umstellen können.
Wenn ich fixe Formulare benötige, mache ich das ohne einen Designer mit zu liefern.
Das haut dann aber bei deiner Adresse 3 auch nicht hin.
Normalerweise sollte das ein Reportgenerator können. Das konnten Reportgeneratoren schon vor 30 Jahren ...
Es kommt auch auf keinen Fall eine programmierte Lösung in Betracht. Das muss so gehen, die Anwender sollen ja den Bericht auch umstellen können.
Wenn ich fixe Formulare benötige, mache ich das ohne einen Designer mit zu liefern.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
Re: Lazreport mehrspaltig
Alles gut, mich interessiert das Thema auch (muß auch öfters Reports erstellen, da hilft es durchaus auch mal was anderes auszuprobieren).MacWomble hat geschrieben:Danke, dass du dir so viel Mühe machst - da bekomme ich mit dem folgenden schon ein schlechtes Gewissen:
Doch, die Adresse ist länger (3 Zeilen) als die dazugehörige Telefonnummer (1 Zeile). Deshalb hatte ich das ja extra so eingefügt.MacWomble hat geschrieben:Das haut dann aber bei deiner Adresse 3 auch nicht hin.
Hmm...MacWomble hat geschrieben:Es kommt auch auf keinen Fall eine programmierte Lösung in Betracht. Das muss so gehen, die Anwender sollen ja den Bericht auch umstellen können.
Per Query stellt man ja Daten zur Verfügung. Dies machst du als Programmierer. Ein Datenfeld könnte auch die Telefonnummern getrennt per LineEnding sein. Ob du diese Daten per Query oder per GetValue (das Value wird per Query gefüllt) zur Verfügung stellst, macht mMn nicht den ganz großen Unterschied. Per Query könnte man ein CalcField erstellen, welches die Telefonnummern addiert (ist IMHO aufwendiger).
Die Lösung finde ich immer noch um einiges eleganter, als zwei Reports nebeneinander zu legen. Da hätte ein Nutzer vermutlich keine Freude dran (wüßte auch nicht, wie man diese dann ausgedruckt bekäme).
Allerdings habe ich nur mittelmäßige Erfahrungen mit LazReport (habe es nur in firmeninternen Projekten im Einsatz) und weiß nicht, ob man das besser gelöst bekommt. Ich bin da jetzt mal leise, vielleicht hat jemand mehr Erfahrung hier und weiß, wie man das richtig angeht.
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
Re: Lazreport mehrspaltig
Michl hat geschrieben:Doch, die Adresse ist länger (3 Zeilen) als die dazugehörige Telefonnummer (1 Zeile). Deshalb hatte ich das ja extra so eingefügt.MacWomble hat geschrieben:Das haut dann aber bei deiner Adresse 3 auch nicht hin.
Ach, vielleicht habe ich hier ein Verständigungsproblem. Ich hatte die Telefonnummern jeweils zu den Adressen zugehörig angesehen (Adresse 1 sollte für eine komplette Adresse mit Straße, PLZ, Stadt etc. stehen, Adresse 2 adäquat usw.). Wenn es nur einen Master (Akte) und zwei voneinander quasi unahängige Detailtabellen Adressen / Telefonnumern gibt, könnte man z.B. die Adressen genauso füllen, wie die Telefonnummern.
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
-
- Lazarusforum e. V.
- Beiträge: 999
- Registriert: Do 17. Apr 2008, 01:59
- OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
- CPU-Target: Intel i7-10750 64Bit
- Wohnort: Freiburg
Re: Lazreport mehrspaltig
Ja, das würde schon gehen, aber wie egsagt fehlt es dann an der Flexibilität.
Es würde auch etwas aufwändiger werden, als es scheint. Es ist nicht einfach nur die Telefonnummer, sondern hierzu auch noch eine Bezeichnung auszugeben. Diese sollten dann sauber untereinander ausgerichtet sein. Eventuell muss zur Telefonnummer dann noch ein Kommentar (z.B. ab 16:00 Uhr)
Somit müsste ich drei Spalten für die Telefonnummer füllen.
Lt. Anleitung (Freereport) sollte es so möglich sein:
Auf der Seite wird ein Masterband mit den Masterdaten angelegt.
Im Detailband werden dann nebeneinander zwei Subreports eingefügt. Für die Subreports wird jeweils eine neue Reportseite im Designer angezeigt und kann dort auch editiert werden. Allerdings muss man da wohl wieder mit einem Master starten.
d.h. Im Subreport1 lege ich die Felder der Detailtabelle (Adressen) ab und im Subreport2 die Felder der SubDetailtabelle (hier Telefonnummern)
Soweit so gut. Nun muss noch irgendwo gruppiert werden - und da hänge ich fest.
Ich versuche mich da nochmal etwas weiter, wenn das dann nicht klappt, werde ich versuchen es auf deine Art zu lösen.
Da hier und in anderen Foren öfters erwähnt wurde, wie viele - auch komplizierte - Berichte die Leute schon mit Lazreport erstellt haben, dachte ich es wäre eine einfache Frage für einen - schlussendlich - einfachen Report.
Auch in der Anleitung wird das Problem in wenigen Worten beschrieben und scheint tatsächlich recht einfach zu sein ....
Hmm irgendwo scheine ich einen Denkfehler zu machen.
Es würde auch etwas aufwändiger werden, als es scheint. Es ist nicht einfach nur die Telefonnummer, sondern hierzu auch noch eine Bezeichnung auszugeben. Diese sollten dann sauber untereinander ausgerichtet sein. Eventuell muss zur Telefonnummer dann noch ein Kommentar (z.B. ab 16:00 Uhr)
Code: Alles auswählen
Telefon: 1234-6738146
Privat: 487-2370421 ab 16:00 Uhr
eMail: dummy@test.com
Somit müsste ich drei Spalten für die Telefonnummer füllen.
Lt. Anleitung (Freereport) sollte es so möglich sein:
Auf der Seite wird ein Masterband mit den Masterdaten angelegt.
Im Detailband werden dann nebeneinander zwei Subreports eingefügt. Für die Subreports wird jeweils eine neue Reportseite im Designer angezeigt und kann dort auch editiert werden. Allerdings muss man da wohl wieder mit einem Master starten.
d.h. Im Subreport1 lege ich die Felder der Detailtabelle (Adressen) ab und im Subreport2 die Felder der SubDetailtabelle (hier Telefonnummern)
Soweit so gut. Nun muss noch irgendwo gruppiert werden - und da hänge ich fest.
Ich versuche mich da nochmal etwas weiter, wenn das dann nicht klappt, werde ich versuchen es auf deine Art zu lösen.
Da hier und in anderen Foren öfters erwähnt wurde, wie viele - auch komplizierte - Berichte die Leute schon mit Lazreport erstellt haben, dachte ich es wäre eine einfache Frage für einen - schlussendlich - einfachen Report.
Auch in der Anleitung wird das Problem in wenigen Worten beschrieben und scheint tatsächlich recht einfach zu sein ....
Hmm irgendwo scheine ich einen Denkfehler zu machen.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
Re: Lazreport mehrspaltig
Genau so geht es. Habe es eben probiert. Wieder was gelernt. Danke für die Info!
Ich habe nochmal das Testprog angehangen. Ist jetzt nicht im Detail ausgeklügelt, aber evtl. nützt dir der Beispielreport ja was?!
Ich habe nochmal das Testprog angehangen. Ist jetzt nicht im Detail ausgeklügelt, aber evtl. nützt dir der Beispielreport ja was?!
- Dateianhänge
-
- LazReportZweiSubreports.zip
- (329.06 KiB) 90-mal heruntergeladen
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
-
- Lazarusforum e. V.
- Beiträge: 999
- Registriert: Do 17. Apr 2008, 01:59
- OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
- CPU-Target: Intel i7-10750 64Bit
- Wohnort: Freiburg
Re: Lazreport mehrspaltig
Jain ... geht nicht wirklich
Sorry, aber die Subdetails sind nicht den Details zugeordnet, was aber sein müsste
Problem ist, dass die Telefonnummern nicht als Subdetail angelegt sind. (Master - Detail - Detail)
Ich habe das mal in deinem Projekt (nicht im Report!)) umgestellt, falls du noch weiter experimentieren möchtest.
Und wie schon gesagt: Irgendwo muss gruppiert werden!
Siehe pdf ab Seite 76
Ok, so langsam zweifle ich auch an der Machbarkeit und die Anleitung kann auch anders interpretiert werden.
Sorry, aber die Subdetails sind nicht den Details zugeordnet, was aber sein müsste
Problem ist, dass die Telefonnummern nicht als Subdetail angelegt sind. (Master - Detail - Detail)
Ich habe das mal in deinem Projekt (nicht im Report!)) umgestellt, falls du noch weiter experimentieren möchtest.
Und wie schon gesagt: Irgendwo muss gruppiert werden!
Siehe pdf ab Seite 76
Ok, so langsam zweifle ich auch an der Machbarkeit und die Anleitung kann auch anders interpretiert werden.
- Dateianhänge
-
- UserManual-en.pdf
- (2.69 MiB) 91-mal heruntergeladen
-
- TestReport.zip
- Master - Detail - Subdetail
- (322.81 KiB) 98-mal heruntergeladen
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
Re: Lazreport mehrspaltig
Also ist es doch so, wie ich es ursprünglich (verstanden) hatte.
Was soll denn passieren, wenn mehr Telefoneinträge als Adresseinträge (Zeilen) vorhanden sind? Soll dann der nächste Adresseintrag erst unterhalb der Telefoneinträge angezeigt werden? Das sollte eigentlich mit einem Subreport auf dem Detailband zu realisieren sein.
Was soll denn passieren, wenn mehr Telefoneinträge als Adresseinträge (Zeilen) vorhanden sind? Soll dann der nächste Adresseintrag erst unterhalb der Telefoneinträge angezeigt werden? Das sollte eigentlich mit einem Subreport auf dem Detailband zu realisieren sein.
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
-
- Lazarusforum e. V.
- Beiträge: 999
- Registriert: Do 17. Apr 2008, 01:59
- OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
- CPU-Target: Intel i7-10750 64Bit
- Wohnort: Freiburg
Re: Lazreport mehrspaltig
ja, immer die längere Spalte soll das untere Ende bestimmen. Eine Adresse hat 1-8 Zeilen, die zugehörigen Nummern 1-10 Zeilen max., dann wiederholt sich das ganze für die nächste Adresse.
Ich habe das wesentliche Problem entdeckt: Die Subreports kennen die übergeordnete Tabellenzeile nicht.
Ich habe das wesentliche Problem entdeckt: Die Subreports kennen die übergeordnete Tabellenzeile nicht.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.