FPReport csv

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

FPReport csv

Beitrag von MacWomble »

Ich habe einen Report mit dem FPReport-Designer erstellt, welcher Daten aus einer csv ausgibt. Funktioniert einwandfrei.

Leider bekomme ich es nicht hin, dass mein Programm den Report lädt, ausführt und als pdf speichert. Hier werden die csv-Daten nicht gelesen, obwohl dies im Report definiert ist.

Ich dachte ich bräuchte nur
FPJSONReport1.LoadFromFile(dlgOpenEtikett.FileName);
FPJSONReport1.RunReport;
aber das ist wohl ein Trugschluss...

ich habe testweise
FPJSONReport1.LoadFromFile(dlgOpenEtikett.FileName);
FPReportDesigner1.Execute;
ausgeführt, der Report ist auch da, die im Report gespeicherte Datenquelle jedoch nicht.

Alternativ habe ich eine Objektliste 'Selected' aus den Zeilen der csv.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6208
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: FPReport csv

Beitrag von af0815 »

Nur mal so eine Frage. Wenn du fpreport designer schliesst und wieder öffnest und dann den Report lädst, sind dann die Daten da?
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
gladio
Beiträge: 217
Registriert: Sa 21. Jun 2014, 06:15
OS, Lazarus, FPC: Win10-64 - aktuelle Lazarus/FPC Standard-Edition
CPU-Target: 64Bit
Wohnort: Rügen

Re: FPReport csv

Beitrag von gladio »

Wenn ich das richtig verstehe, sollder Report angezeigt/geduckt werden und ein PDF-Dokument abgelegt werden?

Ich vermute (habe noch nicht mit fpreport gearbeitet) daß ein entsprechender Filter für die PDF-Ausgabe noch zugeordnet werden muss.

So ähnlich wie bei FortesReport:

Code: Alles auswählen

 //Datei dem Filter zuweisen
fRReport.RLPDFFilter.FileName := FileName;
//Datei speichern
FRReport.RLSaveDialogSetup.Filter := FRReport.RLPDFFilter;
FRReport.RLReport.SaveToFile(FileName);

oder LazReport:

Code: Alles auswählen

   //export als PDF
   if frReport1.PrepareReport then
      frReport1.ExportTo(TfrTNPDFExportFilter,
        VerzeichnisPfad'+'Dateiname+'.pdf');
 

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: FPReport csv

Beitrag von MacWomble »

af0815 hat geschrieben:Nur mal so eine Frage. Wenn du fpreport designer schliesst und wieder öffnest und dann den Report lädst, sind dann die Daten da?


Ja, die Daten sind dann da.

@gladio

Das hat erst mal mit pdf nichts zu tun. Wenn ich aus meinem Projekt einfach den Designer aufrufe anstelle von RunReport, dann ist der Report da, aber die Daten eben nicht.
Wenn ich den Designer aus den Beispielen verwende, sind die Daten nach dem Öffnen des Reports bekannt.

PDF ist danach nur für die Ausgabe zuständig. Ein Druck aus dem Designer sieht komplett anders aus, als wenn ich eine PDF-Datei erstelle. Ebenso unterscheidet sich die HTML-Ausgabe und der Preview aus dem Designer. Jede Ausgabe hat eine andere Ansicht, nur PDF kann auch Textattribute darstellen (z.b. fett). Ich kann gut damit leben, zuerst PDF zu erstellen und aus dieses dann zu drucken, ansonsten aber - denke ich - muss hier ist noch sehr viel getan werden.

Ich möchte den fpreport gerne verwenden, da er bisher den besten Designer mitbringt und ansonsten das kann, was ich benötige. Lazreport scheitert da bei manchen Dingen, Fortes ist vom Ansatz nicht ideal.

Da ich Programmintern mit Objektlisten (Daten der DB) arbeite, kann ich auch ohne den Umweg csv darauf zugreifen. Aber auch heir komme ich nicht so gut weiter, da fpreport so gut wie nicht dokumentiert ist. Die csv habe ich auf die Schnelle eingebunden, da ich einen Etikettendruck benötigte (habe glabels aud meinem Programm aufgerufen). Dies ist aber recht langsam hierfür und zu 'umständlich'.

Nochmal zusammengefasst: Im Moment habe ich zwei Berichte, die mit fpReport-<Designer erstellt wurden und CSV-Daten verwenden. Dies Berichte kann ich in den Designer laden, Preview machen und als PDF exportieren - auch nach dem Ändern der CSV oder dem Neustart des Designers.

