HintergrundApplication Log und Unicode

 

Im Application Log ist es möglich, an eine Meldung oder an einen Protokollkopf einen sogenannten Kontext zu heften. Dieser Kontext besteht aus dem Namen einer (flachen!) DDIC-Struktur und deren Inhalt, der in einem CHAR255-Container gehalten wird.

Beispiel Beispiel

Der Kontext ist eine DDIC-Struktur mit dem Namen 'MY_STRUC', welche die Felder CARRID, CONNID und FLDATE enthält:

Ende des Beispiels.

Syntax Syntax

  1. DATA:
    l_s_msg TYPE bal_s_msg,
    l_context TYPE MY_STRUC.
    
    * fill message type, id and message variables
    ....
    
    * define context information
    l_context-carrid = 'ABC'.
    l_context-connid = 15.
    l_context-fldate = sy-datum.
    l_s_msg-context-tabname = 'MY_STRUC'.
    l_s_msg-context-value = l_context.
    
    * add this message to log 
    CALL FUNCTION 'BAL_LOG_MSG_ADD'
    EXPORTING
    i_s_msg = l_s_msg
    EXCEPTIONS
    OTHERS = 0.
Ende des Codes

Hinweis Hinweis

Das Statement l_s_msg-context-value = l_context.führt in Unicode-Systemen zu Problemen, wenn die DDIC-Struktur Felder enthält, die nicht character-artig sind (z.B. das Feld CONNID als INTEGER).

Ende des Hinweises

Grundsätzlich hätte für die Unicode-Umstellung die Möglichkeit bestanden, diese Container-Mechanik komplett umzustellen (z.B. durch Einführung von REF TO DATA als Referenz auf beliebige Kontext-Informationen). Da aber der überwiegende Teil der Anwendungen nur mit character-artigen Kontexten operiert, wurde eine derartige (aufwendige) Umstellung verworfen. Statt dessen werden hier zwei Möglichkeiten aufgezeigt, wie im Problemfall verfahren werden kann:

  1. Nur character-artige Felder in der DDIC-Struktur verwenden. Dieses Vorgehen wird empfohlen.

    Hinweis Hinweis

    Diese Möglichkeit kann z.B. dann verwendet werden, wenn im Kontext INTEGERs verwendet werden. Eine Umstellung auf NUMC ist ohne großen Aufwand möglich, das Coding kann normalerweise unverändert bleiben, weil der Move eines Integers in ein NUMC-Feld automatisch konvertiert.

    Protokolle, die in alten Releases geschrieben wurden, sind weiterhin lesbar. Die alten Kontext-Daten werden beim Lesen automatisch in die neue Struktur konvertiert.

    Ende des Hinweises
  2. Arbeiten mit ASSIGN .. CASTING.

    Hinweis Hinweis

    Falls Lösung 1 nicht anwendbar ist und unbedingt nicht-character-artige Felder verwendet werden müssen, kann folgendermaßen verfahren werden:

    Das Statement l_s_msg-context-value = l_context. kann ersetzt werden durch:

    Ende des Hinweises

    Syntax Syntax

    1. FIELD-SYMBOLS:
      <l_context> TYPE c.
      ASSIGN l_context TO <l_context> CASTING.
      l_s_msg-context-value = <l_context>.
    Ende des Codes

Das Lesen/Interpretieren der Kontext-Daten erfolgt im Application Log weiterhin korrekt.