Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Werkzeuge (https://www.delphipraxis.net/63-sonstige-werkzeuge/)
-   -   Fastreport: Optimierung (https://www.delphipraxis.net/209388-fastreport-optimierung.html)

haentschman 30. Nov 2021 14:01

Fastreport: Optimierung
 
Hallöle...:wink:

Durch eine Anforderung des Kunden habe ich statt 1x Drucken jetzt 2x Drucken pro Rechnung. 1x Original + 1x mit "Kopie" im Text. :roll:

Das Ganze kostet mich doppelte Zeit, weil der Report nun 2x Prepared + Export nach PDF + Verkleinern ist. Bei einer RE ist das noch verschmerzbar. Aber der Stapeldruck mit ~1000 Rechnungen braucht fast eine Stunde. :cry:

Aktuell Test: 800 Rechnungen(Ordner) mit 2.9GB Anhängen -> ca. 1 Stunde
Delphi-Quellcode:
function ExportPDF(FilePath, FileName: string): Boolean;
begin
  Result := dmReport.frxReport1.Export(dmReport.frxPDFExport1);

  if Result then
  begin
    try
      if not FGhostscript.PDFShrink(FilePath + FileName) then // Fehler über Event
      begin
        Result := False;
      end;
    except
      Result := False;
    end;
  end;
end;
...
if AllowPrint and dmReport.frxReport.PrepareReport(True) then
begin
  FillReportPDF; // Vorgaben PDF
  ExportPDF(Print.PDF.FilePath, Print.PDF.FileName); // Archiv

  Print.IsReceiptCopy := True; // + "Kopie" -> das 2. Mal :-(
  dmReport.FillReportVariable('IsReceiptCopy', Print.IsReceiptCopy); // im Report wird das Feld eingeblendet/ausgeblendet
  if dmReport.frxReport.PrepareReport(True) then
  begin
    FillReportTransus; // Vorgaben Dienstleister
    if ExportPDF(Print.Transus.FilePath, Print.Transus.FileName) then // Transus
    begin
      if Transus.ExportXML(Print.Receipt, Print.Transus.FilePath) then // schreiben XML
      begin
        if Print.Transus.WithAttachments then
        begin
          if CopyAttachments(Print.Transus.FilePath) then // Kopie der Anhänge PDF 2-5 Anhänge 120KB je PDF Seite, Schnitt = 3 Seiten je Anhang
          begin
            WriteMiscToDB(Print.ID); // DB Einträge setzen
            WriteSendToDB(dmReport.frxReport1.ReportOptions.Name, sdtFolder); // DB Einträge setzen
          end;
        end;
      end;

      if Assigned(FOnPrintConfirmation) then
      begin
        FOnPrintConfirmation(Self, ReportType, Print, FFileList); // nur wenn benötigt, in diesem Falle nicht eingehängt
      end;
    end;
  end;
end;
Frage:
1. Wo kann ich noch was rausholen?
2. Alternative?

Der schöne Günther 30. Nov 2021 18:01

AW: Fastreport: Optimierung
 
Miss doch erst mal wo die Zeit hauptsächlich hingeht - Der PDF-Export, das
Delphi-Quellcode:
PrepareReport()
, ...?

Amanda 30. Nov 2021 18:05

AW: Fastreport: Optimierung
 
Ich drucke mit Fastreport in einen Thread. Falls eine Exception
im Thread auftritt wird dieser über einen TimeOut beendet. Der Thread
läuft in einen Windows Dienst.

BerndS 30. Nov 2021 18:06

AW: Fastreport: Optimierung
 
Wäre es denkbar mehrere Threads mit eigenem Datenmodul zu starten, falls sich die anderen Kerne langweilen?

haentschman 1. Dez 2021 05:52

AW: Fastreport: Optimierung
 
Moin...8-)

...Threads. Was ist das? :stupid: Auf das einfachste kommt man nicht. Der einzige Knackpunkt ist, daß der 2. Duchlauf von dem 1. abhänging sein sollte...und die Kopie dann auch. Da schlaf ich mal drüber...

Danke...:wink:

Frickler 1. Dez 2021 11:38

AW: Fastreport: Optimierung
 
Du kannst doch im Report selbst die Anzahl der Kopien einstellen. Und dann gibt es eine eingebaute Reportvariable "CopyName#", die Du im Report-Script folgendermaßen setzt:
Code:
begin
  frxGlobalVariables['CopyName0'] := '';            // copy viewed in the preview
  frxGlobalVariables['CopyName1'] := '';            // 1st printed/exported copy
  frxGlobalVariables['CopyName2'] := 'Kopie 1';     // 2nd printed copy
  frxGlobalVariables['CopyName3'] := 'Kopie 2';     // 3rd printed copy                                
  frxGlobalVariables['CopyName4'] := 'Kopie 3';     // 4th printed copy                                
  frxGlobalVariables['CopyName5'] := 'Kopie 4';     // 5th printed copy                                
  frxGlobalVariables['CopyName6'] := 'Kopie 5';     // 6th printed copy
end.

Uwe Raabe 1. Dez 2021 12:10

AW: Fastreport: Optimierung
 
Ich fürchte das funktioniert hier nicht, da ja sowohl das Original als auch die Kopie als PDF exportiert werden soll.

Man könnte das aber auf einem PDF-Drucker ausdrucken. Womöglich bietet Ghostscript da was, womit man das Shrink gleich mit machen kann.

haentschman 1. Dez 2021 12:59

AW: Fastreport: Optimierung
 
Zitat:

Womöglich bietet Ghostscript da was, womit man das Shrink gleich mit machen kann.
...das Shrink ist ne eigene function mit Ghostcript drin. :zwinker:

PS: Noch zur Erklärung: Die Rechnungen werden nur als PDF elektronisch verschickt. Die erste Rechnung kommt als Original in unser eigenes Archiv, der Kunde bekommt eine XML Rechnung mit der Rechnungskopie als Base64 im Anhang.

Uwe Raabe 1. Dez 2021 13:17

AW: Fastreport: Optimierung
 
Ich würde nochmal auf den eingangs erwähnten Punkt hinweisen:
Zitat:

Zitat von Der schöne Günther (Beitrag 1498452)
Miss doch erst mal wo die Zeit hauptsächlich hingeht - Der PDF-Export, das
Delphi-Quellcode:
PrepareReport()
, ...?


haentschman 2. Dez 2021 06:10

AW: Fastreport: Optimierung
 
Zitat:

Ich würde nochmal auf den eingangs erwähnten Punkt hinweisen
...ist heute im Plan. :wink:


Nachtrag (Werte in Milisekunden):

Zitat:

gleiche Rechnung, gleiche Anhänge

1. Versuch

1. dmReport.frxReport1.PrepareReport(True) 765
FillReportPDF 0
1. ExportPDF 1079
dmReport.FillReportVariable('IsReceiptCopy', Print.IsReceiptCopy) 0
2. dmReport.frxReport1.PrepareReport(True) 421
FillReportTransus; 0
2. ExportPDF 1000
Copy 6063
DB1 47
DB2 1984

2.Versuch

1. dmReport.frxReport1.PrepareReport(True) 843
FillReportPDF 0
1. ExportPDF 1094
dmReport.FillReportVariable('IsReceiptCopy', Print.IsReceiptCopy) 0
2. dmReport.frxReport1.PrepareReport(True) 422
FillReportTransus; 0
2. ExportPDF 953
Copy 6140
DB1 47
DB2 2063
Wow...:shock: Das das Kopieren die meiste Zeit braucht, hatte ich nicht erwartet. (3 PDF Anhänge: hier lokal nach lokal)

DB2: 1 Update auf ein Feld! Alle where Felder im Index...Warum braucht er solange. Verstehe ich nicht. :?
Code:
update Documents set SendTypeUSB = :GES where ReceiptNumber = :PAT
Zitat:

[IDX_ReceiptNumber] vorhanden

Entscheidung:

Das Auflösen des Datamodules (dmReport) mache ich später. Ich werde die Kopien in einen TTask auslagern. Die DB2 schaue ich mir an...

Danke an Alle...:wink:


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:13 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz