16. März 2017 13:41
Hallo,
gerade durch die Verwendung von Events kann es schnell passieren, dass man einen ungeschriebenen Record (noch kein modify erfolgt) in einer eigenen Instanz "überschreibt" und daher folgenden Fehler erhält:
mstsc_2017-03-16_10-24-01.png
„Es wurde versucht, eine alte version eines Datensatzes vom Typ Verkaufskopf zu ändern. Der Datensatz muss zunächst erneut aus der Datenbank gelesen werden."Ein einfaches Beispiel dazu:Ich abonniere das OnBeforePostSalesDoc Event um mit dem SalesHeader eine Routine anzustoßen, welche den Beleg anhand von Debitoreinstellungen versendet (Als PDF,XML,... per Mail,Ftp,...).
In stark vereinfachter Form schaut das so aus:
- Code:
LOCAL [EventSubscriber] OnBeforePostSalesDoc(VAR SalesHeader : Record "Sales Header")
SalesHeader.SETRECFILTER;
REPORT.SAVEASPDF(205, FileMngmt.ServerTempFileName('pdf'), SalesHeader);
Der SalesHeader vom Event enthält die ungeschriebenen Informationen "Ship" und/oder "Invoice" (+ ein paar mehr) vom vorausgegangenen Buchungsdialog.
Wenn die PDF erstellt wird, dann wird der "Anzahl gedruckt" Zähler im neu aus der Datenbank geladenen Record hochgesetzt. Demzufolge fehlen auch die bereits gemachten Änderungen. Es kommt zu oben abgebildetem Fehler.
Workaround:Man kann den Fehler ganz leicht umgehen indem man die Recordänderungen am SalesHeader wieder mit der ungeschriebenen Ursprungsversion vom Event überschreibt. Dazu ergänzt man den Code um 3 weitere Zeilen:
- Code:
LOCAL [EventSubscriber] OnBeforePostSalesDoc(VAR SalesHeader : Record "Sales Header")
SalesHeader.SETRECFILTER;
REPORT.SAVEASPDF(205, FileMngmt.ServerTempFileName('pdf'), SalesHeader);
//Die eigenen Änderungen verwerfen
SalesHeader2.GET(SalesHeader."Document Type",SalesHeader."No.");
SalesHeader2.TRANSFERFIELDS(SalesHeader,FALSE);
SalesHeader := SalesHeader2;
Alle durch den Druck gemachten Änderungen (Erhöhung des Druckzählers) sind somit wieder verschwunden. Man müsste selbst dafür sorgen, dass die eigenen Änderungen gespeichert werden. In diesem Fall also mit einer letzten zusätzlichen Zeile:
- Code:
SalesHeader."No. Printed" += 1;
Meine Frage wäre nun, ob man das so machen kann bzw. darf oder ob dann doch eine andere Lösung sinnvoller wäre?
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.