組み込み関数

組み込み関数は、指定されたデータに対して命令を実行 する点で命令コードに類似しています。組み込み関数は、式の中で使用することができます。また、定数値組み込み関数は名前付き定数においても使用できます。 これらの名前付き定数はどの仕様書でも使用できます。

すべての組み込み関数は、最初の文字としてパーセント記号 (%) で始まります。 組み込み関数の構文は次のとおりです。
関数名{(引数 {:引数... }) }
関数の引数は、変数、定数、式、プロトタイプ・プロシージャー、または他の組み込み関数とすることが できます。 式の引数には組み込み関数を含めることができます。 以下の例は これを例示しています。
図 1. 組み込み関数の引数の例
CL0N01Factor1+++++++Opcode(E)+Extended-factor2++++++++++++++++++++++++++
 *
 * This example shows a complex expression with multiple
 * nested built-in functions.
 *
 * %TRIM takes as its argument a string.  In this example, the
 * argument is the concatenation of string A and the string
 * returned by the %SUBST built-in function.  %SUBST will return
 * a substring of string B starting at position 11 and continuing
 * for the length returned by %SIZE minus 20.  %SIZE will return
 * the length of string B.
 *
 * If A is the string '     Toronto,' and B is the string
 * '  Ontario, Canada            ' then the argument for %TRIM will
 * be '     Toronto, Canada    ' and RES will have the value
 * 'Toronto, Canada'.
 *
C                   EVAL      RES = %TRIM(A + %SUBST(B:11:%SIZE(B) - 20))

使用できる引数の詳細については、個々の組み込み関数の説明を参照してください。

命令コードと異なり、組み込み関数は、結果のフィールドに値を入れるのではなく 、値を戻してきます。 以下の例はこの相違を例示しています。

図 2. 組み込み関数の例
CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
 *
 * In the following example, CITY contains the string
 * 'Toronto, Ontario'.  The SCAN operation is used to locate the
 * separating blank, position 9 in this illustration.  SUBST
 * places the string 'Ontario' in field TCNTRE.
 *
 * Next, TCNTRE is compared to the literal 'Ontario' and
 * 1 is added to CITYCNT.
 *
C     ' '           SCAN      CITY          C
C                   ADD       1             C
C                   SUBST     CITY:C        TCNTRE
C    'Ontario'      IFEQ      TCNTRE
C                   ADD       1             CITYCNT
C                   ENDIF
 *
 * In this example, CITY contains the same value, but the
 * variable TCNTRE is not necessary since the %SUBST built-in
 * function returns the appropriate value.  In addition, the
 * intermediary step of adding 1 to C is simplified since
 * %SUBST accepts expressions as arguments.
 *
C     ' '           SCAN      CITY          C
C                   IF        %SUBST(CITY:C+1) = 'Ontario'
C                   EVAL      CITYCNT = CITYCNT+1
C                   ENDIF

この例で使用されている引数 (変数 CITY および式 C+1) は SUBST 命令の演算項 目の値と似ていることに注意してください。関数そのものの戻り値は結果と類似しています。 一般に、組み込み関数の引数は、命令コードの演算項目 1 および演算項目 2 フィール ドと類似しています。

組み込み関数が役立つもう 1 つの機能は、定義仕様書に使用された時にコードの保守 が単純化される点です。 以下の例はこの機能を例示しています。

図 3. 組み込み関数による単純化された保守
DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords++++++++++++++++++++++++++
 *
 * In this example, CUSTNAME is a field in the
 * externally described data structure CUSTOMER.
 * If the length of CUSTNAME is changed, the attributes of
 * both TEMPNAME and NAMEARRAY would be changed merely by
 * recompiling.  The use of the %SIZE built-in function means
 * no changes to your code would be necessary.
 *
D CUSTOMER      E DS
D                 DS
D TEMPNAME                            LIKE(CUSTNAME)
D NAMEARRAY                      1    OVERLAY(TEMPNAME)
D                                     DIM(%SIZE(TEMPNAME))

組み込み関数は、拡張演算項目 2 演算仕様書で定義仕様書のキーワードと一緒に式 の中で使用することができます。定義仕様書キーワードと一緒に使用する時には、組み込み関数の値がコンパイル 時に分かっていなければならず、引数を式とすることはできません。

次の表には、組み込み関数、その引数、および戻り値がリストされています。

