外部 REXX 関数での絶対位置決めおよび相対位置決め

入力または出力レコード内の位置を参照するすべての File Manager 外部 REXX 関数は、レコード内のバイトの位置を決定するために絶対値を使用できます。例えば、FLD 関数の構文は、次のとおりです。

FLD(start_column,length,type)

ここで、start_column は入力レコードにある特定のバイトを 参照する整数になります。

ただし、いくつかの外部 REXX 関数では、入力または出力 レコード内の「現在位置」を相対的に表す、 オフセット値として指定される位置も許容しています。現在位置は、それぞれのレコードが処理されるときに初期化されますが、これらの関数によって変更することができます。

入力レコードの場合、このことは、入力レコード内でストリングを検索し、見つかったストリングと相対位置にあるフィールドの内容をテストしたりコピーしたりするといったタスクを実行することを可能にします。

出力レコードの場合、このことは、最近に更新された出力レコードのフィールドの相対位置に、簡単にフィールドまたは定数を追加することを可能にします。例えば、正確な現在の開始位置を追跡している必要も、追加されたフィールドの長さを開始位置に手作業で反映したりする必要もなしに、いくつもの定数やフィールドを次々に出力レコードに追加することができます。

注: REXX 外部関数を使用して、出力データ・セットの論理レコードの制限を超えてデータを書き込むことはできません。例えば、LRECL が 80 の固定ブロック・データ・セットを使用しているときに、81 またはそれを超えた位置にデータを書き込むことはできません。

次の関数は、相対位置決めをサポートしています。

  • CHG_OUT
  • CHG_VAR
  • FINDNEXT
  • FINDPREV
  • FLD
  • FLD_CO
  • FLD_OUT
  • FLD_TM
  • FLD_TYPE
  • FLDI
  • FLDO
  • MOD_DATE
  • OVLY_OUT
  • OVLY_VAR
  • SETC
  • SETN
  • TESTC
  • TESTN
  • VAR_OUT
  • VAR_TM

入力および出力レコード内で現行位置を保持するために、これらの関数は INPOS と OUTPOS の 2 つの内部変数を使用します。これらの変数は REXX 環境では外部化されることはなく、上記の関数または SET_OLEN を使用することで、間接的にアクセスまたは変更することしかできません (相対位置の引数はサポートされていませんが、いくつかの環境では OUTPOS の値の変更をサポートしています)。

INPOS
処理されているそれぞれの新規レコードでは、INPOS は 1 に設定されます。INTPOS は、以下の関数が使用されると (副次作用として) 変更されます。
FLD_CO
FLD_CO 関数によってストリング (タイプ C または U) である needle の検索が正常に実行されると常に、INPOS が現在の入力レコードの位置に変更されます。needle が検出された場合、INPOS は検出された needle の最初のバイトに設定されます。needle が検出されなければ、INPOS は変更されません。
FLDI
FLDI 関数 (contains 演算子を使用) によってストリング (タイプ C または U) である needle の検索が正常に実行されると常に、INPOS が現在の入力レコードの位置に変更されます。needle が検出された場合、INPOS は検出された needle の最初のバイトに設定されます。needle が検出されなければ、INPOS は変更されません。

VER 演算子とともに FLDI 関数を使用し、検査が失敗した場合、INPOS は検査が失敗した文字の桁に設定されます。

FINDNEXT
FINDNEXT 関数によって needle の検索が正常に実行されるたびに、INPOS が変更され、検出された needle の最初のバイトに設定されます。needle が検出されなければ、INPOS は変更されません。
FINDPREV
FINDPREV 関数によって needle の検索が正常に実行されるたびに、INPOS が変更され、検出された needle の最初のバイトに設定されます。needle が検出されなければ、INPOS は変更されません。
OUTPOS
処理されているそれぞれの新規レコードでは、OUTPOS は、現行出力レコード長より 1 だけ大きく設定されます。テンプレートがレコードの再形式設定に使用されていない限り、出力レコードは当初、入力レコードと同じ長さです。OUTPOS は、以下の関数が使用されると (副次作用として) 変更されます。
CHG_OUT
CHG_OUT は、出力レコード内の最後に変更されたフィールドの終わりから 1 バイト先に OUTPOS を設定します。
FLD_OUT
FLD_OUT は、出力レコード内のオーバーレイされているフィールドの終わりから 1 バイト先に OUTPOS を設定します。
OVLY_OUT
OVLY_OUT は、出力レコード内のオーバーレイされているフィールドの終わりから 1 バイト先に OUTPOS を設定します。
SET_OLEN
SET_OLEN は、出力レコードの切り捨てを行って、削減されたレコード長より既存の OUTPOS のほうが大きくなるような場合にのみ、OUTPOS を変更します。この場合、OUTPOS は削減された長さに 1 を加算した値にリセットされます。
contains 演算子を使用する FLDO
FLDO 関数 (contains 演算子を使用) によってストリング (タイプ C または U) である needle の検索が正常に実行されると常に、OUTPOS が現在の入力レコードの位置に変更されます。needle が検出された場合、OUTPOS は検出された needle の最初のバイトに設定されます。needle が検出されなければ、OUTPOS は変更されません。

VER 演算子とともに FLDO 関数を使用し、検査が失敗した場合、OUTPOS は検査が失敗した文字の桁に設定されます。

VARPOS
処理されているそれぞれの新規レコードでは、VARPOS は 1 に設定されます。VARPOS は、以下の関数が使用されると (副次作用として) 変更されます。
CHG_VAR
CHG_VAR は、変数内の最後に変更されたフィールドの終わりから 1 バイト先に VARPOS を設定します。
OVLY_VAR
OVLY_VAR は、変数内のオーバーレイされているフィールドの終わりから 1 バイト先に VARPOS を設定します。
TESTC
TESTC 関数 (contains 演算子を使用) によってストリング (タイプ C または U) である needle の検索が正常に実行されると常に、VARPOS が現行変数位置に変更されます。needle が検出された場合、VARPOS は検出された needle の最初のバイトに設定されます。needle が検出されなければ、VARPOS は変更されません。

VER 演算子と共に TESTC 関数を使用し、検査が失敗した場合、VARPOS は検査が失敗した文字の桁に設定されます。