Datenkonvertierung

Wegen Unterschieden in der Art und Weise der Interpretation von Daten in unterschiedlichen Laufzeitumgebungen muss Ihr Programm möglicherweise die Daten konvertieren, die von einer Umgebung an eine andere Umgebung übergeben werden. Daten, die von Java™-Umgebungen in COBOL-Umgebungen und von COBOL in Java verschoben werden, müssen immer eine Datenkonvertierung durchlaufen. Die Datenkonvertierung erfolgt während der COBOL-Vorbereitungszeit und zur COBOL- oder Java-Laufzeit.

Programme, die bidirektionale Sprachen wie Arabisch oder Hebräisch unterstützen, können die BIDI-Konvertierungstabellen verwenden, um zusätzlich zur Codepagekonvertierung die Änderung der Richtung von Textdaten anzugeben. Informationen zur Erstellung von BIDI-Konvertierungstabellen finden Sie im Abschnitt "Bidireltionaler Sprachtext".

Der COBOL-Vorbereitungsprozess konvertiert Dateiinhalt, Dateipfadinformationen und Werte der Umgebungsvariablen bei der Übertragung workstationbasierter Dateien auf einen Build-Server. Für diese Situation werden die Schritte, die für den Aufbau einer Datenkonvertierungstabelle erforderlich sind, weiter unten in diesem Abschnitt beschrieben.

Ihr Programm verwendet ferner in folgenden Laufzeitsituationen eine Konvertierungstabelle:
  • Ihr generierter Java-Code ruft ein Programm oder ein anderes System auf, das eine andere Codepage verwendet (zum Beispiel ein Java-Programm ruft ein Programm unter z/OS auf).

    In diesem Fall können Sie die Konvertierungstabelle in einem Element callLink angeben, das sich auf das aufgerufene Programm bezieht. Alternativ können Sie angeben (in diesem Element callLink), dass die Systemvariable sysVar.callConversionTable die Konvertierungstabelle zur Ausführungszeit angibt.

  • Ihr generierter Java-Code ruft einen Service mithilfe einer fernen EGL-Bindung auf.

    In diesem Fall können Sie die Konvertierungstabelle in einer EGL-Bindung in der EGL-Deploymentdeskriptordatei (.egldd) angeben. Sie geben Sie Konvertierungstabelle an, indem Sie die Eigenschaft conversionTable für jedes Protokoll festlegen, das nicht lokal ist.

  • Ihr generiertes COBOL-Programm ruft ein Programm auf, das sich auf einer fernen Plattform befindet, die den ASCII-Zeichensatz unterstützt.

    In diesem Fall können Sie die Konvertierungstabelle in einem Element callLink angeben, das sich auf das aufgerufene Programm bezieht. Alternativ können Sie angeben (in diesem Element callLink), dass die Systemvariable sysVar.callConversionTable die Konvertierungstabelle zur Ausführungszeit angibt.

  • Ihr generiertes CICS-COBOL-Programm (auf einer Plattform, die den EBCDIC-Zeichensatz unterstützt) startet ein Programm asynchron auf einer Plattform, die den ASCII-Zeichensatz unterstützt. Dies geschieht so wie beim Aufruf der Systemfunktion vgLib.startTransaction durch ein Programm.

    In diesem Fall, können Sie die Konvertierungstabelle in einem Element asynchLink angeben, das sich auf den Datensatz bezieht, der in der Systemfunktion vgLib.startTransaction verwendet wird. Alternativ können Sie angeben (in diesem Element asynchLink), dass die Systemvariable sysVar.callConversionTable die Konvertierungstabelle zur Ausführungszeit angibt.

    Dies ist für Java-Programme nicht möglich, weil die Funktion vgLib.startTransaction für Java nur Programme starten kann, die sich auf dem lokalen System befinden. Da alle Programme lokal sind, ist keine Konvertierung erforderlich.

  • Ihr generiertes CICS-COBOL-Programm greift auf eine VSAM-Datei oder eine CICS-Warteschlange mit transienten Daten zu, die den ASCII-Zeichensatz unterstützt.

    In diesem Fall, können Sie die Konvertierungstabelle in einem Element fileLink angeben, das sich auf die Datei oder die Datenquelle bezieht. Alternativ können Sie (in diesem Element fileLink) angeben, dass die Systemvariable sysVar.callConversionTable die Umrechnungstabelle zur Ausführungszeit angibt.

  • Ihr generiertes Java-Programm zeigt ein Text- oder Druckformat an, das eine Reihe von arabischen oder hebräischen Zeichen enthält. Oder es stellt ein Textformular dar, das eine Reihe solcher Zeichen von einem Benutzer akzeptiert. In diesen Fällen geben Sie die bidirektionale Umsetzungstabelle in der Systemvariablen sysVar.formConversionTable an.