Ich dachte, da der Report ja die Daten zur CSV enthält, könnte ich den einfach aus meinem Programm laden und (ohne Preview - da ohnehin falsch dargestellt) eine PDF erzeugen lassen.
Jedoch kennt fpReport in diesem Moment die Dateneinstellungen nicht mehr (die werden wohl im Designer anders eingelesen)
Zuletzt geändert von MacWomble am Di 3. Dez 2019, 20:25, insgesamt 1-mal geändert.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6208
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: FPReport csv

Beitrag von af0815 »

Man muss bei fpreport verstehen, das es sich um ein mehrstufiges Verfahren handelt. Report, Daten und Rendering sind getrennt.

Du lädst den Report mit

Code: Alles auswählen

FPJSONReport1.LoadFromFile(dlgOpenEtikett.FileName);

und startest danach den Report durch

Code: Alles auswählen

FPJSONReport1.RunReport;

was dein Code nicht zeigt, das du ja vorher einen Renderer zuweisen musst (in deinem Fall pdf). Mir geht nur ab, die Anbindung an die Datenquelle, die durch das einfache laden des Reportes nicht gebunden wird. Der Designer lädt diese automatisch. Dazu gab es vor langer Zeit eine Diskussion, soweit ich mich erinnere.

Mal sehen
Zuletzt geändert von af0815 am Di 3. Dez 2019, 20:36, insgesamt 2-mal geändert.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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: FPReport csv

Beitrag von MacWomble »

Mit dem Renderer kannst du recht haben, aber so weit komme ich gar nicht. Ansonsten hast du mein Problem richtig erkannt.

Ich denke, dass ich in meinem Fall besser auf die ohnehin schon in meinem Programm verwendeten Objektlisten mit Daten zugreifen sollte, aber auch hier finde ich nicht die richtige Anleitung.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6208
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: FPReport csv

Beitrag von af0815 »

Mir geht bei Dir sowas in der Art ab:

Code: Alles auswählen

 // ***** Providing data to the report, form component *****
    FPJSONReport1.ReportData.AddReportData(FPReportDatasetData1);
    FPReportDatasetData1.DataSet:=dbf1;
 

Hier ist ein Hinweis

Code: Alles auswählen

Data management
By itself the TFPReport component does not have knowledge of datasets. It only knows an abstract data loop.
If you design a report using the report designer, the stand-alone designer writes data definitions to the JSON it creates. However, the report itself ignores this information, and no datasets or other data loops will be created.
In order to load and use the information about data in the report design, you can use a TFPReportDataManager component.
Just point the FPJSONReport instance's DataManager property to the instance of the TFPReportDataManager component, and it will instantiate the necessary datasets, and couple them to the report.
 
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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: FPReport csv

Beitrag von MacWomble »

Anbei mal den Report und eine kleine csv. Wenn der Designer im selben Ordner abgelegt wird, funktioniert dieser (Habe den Pfad gelöscht).
Dateianhänge
Test FPReport.zip
(2.6 KiB) 94-mal heruntergeladen
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: FPReport csv

Beitrag von MacWomble »

Das macht mich zwar nun etwas schlauer. Zwar sind die Datendefinitionen im Report gespeichert, jedoch ignoriert der Report diese - Den Sinn dahinter kann ich jedoch nicht verstehen ...

Code: Alles auswählen

The easy way: Using TFPJSONReport
 
The fpjsonreport unit contains the TFPJSONReport class. It combines the JSON streamer and TFPReport, and makes it easier to load/save The fpjsonreport unit contains a TFPJSONReport descendent which does all the above with some simple methods:
 
TFPJSONReport = class(TFPReport)
  procedure LoadFromStream(const aStream: TStream);
  procedure SaveToStream(const aStream: TStream);
  Procedure LoadFromJSON(aJSON : TJSONObject); virtual;
  Procedure SavetoJSON(aJSON : TJSONObject); virtual;
  Procedure LoadFromFile(const aFileName : String);
  Procedure SaveToFile(const aFileName : String);
  Property DataManager : TFPCustomReportDataManager;
end;
 
It also is able to save the JSON Design in a lazarus .lfm file, so if you want to use a report that stores it's design info in a .lfm file, use a TJSONFPReport in lazarus.
Data management
The TFPReportDataManager class can be used to create and manage data sets based on definitions found in the JSON file created by the standalone designer.
(in fact the standalone designer uses the TFPReportDataManager to manage its data).
When you use TFPJSONReport, you can set its DataManager property to an instance of TFPReportDataManager.
When loading/saving the data, it will use the data manager to add and/ord interpret the extra information in the report JSON to create data sets.
If a data set fails to open for some reason (no connection to the database or other things), the LoadErrors property (of type TStrings) will contain the error messages.
The data manager uses a factory to create the necessary data sets. For this, it requires handlers to be registered in the executable. The following units with data handlers are available:
 
    fpreportdatacsv for CSV support.
    fpreportdatadbf for dbf support.
    fpreportdatajson for JSON data file support.
    fpreportdatasqldb for SQLDB support.
 
