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

Rund um die LCL und andere Komponenten

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

Beitragvon MacWomble » 3. Dez 2017, 12:39 [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?
Zuletzt geändert von MacWomble am 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
 
Beiträge: 389
Registriert: 17. Apr 2008, 00:59
Wohnort: Freiburg
OS, Lazarus, FPC: Mint 18.3 Cinnamon / CodeTyphon Generation V Plan 6.00 (FPC 3.1.1) | 
CPU-Target: 32/64 Nit
Nach oben

Beitragvon MacWomble » 4. Dez 2017, 08:25 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.
MacWomble
 
Beiträge: 389
Registriert: 17. Apr 2008, 00:59
Wohnort: Freiburg
OS, Lazarus, FPC: Mint 18.3 Cinnamon / CodeTyphon Generation V Plan 6.00 (FPC 3.1.1) | 
CPU-Target: 32/64 Nit
Nach oben

Beitragvon Michl » 4. Dez 2017, 08:54 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; 
Michl
 
Beiträge: 2191
Registriert: 19. Jun 2012, 11:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

Beitragvon MacWomble » 4. Dez 2017, 10:25 Re: Lazreport mehrspaltig

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.
MacWomble
 
Beiträge: 389
Registriert: 17. Apr 2008, 00:59
Wohnort: Freiburg
OS, Lazarus, FPC: Mint 18.3 Cinnamon / CodeTyphon Generation V Plan 6.00 (FPC 3.1.1) | 
CPU-Target: 32/64 Nit
Nach oben

Beitragvon Michl » 4. Dez 2017, 14:42 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 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:
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Code: Alles auswählen
type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 
Michl
 
Beiträge: 2191
Registriert: 19. Jun 2012, 11:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

Beitragvon MacWomble » 4. Dez 2017, 15:10 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. :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.
MacWomble
 
Beiträge: 389
Registriert: 17. Apr 2008, 00:59
Wohnort: Freiburg
OS, Lazarus, FPC: Mint 18.3 Cinnamon / CodeTyphon Generation V Plan 6.00 (FPC 3.1.1) | 
CPU-Target: 32/64 Nit
Nach oben

Beitragvon Michl » 4. Dez 2017, 16:45 Re: Lazreport mehrspaltig

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).
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Code: Alles auswählen
type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 
Michl
 
Beiträge: 2191
Registriert: 19. Jun 2012, 11:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

Beitragvon MacWomble » 4. Dez 2017, 19:57 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.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
MacWomble
 
Beiträge: 389
Registriert: 17. Apr 2008, 00:59
Wohnort: Freiburg
OS, Lazarus, FPC: Mint 18.3 Cinnamon / CodeTyphon Generation V Plan 6.00 (FPC 3.1.1) | 
CPU-Target: 32/64 Nit
Nach oben

Beitragvon Michl » 4. Dez 2017, 20:56 Re: Lazreport mehrspaltig

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: 2191
Registriert: 19. Jun 2012, 11:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

Beitragvon Michl » 4. Dez 2017, 21:11 Re: Lazreport mehrspaltig

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; 
Michl
 
Beiträge: 2191
Registriert: 19. Jun 2012, 11:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

Beitragvon MacWomble » 5. Dez 2017, 09:58 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)
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.
MacWomble
 
Beiträge: 389
Registriert: 17. Apr 2008, 00:59
Wohnort: Freiburg
OS, Lazarus, FPC: Mint 18.3 Cinnamon / CodeTyphon Generation V Plan 6.00 (FPC 3.1.1) | 
CPU-Target: 32/64 Nit
Nach oben

Beitragvon Michl » 5. Dez 2017, 10:35 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?!
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Code: Alles auswählen
type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 
Michl
 
Beiträge: 2191
Registriert: 19. Jun 2012, 11:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

Beitragvon MacWomble » 5. Dez 2017, 22:16 Re: Lazreport mehrspaltig

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.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
MacWomble
 
Beiträge: 389
Registriert: 17. Apr 2008, 00:59
Wohnort: Freiburg
OS, Lazarus, FPC: Mint 18.3 Cinnamon / CodeTyphon Generation V Plan 6.00 (FPC 3.1.1) | 
CPU-Target: 32/64 Nit
Nach oben

Beitragvon Michl » 5. Dez 2017, 23:01 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.
Code: Alles auswählen
type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 
Michl
 
Beiträge: 2191
Registriert: 19. Jun 2012, 11:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

Beitragvon MacWomble » 5. Dez 2017, 23:16 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.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
MacWomble
 
Beiträge: 389
Registriert: 17. Apr 2008, 00:59
Wohnort: Freiburg
OS, Lazarus, FPC: Mint 18.3 Cinnamon / CodeTyphon Generation V Plan 6.00 (FPC 3.1.1) | 
CPU-Target: 32/64 Nit
Nach oben

» Weitere Beiträge siehe nächste Seite »
Nächste

Zurück zu Komponenten und Packages



Wer ist online?

Mitglieder in diesem Forum: MmVisual und 2 Gäste

porpoises-institution
accuracy-worried