Möglicherweise verwenden Sie die Laufzeitkonvertierung in folgenden Situationen:
  • Sie kennen die Laufzeitsprache nicht und wissen daher nicht, welche Konvertierungstabelle Sie zur Generierungszeit angeben sollen. Gehen Sie in diesem Fall wie folgt vor:
    1. Legen Sie die Eigenschaft conversionTable im Element callLink, asynchLink oder fileLink fest, um PROGRAMCONTROLLED anzugeben.
    2. Legen Sie in Ihrem Programm den Wert der Systemvariablen sysVar.callConversionTable zur Laufzeit auf Basis der Benutzereingabe fest.
  • Ihr Programm übergibt einen Datensatz an ein anderes Programm, aber andere Datensatzvariablen definieren den Datensatz, der übergeben wird, neu. Der Datensatz und seine Neudefinitionen beziehen sich auf denselben Speicherbereich. Die tatsächliche Struktur und die Datentypen im Datensatz variieren abhängig von der Neudefinition, die Sie tatsächlich für den Aufruf verwenden. Daher variieren die Anforderungen an die Datenkonvertierung zur Laufzeit ebenfalls auf Grundlage der verwendeten Neudefinition. Gehen Sie in diesem Fall wie folgt vor:
    1. Legen Sie die Eigenschaft conversionTable im Element callLink, asynchLink oder fileLink fest, um PROGRAMCONTROLLED anzugeben.
    2. Legen Sie in Ihrem Programm als Wert für die Systemvariable sysVar.callConversionTable Leerzeichen fest, um anzuzeigen, dass die automatische Konvertierung nicht erfolgen soll.
    3. Rufen Sie in Ihrem Programm die Systemfunktion sysLib.convert auf, um die Datensatzvariable zu konvertieren, die der für Sie erforderlichen Datensatzstruktur entspricht. Die Funktion sysLib.convert ermöglicht Ihnen ferner, die Konvertierungstabelle anzugeben, die Sie auf Basis der Benutzereingabe benötigen.

Informationen zur Anpassung der Konvertierungstabelle in der z/OS-COBOL-Umgebung finden Sie unter IBM Rational COBOL Runtime Guide für zSeries.

Datenkonvertierung bei der Generierung eines COBOL-Programms

Wenn COBOL auf einer Workstation auf einem z/OS- oder einem iSeries-Build-Server vorbereitet wird, erfolgt die Konvertierung in Übereinstimmung mit Ihren Angaben in den Builddeskriptoroptionen clientCodeSet und serverCodeSet auf einem Build-Server. Jede dieser Builddeskriptoroptionen muss einen codierter Zeichensatz angeben, der für den ICONV-Konvertierungsservice auf z/OS und iSeries definiert ist. Fehlt die Angabe, werden die Standardeinstellungen verwendet.

Programme, die bidirektionale Sprachen wie Arabisch oder Hebräisch unterstützen, können zusätzlich zur Codepagekonvertierung auch eine Umordnung der Textliterale erfordern. Weitere Informationen finden Sie im Abschnitt "Bidirektionaler Sprachtext".

Datenkonvertierung zur Laufzeit in einem generierten COBOL-Programm.

Wenn ein generiertes COBOL-Programm auf ein Programm oder eine Datei in einer fernen CICS-Region zugreift, die den ASCII-Zeichensatz unterstützt, wird in Übereinstimmung mit der Konvertierungstabelle eine Konvertierung im aufrufenden Programm vorgenommen. Die Konvertierungstabelle ist in diesem Fall ein Lademodul, das Informationen zur Codepageumsetzung enthält.

Die Texttabelle listet die Konvertierungstabellen auf, die mit EGL ausgeliefert wurden und auf die zur Laufzeit von einem generierten COBOL-Programm zugegriffen werden kann. Diese Konvertierungstabelle konvertiert Daten zwischen dem EBCDIC-Format und den Windows 2000/NT/XP ASCII-Zeichensatztabellen.