表 1. 組み込み関数
名前 引数 戻り値
%ABS 数値式 式の絶対値
%ADDR 変数名 {: *DATA } 変数のアドレス、または可変長変数のデータ部のアドレス
%ALLOC 割り振るバイト数 割り振られる記憶域へのポインター
%BITAND 文字、数値 すべての引数のビットの論理積 (ビット単位)
%BITNOT 文字、数値 引数のビットの反転 (ビット単位)
%BITOR 文字、数値 すべての引数のビットの論理和 (ビット単位)
%BITXOR 文字、数値 2 つの引数のビットの排他論理和 (ビット単位)
変更の始まり%CHAR変更の終わり 変更の始まり
  • 文字、グラフィック、UCS-2 式 { : ccsid }
  • 数値式
  • 日付、時刻、タイム・スタンプ式 {: 日付、時刻、またはタイム・スタンプの形式 }
変更の終わり
変更の始まり
  • 指定された CCSID の文字形式の値
  • ジョブ CCSID の文字形式の値
  • ジョブ CCSID の文字形式の値
変更の終わり
%CHECK コンパレーター・ストリング:チェックされるストリング {:開始位置 } コンパレーター・ストリング内でない文字の最初の位置。 または、見付からない場合はゼロ
%CHECKR コンパレーター・ストリング:チェックされるストリング {:開始位置 } コンパレーター・ストリング内でない文字の末尾の位置。 または、見付からない場合はゼロ
%DATE {値 {: 日付の形式 } } 指定された に対応する日付。 または、指定されていなければ現在のシステム日付。
%DAYS 日数 期間としての日数
%DEC
  • 数値式 {:数字:小数点以下の桁数 }
  • 文字式: 数字:小数点以下の桁数
  • 日付、時刻、またはタイム・ スタンプ式 {:形式 }
パック数値形式の値
%DECH

数値式または文字式:
数字:小数点以下の桁数

パック数値形式の四捨五入値
%DECPOS 数値式 10 進数の数
%DIFF 変更の始まり日付または時刻式: 日付または時刻式: 単位 {:秒の小数部の桁数 }変更の終わり 2 つの日付、時刻、またはタイム・スタンプの差を指定された単位で示したもの
%DIV 被除数: 除数 2 つの引数の割り算からの商
%EDITC 非浮動数値式:編集コード {:*CURSYM | *ASTFILL | 通貨記号 } 編集済みの値を表すストリング
%EDITFLT 数値式 浮動の文字外部表示表現
%EDITW 非浮動数値式:編集語 編集済みの値を表すストリング
%ELEM 1 配列、テーブル、または複数オカレンス・データ構造名 要素または繰り返しの数
%EOF {ファイル名 } '1' 最後に実行された反復入力、読み取り操作、またはサブファイルへの書き出し (指定された場合は特定のファイルに対する) が、ファイルの終わり条件またはファイル の先頭条件で終了した場合、およびファイルが指定されているときに、そのファイルに対して最近実行された OPEN、CHAIN、SETGT、または SETLL が 成功しなかった場合
'0' それ以外の場合
%EQUAL {ファイル名 } '1' 最後に実行された SETLL (指定された場合は特定のファイルに対する) また は LOOKUP 命令が等しい項目を見付けた場合
'0' それ以外の場合
%ERROR   '1' 最後に実行された、拡張 'E' が指定された命令コードの結果がエラーである場合
'0' それ以外の場合
%FIELDS 更新されるフィールドのリスト 該当せず
%FLOAT 数値式または文字式 浮動形式の値
%FOUND {ファイル名 } '1' 最後に実行された関係のある命令 (指定された場合は特定のファイルに対する) がレコード (CHAIN、DELETE、SETGT、SETLL)、要素 (LOOKUP)、または等しい項目 (CHECK、CHECKR、SCAN) を見付けた場合
'0' それ以外の場合
変更の始まり%GRAPH変更の終わり 変更の始まり文字、グラフィック、または UCS-2 式 { : ccsid }変更の終わり 変更の始まり指定された CCSID のグラフィック形式の値変更の終わり
%HANDLER 処理プロシージャー: 通信域 該当せず
%HOURS 時間数 期間としての時間数
%INT 数値式または文字式 整数形式の値
%INTH 数値式または文字式 整数形式の四捨五入値
%KDS

キーを含むデータ構造
{: キーの数 }

