Try-Function NAV2016

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

Re: Try-Function NAV2016

8. März 2016 14:39

Das Inkonsistenzen beim Abbruch von Schreibtransaktionen passieren steht schon oben im MSDN-Artikel, leider nicht im Fettdruck und nicht deutlich genug:
Changes to the database that are made with a try function are not rolled back.


Die weiteren Posts von Vjeko hatten wir im anderen Thema schon verlinkt:
http://vjeko.com/tryfunction-lessons-learned-from-preview-posting
http://vjeko.com/fixing-preview-posting-part-1
http://vjeko.com/fixing-preview-posting-part-2
In CU 4 gibt es wichtige Codefixes zur Buchungsvorschau. Darunter sollte diese Funktion nicht eingesetzt werden.

Sinnvolle Einsatzgebiete sind hier beschrieben:
TryFunction - .NET Exception Handling in C/AL

Re: Try-Function NAV2016

8. März 2016 14:41

Okay, ist schon heftig.
Den Satz habe ich schon gelesen, aber anders interpretiert. Ich dachte, die Daten welche bis dorthin geschrieben und commited wurden, sind davon betroffen. Aber nicht, dass er wirklich einen Commit durchführt bei Abbruch der Funktion. Naja gut zu wissen... hab mich wohl vom Codebeispiel in die Irre führen lassen.