18. August 2011 17:22
Hallo Leute,
ich habe wieder einmal ein exotisches Problem:
alter Code:
- Code:
SalesLine.RESET;
SalesLine.SETRANGE("Document Type","Document Type");
SalesLine.SETRANGE("Document No.","Document No.");
SalesLine.SETRANGE("Attached to Line No.","Line No.");
SalesLine.DELETEALL(TRUE);
Nun soll in der SalesLine unter gewissen Umständen eine Prüfung im ONDELETE-Trigger
nicht ausgeführt werden. Der Code in der Salesline:
- Code:
OnDelete()
:
IF NOT gboo_allowState THEN BEGIN
TESTFIELD("Quantity Shipped",0);
TESTFIELD("Quantity Invoiced",0);
END;
Nun sollte man meinen, dass dieses Problem einfach zu lösen ist. Die SalesLine verfügt über folgende Methode:
- Code:
SetDeleteAllowed(pboo_allowState : Boolean)
gboo_allowState := pboo_allowState;
Also rufe ich einfach diese Methode im neuen Code auf:
- Code:
SalesLine.RESET;
SalesLine.SETRANGE("Document Type","Document Type");
SalesLine.SETRANGE("Document No.","Document No.");
SalesLine.SETRANGE("Attached to Line No.","Line No.");
SalesLine.SetDeleteAllowed(TRUE); // temporary no check
SalesLine.DELETEALL(TRUE);
SalesLine.SetDeleteAllowed(FALSE); // turn on check
Nun die Preisfrage: Wird das funktionieren wie gewünscht oder nicht?
Leider habe ich die Antwort schon parat: es funktioniert nicht. Im Debugmode kann man sehen, dass die Methode aufgerufen wird und die gboo_allowState gesetzt ist. Im ONDELETE ist sie dann aber wieder initialisiert.
Wenn ich den DELETEALL ausprogrammiere funktioniert es.
Ich kann mir nur vorstellen, dass der DELETEALL intern eine neue Instanz von SalesLine anlegt und auf dieser die DELETE(TRUE) ausführt - und natürlich kennt diese (neue) Instanz die gboo_allowState nicht. Also wiedereinmal: Vorsicht vor DELETEALL...
WoF