8. März 2016 13:41
Hallo,
ich habe eine Verständnisfrage zur Try-Function.
https://msdn.microsoft.com/en-us/library/dn951443%28v=nav.90%29.aspx- Code:
[TryFunction]
PROCEDURE TryPostingSomething@1();
BEGIN
CODEUNIT.RUN(CODEUNIT::"Purch.-Post");
END;
PROCEDURE CallTryPostingDotNet @2();
VAR
MyPostingCodeunit@1 : Codeunit 90;
MyDotNetExceptionHandler@2 : Codeunit 1291;
IndexOutOfRangeException@3 : DotNet 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.IndexOutOfRangeException'
BEGIN
IF TryPostingSomething THEN
MESSAGE('Posting succeeded.')
ELSE BEGIN
MyDotNetExceptionHandler.Collect;
IF MyDotNetExceptionHandler.TryCastToType(IndexOutOfRangeException) THEN
MESSAGE('The index used to find the value was not valid.')
ELSE
MyDotNetExceptionHandler.Rethrow;
END;
END;
Ausgehend vom o.g. Beispielcode, wenn jetzt in der Buchungsroutine eine Exception auftritt, z.B. weil bei einem Artikel keine Charge zugewiesen wurde, habe ich beobachtet, dass er dann alle Daten in die Datenbank schreibt und commited (unabhängig davon ob Commits im Programmcode vorhanden sind) die bis zum auftreten des Fehlers bearbeitet wurden. Es kann also passieren, dass er den Gebuchten Wareneingang mit 5 von 10 Zeilen anlegt, er schreibt auch die Artikelposten und bei Artikel 5 unterbricht er mit einer Fehlermeldung. Hat bei diesen schon die Artikelposten geschrieben, jedoch noch keine Lagerplatzposten.
Diesbezüglich habe ich hier im Forum auch schon einen Hinweis von Kowa gelesen, aber kann es wirklich so sein? Diese Funktion wäre ja dann absolut Gefährlich, gerade das von MS aufgeführte Beispiel führt zu fatalen Fehlern.
http://www.msdynamics.de/viewtopic.php?f=68&t=29056#p114896