関数 ID の一般的なフォーマットは次のとおりです。
フォーマット: 関数 ID >>-FUNCTION--関数名-1--+----------------+--+-------+-------------->< | .------. | '-参照修飾子-' | V | | '-(----引数-1-+--)-'
引数-1 は、UNDATE 組み込み関数の場合を除いて、ウィンドウ表示日付フィールドであってはなりません。
関数 ID は、その関数タイプのデータ項目を使用できるところであればどこでも指定できます。関数の引数は、同じ関数についての別の評価を含め、結果がその引数の要件を満たす、任意の関数または関数を含む式にすることができます。
手続き部のステートメント内では、それぞれの関数 ID は、それと同じ位置にも ID に関連付けられた参照変更や添え字付けがあれば、それらが評価される時に同時に評価されます。
ある関数のクラスと特性、およびそれが必要とする引数の個数とタイプは、 その関数定義によって決定されます。 関数の有する特性には、次のようなものがあります。
いくつかの関数の場合、そのクラスと特性は、 その関数への引数によって決定されます。
組み込み関数の評価はコンテキストには影響されません。 つまり、関数評価は関数以外の操作やオペランドには影響されません。 ただし、関数の評価は、引数の属性によって影響を受ける場合があります。
手続き部のステートメント内では、それぞれの関数 ID は、それと同じ位置にも ID に関連付けられた参照変更や添え字付けがあれば、それらが評価される時に同時に評価されます。
COBOL の関数には以下のタイプがあります。
英数字 関数は、英数字のクラスとカテゴリーに属します。 戻り値は、暗黙のうちに USAGE DISPLAY になります。 戻り値の文字位置の数は、関数定義によって決定されます。
国別 関数は、国別のクラスとカテゴリーに属します。 戻り値は、暗黙のうちに USAGE NATIONAL を持ち、国別文字 (UTF-16) で表現されます。戻り値の文字位置の数は、関数定義によって決定されます。
数字 関数は、数字のクラスとカテゴリーに属します。戻り値は、常に演算符号を持つとみなされ、数字の中間結果になります。 詳細については、「Enterprise COBOL プログラミング・ガイド」を参照してください。
整数 関数は、数字のクラスとカテゴリーに属します。 戻り値は、常に演算符号を持つとみなされ、整数の中間結果になります。 戻り値の桁数は、関数定義によって決定されます。 詳細については、「Enterprise COBOL プログラミング・ガイド」を参照してください。
英数字引数は使用できる任意の関数の引数として、英数字関数を使用することができます。
英数字関数の参照変更は許可されています。 ある関数に対して参照変更が指定されている場合、その参照変更の評価は、その関数の評価の直後に行われます。 つまり、関数の戻り値は参照変更されます。
次の場合、英数字関数は使用できません。
国別引数は使用できる任意の関数の引数として、国別関数を使用することができます。
国別関数の参照変更は許可されています。 ある関数に対して参照変更が指定されている場合、その参照変更の評価は、その関数の評価の直後に行われます。 つまり、関数の戻り値は参照変更されます。
国別関数は使用できません。
数字引数を使用できる関数の引数として、数字関数を参照することができます。
たとえ個々の参照が整数値をもたらす場合でも、 数字関数は、整数オペランドが必要とされるところでは使用することができません。関数 INTEGER または関数 INTEGER-PART を使用すると、 引数のタイプを数字から整数に強制的に変えることができます。
整数引数を使用できる関数の引数として、整数関数を参照することができます。
使用上の注意:
関数によって戻り値は、その関数が評価されるときに、関数 ID の中で指定された引数によって決定される場合があります。関数の中には引数が不要なものもあれば、引数の固定数が必要なもの、さらには引数の可変数を受け入れるものがあります。
引数は、次のいずれかのうちの 1 つでなければなりません。
関数の個別の引数指定については、関数の定義を参照してください。
引数のタイプには次のものがあります。
関数によっては、その引数に対して制約 (受け入れ可能な値の範囲など) を設けているものがあります。関数に対して引数として割り当てられる値が、 指定の制限に適合しない場合には、戻り値は未定義になります。
ネストされた関数が引数として使用される場合、その引数の評価は、 その関数より外側の関数が持つ引数によって影響を受けることはありません。
同一の関数のレベルにある引数だけが、相互作用します。 この相互作用は、次の 2 つの領域で発生します。
関数の評価においては、その引数は、 引数リストに指定された順番に左から右へと個別的に評価されます。 評価される引数は、関数 ID、または関数 ID を含む式であることができます。
算術式を引数として指定し、その式の最初の演算子が単項演算子の加算記号または減算記号である場合、 式はその直前に左括弧を必要とします。
浮動小数点リテラルは、数字引数が使用できる個所ならどこでも使用できます。また、数字引数が許される関数の中で使用する算術式中でも使用できます。
内部浮動小数点項目および外部浮動小数点項目 (display 浮動小数点および国別浮動小数点の両方) は、数字引数が許される個所であればどこでも使用できます。また、数字引数が許される関数への引数として算術式の中でも使用できます。
浮動小数点項目および浮動小数点リテラルは、整数引数が必要とされる個所や、英数字または国別クラスの引数が必要とされる個所 (LOWER-CASE、REVERSE、 UPPER-CASE、NUMVAL、および NUMVAL-C 関数など) では使用できません。
以下のステートメントは、英数字引数の中の各小文字を対応する大文字に置き換える、組み込み関数 UPPER-CASE の使用例です。
MOVE FUNCTION UPPER-CASE('hello') TO DATA-NAME.
このステートメントは、HELLO を DATA-NAME へ移動します。
以下のステートメントは、国別引数の中の各小文字に対応する大文字に置き換える組み込み関数 LOWER-CASE の使用例です。
MOVE FUNCTION LOWER-CASE(N'HELLO') TO N-DATA-NAME.
このステートメントは、国別文字 hello を N-DATA-NAME へ移動します。
以下のステートメントは、数字組み込み関数の使用例です。
COMPUTE NUM-ITEM = FUNCTION SUM(A B C)
このステートメントは数字関数 SUM を使用して、A、B、および C の値を加算し、その結果を NUM-ITEM へ格納します。
関数が 1 つの引数を任意の回数で繰り返して使用することができる場合、 テーブルを識別するデータ名と修飾子を指定することによって、そのテーブルを参照することができます。これはその直後に、 1 つ以上の添え字として ALL の添え字付けを行うことができます。
ヒント: ALL 添え字の評価は、少なくとも 1 つの引数の中に結果としてもたらされる必要があります。 さもなければ、その関数によって戻り値は、未定義になってしまいます。 ただし、SSRANGE コンパイラー・オプションと CHECK ランタイム・オプションを指定すれば、実行時に状況の診断ができます。
添え字として ALL を指定するのは、その添え字の位置にあらゆる有効な添え字を使用して、 すべての可能なテーブル・エレメントを指定することと同じです。
テーブル名 (ALL) としてテーブル引数を指定する場合、 1 つの引数として左から右への順序で各テーブル・エレメントの暗黙指定をします。この場合、最初 (左端) の引数が、テーブル名 (1) であり、ALL が 1 によって置き換えられます。 次の引数はテーブル名 (2) です。ここで、添え字の値は 1 だけ増加されています。 このプロセスは、暗黙の引数を 1 つずつ生成するために添え字の値を 1 ずつ増加しながら続行され、 添え字の値が ALL の値の範囲の最大値に達するまで行われます。
例えば、
FUNCTION MAX(Table(ALL))
は次のものと同じになります。
FUNCTION MAX(Table(1) Table(2) Table(3) ... Table(n))
ここで n は、Table の中のエレメント数です。
テーブル名 (ALL, ALL, ALL) のように ALL 添え字が複数ある場合、最初の暗黙の引数はテーブル名 (1, 1, 1) となります。ここで、各 ALL 添え字は 1 によってそれぞれ置き換えられています。次の引数はテーブル名 (1, 1, 2) となります。ここでは、右端の添え字が 1 だけ増加されてます。右端の ALL によって表現される添え字は、その値の範囲の限度まで増加され、それぞれの値に対する暗黙の引数を作り出します。
いったん ALL として指定された添え字が、その値の範囲の限度まで増加されると、 その左にある ALL として指定されている次の添え字が 1 だけ増加されます。 新たに増加される添え字の右にある ALL として指定されている各添え字は、 1 に設定されて暗黙の引数が作り出されます。 ここで再び、 右端の ALL によって表現されている添え字がその値の範囲の限度まで増加され、 その値に対し暗黙の引数を作り出します。 この処理は、 ALL として指定されている各添え字がその値の範囲の限度に増加されるまで繰り返されます。
例えば、
FUNCTION MAX(Table(ALL, ALL))
は次のものと同じになります。
FUNCTION MAX(Table(1, 1) Table(1, 2) Table(1, 3) ... Table(1, n)
Table(2, 1) Table(2, 2) Table(2, 3) ... Table(2, n)
Table(3, 1) Table(3, 2) Table(3, 3) ... Table(3, n)
...
Table(m, 1) Table(m, 2) Table(m, 3) ... Table(m, n))
ここで、n は Table の列の次元の中のエレメント数であり、m は Table の行の次元の中のエレメント数です。
ALL 添え字は、リテラル、データ名、 または指標名の各添え字と結合して多次元テーブルを参照することができます。
例えば、
FUNCTION MAX(Table(ALL, 2))
は次のものと同じになります。
FUNCTION MAX(Table(1, 2)
Table(2, 2)
Table(3, 2)
...
Table(m, 2))
ここで、m は Table の行の次元の中のエレメント数です。
ALL 添え字が、ある引数に対して指定され、その引数が参照変更を行う場合、 その参照修飾子は、テーブルのエレメントとして暗黙に指定されたそれぞれのエレメントに適用されます。
ALL 添え字が参照変更を行うオペランドに対して指定されている場合、 その参照修飾子は、 テーブルのエレメントとして暗黙に指定されたそれぞれのエレメントに適用されます。
ALL 添え字が OCCURS DEPENDING ON 節に関連付けられている場合、 その値の範囲は、OCCURS DEPENDING ON 節のオブジェクトによって決定されます。
例えば、次のような給与計算レコードの定義があります。
01 PAYROLL.
02 PAYROLL-WEEK PIC 99.
02 PAYROLL-HOURS PIC 999 OCCURS 1 TO 52
DEPENDING ON PAYROLL-WEEK.
次の COMPUTE ステートメントを使用することによって、 その年のその日までの就業時間の合計、週当たりの最大勤務時間、 および最大勤務時間があった週を識別することができます。
COMPUTE YTD-HOURS = FUNCTION SUM (PAYROLL-HOURS(ALL)) COMPUTE MAX-HOURS = FUNCTION MAX (PAYROLL-HOURS(ALL)) COMPUTE MAX-WEEK = FUNCTION ORD-MAX (PAYROLL-HOURS(ALL))
これらの関数呼び出しにおいて、ALL 添え字を使用することによって PAYROLL-HOURS 配列の (PAYROLL-WEEK フィールドの実行時間値に応じて異なる) すべてのエレメントを参照できます。