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