データ操作ステートメント
COBOL が DBCS 文字を処理する方法は SBCS 文字を処理する方法と同じなので、DBCS 文字を数値演算で使用したり、算術ステートメントを使用して操作したりはしないでください。
任意の DBCS データ項目を INSPECT ステートメントのオペランドとして使用できます。 システムはこれらのオペランドの DBCS 文字を、1 文字の半分ずつ、シフト制御文字を含めて検査および置換します。 結果として、データの突き合わせが正確に行われない場合があります。
DBCS 文字オペランドは、別の DBCS 文字リテラルまたはデータ項目との組み合わせでしか使用できません。 混合オペランドは英数字として扱われます。 REPLACING 句を使用すると、検査される混合データ項目の一部を英数字データに置き換えたり、 あるいは検査される英数字データ項目の一部を混合データに置き換えたりすることができます。
文字ストリングを、異なる長さのストリングで置き換えることはできません。 混合データ項目の SBCS 文字を DBCS 文字で置き換えたり、混合データ項目の DBCS 文字を SBCS 文字で置き換えたりする場合には、このことを考慮してください。
INSPECT ステートメントでの DBCS 文字を含む混合項目の使用を制御したい場合は、シフト制御文字を含むデータ項目を定義してください。 シフトアウト文字とシフトイン文字を INSPECT ステートメントの BEFORE/AFTER オペランドとして使用します。
次の例は、INSPECT ステートメントを使用して、混合データ項目内の 1 つの DBCS 文字を別の DBCS 文字に置き換える方法を示しています。
01 SUBJECT-ITEM PICTURE X(50). 01 DBCS-CHARACTERS VALUE "0EK1K20F". 05 SHIFT-OUT PICTURE X. 05 DBCS-CHARACTER-1 PICTURE XX. 05 DBCS-CHARACTER-2 PICTURE XX. 05 SHIFT-IN PICTURE X.
INSPECT ステートメントのコーディングは、次のようなものになります。
INSPECT SUBJECT-ITEM REPLACING ALL DBCS-CHARACTER-1 BY DBCS-CHARACTER-2 AFTER INITIAL SHIFT-OUT.
さらに、INSPECT ステートメントを使用することにより、適切な処理が実行されるようにデータ中に DBCS 文字が含まれているかどうかを判別することができます。 以下に例を示します。
01 SUBJECT-FIELD PICTURE X(50). 01 TALLY-FIELD PICTURE 9(3) COMP. 01 SHIFTS VALUE "0E0F". 05 SHIFT-OUT PICTURE X. 05 SHIFT-IN PICTURE X.
手続き部 (PROCEDURE DIVISION) では、次のように入力できます。
MOVE ZERO TO TALLY-FIELD. INSPECT SUBJECT-FIELD TALLYING TALLY-FIELD FOR ALL SHIFT-OUT. IF TALLY-FIELD IS GREATER THAN ZERO THEN PERFORM DBCS-PROCESSING ELSE PERFORM A-N-K-PROCESSING.
すべての DBCS 文字は英数字ストリングとして移動されます。 システムはデータの変換や検査を行いません。
混合リテラルをグループ項目および英数字項目に移動できます。 DBCS データ項目または DBCS リテラルは、DBCS データ項目にしか移動できません。
受け取りフィールドの長さが送り側フィールドと異なる場合、COBOL は次のどちらかを行います。
受け取りデータ項目の PICTURE 文節での記号の編集効果についてさらに理解するには、「WebSphere Development Studio: ILE COBOL 解説書」を参照してください。
このステートメントで条件名を TRUE に設定すると、COBOL は VALUE 文節のリテラルをそれに対応するデータ項目に移します。 DBCS 文字を含むリテラルを移動させることができます。
STRING ステートメントを使用して、DBCS サブフィールドを含むデータ項目を構成できます。 シフト制御文字を含め、ソース・データ項目またはリテラル内のすべてのデータは、 一度に 1 文字の DBCS 文字の半分ずつが受け取りデータ項目に移されます。
UNSTRING ステートメントは、DBCS データおよび混合データを英数字データと同様の方法で処理します。 UNSTRING 操作は、一度に 1 文字の DBCS 文字の半分ずつについて実行されます。
データ項目には、同じフィールド内に英数字と DBCS の両方を含めることができます。
データ・フィールドの中で 2 バイトおよび英数字サブフィールドを検索するには、DELIMITED BY 句を使用します。 シフト制御文字を含むデータ項目を指定して、それらのデータ項目を DELIMITED BY 句の ID として使用します。 これを行う方法については、次の例を参照してください。 送り出しフィールドのサブフィールドの走査を継続するには、POINTER 変数を使用します。
システムが UNSTRING 操作を実行した後、DELIMITER IN 句で保管した区切り文字がシフト制御文字値かどうかを検査することによって、DBCS を含むのはどのサブフィールドか、 またはどれに英数字が含まれるかを調べることができます。
次の例は、混合データを含む文字ストリングに対する UNSTRING 操作に備えてフィールドを設定する方法を示すものです。
01 SUBJECT-FIELD PICTURE X(40) 01 FILLER. 05 UNSTRING-TABLE OCCURS 4 TIMES. 10 RECEIVER PICTURE X(40). 10 DELIMTR PICTURE X. 10 COUNTS PICTURE 99 COMP. 01 SHIFTS VALUE "0E0F". 05 SHIFT-OUT PICTURE X. 05 SHIFT-IN PICTURE X.
UNSTRING ステートメントを次のようにコーディングします。
UNSTRING SUBJECT-FIELD DELIMITED BY SHIFT-OUT OR SHIFT-IN INTO RECEIVER (1) DELIMITER IN DELIMTR (1) COUNT IN COUNTS (1) INTO RECEIVER (2) DELIMITER IN DELIMTR (2) COUNT IN COUNTS (2) INTO RECEIVER (3) DELIMITER IN DELIMTR (3) COUNT IN COUNTS (3) INTO RECEIVER (4) DELIMITER IN DELIMTR (4) COUNT IN COUNTS (4) ON OVERFLOW PERFORM UNSTRING-OVERFLOW-MESSAGE.
この UNSTRING ステートメントは、文字ストリングを英数字部分と DBCS 部分に分割します。 文字ストリング内のデータが有効であるとすれば、 区切り文字の値がシフトアウトなら対応する受け取りフィールドの内容は英数字データであることを示しており、 シフトインなら対応する受け取りフィールドに DBCS データが含まれることを示しています。 各受け取りフィールドが文字を受け取ったかどうかは、COUNT データ項目を調べることによって判別できます。 次の図は、上記の UNSTRING 操作の結果を示す例です。
SUBJECT-FIELD = ABC0EK1K2K30FD0EK4K5K60F RECEIVER (1) = ABC DELIMTR (1) = 0E COUNTS (1) = 3 RECEIVER (2) = K1K2K3 DELIMTR (2) = 0F COUNTS (2) = 6 RECEIVER (3) = D DELIMTR (3) = 0E COUNTS (3) = 1 RECEIVER (4) = K4K5K6 DELIMTR (4) = 0F COUNTS (4) = 6 SUBJECT-FIELD = 0EK1K2K30FABC0EK40F RECEIVER (1) = (blanks) DELIMTR (1) = 0E COUNTS (1) = 0 RECEIVER (2) = K1K2K3 DELIMTR (2) = 0F COUNTS (2) = 6 RECEIVER (3) = ABC DELIMTR (3) = 0E COUNTS (3) = 3 RECEIVER (4) = K4 DELIMTR (4) = 0F COUNTS (4) = 2
(C) Copyright IBM Corporation 1992, 2006. All Rights Reserved.