Rational Developer for System z
Enterprise COBOL for z/OS バージョン 4.1 言語解説書


UNSTRING ステートメント

UNSTRING ステートメントを使用することによって、送り出しフィールドの中の連続するデータを分割して、 複数の受け取りフィールドに入れることができます。

構文図を読む構文図をスキップする
フォーマット 

>>-UNSTRING--ID-1----------------------------------------------->

>--+---------------------------------------------------------------------------------+-->
   '-DELIMITED--+----+--+-----+--+-ID-2-------+--+---------------------------------+-'   
                '-BY-'  '-ALL-'  '-リテラル-1--'  | .-----------------------------. |     
                                                 | V                             | |     
                                                 '---OR--+-----+--+-ID-3-------+-+-'     
                                                         '-ALL-'  '-リテラル-2--'         

>--INTO--------------------------------------------------------->

   .------------------------------------------------------------.   
   V                                                            |   
>----ID-4--+-------------------------+--+---------------------+-+-->
           '-DELIMITER--+----+--ID-5-'  '-COUNT--+----+--ID-6-'     
                        '-IN-'                   '-IN-'             

>--+-------------------------+--+------------------------+------>
   '-+------+--POINTER--ID-7-'  '-TALLYING--+----+--ID-8-'   
     '-WITH-'                               '-IN-'           

>--+--------------------------------------+------------------->
   '-+----+--OVERFLOW--命令ステートメント-1-'   
     '-ON-'                                     

>--+-------------------------------------------+-------------->
   '-NOT--+----+--OVERFLOW--命令ステートメント-2-'   
          '-ON-'                                     

>--+--------------+--------------------------------------------><
   '-END-UNSTRING-'   

ID-1
これは送り出しフィールド を表します。データは、このフィールドからデータ受け取りフィールド (ID-4) に転送されます。

ID-1 は、英字、英数字、英数字編集、DBCS、国別、または国別編集カテゴリーのデータ項目を参照しなければなりません。

ID-2リテラル-1ID-3リテラル-2
1 つ以上の区切り文字を指定します。

ID-2 および ID-3 は、英字、英数字、英数字編集、DBCS、国別、または国別編集カテゴリーのデータ項目を参照しなければなりません。

リテラル-1 またはリテラル-2 は、英数字、DBCS、または国別カテゴリーでなければなりません。また、ALL というワードで始まる形象定数にすることはできません。

ID-4
1 つ以上の受け取りフィールドを指定します。

ID-4 は、英字、英数字、数字、DBCS、または国別カテゴリーのデータ項目を参照しなければなりません。参照されるデータ項目が数字カテゴリーの場合は、その PICTURE 文字ストリングにはピクチャー記号 P を含めることはできません。また、USAGE DISPLAY または NATIONAL でなければなりません。

ID-5
ID-4 に関連付けられた区切り文字を受け取るフィールドを指定します。

ID-5 は、英字、英数字、DBCS、または国別カテゴリーのデータ項目を参照しなければなりません。

ID-6
ID-4 へ転送される文字数を入れるフィールドを指定します。

ID-6 は、PICTURE 文字ストリングの中で記号 P を使用しないで定義された整数データ項目でなければなりません。

ID-7
UNSTRING 処理中の相対的文字位置を入れるフィールドを指定します。

ID-7 ストリングの記号 P なしで定義された 整数データ項目である必要があります。

ID-7は、ID-1 によって参照されるデータ項目内の文字位置数に 1 を加えた値が十分に入るサイズの データ項目として記述する必要があります。
ID-8
処理される区切り文字で区切られているフィールドの数で増分されるフィールドを指定します。

ID-8 は、PICTURE 文字ストリングの中で記号 P を使用しないで定義された整数データ項目でなければなりません。

次の規則が適用されます。

カウント・フィールド (ID-6) およびポインター・フィールド (ID-7) は、バイト数ではなく文字位置 (英数字、DBCS、または国別) の数によって増分されます。

UNSTRING ステートメントの実行開始時に、特定のエレメントの 評価または計算が 1 回だけ実行されることを除き、MOVE ステートメントの シリーズを 1 つの UNSTRING ステートメントで置き換えることができます。 詳しくは、UNSTRING ステートメントの実行終了時の値を参照してください。

移動の規則は、ID-1 のカテゴリーの基本送り出し項目に対する MOVE ステートメントの規則と 同じであり、該当する ID-4 が受け取り項目となります (MOVE ステートメントを参照)。 例えば、ID-1 が DBCS 項目の場合は、DBCS 項目の移動規則が使用されます。

DELIMITED BY 句

この句は、データ転送を制御するデータ内の区切り文字を指定します。

ID-2ID-3リテラル-1、またはリテラル-2 は、それぞれ 1 つの区切り文字を表します。

DELIMITED BY 句を指定していない 場合、 DELIMITER IN 句および COUNT IN 句を指定してはなりません

