[Gelöst] Report SAVEASPDF Performance

3. Dezember 2014 17:13

Hallo Community,
Ich versuche mich im Moment mit der Funktion SAVEASPDF eines Reports. Nicht wirklich kompliziert und funktioniert auch sei weit. Die Prozedur braucht für 15 Rechnungen ca. 30 Sekunden. Das Manko weswegen ich hier bin ist: der Speicherverbrauch ist enorm. Im Schnitt allokiert der NAV Server 13MB Ram für ein (!) PDF. Der allokierte Arbeitsspeicher wird leider nicht nach Erzeugung wieder freigegeben.
Versuche ich nun 600 Rechnungen zu "drucken" frisst sich der Speicher voll und die Maschine auf der der NAV Server läuft geht so langsam in die Knie.

Hat jemand eine Idee was ich aus Performance sicht machen könnte?
Meine Idee wäre einen Aufgabenwarteschlangenposten einzurichten der alle 5-10 Minuten eine feste Anzahl an PDFS erzeugt und dann ein paar Minuten pausiert um nicht alle PDFs auf einmal zu erzeugen sondern "schwungweise".

Was meint ihr?
Zuletzt geändert von ThomasM am 4. Dezember 2014 15:12, insgesamt 1-mal geändert.

Re: Report SAVEASPDF Performance

3. Dezember 2014 22:48

Was die Freigabe des Speichers angeht:
wird der Report pro Rechnung gestartet? Denn ansonsten (beim Start für einen Stapel an Rechnungen als Gesamt-PDF) ist das alt bekannte Problem, dass das gesamte DataSet des Ausdrucks zunächst im Cache gebildet wird und erst dann, wenn das DataSet komplett ist, beginnt NAV zu drucken. Lösung dann: den Report pro Rechnung starten. Und falls der Report per Variable ausgeführt wird (also nicht Report.SAVEASPDF(206,'Dateiname',"Sales Invoice Header") dann hilft evtl. ein CLEAR(reportVariable) vor dem jeweiligen Start und nach dem jeweiligen Druck, also etwa:
Code:
CLEAR(reportVariable);
salesInvHeader.GET('123456');
salesInvHeader.SETRECFILTER;
reportVariable.SETTABLEVIEW(salesInvHeader);
reportVariable.SAVEASPDF('Dateiname');
CLEAR(reportVariable);

Re: Report SAVEASPDF Performance

4. Dezember 2014 14:24

Jupiter hat geschrieben:Was die Freigabe des Speichers angeht:
wird der Report pro Rechnung gestartet? Denn ansonsten (beim Start für einen Stapel an Rechnungen als Gesamt-PDF) ist das alt bekannte Problem, dass das gesamte DataSet des Ausdrucks zunächst im Cache gebildet wird und erst dann, wenn das DataSet komplett ist, beginnt NAV zu drucken. Lösung dann: den Report pro Rechnung starten. Und falls der Report per Variable ausgeführt wird (also nicht Report.SAVEASPDF(206,'Dateiname',"Sales Invoice Header") dann hilft evtl. ein CLEAR(reportVariable) vor dem jeweiligen Start und nach dem jeweiligen Druck, also etwa:
Code:
CLEAR(reportVariable);
salesInvHeader.GET('123456');
salesInvHeader.SETRECFILTER;
reportVariable.SETTABLEVIEW(salesInvHeader);
reportVariable.SAVEASPDF('Dateiname');
CLEAR(reportVariable);


Danke für die Info. Ich rufe den Report aktuell aus einer REPEAT ... UNTIL Schleife wie folgt auf:
Code:
REPORT.SAVEASPDF(50002,'Name',SalesInvoiceHeader_LT)

Über die Problematik der großen Datasets habe ich auch ein Paar Artikel gelesen.
http://blogs.msdn.com/b/nav/archive/201 ... eview.aspx
http://blogs.msdn.com/b/nav/archive/201 ... s-nav.aspx

Ich werde deinen Ansatz mal probieren, es klingt relativ logisch, mit dem CLEAR Befehl der Speicherverwaltung Beine zu machen. Mal gucken obs klappt.

Dank dir erstmal!

Re: Report SAVEASPDF Performance

4. Dezember 2014 15:12

Jupiter hat geschrieben:
Code:
CLEAR(reportVariable);
salesInvHeader.GET('123456');
salesInvHeader.SETRECFILTER;
reportVariable.SETTABLEVIEW(salesInvHeader);
reportVariable.SAVEASPDF('Dateiname');
CLEAR(reportVariable);


Ich habe diesen Ansatz jetzt ausprobiert und nochmal mit meinem Aufruf verglichen - ich weiß nicht weshalb aber der Speicherverbrauch ist ziemlich identisch, mit der Ausnahme, dass die oben genannten Variante den Speicher auch während der Abarbeitung wieder freigibt im Gegensatz wenn man den statischen Aufruf via REPORT.SAVEASPDF benutzt.

Danke für dein Feedback. Ich denke, das wars soweit!