該当せず
%LEN 任意の式 数字または文字の長さ
%LOOKUPxx 引数: 配列 {:開始指標 {:要素の数 } } 突き合わせる要素の配列指標
%MINUTES 分数 期間としての分数
%MONTHS 月数 期間としての月数
%MSECONDS マイクロ秒数 期間としてのマイクロ秒数
%NULLIND ヌル値可能フィールド名 ヌル値可能フィールド用のヌル標識設定値を示す 標識形式の値
%OCCUR 複数オカレンス・データ構造名 複数オカレンス・データ構造の現行のオカレンス
%OPEN ファイル名 '1' 指定されたファイルがオープンされている場合
'0' 指定されたファイルがクローズされている場合
%PADDR プロシージャーまたはプロトタイプ名 プロシージャーまたはプロトタイプのアドレス
%PARMS なし プロシージャーに渡されたパラメーターの数
%PARMNUM プロシージャー・インターフェース・パラメーター名 プロシージャー・インターフェース・パラメーターの番号
%REALLOC ポインター: 数値式 割り振られる記憶域へのポインター
%REM 被除数: 除数 2 つの引数の割り算からの剰余
%REPLACE 置換ストリング: ソース・ストリング {:開始 位置 {:置換するソースの長さ } } 開始位置から開始し、指定された文字数を置換して、 置換ストリングをソース・ストリングに挿入することによって 生成されるストリング
変更の始まり%SCAN変更の終わり 変更の始まり検索引数:検索されるストリング{:開始位置{:長さ}}変更の終わり 変更の始まりストリング内の検索引数の最初の桁またはそれが見付からない場合はゼロ変更の終わり
変更の始まり%SCANR変更の終わり 変更の始まり検索引数:検索されるストリング{:開始位置{:長さ}}変更の終わり 変更の始まりストリング内の検索引数の最後の位置、またはゼロ (その検索引数が見つからない場合)変更の終わり
%SCANRPL

走査ストリング:
置換ストリング:
ソース・ストリング {:走査開始位置 {:走査の長さ } }

ソース・ストリング内で、開始位置から指定された長さの分を走査して、走査ストリングを置換ストリングで置換して生成したストリング
%SECONDS 秒数 期間としての秒数
%SHTDN   '1' システム・オペレーターがシャットダウンを要求している場合
'0' それ以外の場合
%SIZE 1 変数、配列、またはリテラル {:*ALL } 変数またはリテラルのサイズ
%SQRT 数値 数値の平方根
%STATUS {ファイル名 } '0' 最後に実行された、拡張 'E' が指定された命令コード以降、 プログラム・エラーまたはファイル・エラーが発生していない場合
エラーが発生した場合、プログラムまたはファイル状況 に関して設定された最新の値
ファイルが指定されている場合、戻り値は、 そのファイルに関する最新の状況
%STR ポインター {:最大長 } 最初の x'00' までの (ただしその値を含まない) ポインター引数 によってアドレスされる文字
%SUBARR 配列名:開始指標 {:要素の数 } 配列サブセット
%SUBDT 日付または時刻の式: 単位 日付または時刻の値の指定された部分を含む、符号なし数値
変更の始まり%SUBDT変更の終わり 変更の始まり日付または時刻式: 単位 {桁数 : { 秒の小数部の桁数 } }変更の終わり 変更の始まり 変更の終わり
%SUBST ストリング:開始位置 {:長さ } サブストリング
%THIS   ネイティブ・メソッド用のクラス・インスタンス
%TIME {値 {: 時刻の形式 } } 指定された に対応する時刻。 または、指定されていなければ現在のシステム時刻。
%TIMESTAMP 変更の始まり{(値 {: タイム・スタンプ形式 {: 秒の小数部の桁数 } }) }変更の終わり 指定された英数字または数字の に対応する タイム・スタンプ、または、何も指定されていなければ現在のシステム・タイム・スタンプ。
変更の始まり%TIMESTAMP変更の終わり 変更の始まり{(値 {: 秒の小数部の桁数 }) }変更の終わり 変更の始まり指定された日付またはタイム・スタンプの に対応する タイム・スタンプ、または、何も指定されていなければ現在のシステム・タイム・スタンプ。変更の終わり
%TLOOKUPxx 引数: 検索テーブル {: 代替テーブル } '*ON' 一致するものがある場合
'*OFF' それ以外
%TRIM ストリング {: トリミング対象文字 } 左および右のブランクまたは指定文字がトリミングされたストリング
%TRIML ストリング {: トリミング対象文字 } 左のブランクまたは指定文字がトリミングされたストリング
%TRIMR ストリング {: トリミング対象文字 } 右のブランクまたは指定文字がトリミングされたストリング
変更の始まり%UCS2変更の終わり 変更の始まり文字、グラフィック、または UCS-2 式 { : ccsid }変更の終わり 変更の始まり指定された CCSID の UCS-2 形式の値変更の終わり
%UNS 数値式または文字式 符号なし形式の値
%UNSH 数値式または文字式 符号なし形式の四捨五入値
%XFOOT 配列式 要素の合計
%XLATE 変換元文字: 変換先文字: ストリング {: 開始位置 } 変換元文字が変換先文字で置換されたストリング
%XML XML 文書 { : オプション } 該当せず
%YEARS 年数 期間としての年数
変更の始まり
注:
  1. 複合修飾名は許可されません。
変更の終わり