4.4 Verwendung des Datentyps anyvalue

Wird im IDM-Dialogskript der Typ anyvalue als Parameter einer COBOL-Funktion definiert, dann ist für diesen Parameter jeder Datentyp erlaubt. Im COBOL-Programm wird ein solcher Parameter als Zeiger (pointer) an das Programm übergeben. Um einen solchen Wert in Schnittstellenfunktionen zu verwenden, die eine DM-Value-Struktur erwarten, kann der Parameter dem DM-value-pointer zugewiesen werden und der DM-datatype auf DT-anyvalue gesetzt werden. Man kann dies so interpretieren, dass die DM-Value-Struktur jeden Datentyp beinhalten kann und dass der tatsächliche Wert als Zeiger hinterlegt ist.

Unabhängig davon, wie ein Eingabeparameter definiert war, wird ein Rückgabewert oder Ausgabeparameter, dessen Datentyp direkt in der DM-Value-Struktur gespeichert werden kann, auch direkt gespeichert. Aus DT-anyvalue wird also zum Beispiel DT-string.

Nicht direkt gespeichert werden können Sammlungsdatentypen, diese werden also immer als DT-anyvalue zurückgegeben. Ein solcher DT-anyvalue-Wert kann mit den DMcob_Value*-Funktionen ausgewertet werden.

Zu beachten

Der Datentyp anyvalue gibt im IDM-Dialogskript an, dass jeder Datentyp erlaubt ist. Zur Laufzeit haben aber ein Attribut, eine Variable, ein Parameter oder ein Rückgabewert immer einen Wert mit einem bestimmten Datentyp, der ungleich anyvalue ist.

Beispiel

Die folgende Definition einer Regel besagt, dass der Rückgabewert jeden Datentyp annehmen kann:

rule anyvalue RuleAny(integer I) {
  case I
    in 1: return "Hallo";
    in 2: return 42;
    otherwise:
      return void;
  endcase
}

Zur Laufzeit wird aber nicht anyvalue zurückgegeben, sondern immer der Typ aus der return-Anweisung.Zum Beispiel wird print typeof(RuleAny(1)); den Wert string ausgeben.

Eine Ausnahme von den obigen Regeln stellt ein Managed Value dar, der mit DMcob_ValueInit erzeugt wurde. Ein Managed Value bleibt immer erhalten. Wird ein Managed Value in einer DM-Value Struktur als DM-value-pointer verwendet (DM-datatype muss auf DT-anyvalue gesetzt sein), dann bleibt der Datentyp DT-anyvalue erhalten. Dies gilt auch für Rückgabewerte und Ausgabeparameter.

Gültigkeitsdauer der DM-value-pointer-Werte

Ein Managed Value, der nicht global angelegt wurde, ist nur bis zum Ende der Funktion, in der er angelegt wurde gültig. Er kann aber noch an den IDM zurückgegeben werden.

Das gleiche gilt für Zeigerwerte, die als anyvalue-Parameter an eine Funktion übergeben wurden. Sie sind auch nur bis zum Ende der Funktion gültig. Eine Rückgabe an den IDM ist erlaubt.

Alle anderen Zeigerwerte, die zum Beispiel angelegt wurden um einen Sammlungsdatentyp zurückzugeben, sind nur bis zum Aufruf der nächsten DMcob*-Funktion gültig. Sie dürfen auch nicht an den IDM zurückgegeben werden. Damit solche Werte ausgewertet werden können, zerstören die DMcob_Value*-Funktionen die Gültigkeit nicht.

Es wird empfohlen für Sammlungsdatentypen von vorneherein Managed Values zu verwenden.