Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Werkzeuge (https://www.delphipraxis.net/63-sonstige-werkzeuge/)
-   -   Fast Report PrepareRaport (https://www.delphipraxis.net/197599-fast-report-prepareraport.html)

michael.cohrs 21. Aug 2018 11:43

Fast Report PrepareRaport
 
Guten Tag zusammen,

ich habe erstellten Report zur Optimierung bekommen und folgendes Problem:

Das Auslesen der Daten aus der Datenbank geht erwartungsgemäß schnell, bei 3 gelesenen Reports
a 6 Seiten wird durch Aufruf von PrepareReport jedoch eine Zeit für die Voransicht von ca. 2,5 Minuten
benötigt. In der Realität werden jedoch nicht nur 3 Reports a 6 Seiten sondern um die 100 Reports
benötigt, für die Darstellung würden ca. 2 - 3 Stunden benötigt. Warum ist PrepareReport so langsam
und kennt jemand eine Lösung für dieses Problem?

Vielen Dank

Michael Cohrs

Steku 21. Aug 2018 12:08

AW: Fast Report PrepareRaport
 
Hi,

mal so auf die Schnelle aus dem FR Forum:

frxReport1.EngineOptions.MaxMemSize:=200;
frxReport1.EngineOptions.UseFileCache:=True;

Vielleicht hilft es ja schon.

Welche IDE bzw. FR Version setzt du ein?

Grüße
Steku

Frickler 21. Aug 2018 12:37

AW: Fast Report PrepareRaport
 
1- oder 2-Pass Reports? (2-Pass braucht man z.B., um die Gesamtsumme schon auf der ersten Seite anzeigen zu können oder auch die Gruppensummen im Gruppenkopf) Komplexe Berechnungen in der Scriptsprache, die ebenfalls die DataSets mehrfach durchgraben? Da nutzt auch ein schneller Einmalzugriff nix, vor allem wenn die Queries x-fache JOINs darstellen, womöglich auf etliche Views usw.

Wir haben diese Probleme umschifft, indem wir alle Reports auf temporäre Tabellen (detached ClientDataSets) zugreifen lassen und nie direkt auf die Queries.

michael.cohrs 22. Aug 2018 06:24

AW: Fast Report PrepareRaport
 
Guten Morgen Steku, guten Morgen Frickler,

erst einmal vielen Dank für eure Antworten!!

@ Steku: die Einstellungen habe ich bereits vorgenommen, haben aber leider keinen Erfolg gebracht :(
Wir setzen Delphi Seattle ein und nutze den dort enthaltenen Fastreport, die Version habe ich
leider nicht im Kopf, bin heut nicht in der Firma.

@ Frickler: Es sind 2-Pass Reports. Dein Ansatz / Lösung kling vielversprechend, hast Du vielleicht ein
Beispiel für mich an dem ich mich Orientieren kann, ich habe bisher keine Erfahrung damit.

Lemmy 22. Aug 2018 07:01

AW: Fast Report PrepareRaport
 
Servus,

Zitat:

Zitat von michael.cohrs (Beitrag 1411195)
bei 3 gelesenen Reports
a 6 Seiten wird durch Aufruf von PrepareReport jedoch eine Zeit für die Voransicht von ca. 2,5 Minuten
benötigt.

nur um sicher zu gehen: Die 3 Reports werden unabhängig voneinander angezeigt? Oder werden die 3 Reports zu einem Report zusammengebaut?

Macht ihr irgend welche Berechnungen innerhalb der Reports? Werden Events vom Report gefeuert und durch die Anwendung abgearbeitet?

Grüße

michael.cohrs 22. Aug 2018 07:34

AW: Fast Report PrepareRaport
 
Guten Morgen Lemmy,

die Reports werden zusammengebaut zu einem, innerhalb der Reports werden noch SQL Statements ausgeführt,
Die SQL`s außerhalb der Reports sind für die Komplexibilität verhältnismäßig schnell, es hackt / hängt nur
an der Fastreportroutine PrepareReport, soviel habe ich herausfinden können.

Viele Grüße

Michael

Lemmy 22. Aug 2018 07:41

AW: Fast Report PrepareRaport
 
Und iwe baust Du die zusammen? Setzt du die PreparedReports zusammen oder packst Du einfach
ReportA
PrepareREport
+ReportB
PrepeareReport
+ReportC
PrepareReport

Die Teile zusammen? Da ist es dann klar, dass Prepare verdammt lange dauert, da bei jedem Prepare ALLE Reports neu aufgebaut werden.

Wenn Du unterschiedliche Reports zusammen bauen willst, dann musst Du so vorgehen:

2 frxReport Komponenten:
frx1: zum Prepare
frx2: zum halten der vorbereiteten Reports

frx1.LoadFromFile(<>);
frx1.PrepareReport(true);
frx2.Pages.AddPrepared(frx1.Page)

das habe ich mit einigen dutzend Reportvorlagen gemacht und Reports mit mehreren hundert Seiten generiert die sich zur Laufzeit aufgrund der Eingabedaten dynamisch zusammen gestellt haben, incl. Inhaltsverzeichnis!
HInweis: Code ist von fr3, sollte aber so, bzw. mit kleinen Abweichungen auch noch unter fr4 und neuer laufen.

Edit:
da ist er:

https://www.delphipraxis.net/1328028-post8.html

michael.cohrs 22. Aug 2018 07:48

AW: Fast Report PrepareRaport
 
Danke Lemmy,

in der Tat werden die Teile einfach zusammen gepackt, das habe ich so übernommen
und soll es optimieren (verständlicher weise)

sag hast Du hierfür ein exemplarischen Codesnipsel an dem ich mich orientieren kann,
das wäre sehr nett und würde mich echt weiterhelfen....

Viele Grüße

Michael

michael.cohrs 22. Aug 2018 07:49

AW: Fast Report PrepareRaport
 
Ach übrigens, die erstellen Reports können nicht
als File gespeichert werden deshalb geht hier Loadfromfile nicht...

michael.cohrs 22. Aug 2018 08:09

AW: Fast Report PrepareRaport
 
Danke für das Beispiel, ich werde es Morgen gleich ausprobieren, wäre ja cool wenn das so läuft!!!

Lemmy 23. Aug 2018 08:13

AW: Fast Report PrepareRaport
 
@Michael: Wenn Du ne PN schreibst und ne Antwort willst, dann solltest Du die Beschränkung abschalten, dass man dir keine PN schreiben darf :-)

michael.cohrs 23. Aug 2018 08:27

AW: Fast Report PrepareRaport
 
Oh Sorry, hab ich glatt übersehen das Häckchen jedoch ist das Problem noch vorhanden leider,
kennst Du eine Alternative zu Pages.AddPrepared ?

Lemmy 23. Aug 2018 08:35

AW: Fast Report PrepareRaport
 
Ich habe es selbst noch nicht in den aktuellen FR versucht, aber in FR4++ sollte das funktionieren:

Delphi-Quellcode:
frxReport1.PreviewPages.AddFrom(frxReport2);

michael.cohrs 24. Aug 2018 07:12

AW: Fast Report PrepareRaport
 
Guten Morgen Lemmy,

ich hab es versucht und es klappt auch, jedoch ist das nicht die Lösung für mein Problem
denn die Fastreport Routine PrepareReport ist so quälend langsam, alles andere läuft recht flott.
Ist es möglich einen oder mehrere Reports ohne Prepare darzustellen? Ich denke da an Memorystream oder ähnliches

Frickler 31. Aug 2018 16:31

AW: Fast Report PrepareRaport
 
Zitat:

Zitat von michael.cohrs (Beitrag 1411269)
Guten Morgen Steku, guten Morgen Frickler,

@ Frickler: Es sind 2-Pass Reports. Dein Ansatz / Lösung kling vielversprechend, hast Du vielleicht ein
Beispiel für mich an dem ich mich Orientieren kann, ich habe bisher keine Erfahrung damit.

Hier mal kurz skizziert, wie das funktioniert (mit UniDAC):

Delphi-Quellcode:
var
  TempProvider: TDataSetProvider;
  TempQuery  : TUniQuery;
...
TempProvider := TDataSetProvider.Create(nil);
TempQuery := TUniQuery.Create(nil);
try
  try
    TempQuery.Connection := ...
    TempQuery.UnPrepare;
    TempQuery.SQL.Text := 'SELECT bla FROM blubb WHERE faselrhabarber = :F';
    TempQuery.Params := ...
    TempQuery.Prepare;
    TempQuery.Active := true;
    TempProvider.Options := [poIncFieldProps];
    TempProvider.DataSet := TempQuery;
    cds.IndexName := '';
    cds.Data := TempProvider.Data;
  except
    on E: Exception do
      ...(Fehler melden)...
  end
finally
  TempQuery.Free;
  TempProvider.Free;
end;
Hinweis: "cds" ist eine auf dem Datenmodul liegende TClientDataSet-Komponente. Diese dient dann als Datenquelle für den Report. "sqltxt" ist die Anweisung für den Report.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:05 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