Sprache Tabellenname
Brasilianisches Portugiesisch ELACNPTB
Vereinfachtes Chinesisch ELACNCHS
Traditionelles Chinesisch ELACNCHT
Englisch in Großschreibung ELACNENP
Amerikanisches Englisch ELACNENU
Französisch ELACNFRA
Deutsch ELACNDEU
Italienisch ELACNITA
Japanisch, Katakana (Einzelbytezeichensatz) ELACNJPN
Koreanisch ELACNKOR
Spanisch ELACNESP
Deutsch (Schweiz) ELACNDES

Datenkonvertierung zur Ausführungszeit in einem generierten Java-Programm

Die folgenden Regeln gelten für Java-Code:
  • Wenn ein generiertes Java-Programm oder ein Wrapper ein generiertes Java-Programm aufruft, erfolgt die Konvertierung im aufrufenden Programm und zwar in Übereinstimmung mit eine Reihe von EGL-Klassen, die zur Ausführungszeit initiiert wurden. In den meisten Fällen ist überhaupt keine Konvertierung erforderlich. Selbst wenn der Aufrufer auf eine ferne Plattform zugreift, die eine Codepage verwendet, die sich von der Codepage unterscheidet, die vom aufrufenden Programm verwendet wird. Sie müssen jedoch in folgender Situation eine Konvertierungstabelle angeben:
    • Das aufrufende Programm ist Java-Code und befindet sich auf einem System, das genau eine Codepage unterstützt.
    • Das aufgerufene Programm ist kein Java-Programm und befindet sich auf einem System, das eine andere Codepage unterstützt.

    Der Tabellenname ist in diesem Fall ein Symbol, das die Art der Konvertierung angibt, die zur Ausführungszeit erforderlich ist.

  • Wenn ein generiertes Java-Programm auf eine ferne WebSphere MQ-Nachrichtenwarteschlange zugreift, erfolgt die Konvertierung im aufrufenden Programm und zwar in Übereinstimmung mit eine Reihe von EGL-Klassen, die zur Ausführungszeit initiiert wurden. Wenn das aufrufende Programm auf eine ferne Plattform zugreift, die eine Codepage verwendet, die sich von der vom aufrufenden Programm verwendeten Codepage unterscheidet, geben Sie im zugehörigen Element, das sich auf die WebSphere MQ-Nachrichtenwarteschlange bezieht, eine Konvertierungstabelle an.
In der folgenden Tabelle sind die Konvertierungstabellen aufgelistet, auf die generierter Java-Code zur Laufzeit zugreifen kann. Jeder Name hat das Format CSOcx. Variablen werden in der folgenden Liste erläutert:
c
Diese Variable stellt den auf der aufgerufenen Programmplattform unterstützen Zeichensatz dar. Wählen Sie einen der folgenden Werte aus:
  • J steht für Java (wenn das aufgerufene Programm ein mit EGL generiertes Java-Programm ist)
  • E steht für EBCDIC (wenn das aufgerufene Programm ein mit EGL generiertes COBOL-Programm ist)
x
Diese Variable stellt die Codepagenummer für die angegebene Sprache auf der Plattform des fernen Programms dar. Die einzelnen Nummern sind in der Veröffentlichung Character Data Representation Architecture Reference and Registry, IBM Form SC09-2190, angegeben. Die Registry gibt die codierten Zeichensätze an, die von den Konvertierungstabellen unterstützt werden.

  Ferne Plattformen
Sprache Linux UNIX Windows 2000/NT/XP z/OS UNIX System Services oder iSeries Java z/OS oder iSeries COBOL
Arabisch CSOJ1046 CSOJ1046 CSOJ1256 CSOJ420 CSOE420
Vereinfachtes Chinesisch CSOJ1381 CSOJ1381 CSOJ1386 CSOJ1388 CSOE1388
Traditionelles Chinesisch CSOJ950 CSOJ950 CSOJ950 CSOJ1371 CSOE1371
Kyrillisch CSOJ866 CSOJ866 CSOJ1251 CSOJ1025 CSOE1025
Dänisch CSOJ850 CSOJ850 CSOJ850 CSOJ277 CSOE277
Osteuropa CSOJ852 CSOJ852 CSOJ1250 CSOJ870 CSOE870
Britisches Englisch CSOJ850 CSOJ850 CSOJ1252 CSOJ285 CSOE285
Amerikanisches Englisch CSOJ850 CSOJ850 CSOJ1252 CSOJ037 CSOE037
Französisch CSOJ850 CSOJ850 CSOJ1252 CSOJ297 CSOE297
Deutsch CSOJ850 CSOJ850 CSOJ1252 CSOJ273 CSOE273
Hebräisch CSOJ856 CSOJ856 CSOJ1255 CSOJ424 CSOE424
Japanisch CSOJ943 CSOJ943 CSOJ943 CSOJ1390 (Katakana SBCS), CSOJ1399 (Latin SBCS) CSOE1390 (Katakana SBCS), CSOE1399 (Latin SBCS)
Koreanisch CSOJ1363 CSOJ1363 CSOJ1363 CSOJ1364 CSOE1364
Portugiesisch CSOJ850 CSOJ850 CSOJ1252 CSOJ037 CSOE037
Spanisch CSOJ850 CSOJ850 CSOJ1252 CSOJ284 CSOE284
Schwedish CSOJ850 CSOJ850 CSOJ1252 CSOJ278 CSOE278
Deutsch (Schweiz) CSOJ850 CSOJ850 CSOJ1252 CSOJ500 CSOE500
Türkisch CSOJ920 CSOJ920 CSOJ1254 CSOJ1026 CSOE1026

