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 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.
- Sie kennen die Laufzeitsprache nicht und wissen daher nicht, welche Konvertierungstabelle Sie zur Generierungszeit angeben sollen. Gehen Sie in diesem Fall wie folgt vor:
- Legen Sie die Eigenschaft conversionTable im Element callLink, asynchLink oder fileLink fest, um PROGRAMCONTROLLED anzugeben.
- 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:
- Legen Sie die Eigenschaft conversionTable im Element callLink, asynchLink oder fileLink fest, um PROGRAMCONTROLLED anzugeben.
- Legen Sie in Ihrem Programm als Wert für die Systemvariable sysVar.callConversionTable Leerzeichen fest, um anzuzeigen, dass die automatische Konvertierung nicht erfolgen soll.
- 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
- 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.
- 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.
| 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.