データ変換

ランタイム環境が異なるとデータを解釈する方法にも差が生じるので、ある環境から別の環境に渡すデータは、プログラム上での変換が必要な場合があります。 Java™ 環境から COBOL 環境に移動したデータ、および COBOL から Java に移動したデータは、必ずデータ変換を行う必要があります。データ変換が実行されるタイミングは、COBOL の準備時と、COBOL や Java の実行時です。

アラビア語またはヘブライ語などの双方向言語をサポートするプログラムでは、BIDI 変換テーブルを使用して、コード・ページ変換と併せてテキスト・データの再配列を指定できます。BIDI 変換テーブルの作成については、トピック『双方向言語テキスト』を参照してください。

ワークステーション・ベースのファイルをビルド・サーバーに 転送する場合、COBOL の準備プロセスにより、ファイル・コンテンツ、ファイル・パス情報、および環境変数値が変換されます。この場合のデータ変換テーブルの設定に必要なステップについては、このトピックの中で後述します。

実行時の状態が次のような場合にも、プログラムで変換テーブルが使用されます。
  • 生成された Java コードが、 異なるコード・ページを使用する別のシステム上のプログラムを呼び出す場合 (例えば、Java プログラムが z/OS® 上のプログラムを呼び出す場合)。

    この場合は、 呼び出し先プログラムを参照する callLink 要素で変換テーブルを指定できます。または、(callLink 要素の中で) sysVar.callConversionTable システム変数が実行時に変換テーブルを指定するように指示することもできます。

  • 生成される Java コードが、EGL リモート・バインディングを使用してサービスを呼び出す場合。

    この場合は、EGL デプロイメント記述子 (.egldd) ファイルの EGL バインディングで変換テーブルを指定できます。 変換テーブルを指定するには、ローカル以外のプロトコルの conversionTable プロパティーを設定します。

  • 生成される COBOL プログラムが、ASCII 文字セットをサポートするリモート・プラットフォーム上に存在するプログラムを呼び出す場合。

    この場合は、 呼び出し先プログラムを参照する callLink 要素で変換テーブルを指定できます。または、(callLink 要素の中で) sysVar.callConversionTable システム変数が実行時に変換テーブルを指定するように指示することもできます。

  • 生成された CICS® COBOL プログラム (EBCDIC 文字セットをサポートするプラットフォーム上にある) が、ASCII 文字セットをサポートするプラットフォーム上でプログラムを非同期に開始する場合。プログラムが vgLib.startTransaction システム関数を呼び出すときにこのような状況が発生する場合があります。

    この場合は、vgLib.startTransaction システム関数に使用されたレコードを参照する asynchLink 要素で変換テーブルを指定できます。 または、(asynchLink 要素の中で) sysVar.callConversionTable システム変数が実行時に変換テーブルを指定するように指示することもできます。

    これは、Java プログラムでは不可能です。Java の vgLib.startTransaction 関数は、ローカル・システム上にあるプログラムしか開始できません。すべてのプログラムはローカルであるため、変換する必要はありません。

  • 生成される CICS COBOL プログラムが、ASCII 文字セットをサポートするプラットフォーム上の VSAM ファイルまたは CICS 一時データ・キューにアクセスする場合。

    この場合は、 該当のファイルまたはデータ・キューを参照する fileLink 要素で変換テーブルを指定できます。または、(fileLink 要素の中で) sysVar.callConversionTable システム変数が実行時に変換テーブルを指定するように指示することもできます。

  • 生成される Java プログラムが、アラビア語またはヘブライ語の一連の文字が含まれるテキストまたは印刷書式を表示するか、 これらの文字のユーザーからの入力を受け入れるテキスト書式を表示する場合。この場合は、sysVar.formConversionTable システム変数で双方向変換テーブルを指定します。
次のような状態のとき、実行時変換を使用することができます。
  • ランタイムの言語が分からないため、生成時に指定すべき変換テーブルが分からない。 この場合は、次のようにします。
    1. callLinkasynchLink、または fileLink 要素の conversionTable プロパティーの設定を行って、PROGRAMCONTROLLED を指定します。
    2. プログラムで、実行時にユーザーからの入力に基づいて、sysVar.callConversionTable システム変数の値を設定します。
  • プログラムが別のプログラムへレコードを渡すが、渡されるレコードが他のレコード変数によって再定義される。 レコードおよびその再定義は、すべてメモリー内の同じ領域を参照しますが、 レコード内のデータの実際の構造および型は、呼び出しに対して実際にどの再定義を使用しているかによって変化します。 したがって、データ変換の要件も、使用されている再定義に応じて実行時に変化します。 この場合は、次のようにします。
    1. callLinkasynchLink、または fileLink 要素の conversionTable プロパティーの設定を行って、PROGRAMCONTROLLED を指定します。
    2. プログラムで、sysVar.callConversionTable システム変数の値を、自動変換を実行しないことを示すブランクに設定します。
    3. プログラムで、sysLib.convert システム関数を呼び出し、必要なレコード構造に対応するレコード変数の変換を行います。 sysLib.convert 関数では、ユーザーからの入力に基づいて必要な変換テーブルを指定するようにすることもできます。

