FLDI

1. Syntax

1  FLDI (
2.1! 1
2.1 start
1 ,
1 length
1 ,
1 type
1 ,
1! 'EQ'
1 operator
2?  + , value
2  , duplication
2?   VER
2  )

FASTREXX 条件式で使用できます。

start、length、および type パラメーターで定義されている入力レコード・フィールドに対して条件付きテストを実行します。

注:
  1. 演算子 (operator) および非数値の値はすべて引用符で囲み、構文エラーにならないようにする必要があります。
  2. レコード長を超える length の値を指定すると、「偽」の結果が返されます。
  3. 数値タイプ (タイプ B、P、Z) を指定した場合に、指定したフィールドに、そのタイプに無効なデータが含まれていると、関数は「偽」の結果を返します。数値データは常に整数形式で戻されます。すなわち、関数は数値データのスケールを実行しません。
start
フィールド値の読み取りを開始する入力レコード内の位置 (バイト単位)。以下のように指定できます。
絶対位置
正の整数である必要があります。start が入力レコードの現在の長さより大きければ、この関数は無効になります。
現行 INPOS からの相対位置
IPx または INx、または Px または Nx として指定できます。結果の値がゼロ以下になる場合、関数はエラーとなります。結果の値が入力レコードの現在の長さより大きいと、関数は「偽」の結果を作成します。
現行 OUTPOS からの相対位置
OPx または ONx として指定する必要があります。結果の値がゼロ以下になる場合、関数はエラーとなります。結果の値が入力レコードの現在の長さより大きいと、関数は「偽」の結果を作成します。
length
フィールドの長さ (バイト数)。
  • 2 進数フィールドの場合には、長さを指定する必要があります。これは 2、4、または 8 とすることができます。
  • 文字フィールドの場合には、長さを省略すると、次の長さにデフォルト設定されます。
    • contains 型演算子の場合は、入力レコードの残りの長さ。
    • すべての値が変数置換の場合は、入力レコードの残りの長さ。
    • その他の場合は、最大リテラル値の長さを使用。
  • パック 10 進フィールドでは、長さを指定する場合には 1 から 16 の範囲内でなければなりません。長さを省略すると、関数はレコード・データからパック・フィールドの長さを決定して、そのフィールドだけを戻します。
  • ゾーン 10 進フィールドでは、長さを指定する場合には 1 から 31 の範囲内か、またはフィールドに分離符号文字が入っている場合には 1 から 32 の範囲内でなければなりません。長さを省略すると、関数はレコードの残りを戻します。32 を超えた場合、関数は「偽」の結果を返します。
type
フィールドのデータ・タイプ。有効な値は、以下のとおりです。
B
2 進数。関数は 2 進数フィールドを符号付きと解釈します。
C
文字。これは、デフォルトです。
P
パック 10 進数。
U
フィールドを文字として解釈しますが、ストリングを戻す前に、これを大文字に変換します。
Z
ゾーン 10 進数。すべての COBOL 外部 10 進数変形を数値データとして解釈します。
オペレーター (operator)
デフォルトは EQ または = です。この機能では、動的テンプレートと基準編集で示した、すべての演算子をサポートしています。サポートする演算子の詳細と説明については、以下の節を参照してください。
入力する値は、参照されている演算子とフィールドでのコンテキストで有効な値である必要があります。例えば、複数の値を使用できる演算子は、CO (包含) など一部の演算子のみです。また、数値を入力するのは、数値フィールドを検査する場合です。
  • 16 進数ストリングの指定。16 進数ストリングは 'hhhhhh'x の形式でなければなりません。引用符で囲まれた値の文字数は偶数であり、使用される文字が有効な 16 進文字 (0–9、A–F) である必要があります。
  • バイナリー・ストリングの指定。バイナリー・ストリングは 'nnnnnn'b の形式でなければなりません。引用符で囲まれた値は「0」と「1」の組み合わせである必要があります。
  • 文字ストリングの指定。非数値タイプの場合は、値を引用符で囲む必要があります。
  • &variable_name の指定による変数の指定。一致する文字変数、数値変数、または TALLY 変数を見つけられる場合は、変数で値が代用されます。一致する変数を検出できなければ、ストリングはリテラル値として扱われます。数値比較が実行される場合、文字変数は数値に変換されます。変換に失敗すると、関数は「偽」の結果を返します。数値または TALLY 変数が文字比較で参照された場合、値は、表示画面形式に変換され、先行ゼロが除去された数値になります。
duplication
整数 n を指定することで、リテラル値を n 回複写します。
注: これは、単一値をサポートする演算子 (例えば、Not contains) に、その値がリテラル定数であり、置換変数でない場合にのみ使用できます。
VER
フィールドが、「値」列で指定されている文字だけで構成されていることを検証します。

例 1

入力レコードを検査し、レコードに値「Smith」または「Jones」が含まれているレコードのみを処理します。

注: この場合は、包含処理で大/小文字の区別を行わないため演算子 CU を使用します。
  if FLDI(1,,C,'CU','Smith','Jones') then
     return
   else
     return 'DROP'

例 2

salary が 75000 より大きいすべてのレコードを処理します。ここで、salary は、開始位置 28 で検出されるパック 10 進数値です。

注: この事例では、File Manager がパック 10 進数フィールドの長さを計算します。
  if FLDI(28,,P,'>',75000) then
     return
   else
     return 'DROP'

例 3

開始位置 10 に値「ABCABCABCABCABC」があるすべての入力レコードを処理します。

注: length は、リテラル値の長さである 15 にデフォルト設定されます。
If FLDI(10,'=','ABC',5) then
     return
  else
     return 'DROP'

例 4

例 2 と同じですが、数値変数を使用します。
SETN(salary_high,75000)
if FLDI(28,,P,'>','&salary_high') then
     return
   else