FileMgt.BLOBExport Trennung des Streams

10. Februar 2023 12:02

Hallo zusammen,

Ich möchte aus einem Report eine PDF generieren und diese anschließend exportieren.
Unten stehender Code ist zunächst mal eine Machbarkeitsprüfung. Daher rudimentär..

Problem:
Wenn ich für den Export der Rechnung 2 Datensätze markiere und diese in SalesInvHeader übergeben werden, dann:
* durchläuft er zweimal den Repeat mit unterschiedlichen SalesInvHeader-Parameter --> korrekt
* generiert eine PDF und exportiert diese in entspr. lokale Userverzeichnis --> korrekt
ABER:
Im TempBlob stehen sofort immer 2 Rechnungen. Dh er generiert beim ersten Durchlaufen des Repeat eine PDF mit BEIDEN Rechnungen. Beim zweiten Durchlauf schreibt er dann den gleichen Blob nochmal.
Ergebnis: zwei PDF-Dokumente, die inhaltlich identisch sind.

Ich verstehe nicht, warum im TempBlob SOFORT beide PDFs geschrieben sind, obwohl er im Repeat selbst nur einen Datensatz aus SalesInvHeader in der "Hand" hat.
Wo liegt der Fehler?

Code:
SalesInvHeader := Rec;
CurrPage.SETSELECTIONFILTER(SalesInvHeader);
Z :=0;
WITH SalesInvHeader DO BEGIN
  IF FINDSET THEN BEGIN
    REPEAT
      SaveDocumentAsPDFToStream(SalesInvHeader, TempBlob);
      Z:= Z + 1;
    UNTIL SalesInvHeader.NEXT = 0;
  END;
END;

LOCAL SaveDocumentAsPDFToStream(DocumentVariant : Variant;VAR TempBlob : TEMPORARY Record TempBlob)
ReportID := 50176;
DataTypeMgt.GetRecordRef(DocumentVariant, DocumentRef);

TempBlob.Blob.CREATEOUTSTREAM(VarOutStream);
IF REPORT.SAVEAS(ReportID, '', REPORTFORMAT::Pdf, VarOutStream, DocumentRef) THEN
  BEGIN
    FileMgt.BLOBExport(TempBlob,'OST'+ FORMAT(Z) + '.pdf',FALSE);
  END
ELSE BEGIN
   ERROR(TxtCouldNotSaveReport, ReportID);
END;



Vielen Dank!

Re: FileMgt.BLOBExport Trennung des Streams

10. Februar 2023 12:09

Hallo,

wenn du in den Filterkriterien nach dem Start des Reports auf zwei oder mehr Belegnummern filterst, wird nur ein Bericht und damit nur eine PDF erzeugt.

Gruß fiddi

Re: FileMgt.BLOBExport Trennung des Streams

10. Februar 2023 12:52

Ursache also SETSELECTIONFILTER
Das dachte ich mir, logisch ist es aber nicht (für mich).
Was muss ich tun, um tatsächlich 2 PDFs erzeugen zu können? Künftig werden das über 100 sein....

Re: FileMgt.BLOBExport Trennung des Streams

10. Februar 2023 13:24

Hallo,

das ist sehr logisch!

Alles was du in den Filterkriterien eines Berichts selektierst, wird auch in einem Bericht ausgedruckt.
Du willst doch auch nicht, dass in einer Artikelliste jeder Artikel einzeln ausgedruckt wird!?

Lösung: Berichtsparameter abfragen, dann eine Vorschaltroutine bauen, die dann für jeden selektierten Beleg den Bericht separat auf den Datensatz gefiltert mit den abgefragten Parametern aufruft.

Gruß fiddi

Re: FileMgt.BLOBExport Trennung des Streams

10. Februar 2023 14:14

erster Ansatz:
jetzt schreibt er zwar meistens eine eigene PDF, ab und an sind die PDFs aber leer.
Jetzt wirds schwierig....

Code:
SalesInvHeader := Rec;
CurrPage.SETSELECTIONFILTER(SalesInvHeader);
Z :=0;
WITH SalesInvHeader DO BEGIN
  IF FINDSET THEN BEGIN
    REPEAT
      SalesInvHeader2 := SalesInvHeader;
      SalesInvHeader2.SETRECFILTER;
      SaveDocumentAsPDFToStream(SalesInvHeader2, TempBlob);
      SLEEP(500);
      Z:= Z + 1;
    UNTIL SalesInvHeader.NEXT = 0;
  END;
END;

Re: FileMgt.BLOBExport Trennung des Streams

10. Februar 2023 14:32

Hallo,

du solltest dir mal die Doku zu SetRecfilter durchlesen, der tut nicht immer was man erwartet.

Vielleicht ist ja auch nicht zu drucken, und der Bericht springt raus.

Gruß Fiddi

Re: FileMgt.BLOBExport Trennung des Streams

14. Februar 2023 10:08

Hallo,
jetzt ohne SetRecfilter.
Um jetzt den Client aus dem Spiel zu nehmen nutze ich "FileMgt.BLOBExportToServerFile"

Ergebnis: beim ersten Export funktioniert alles fehlerfrei. Beim nächsten Export (ich wähle die gleichen Rechnungen erneut aus) erstellt er mir von der Dateigröße her identische PDF-Dokumente, allerdings sind diese alle leer.
Ich denke, der Blob-Inhalt ist irgendwie fehlerhaft. Muss ich den Blob zurücksetzen? Wenn ja, wie?

Code:
CurrPage.SETSELECTIONFILTER(SalesInvHeader);
Z :=0;
WITH SalesInvHeader DO BEGIN
  IF FINDSET THEN BEGIN
    REPEAT
      SalesInvHeader2 := SalesInvHeader;
      SalesInvHeader3.SETFILTER("No.",'%1',SalesInvHeader2."No.");
      IF SalesInvHeader3.FINDFIRST THEN
      SaveDocumentAsPDFToStream(SalesInvHeader3, TempBlob);
      Z:= Z + 1;
    UNTIL SalesInvHeader.NEXT = 0;
  END;
END;

LOCAL SaveDocumentAsPDFToStream(DocumentVariant : Variant;VAR TempBlob : TEMPORARY Record TempBlob)
ReportID := 50176;
DataTypeMgt.GetRecordRef(DocumentVariant, DocumentRef);

TempBlob.Blob.CREATEOUTSTREAM(VarOutStream);
IF REPORT.SAVEAS(ReportID, '', REPORTFORMAT::Pdf, VarOutStream, DocumentRef) THEN
  BEGIN
    FileMgt.BLOBExportToServerFile(TempBlob,'c:\temp\ost'+ FORMAT(Z) + '.pdf');
    Z:= Z + 1;
  END
ELSE BEGIN
   ERROR(TxtCouldNotSaveReport, ReportID);
END;

Re: FileMgt.BLOBExport Trennung des Streams

16. Februar 2023 16:06

Ich hab das jetzt verworfen und über myrep.SAVEASPDF gelöst.
Viel einfacher.

Hilfestellung bei der Lösung: viewtopic.php?f=64&t=25519

Danke für die Unterstützung.

Re: FileMgt.BLOBExport Trennung des Streams

16. Februar 2023 21:49

Warum nicht SAVEASPDF - das wollte ich gestern schon fragen, hab's dann aber offenbar wieder vergessen abzuschicken ;-)