ALL
任意の区切り文字の複数の連続するオカレンスは、唯一のオカレンスのように扱われます。この 1 つのオカレンスは、区切り文字受け取りフィールド (ID-5) が指定されていれば、そこに移動されます。送り出しフィールド内の区切り文字は、ID-1 と同じ USAGE およびカテゴリーの基本項目として扱われます。この区切り文字は、MOVE ステートメントの規則に従って、現在の区切り文字受け取りフィールドに移動されます。

DELIMITED BY ALL が指定されていない 場合には、いずれかの 区切り文字が 2 つ以上連続して出現すると、現在のデータ受け取りフィールド (ID-4) は、 データ受け取りフィールドの記述に従って、スペースまたは 0 で埋め込まれます。

2 文字以上の区切り文字

2 文字以上の区切り文字は、区切っている文字が以下の両方である場合のみ、 区切り文字として認識されます。

  • 連続している
  • 送り出しフィールドで指定したシーケンス内

2 つ以上の区切り文字

2 つ以上の区切り文字を指定すると、OR 条件が存在し、いずれかの区切り文字が オーバーラップして現れるたびに、指定されたシーケンスで送り出しフィールドの区切り文字として認識されます。

以下に例を示します。

DELIMITED BY "AB" or "BC"

送り出しフィールドに AB または BC が現れると、区切り文字としてみなされます。ABC が現れると、AB が現れたとみなされます。

INTO 句

この句は、データの移動先フィールドを指定します。

ID-4データ受け取りフィールド を表します。

DELIMITER IN
この句は、区切り文字の移動先フィールドを指定します。

ID-5区切り文字受け取りフィールド を表します。

DELIMITED BY 句を指定していない 場合、DELIMITED IN 句を指定してはなりません

COUNT IN
この句は、検査済み文字位置の数が入れられるフィールドを指定します。

ID-6は、各データ転送のデータ個数フィールド です。各フィールドには、この受け取りフィールドへの移動に関して、送り出しフィールド内の 検査済み文字 (区切り文字で終わるか、または送り出しフィールドの終わりで終わる) の 個数が入れられます。 区切り文字はこの個数には含まれません。

DELIMITED BY 句を指定していない 場合、COUNT IN 句を指定してはなりません

POINTER 句

POINTER 句を指定した場合、ポインター・フィールド ID-7 の値は、送り出しフィールドの文字位置が検査されるたびに 1 ずつ増分されます。UNSTRING ステートメントの実行が完了すると、ポインター・フィールドには、 送り出しフィールド内で検査された文字位置数とその初期値を加えた値が入ります。

この句を指定する場合には、UNSTRING ステートメントの実行を開始する前に、ユーザーはポインター・フィールドを初期化する必要があります。

TALLYING IN 句

TALLYING 句が指定されるときに、領域カウント・フィールド ID-8 には、(UNSTRING ステートメントの実行の終了時に) 受け取り領域が作用したデータ数を初期値に加えた値が入ります。

この句を指定する場合には、UNSTRING ステートメントの実行を開始する前に、ユーザーは領域カウント・フィールドを初期化する必要があります。

ON OVERFLOW 句

次のような場合に、オーバーフロー条件が存在します。

  • ポインター値 (明示的または暗黙的に指定) が 1 より小さい場合。
  • ポインター値 (明示的または暗黙的に指定) が、送り出しフィールドの長さに 等しい値を超える場合。
  • すべてのデータ受け取りフィールドの処理を終えても、送り出しフィールドに 依然として未検査の文字位置がある場合。

オーバーフロー条件が生じる場合

オーバーフロー条件は、次のような操作の結果生じます。

  1. データがそれ以上転送されない。
  2. UNSTRING 操作が終了する。
  3. NOT ON OVERFLOW 句が指定されている場合は、それが無視される。
  4. 制御は UNSTRING ステートメントの最後に移されるか、ON OVERFLOW 句が指定されていれば、命令ステートメント-1 へ移されます。

命令ステートメント-1
オーバーフロー条件を処理するステートメント (複数可)。

制御が命令ステートメント-1 に移された場合、命令ステートメント-1 に指定された各ステートメントの規則に従って、実行が継続されます。明示的な制御の移動を起こす、プロシージャーのブランチ・ステートメントや条件ステートメントが実行された場合は、制御はそのステートメントの規則に従って移されます。それ以外の場合は、命令ステートメント-1 の実行が完了すると、 制御は UNSTRING ステートメントの終わりに移されます。

オーバーフロー条件が生じない場合

UNSTRING ステートメントの実行中に、オーバーフロー条件を引き起こす 条件が生じないときには、以下のようになります。

  1. データの転送が完了する。
  2. ON OVERFLOW 句が指定されていれば、無視される。
  3. 制御は UNSTRING ステートメントの最後に移されるか、NOT ON OVERFLOW 句が 指定されていれば、命令ステートメント-2 へ移されます。
命令ステートメント-2
生じないオーバーフロー条件を処理するステートメント (複数可)。

制御が命令ステートメント-2 に移された場合、命令ステートメント-2 に指定された各ステートメントの規則に従って、実行が継続されます。明示的な制御の移動を起こす、プロシージャーのブランチ・ステートメントや条件ステートメントが実行された場合は、制御はそのステートメントの規則に従って移されます。それ以外の場合は、命令ステートメント-2 の実行が完了すると、 制御は UNSTRING ステートメントの終わりに移されます。