z/OS COBOL 環境での変換テーブルのカスタマイズについては、「IBM Rational® COBOL Runtime Guide for zSeries」を参照してください。

COBOL プログラムの生成時のデータ変換

COBOL プログラムをワークステーション上で生成し、z/OS または iSeries ビルド・サーバー上で準備すると、 変換は clientCodeSet および serverCodeSet ビルド記述子オプションの指定に従ってビルド・サーバー上で処理されます。 ビルド記述子オプションでは、z/OS および iSeries 上の ICONV 変換サービスに対して定義されるコード・セットを指定する必要があり、指定しないと、デフォルトの設定が適用されます。

アラビア語やヘブライ語などの双方向言語をサポートするプログラムでは、コード・ページ変換のほか、テキスト・リテラルの再配列も必要になる場合があります。 詳しくは、トピック『双方向言語テキスト』を参照してください。

生成済み COBOL プログラムでの実行時のデータ変換

生成した COBOL プログラムが、ASCII 文字セットをサポートするリモート CICS 領域上のプログラムまたはファイルにアクセスすると、変換テーブルに従って、呼び出し側で変換が実行されます。この場合の変換テーブルは、コード・ページ変換の情報が格納されているロード・モジュールです。

次の表には、EGL と一緒に収録されている変換テーブルを示します。この変換テーブルには、生成された COBOL プログラムが実行時にアクセスできます。これらの変換テーブルは、EBCDIC 形式と Windows 2000/NT/XP ASCII コード・ページの間でデータを変換します。

言語 テーブル名
ブラジル・ポルトガル語 ELACNPTB
中国語 (簡体字) ELACNCHS
中国語 (繁体字) ELACNCHT
英語、大文字 ELACNENP
英語 (米国) ELACNENU
フランス語 ELACNFRA
ドイツ語 ELACNDEU
イタリア語 ELACNITA
日本語、カタカナ (1 バイト文字セット) ELACNJPN
韓国語 ELACNKOR
スペイン語 ELACNESP
スイス・ドイツ語 ELACNDES

生成済み Java プログラムでの実行時のデータ変換

以下の規則は Java コードに適用されます。
  • 生成された Java プログラム またはラッパーが、生成された Java プログラムを呼び出すと、実行時に開始される 1 組の EGL クラスに従って、呼び出し側プログラムで変換が実行されます。ほとんどの場合、変換を行う必要はまったくありません。呼び出し側が、起動側が使用しているのとは異なるコード・ページを使用するリモート・プラットフォームにアクセスする場合でもやはり必要ありません。ただし、次の場合には変換テーブルを指定しなければなりません。
    • 呼び出し側プログラムが Java コードであり、1 つのコード・ページをサポートするシステム上で稼働している。
    • 呼び出し先プログラムが非 Java プログラムであり、別のコード・ページをサポートするシステム上で稼働している。

    この場合のテーブル名は、実行時に必要な種類の変換を表すシンボルになります。

  • 生成された Java プログラムがリモートの WebSphere® MQ メッセージ・キューにアクセスすると、実行時に開始される一連の EGL クラスに従って、呼び出し元で変換が実行されます。 起動側が使用しているのとは異なるコード・ページを使用するリモート・プラットフォームに呼び出し側がアクセスする場合は、『関連要素』に示す、WebSphere MQ メッセージ・キューを参照する変換テーブルを指定します。
次の表は、生成された Java コードが実行時にアクセスできる変換テーブルをリストしたものです。 それぞれの名前のフォーマットは、CSOcx です。 可変部については、次のとおりです。
c
この可変部は、呼び出し先プログラムのプラットフォームでサポートされている文字セットを表します。 次のいずれかを選択します。
  • Java の場合は J (呼び出し先プログラムが EGL 生成の Java プログラムの場合)
  • EBCDIC の場合は E (呼び出し先プログラムが EGL 生成の COBOL プログラムの場合)
x
この可変部は、リモート・プログラムのプラットフォームに指定されている言語のコード・ページ番号を表します。 各番号は、「Character Data Representation Architecture Reference and Registry、SC09-2190」に指定されています。各変換テーブルによってサポートされているコード化文字セットは、レジストリーによって識別できます。

  リモート・プラットフォーム
