[gelöst] ERROR ignorieren und im Code fortfahren

24. Juni 2019 17:32

Ich habe folgende Anforderung auf dem Tisch und finde keinen Ansatz :-(

Kunde will seine Artikelvarianten bereinigen.
Einige Artikelvarianten werden nicht (mehr) verwendet und sollen gelöscht werden.
- Wenn er nun alle Artikelvarianten markiert und löscht, so bricht der Löschvorgang immer dann ab, wenn er auf eine noch verwendete Artikelvariante trifft. Aufgrund des ERROR im OnDeleteTrigger.
=> Gewünscht ist eine Lösung, bei der die nicht löschbaren Artikelvarianten bestehen bleiben, die anderen Artikelvarianten aber "in einem Rutsch" gelöscht werden.
Zuletzt geändert von raggy am 25. Juni 2019 18:30, insgesamt 1-mal geändert.

Re: ERROR ignorieren und im Code fortfahren

24. Juni 2019 18:48

Denke ich zu einfach wenn ich da einfach eine Codeunit oder Page Action im Sinne von "IF NOT DELETE THEN" ausprobieren würde?

Re: ERROR ignorieren und im Code fortfahren

25. Juni 2019 08:24

enh hat geschrieben:... "IF NOT DELETE THEN"

Ich würde einen Report schreiben, welcher die Bereinigung übernimmt. Und dann einfach mittels des

Code:
IF NOT ItemVariant.DELETE(TRUE) THEN

draufschlagen. Wichtig ist es tatsächlich den Trigger zu durchlaufen.

Re: ERROR ignorieren und im Code fortfahren

25. Juni 2019 08:51

Das habe ich ja auch schon probiert.
- Beim ersten nicht löschbaren Satz kommt die Meldung und der Report beendet sich. Und es ist kein einziger Satz gelöscht.
- Wenn ich nach dem DELETE einen COMMIT einfüge, dann löscht es zumindest alles bis zum ersten nicht löschbaren Satz. Aber das ist der gleiche Effekt wie beim manuelle Löschen.
Mit dem ERROR aus dem OnDelete-Trigger ist also immer Ende.

Ich hatte gehofft, dass es irgendeinen Trick gibt, das zu umgehen ...

Re: ERROR ignorieren und im Code fortfahren

25. Juni 2019 09:20

1. Programmcode mit dem DELETE in eine Codeunit auslagern.
2. In der Schleife, in welcher die Datensätze mit der Artikelvariante durchlaufen werden (bzw. im OnAfterGetRecord des Reports, welcher die Artikelvarianten löschen soll), diese Codeunit mit dem Datensatz der jeweiligen Artikelvariante aufrufen. Möchte man wissen warum die oder die Variante nicht gelöscht werden konnte, dann den Fehlertext irgendwo wegprotokollieren:
Code:
COMMIT;
IF NOT MeineCodeunit.RUN(aktuelleArtikelVariante) THEN BEGIN
  meinFehlertext := COPYSTR(GETLASTERRORTEXT,1,MAXSTRLEN(meinFehlertext ));
  // Protokoll mit dem Fehlertext irgendwo speichern....
  // ...
END;

Re: ERROR ignorieren und im Code fortfahren

25. Juni 2019 18:30

JA das ist die Lösung.
Ich hatte sowas im Kopf, hatte es bei den ersten Tests aber wohl nicht ganz richtig umgesetzt !!!

1000 Dank !!!