データ変換
ランタイム環境が異なるとデータを解釈する方法にも差が生じるので、ある環境から別の環境に渡すデータは、プログラム上での変換が必要な場合があります。 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 システム変数で双方向変換テーブルを指定します。
- ランタイムの言語が分からないため、生成時に指定すべき変換テーブルが分からない。
この場合は、次のようにします。
- callLink、asynchLink、または fileLink 要素の conversionTable プロパティーの設定を行って、PROGRAMCONTROLLED を指定します。
- プログラムで、実行時にユーザーからの入力に基づいて、sysVar.callConversionTable システム変数の値を設定します。
- プログラムが別のプログラムへレコードを渡すが、渡されるレコードが他のレコード変数によって再定義される。
レコードおよびその再定義は、すべてメモリー内の同じ領域を参照しますが、
レコード内のデータの実際の構造および型は、呼び出しに対して実際にどの再定義を使用しているかによって変化します。
したがって、データ変換の要件も、使用されている再定義に応じて実行時に変化します。
この場合は、次のようにします。
- callLink、asynchLink、または fileLink 要素の conversionTable プロパティーの設定を行って、PROGRAMCONTROLLED を指定します。
- プログラムで、sysVar.callConversionTable システム変数の値を、自動変換を実行しないことを示すブランクに設定します。
- プログラムで、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 プログラムを呼び出すと、実行時に開始される 1 組の EGL クラスに従って、呼び出し側プログラムで変換が実行されます。ほとんどの場合、変換を行う必要はまったくありません。呼び出し側が、起動側が使用しているのとは異なるコード・ページを使用するリモート・プラットフォームにアクセスする場合でもやはり必要ありません。ただし、次の場合には変換テーブルを指定しなければなりません。
- 呼び出し側プログラムが Java コードであり、1 つのコード・ページをサポートするシステム上で稼働している。
- 呼び出し先プログラムが非 Java プログラムであり、別のコード・ページをサポートするシステム上で稼働している。
この場合のテーブル名は、実行時に必要な種類の変換を表すシンボルになります。
- 生成された Java プログラムがリモートの WebSphere® MQ メッセージ・キューにアクセスすると、実行時に開始される一連の EGL クラスに従って、呼び出し元で変換が実行されます。 起動側が使用しているのとは異なるコード・ページを使用するリモート・プラットフォームに呼び出し側がアクセスする場合は、『関連要素』に示す、WebSphere MQ メッセージ・キューを参照する変換テーブルを指定します。
- 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 型の EBCDIC | NUMC 型の EBCDIC | ASCII |
|---|---|---|
| F (正符号) | C | 3 |
| D (負符号) | D | 7 |
DATE、INTERVAL、TIME、または TIMESTAMP 型の変数の場合、EGL は、CHAR アルゴリズムおよびストリング形式のその変数を使用して値を変換します。
sysLib.convert() システム関数および sysVar.callConversionTable システム変数の詳細は、 「EGL 言語解説書」のトピック『convert()』および『callConversionTable』に記載されています。