言語 Linux UNIX Windows 2000/NT/XP z/OS UNIX システム・サービスまたは iSeries Java z/OS または iSeries COBOL
アラビア語 CSOJ1046 CSOJ1046 CSOJ1256 CSOJ420 CSOE420
中国語 (簡体字) CSOJ1381 CSOJ1381 CSOJ1386 CSOJ1388 CSOE1388
中国語 (繁体字) CSOJ950 CSOJ950 CSOJ950 CSOJ1371 CSOE1371
キリル文字言語 CSOJ866 CSOJ866 CSOJ1251 CSOJ1025 CSOE1025
デンマーク語 CSOJ850 CSOJ850 CSOJ850 CSOJ277 CSOE277
東ヨーロッパ言語 CSOJ852 CSOJ852 CSOJ1250 CSOJ870 CSOE870
英語 (英国) CSOJ850 CSOJ850 CSOJ1252 CSOJ285 CSOE285
英語 (米国) CSOJ850 CSOJ850 CSOJ1252 CSOJ037 CSOE037
フランス語 CSOJ850 CSOJ850 CSOJ1252 CSOJ297 CSOE297
ドイツ語 CSOJ850 CSOJ850 CSOJ1252 CSOJ273 CSOE273
ヘブライ語 CSOJ856 CSOJ856 CSOJ1255 CSOJ424 CSOE424
日本語 CSOJ943 CSOJ943 CSOJ943 CSOJ1390 (カタカナ SBCS)、CSOJ1399 (ラテン語 SBCS) CSOE1390 (カタカナ SBCS)、CSOE1399 (ラテン語 SBCS)
韓国語 CSOJ1363 CSOJ1363 CSOJ1363 CSOJ1364 CSOE1364
ポルトガル語 CSOJ850 CSOJ850 CSOJ1252 CSOJ037 CSOE037
スペイン語 CSOJ850 CSOJ850 CSOJ1252 CSOJ284 CSOE284
スウェーデン語 CSOJ850 CSOJ850 CSOJ1252 CSOJ278 CSOE278
スイス・ドイツ語 CSOJ850 CSOJ850 CSOJ1252 CSOJ500 CSOE500
トルコ語 CSOJ920 CSOJ920 CSOJ1254 CSOJ1026 CSOE1026

Java からプログラムを呼び出す際、 リンケージ・オプション・パーツに変換テーブルの値が指定されていない場合のデフォルトの変換テーブルは、英語 (US) の変換テーブルになります。

変換アルゴリズム

レコードと構造体のデータ変換は、副構造のない構造体フィールドの宣言が基本になります。

名前のない (構造化レコード内でアスタリスクによって示される) 変数や、BIN、BIGINT、BOOLEAN、INT、SMALLINT、DECIMAL、MONEY、PACF、 HEX、STRING、または UNICODE 型の変数の変換は実行されません。 ただし、双方向変換テーブルを使用している場合は、UNICODE および STRING 変数が、表に定義されているとおり反転されます。 詳しくは、双方向データの処理を参照してください。

CHAR、DBCHAR、または MBCHAR 型のデータは、COBOL または Java の変換テーブルに従って変換されます。

FLOAT および SMALLFLOAT 型の変数の場合、変換ルーチンは、Java には IEEE 754 フォーマット、zSeries COBOL には IBM® 370 フォーマットを使用して、Java から zSeries COBOL への変換、およびその逆の変換を行います。 Java と iSeries COBOL 間の場合、FLOAT および SMALLFLOAT 変数の変換は必要ありません。

MBCHAR データの EBCDIC から ASCII への変換では、変換ルーチンによってシフトイン・シフトアウト (SO/SI) 文字が削除され、この文字数と同じ数のブランクが変数の末尾に追加されます。ASCII から EBCDIC への変換では、変換ルーチンによって 2 バイトのストリングの前後に SO/SI 文字が挿入され、フィールドに収容できる有効な最後の文字で値が切り捨てられます。 MBCHAR フィールドが可変長レコード内にあり、現行レコードの末尾が MBCHAR フィールド内にある場合、レコード長は SO/SI 文字の挿入または削除を反映するように調整されます。レコード長は、現行レコードの末尾がどこにあるかを示しています。

型が NUM または NUMC の変数では、変換ルーチンが CHAR アルゴリズムを使用して、最後のバイトを除くすべてのバイトを変換します。符号ハーフバイト (フィールドの最後のバイトのうちの最初のハーフバイト) は、次の表に示す 16 進値に従って変換されます。
表 1. NUM および NUMC 変数の変換
NUM 型の EBCDIC NUMC 型の EBCDIC ASCII
F (正符号) C 3
D (負符号) D 7

DATE、INTERVAL、TIME、または TIMESTAMP 型の変数の場合、EGL は、CHAR アルゴリズムおよびストリング形式のその変数を使用して値を変換します。

sysLib.convert() システム関数および sysVar.callConversionTable システム変数の詳細は、 「EGL 言語解説書」のトピック『convert()』および『callConversionTable』に記載されています。