You must make sure to include the units for the data formats that you need in your project file. If you fail to do so, you will get errors saying that an unknown data type is used.


... und hier sollte ich die Lösung verbergen :shock:
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6208
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: FPReport csv

Beitrag von af0815 »

Die Zeile hier ist die Lösung, ichhabe aber gerade keinen funktionsfähigen fpreport. Das wird sich erst am WE bei mir lösen lassen.

Code: Alles auswählen

When you use TFPJSONReport, you can set its DataManager property to an instance of TFPReportDataManager

und fpreportdatacsv
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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: FPReport csv

Beitrag von MacWomble »

Da war ich heute vormittags auch dran, habe es aber nicht hin bekommen. Bin noch am studieren der Beispielprogramme.
Ich werde das mit den csv-Dateien wahrscheinlich ohnehin verwerfen und das jeweilige Datenobjekt meiner Datenbankklasse als Datenquelle verwenden.
Bei Etiketten und Adresslisten ist das nicht wirklich relevant, aber es kommen auch noch Master-Detail Reports hinzu. Da funktioniert das mit csv ohnehin nicht gut.

Ich vermute, ich muss dann TFPReportUserData verwenden und die DataLoop aus meinem Programm mit Daten versorgen (ähnlich Lazreport, wobei es dort nicht funktioniert hatte.)

Die gespeicherten FPReport-Dateien dienen wohl in erster Linie dem Layout, so wie du ja auch schon geschrieben hattest. Die Datengeschichte muss dann von der Anwendung selbst geliefert werden (bei csv würde es wahrscheinlich recht einfach gehen, wenn man wüsste wie).

Falls ich eine Lösung finde - ist bei mir auch etwas Zeitabhängig - poste ich diese hier.
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: FPReport csv

Beitrag von MacWomble »

So, ein kleines Stück bin ich weiter.
1. Ich kann die gespeicherte Reportdefinition laden
2. Ich sehe meine Datenfelder im Desiger

Allerdings kann ich die Datenquelle weder für die Seite noch für das Band setzen (im Designer)
Wie ich meine Daten in den Report bekomme, ist mir auch weiterhin nicht klar.

Code: Alles auswählen

 
 
procedure TReports.PrintLabels(S: TSelectedAdresses);
var
  rpt: TFPjsonReport;
  p: TFPReportCustomPage;
  Designer: TFPReportDesigner;
  lReportData: TFPReportUserData;
begin
  PaperManager.RegisterStandardSizes;
  rpt := TFPjsonReport.Create(self);
  rpt.LoadFromFile('/home/klaus/Entwicklung/CTR-BOSS_2019/DATA/Labels/Etiketten.json');
  lReportData := TFPReportUserData.Create(self);
  lReportData.Name:='Adressdaten';
  lReportData.DataFields.AddField('Anrede', rfkString);
  lReportData.DataFields.AddField('Namenszeile1', rfkString);
  lReportData.DataFields.AddField('Namenszeile2', rfkString);
  lReportData.DataFields.AddField('Namenszeile3', rfkString);
  lReportData.DataFields.AddField('Strasse', rfkString);
  lReportData.DataFields.AddField('Ort', rfkString);
  lReportData.DataFields.AddField('Land', rfkString);
  rpt.ReportData.AddReportData(lReportData);
  Designer:= TFPReportDesigner.create(self);
  Designer.Report:=rpt;
  Designer.Execute;
end;
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: FPReport csv

Beitrag von MacWomble »

Da sich hier wohl niemand mit fpreport auskennt, führe ich den Thread im englischen Forum fort:
https://forum.lazarus.freepascal.org/in ... 708.0.html
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6208
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: FPReport csv

Beitrag von af0815 »

Ich habe dir eine Antwort im englischen Forum hinterlassen.

Im Code des Designer kann man nachlesen wie es dort gemacht wird. Ich bin bei 'Open Report' eingestiegen und habe mich dann hinunter gehangelt bis ich die Stelle gefunden habe, wo die Daten in den Designer geladen werden.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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: FPReport csv

Beitrag von MacWomble »

Danke !

Das sieht dort schon recht vielversprechend aus. Ich werde es ausprobieren und mich wieder melden.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Antworten