Wenn Sie ein Programm von Java aufrufen und im Verbindungsoptionsabschnitt keinen Wert für die Konvertierungstabelle angeben, sind die Standardkonvertierungstabellen die Tabellen für Amerikanisches Englisch.

Konvertierungsalgorithmus

Die Datenkonvertierung von Datensätzen und Strukturen basiert auf den Deklarationen von Strukturfeldern, die keine Unterstruktur haben.

Für Variablen ohne Namen (diese Variablen sind in einem strukturierten Datensatz durch ein Sternchen gekennzeichnet) oder für Variablen vom Typ BIN, BIGINT, BOOLEAN, INT, SMALLINT, DECIMAL, MONEY, PACF, HEX, STRING oder UNICODE wird keine Konvertierung ausgeführt. Wenn Sie jedoch eine bidirektionale Umsetzung verwenden, werden UNICODE- und STRING-Variablen wie in der Tabelle definiert umgekehrt. Weitere Information finden Sie in Mit bidirektionalen Daten arbeiten.

Daten vom Typ CHAR, DBCHAR oder MBCHAR werden entsprechend der COBOL- oder Java-Konvertierungstabellen konvertiert.

Für Variablen vom Typ FLOAT und SMALLFLOAT konvertiert die Konvertierungsroutine von Java in zSeries COBOL und zurück mithilfe des IEEE 754-Formats für Java und mithilfe des IBM® 370-Formats für zSeries COBOL. Für die Variablen FLOAT und SMALLFLOAT ist zwischen Java und iSeries COBOL keine Konvertierung erforderlich.

Bei der EBCDIC-in-ASCII-Konvertierung für MBCHAR-Daten löscht die Konvertierungsroutine DBCS-Startzeichen und DBCS-Endezeichen und fügt eine entsprechende Anzahl an Leerzeichen am Ende der Variablen ein. Bei der ASCII-in-EBCDIC-Konvertierung fügt die Konvertierungsroutine DBCS-Startzeichen und DBCS-Endezeichen vor und nach den Doppelbytezeichenfolgen ein und schneidet den Wert beim letzten gültigen Zeichen ab, das in das Feld hineinpasst. Wenn das MBCHAR-Feld in einem Datensatz mit variabler Länge enthalten ist und das Ende des aktuellen Datensatzes sich im MBCHAR-Feld befindet, wird die Datensatzlänge angepasst, um das Einfügen oder Löschen von DBCS-Startzeichen und DBCS-Endezeichen widerzuspiegeln. Die Datensatzlänge gibt an, wo der aktuelle Datensatz endet.

Für Variablen vom Elementtyp NUM oder NUMC konvertiert die Konvertierungsroutine alles bis auf das letzte Byte mithilfe des CHAR-Algorithmus. Das Halbbytezeichen, das das erste Halbbyte des letzten Byte im Feld ist, wird entsprechend des in der folgenden Tabelle angezeigten Hexadezimalwerts konvertiert.
Tabelle 1. Konvertierung für NUM- und NUMC-Variablen
EBCDIC für Typ NUM EBCDIC für Typ NUMC ASCII
F (positives Vorzeichen) C 3
D (negatives Vorzeichen) D 7

Für Variablen vom Typ DATE, INTERVAL, TIME oder TIMESTAMP konvertiert EGL die Werte mithilfe des CHAR-Algorithmus und des Zeichenfolgeformats der Variablen

Weitere Informationen zur Systemfunktion sysLib.convert() und zur Systemvariablen sysVar.callConversionTable finden Sie in den Abschnitten zu "convert()" und "callConversionTable" in der EGL-Sprachreferenz.