END-UNSTRING 句

この明示的範囲終了符号は、UNSTRING ステートメントの範囲を区切るために使用されます。 END-UNSTRING 句を使用することによって、 条件 UNSTRING ステートメントを他の条件ステートメント内にネストすることができます。 END-UNSTRING 句は、命令 UNSTRING ステートメントと共に使用することもできます。

詳しくは、範囲区切りステートメントを参照してください。

データ・フロー

UNSTRING ステートメントが開始されると、データは次の規則に従って 送り出しフィールドから現在のデータ受け取りフィールドに移動されます。

ステージ 1: 検査

  1. POINTER 句が指定されている場合には、送り出しフィールドはポインター・フィールドの 値によって指定された相対文字位置から検査が開始されます。

    POINTER 句が指定されていない 場合、送り出しフィールドの文字ストリングは 左端の文字位置から検査が開始されます。

  2. DELIMITED BY 句が指定されている場合は、区切り文字が検出されるまで、 文字位置が 1 つずつ、左から右へ検査されます。 区切り文字が検出される前に送り出しフィールドの終わりに達すると、送り出しフィールドの 最後の文字位置で検査が終了します。 受け取りフィールドがさらにある場合には、次のフィールドが選択され、それ以外の場合には、 オーバーフロー条件が起こります。

    DELIMITED BY 句が指定されていない 場合、検査される文字位置の数は、 現在のデータ受け取りフィールドのサイズに等しくなります。以下の表の説明を参照してください。受け取りフィールドのカテゴリーの扱いによるサイズについては、表 1を参照してください。

    表 1. DELIMITED BY が指定されていない場合の検査される文字位置
    受け取りフィールドが以下の場合 検査される文字位置の数
    英数字または英字 現行受け取りフィールドの英数字文字位置数と等しい
    DBCS 現行受け取りフィールドの DBCS 文字位置数と等しい
    国別 現行受け取りフィールドの国別文字位置数と等しい
    数字 現行受け取りフィールドの整数部の文字位置数と等しい
    SIGN IS SEPARATE 節で説明されている 現行受け取りフィールドのサイズより 1 小さい
    可変長データ項目として説明されている UNSTRING 操作の開始時に現行受け取りフィールドのサイズで判別する

    ステージ 2: 移動

  3. 検査される文字位置 (区切り文字を除く) は、下記の表で示している場合を除き、送り出しフィールドと同じデータ・カテゴリーの基本データ項目として扱われます。

    ID-1 (送り出しフィールド) のカテゴリー 基本データ項目のカテゴリー
    英数字編集 英数字
    国別編集 国別
    基本データ項目は、送り出しフィールドおよび受け取りフィールドのカテゴリーに関する MOVE ステートメントの規則に従って (MOVE ステートメントを参照)、現在のデータ受け取りフィールドに移動されます。
  4. DELIMITER IN 句を指定したときは、送り出しフィールドの中の区切り文字は、 基本英数字項目として扱われ、MOVE ステートメントの規則に従って現在の区切り文字 受け取りフィールドに移動されます。 区切り条件が、送り出しフィールドの終わりで起きた場合は、現在の区切り文字受け取りフィールドにはスペースが入れられます。
  5. COUNT IN 句を指定すると、検査された文字位置数に等しい値 (区切り文字を除く) が、 基本移動の規則に従って、データ・カウント・フィールドに移動されます。

    ステージ 3: 連続的な反復

  6. DELIMITED BY 句を指定した場合、送り出しフィールドは、区切り文字の右側にある最初の文字位置からさらに検査されます。

    DELIMITED BY 句を指定しない 場合、送り出しフィールドは、 検査された最後の文字位置の右側にある最初の文字位置からさらに検査されます。

  7. 連続した各データ受け取りフィールドに対して、検査および移動の処理が以下のことが生じるまで繰り返されます。
    • 送り出しフィールドにあるすべての文字が転送される。
    • 満たされていないデータ受け取りフィールドがなくなる。

UNSTRING ステートメントの実行終了時の値

以下の操作は、1 回だけ、UNSTRING ステートメントの実行開始時に 行われます。

  • 添え字、参照変更、変数の長さ、変数の場所の計算
  • 関数の計算

したがって、ID-4ID-5ID-6ID-7、または ID-8 が、 UNSTRING ステートメントの中で添え字、参照修飾子、または関数引数として使用される場合、 または、UNSTRING ステートメント内の ID のいずれかの長さまたは位置に 影響を与える場合、これらの値は UNSTRING ステートメントの実行開始時に決められるので、 UNSTRING ステートメントの実行結果によって影響されることはありません

UNSTRING ステートメントの例

以下の図では、UNSTRING ステートメントの例の実行結果を示しています。

この図は、UNSTRING ステートメントの例を示しています。 詳細へのリンク。


ご利用条件 | フィードバック

このインフォメーション・センターでは Eclipse テクノロジーが採用されています。(http://www.eclipse.org)