[gelöst] Lazreport mehrspaltig Detail-Subdetail Side by Side

Rund um die LCL und andere Komponenten
MacWomble
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

Beitrag von MacWomble »

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?
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.

MacWomble
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

Beitrag von MacWomble »

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.

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Lazreport mehrspaltig

Beitrag von Michl »

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; 

MacWomble
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

Beitrag von MacWomble »

Master = Akten
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.

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Lazreport mehrspaltig

Beitrag von Michl »

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 Daten

Code: Alles auswählen

Akte
--------------------------------------------
Adresse 1     
               | Tel 1
               | bis Tel n
Adresse 2     
               | Tel A
               | bis Tel Z
haben 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 bekommen

Code: Alles auswählen

Akte
--------------------------------------------
Adresse 1      | Tel 1
               | bis Tel n
Adresse 2      | Tel A
               | bis Tel Z
Habe 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:
Dateianhänge
LazReportSubDetail.png
LazReportMasterSubDetail.zip
(331.59 KiB) 79-mal heruntergeladen

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

MacWomble
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

Beitrag von MacWomble »

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. :oops:

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.

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Lazreport mehrspaltig

Beitrag von Michl »

MacWomble hat geschrieben:wie es oft so ist, ist die Adresse natürlich auch mehrzeilig. Genau hier liegt das Problem,
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.

Sieht dann so aus (Bsp-Source wie oben anbei).
Dateianhänge
LazReportDetailsUnterschiedlicherHoehe.zip
(329.37 KiB) 70-mal heruntergeladen
LazReportDetail.png

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

MacWomble
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

Beitrag von MacWomble »

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.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Lazreport mehrspaltig

Beitrag von Michl »

MacWomble hat geschrieben:Danke, dass du dir so viel Mühe machst - da bekomme ich mit dem folgenden schon ein schlechtes Gewissen:
Alles gut, mich interessiert das Thema auch (muß auch öfters Reports erstellen, da hilft es durchaus auch mal was anderes auszuprobieren).

MacWomble hat geschrieben:Das haut dann aber bei deiner Adresse 3 auch nicht hin.
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: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.
Hmm...
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; 

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Lazreport mehrspaltig

Beitrag von Michl »

Michl hat geschrieben:
MacWomble hat geschrieben:Das haut dann aber bei deiner Adresse 3 auch nicht hin.
Doch, die Adresse ist länger (3 Zeilen) als die dazugehörige Telefonnummer (1 Zeile). Deshalb hatte ich das ja extra so eingefügt.

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; 

MacWomble
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

Beitrag von MacWomble »

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)

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. :oops:
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Lazreport mehrspaltig

Beitrag von Michl »

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?!
Dateianhänge
LazReportZweiSubreports.zip
(329.06 KiB) 88-mal heruntergeladen
ZweiSubreports.png

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

MacWomble
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

Beitrag von MacWomble »

Jain ... geht nicht wirklich

Sorry, aber die Subdetails sind nicht den Details zugeordnet, was aber sein müsste :shock:

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) 89-mal heruntergeladen
TestReport.zip
Master - Detail - Subdetail
(322.81 KiB) 95-mal heruntergeladen
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Lazreport mehrspaltig

Beitrag von Michl »

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.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

MacWomble
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

Beitrag von MacWomble »

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.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Antworten