[Erledigt] Blob leeren funktioniert nicht wie gewünscht

27. Dezember 2016 12:01

Hallo,

ich habe ein Problem mit dem Leeren eines Blobfeldes.

Ich möchte einen Datensatz verarbeiten, dieser enthält ein Blobfeld, in welchem z.B. ein PDF Beleg zwischengespeichert wird. Nach erfolgreicher Abarbeitung des Datensatzes (Versand des PDF Belegs) soll das Blobfeld wieder geleert werden. Dazu nutze ich folgenden überschaubaren Code:

Tabelle SendQueue mit dem BlobFeld DocBlob:
Code:
SendQueue.DocBlob.CREATEOUTSTREAM(StreamOut);
StreamOut.WRITETEXT('');
SendQueue.MODIFY;


Diesen Code habe ich einfach mit an das Ende meiner Verarbeitung gesetzt und dort funktioniert er NICHT! Das Blobfeld behält weiterhin den PDF Beleg.
Meine Verarbeitung starte ich über eine Pageaction. Also z.B. über einen Funktionsaufruf:
StarteVerarbeitung(Rec);

Selbst wenn ich das Blob Löschen seperat aufrufe funktioniert es nicht:
StarteVerarbeitung(Rec);
LöscheBlob(Rec);

Ja selbst mit einem COMMIT zwischen beiden Funktionen funktioniert es NICHT!

Es funktioniert nur, wenn ich eine zusätzliche Pageaction für die Löschfunktion erstelle. Also drücke ich dann einen Knopf für die Verarbeitung und einen 2. Knopf für das leeren des Blobfeldes. Das möchte ich so natürlich nicht und frage mich deshalb, wie das denn sein kann?
Zuletzt geändert von Raik Zobel am 27. Dezember 2016 14:57, insgesamt 1-mal geändert.

Re: Blob leeren funktioniert nicht wie gewünscht (NAV Fehler

27. Dezember 2016 12:06

Hat StarteVerarbeitung einen VAR-Parameter (sofern Rec = SendQuee)?
Ist ggf. ein CurrPage.UPDATE notwendig?
Hast du es alternativ mit CLEAR probiert?

Re: Blob leeren funktioniert nicht wie gewünscht (NAV Fehler

27. Dezember 2016 13:59

Natalie hat geschrieben:Hat StarteVerarbeitung einen VAR-Parameter (sofern Rec = SendQuee)?
Ist ggf. ein CurrPage.UPDATE notwendig?
Hast du es alternativ mit CLEAR probiert?


Hallo Natalie,
das ging ja super fix.

Ich möchte meine Struktur darlegen, da diese ein wenig verzweigt ist.
Es handelt sich auch immer um VAR Parameter. Das mit dem CLEAR habe ich ganz am Anfang mal probiert, funktioniert scheinbar nicht. Leider konnte ich kein offizielle Löschanleitung für ein Blobfeld finden; Aber das mit dem StreamOut.WRITETEXT('') funktioniert ja, bloß nicht an gewünschter Stelle.

Die Pageaction startet mit der Funktion:
Codeunit.SendFileFromQueue(VAR SendQueue : Record "DDP Send Queue") : Boolean

Diese Funktion beinhaltet den Aufruf zweier weiterer Funktionen:
LOCAL CreateFile(VAR SendQueue : Record "DDP Send Queue") : Boolean //Hier wird der Beleg erstellt und in das Blobfeld gespeichert.
LOCAL SendFile(VAR SendQueue : Record "DDP Send Queue") : Boolean //Wenn CreateFile ohne Fehler ist, dann wird hier der Beleg versendet und anschließend soll das Blob gelöscht werden.

Die SendFile Funktion schaut folgendermaßen aus:
Code:
COMMIT;
IF CODEUNIT.RUN(66103,SendQueue) THEN BEGIN  //Datei senden
  SendQueue.Status := SendQueue.Status::Erfolgreich;
  SendQueue.ErrorLog := '';
  SendQueue."Sending Date" := CURRENTDATETIME;
  //BLOB LÖSCHEN
  SendQueue.MODIFY;
  EXIT(TRUE);
END ELSE BEGIN
  SendQueue.Status := SendQueue.Status::Fehler;
  SendQueue.ErrorLog := GETLASTERRORTEXT;
  SendQueue.MODIFY;
  EXIT(FALSE);
END;


Nun hatte ich als erstes probiert in dem Bereich "BLOB LÖSCHEN" das Feld zu leeren. Dort geht es nicht. Alle anderen Felder (Status, ErrorLog und "Sending Date" werden ordnungsgemäß geschrieben). Dann habe ich versucht, das Blob direkt nach dem allerersten Funktionasaufruf in der Pageaction zu leeren, ging auch nicht. Nur als separate Pageaction geht es.

Nun habe ich probiert den By Reference Parameter wegzulassen. Damit funktioniert es teilweise. Teilweise, weil dann z.B. das Modifizieren nach Erstellung der Datei nicht mehr geht (Datensatz muss neu gelesen werden-Fehler). Außerdem benötige ich den Parameter, da es auch möglich sein soll einen Temporären Record der SendQueue Tabelle "druchzuschleifen".

Re: Blob leeren funktioniert nicht wie gewünscht (NAV Fehler

27. Dezember 2016 14:04

vandyke hat geschrieben:Die Pageaction startet mit der Funktion:
Codeunit.SendFileFromQueue(VAR SendQueue : Record "DDP Send Queue") : Boolean

Und diese Funktion rufst du mit Rec als SendQueue auf? Oder ist SendQueue nicht die SourceTable der Page?

Re: Blob leeren funktioniert nicht wie gewünscht (NAV Fehler

27. Dezember 2016 14:05

Hallo

und wenn du versuchst dem Blob eine leere Blob-Variable zuzuweisen

Code:
SendQueue.DocBlob := TempBlob.Blob

Re: Blob leeren funktioniert nicht wie gewünscht (NAV Fehler

27. Dezember 2016 14:56

Natalie hat geschrieben:Und diese Funktion rufst du mit Rec als SendQueue auf? Oder ist SendQueue nicht die SourceTable der Page?

SendQueue ist die SourceTable. Also ja, Rec = SendQueue.

pjung hat geschrieben:
Code:
SendQueue.DocBlob := TempBlob.Blob

Das ist die Lösung - es funktioniert!
Ich danke euch beiden!

Warum meine ursprüngliche Variante allerdings nicht funktionieren will, bzw. nur funktioniert wenn man das Leeren-per-Stream über eine extra Pageaction macht, kann ich mir absolut nicht erklären.
Na ja, so lange es einen zweiten Weg gibt.