データ操作ステートメント

データ操作ステートメント

算術ステートメント

COBOL が DBCS 文字を処理する方法は SBCS 文字を処理する方法と同じなので、DBCS 文字を数値演算で使用したり、算術ステートメントを使用して操作したりはしないでください。

INSPECT ステートメント

任意の 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.

注:
AFTER INITIAL SHIFT-OUT 句を使用すると、EBCDIC 値が DBCS-CHARACTER-1 と同じである 2 つの連続した英数字を誤って置換する危険を避けるのに役立ちます (SUBJECT-ITEM に混合データが含まれる場合)。

さらに、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.

MOVE ステートメント

すべての DBCS 文字は英数字ストリングとして移動されます。 システムはデータの変換や検査を行いません。

混合リテラルをグループ項目および英数字項目に移動できます。 DBCS データ項目または DBCS リテラルは、DBCS データ項目にしか移動できません。

受け取りフィールドの長さが送り側フィールドと異なる場合、COBOL は次のどちらかを行います。

受け取りデータ項目の PICTURE 文節での記号の編集効果についてさらに理解するには、「WebSphere Development Studio: ILE COBOL 解説書」を参照してください。

SET ステートメント (条件名形式)

このステートメントで条件名を TRUE に設定すると、COBOL は VALUE 文節のリテラルをそれに対応するデータ項目に移します。 DBCS 文字を含むリテラルを移動させることができます。

STRING ステートメント

STRING ステートメントを使用して、DBCS サブフィールドを含むデータ項目を構成できます。 シフト制御文字を含め、ソース・データ項目またはリテラル内のすべてのデータは、 一度に 1 文字の DBCS 文字の半分ずつが受け取りデータ項目に移されます。

UNSTRING ステートメント

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