[gelöst] Event soll nicht generell ausgeführt werden

13. Mai 2019 13:46

Hallo,

ich bin zum Thema "Event", "Subscriber", etc. noch ziemlich ahnungslos ...

Nun habe ich eine Anpassungsanfrage vorliegen, dass ein programmierter Event nicht generell ausgeführt werden soll.

In einer Subscriber-Coderunit ist folgendes programmiert:
Code:
LOCAL [EventSubscriber] TableSalesHeader_OnBeforeDeleteEvent(VAR Rec : Record "Sales Header";RunTrigger : Boolean)
IF Rec.ISTEMPORARY THEN
  EXIT;
productionOrderL.RESET;
productionOrderL.SETRANGE("Sales Order No.",Rec."No.");
productionOrderL.SETFILTER(Status,'%1..%2',productionOrderL.Status::Planned,productionOrderL.Status::Released);
IF NOT productionOrderL.ISEMPTY THEN
  IF CONFIRM(ExistingFAConfrm,FALSE) THEN BEGIN
    productionOrderL.DELETEALL(TRUE);
  END ELSE
    ERROR(CanceledErr);

Damit soll das Löschen des Sales Header verhindert werden, wenn es noch Fertigungsaufträge dazu gibt - es sei denn, man lässt hier die Fertigungsaufträge löschen.

Nun greift der Event ja IMMER beim DELETE, was aber störend ist ...
Wird z.B. in der Codeunit 80 der Sales Header gelöscht (weil der nach dem Fakturieren abgeschlossen ist), so soll dieser Code nicht durchlaufen werden.

Wie bekomme ich denn das gesteuert ?
Zuletzt geändert von raggy am 17. Mai 2019 09:27, insgesamt 2-mal geändert.

Re: Event soll nicht generell ausgeführt werden

13. Mai 2019 14:16

Ohne mich jetzt weiter damit beschäftigt zu haben -> in meiner 2016er DB gibt es OnBeforePostSalesDoc(Rec) (CU 80) als Publisher.
Den kannst du Subscriben, und in deiner CU ein Flag setzen, sodass du weißt, dass aus der Buchungsroutine gelöscht wird - > dann springst du aus deinem Event raus (wie du schon bei IsTemporary gemacht hast) -> vorher dein Flag natürlich noch auf Standard zurücksetzen.
Deine Subscriber CU sollte (bzw. muss) SingleInstance sein.
...nur so ein fixer Gedankengang
Zuletzt geändert von sweikelt am 13. Mai 2019 14:40, insgesamt 1-mal geändert.

Re: Event soll nicht generell ausgeführt werden

13. Mai 2019 14:24

Hallo raggy,

dein Quelltext ist leichter zu lesen und zu verstehen, wenn du ihn zwischen so genannte Code-Tags setzt. Insbesondere deine Formatierungen werden so auch beibehalten.

Daher bitten wir dich, vor und nach deinem Quelltext diese Code-Tags einzufügen. Beispiel:


[code]Dein Quelltext[/code]

Gruß, Kowa
MSDynamics.de-Team

Re: Event soll nicht generell ausgeführt werden

13. Mai 2019 14:27

Vielleicht reicht es dir Rec.Ship und Rec.Invoice abzufragen.

Ansonsten gibt es noch die Möglichkeit eine SingleInstance Codeunit zu nutzen. Du könntest im OnAfterPostSalesDocEvent mittels dieser Codeunit eine Variable auf TRUE setzen. Z.B. Boolean=DoNotDeleteSalesHeader. Im OnBeforeDeleteEvent fragst du die Variable ab und setzt sie auch wieder auf FALSE.

Edit: Da war sweikelt schneller.

Re: Event soll nicht generell ausgeführt werden

13. Mai 2019 14:57

Hallo,

Im Normalfall werden die Deletes in CU80 mit RunTrigger=FALSE aufgerufen, aber verlassen würde ich mich darauf nicht wirklich. 8-)

Außerdem würd ich mir den Confirm sparen, wenn der DELETE durch ein Hintergrundprogramm oder API ohne GUI passiert.

Gruß Fiddi

Re: Event soll nicht generell ausgeführt werden

13. Mai 2019 16:56

Hallo Fiddi,

der CONFIRM muss drin bleiben. Der Anwender soll immer eine Info bekommen.

Aber das mit dem RunTrigger war die Lösung ;-)
Code:
LOCAL [EventSubscriber] TableSalesHeader_OnBeforeDeleteEvent(VAR Rec : Record "Sales Header";RunTrigger : Boolean)
IF Rec.ISTEMPORARY OR NOT RunTrigger THEN
  EXIT;
productionOrderL.RESET;
productionOrderL.SETRANGE("Sales Order No.",Rec."No.");
productionOrderL.SETFILTER(Status,'%1..%2',productionOrderL.Status::Planned,productionOrderL.Status::Released);  //MC.N 13.05.19 RSC
IF NOT productionOrderL.ISEMPTY THEN
  IF CONFIRM(ExistingFAConfrm,FALSE) THEN BEGIN
    productionOrderL.DELETEALL(TRUE);
  END ELSE
    ERROR(CanceledErr);

So funktioniert es jetzt.
Viiiiiiiiiiiielen Dank !!!!