C/AL: Codeunit-Variablen zuweisen

21. November 2008 11:41

Hier eine Möglich im Umgang mit Codeunits, die ich nirgends dokumentiert gefunden habe,
die aber interessante Möglichkeiten eröffnet.

Codeunit-Variablen werden genutzt, um C/AL Code einzubinden, der sich halt in einer Codeunit
befindet. Man kann aber auch Codeunit-Variablen einander zuweisen.

Code:
C2 := C1;


In diesem Fall wird der "Zeiger auf den Arbeitsbereich" der Codeunit C1 nach C2 kopiert, was zu Folge
hat, dass die Globalen Variablen von C1 und C2 identisch sind.
Angenommen, WriteValue und ReadValue beziehen sich auf eine globale Variable der Codeunit C.

Code:
   C1.WriteValue(5);
   x := C2.ReadValue;

Das Ergebnis in x wird fünf sein.

Diese Zuweisungen funktionieren auch über Objektgrenzen hinweg. Ich habe diese Möglichkeit
für mich genutzt, um in einem Dataport Fehlermeldungen an die aufrufende Codeunit zu übergeben
und anschließend in einer Tabelle zu protokollieren. Innerhalb des Dataports ging nicht, weil im
Fehlerfall die Protokollzeilen wegen des Rollbacks wieder weg waren, und ein COMMIT war auch
nicht praktikabel. (Ab Version 5.0 gibt es dafür GETLASTERRORTEXT)

Code:
// Codeunit Log
VAR
  LastErrorText : Text[100];

FUNCTION SetLastErrorText(String);
BEGIN
  LastErrorText := String;
END;

FUNCTION GetLastErrorText(): STRING;
BEGIN
  EXIT(LastErrorText);
END;


// aufrufende Codeunit
VAR
  Log: CODEUNIT Log;
  LogRec: RECORD;
  DP: DATAPORT;
  T: TEXT[30];

BEGIN
  DP.SetLog(Log);
  IF NOT DP.RUN THEN BEGIN
    T := Log.GetLastErrorText;     // Fehlermeldung abholen
    LogRec.Text := T;
    LogRec.INSERT;
  END;
END;

// Dataport
VAR
  Log: Codeunit Log;

FUNCTION SetLog(NewLog: CODEUNIT Log);
BEGIN
  Log := NewLog;
END;

// z.B. in OnAfterImportRecord...
BEGIN
   IF ... THEN BEGIN
      Log.SetlastErrorText(Text100);
      ERROR(Text100);
   END;
END;


Gruß

Torsten