Beleggenehmigung - Variable NavVariant nicht initialisiert

20. November 2020 10:26

Moin zusammen,

im Zusammenhang mit dem Problem "Beleggenehmigung - Der Typ wird nicht unterstützt" erhalten unsere Anwender in letzter Zeit immer häufiger die Fehlermeldung "Variable Microsoft.Dynamics.Nav.Runtime.NavVariant nicht initialisiert."
Screenshot.png


Nach intensiven Recherchen haben wir mit dem Debugger festgestellt, dass in der Tabelle 1522 "Workflow Event Queue" Einträge vorhanden sind, die pro Session-ID mehrfach auf denselben "Record Index" zeigen.
Screenshot3.png


Bei der Abarbeitung dieser Datensätze (in der Funktion "ExecuteQueuedEvents" wird ausschließlich auf die Session-ID gefiltert und mit dem Record Index versucht, einen Record aus einem Variant-Array (in einer SingleInstance-Codeunit vorgehalten) zu ziehen.
Nachdem der Record aus dem Variant-Array geholt wurde, wird das entsprechende Array-Element geleert.
Dies führt dazu, dass bei dem nächsten Zugriff auf denselben Record Index dieses Array-Element leer ist und kein Record in die Variable "Variant" übergeben werden kann.
Bei dem Versuch, aus diesem Variant einen RecordRef zu ziehen, läuft NAV dann auf den oben genannten Fehler.
Screenshot2.png


Vermutlich befinden sich also in dieser Tabelle noch Einträge aus vorherigen Sessions, welche aus irgendeinem Grund nicht sauber abgearbeitet werden konnten (weil der Workflow z. b. durch einen unerwarteten Fehler abgebrochen war oder der Client abgestürzt war).

Wenn sich jetzt ein Anwender an NAV anmeldet und eine Session-ID zugewiesen bekommt, zu der es noch solche Relikte in der Tabelle gibt, dann kann der Workflow logischerweise nicht mehr funktionieren, da in seinem Variant-Array die Datensätze gar nicht existieren, denn sein Workflow hat ja eigene Einträge hinzugefügt. (in obigen Screenshot stammen z. B. der Eintrag mit der ID 35075.
Die Funktion ExecuteQueuedEvents will aber stumpf alle Einträge zu dieser Session-ID abarbeiten und greift sich den verwaisten Eintrag mit der ID 35048, holt sich die Records aus den Array-Elementen 1 und 2 (welche daraufhin geleert werden) und arbeitet seinen Workflow ab.
Wenn die Funktion nun auf den Eintrag mit der ID 35075 stößt, will es wieder die Array-Elemente 1 und 2 holen (die jetzt aber schon leer sind) und läuft bei der RecRef-Zuweisung auf den Fehler.

Unser Workaround:
Da der Workflow mit den alten Einträgen in der Tabelle zu Beginn einer Session-ID sowieso nichts mehr anfangen kann (weil das Variant-Array bei dem Anwender zum Beginn seiner Session auf jeden Fall leer ist), haben wir ein Event implementiert, welches alle Einträge zu dieser Session-ID bei OnAfterLogInStart löscht.
Screenshot4.png
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.