12. August 2011 14:26
Hi Sven,
die Problem ist, dass du innerhalb einer Transaktion (ttsbegin....ttscommit) den try-catch-Block verwendest.
Dynamics AX verwendet beim Einfügen, Ändern oder Löschen von Datensätzen aus Masken automatisch eine Transaktion um diese Operation.
Das kannst du dir ganz einfach ansehen, wenn du z.B. in der Insert-Methode einer Tabelle folgenden Code schreibst:
- Code:
info(strfmt("TTS Level: %1", appl.ttsLevel()));
Du solltest sehen, das der TTS-Level immer 1 ist. Somit führt Dynamics AX diese Operation in einer Transaktion aus (in der ersten Ebene).
Das Problem hierbei ist, dass Try-Catch-Blöcke nicht innerhalb einer Transaktion verwendet werden können, bzw. bei einer Transaktion immer die äußerste Try-Catch-Block angesprochen wird, welcher ausserhalb der Transaktion liegt. Somit wird dein Try-Catch-Block ignoriert und der Fehler direkt an das Infolog übergeben.
Noch zwei Beispiele hierzu...
Beispiel 1: Funktioniert nicht! - Ausgabe des Infolog ist "My error".
- Code:
ttsBegin;
try
{
throw error("My error");
}
catch
{
info("Caught my error");
}
ttsCommit;
Beispiel 2: Funktioniert! - Ausgabe des Infolog ist "My error und Caught my error".
- Code:
try
{
ttsBegin;
throw error("My error");
ttsCommit;
}
catch
{
info("Caught my error");
}
Damit das ganze nun funktioniert, musst du den Code so "einbauen", dass dieser den äußersten Try-Catch-Block bildet (Beispiel 2) und die Transaction innerhalb des Try-Blocks ausgeführt wird.
Problem hierbei ist aber, dass du somit auch in jeder Maske in der die Tabelle als Datenquelle verwendet wird, die Tabellenoperationen "von Hand" ausführen musst um die automatische Transaktion weg zu bekommen. Das ist mehr als nur nicht schön ist.
Deswegen würde ich vorschlagen einen Weg zu suchen, bei dem dein Code nicht auf Ebene einer Tabellenmethode aufgerufen wird.