ダイアログマネージャコマンドからの関数の呼び出し
ダイアログマネージャで関数を呼び出すには、次の方法があります。
- -SET コマンドからの呼び出し。関数の結果を変数に格納します。詳細は、ダイアログマネージャコマンドからの関数の呼び出しを参照してください。
- -IF コマンドからの呼び出し。詳細は、WHERE/IF 条件での関数の呼び出しを参照してください。
- オペレーティングシステムの -RUN コマンドからの呼び出し。詳細は、ダイアログマネージャコマンドからの関数の呼び出しを参照してください。
ダイアログマネージャは数値引数を倍精度フォーマットに変換します。これは、引数の値が数値の場合に発生し、関数で使用可能なフォーマットとは無関係です。このため、ダイアログマネージャで関数の引数を指定する場合は、注意が必要です。
文字列を受容する関数に数値文字列を入力すると、倍精度浮動小数点数へ変換されるため、正しくない結果が発生します。この問題を解決するには、文字列の末尾に数値ではない文字を追加します。ただし、この追加文字は引数の長さから除外します。
ダイアログマネージャの日付変数 (例、&YYMD) は、レガシー日付を日付フォーマット (基準日からのオフセット) ではなく、文字フォーマットで返します。レガシー日付の代わりに日付オフセットを必要とする関数の場合、日付変数を引数として使用する前に、DATECVT 関数を使用して日付変数を日付オフセットに変換する必要があります。次に、DATECVT 関数を再度使用して、結果をレガシー日付に変換します。以下はその例です。
-SET &TODAY_OFFSET=DATECVT(&YYMD , 'I8YYMD' , 'YYMD'); -SET &BEG_CUR_YR=DATEMOV(&TODAY_OFFSET.EVAL , 'BOY'); -SET &CLOSE_DTBOY=DATECVT(&BEG_CUR_YR.EVAL , 'YYMD' , 'I8YYMD')';
関数結果の変数への割り当て
-SET コマンドを使用すると、関数の結果を変数に格納することができます。
ダイアログマネージャ変数は、文字データのみを格納することができます。関数からダイアログマネージャ変数に返される値が数値の場合、値は整数に切り捨てられ、文字フォーマットに変換されてから変数に格納されます。
関数の結果の変数への割り当て
-SET &variable = function(arg1, arg2[.LENGTH],..., 'format');
結果が割り当てられる変数です。
関数です。
関数の引数です。
変数の長さを返します。入力引数として文字列の長さをとる関数では、文字列の入力を要求して .LENGTH 接尾語で長さを決定することができます。
結果のフォーマットです。フォーマットは一重引用符 (') で囲みます。.EVAL 接尾語を使用しない限り、出力引数にダイアログマネージャ変数を指定することはできません。ただし、変数を入力引数として指定することは可能です。
-SET コマンドからの関数の呼び出し
AYMD は、&INDATE の値に 14 日を加えます。&INDATE 変数は、プロシジャにより、6 桁の年月日フォーマットに設定済みです。
-SET &OUTDATE = AYMD(&INDATE, 14, 'I6');
出力日付のフォーマットは、6 桁の整数 (I6) です。フォーマットは出力が整数であることを示していますが、この値は文字列として &OUTDATE 変数に格納されます。このため、&OUTDATE の値を表示すると、年、月、日の間にスラッシュ (/) はありません。
関数の結果に基づく分岐の設定
ダイアログマネージャの -IF コマンドから関数を呼び出すことにより、関数の結果に基づいて分岐を設定することができます。
分岐コマンドが複数行にわたる場合、先頭フィールドにハイフン (-) を入力することで、次の行に続けることができます。
関数の結果関数の結果に基づく分岐の設定
-IF function(args) relation expression GOTO label1 [ELSE GOTO label2];
関数です。
引数です。
EQ や LE など、関数と式との関係を表す演算子です。
値、論理式、または関数です。カンマ (,) やブランクが含まれていない限り、リテラルを一重引用符 (') で囲むことはできません。
12 バイト以内のユーザ定義の名前です。-QUIT または -EXIT を除くダイアログマネージャコマンド名やブランクを含めることはできません。関数、算術演算子、論理演算子と間違えやすい語句を使用することはできません。
label テキストは、プロシジャ内の -IF 条件の前後に記述することができます。
-IF テストに失敗した場合に制御を label2 に渡します。
関数の結果に基づく分岐の設定
AYMD 関数の結果は -IF テストの条件を指定します。関数の結果に応じて、2 つのリクエストのいずれかが実行されます。
-LOOP 1. -IF &INDATE EQ 0 GOTO EXIT; 2. -SET &WEEKDAY = DOWK(&INDATE, 'A4'); 3. -TYPE START DATE IS &WEEKDAY &INDATE 4. -IF AYMD(&INDATE, &DAYS, 'I6YMD') LT 960101 GOTO EARLY; 5. -TYPE LONG PROJECT -*EX LONGPROJ -RUN -GOTO EXIT 6. -EARLY -TYPE SHORT PROJECT -*EX SHRTPROJ -RUN -EXIT
このプロシジャは、次のように処理されます。
- 0 (ゼロ) を入力すると、制御は -EXIT に渡され、処理は終了します。
- DOWK 関数により開始日の曜日が取得されます。
- -TYPE コマンドにより、プロジェクト開始日の曜日と日付が表示されます。
- AYMD 関数によりプロジェクト終了日が計算されます。この日付が 1996 年 1 月 1 日以前の場合、-IF コマンドによりラベル「EARLY」への分岐が実行されます。
- 1996 年 1 月 1 日より後にプロジェクトが終了する場合、TYPE コマンドにより「LONG PROJECT」という語句が表示され、処理は終了します。
- プロシジャがラベル「EARLY」に分岐する場合、TYPE コマンドにより「SHORT PROJECT」という語句が表示され、処理は終了します。
関数の結果に基づく分岐の設定
AYMD 関数の結果は -IF テストの条件を指定します。関数の結果に応じて、2 つのリクエストのいずれかが実行されます。
-LOOP 1. -PROMPT &INDATE.ENTER START DATE IN YEAR-MONTH-DAY FORMAT OR ZERO TO EXIT:. 2.IF &INDATE EQ 0 GOTO EXIT; 3.SET &WEEKDAY = DOWK(&INDATE, 'A4'); 4. -TYPE START DATE IS &WEEKDAY &INDATE 5. -PROMPT &DAYS.ENTER ESTIMATED PROJECT LENGTH IN DAYS:. 6. -IF AYMD(&INDATE, &DAYS, 'I6YMD') LT 960101 GOTO EARLY; 7. -TYPE LONG PROJECT -*EX LONGPROJ -RUN -GOTO EXIT 8. -EARLY -TYPE SHORT PROJECT -*EX SHRTPROJ -RUN -GOTO EXIT -EXIT
このプロシジャは、次のように処理されます。
- プロジェクトの開始日を YYMMDD フォーマットで指定するよう要求されます。
- 0 (ゼロ) を入力すると、制御は -EXIT に渡され、処理は終了します。
- DOWK 関数により開始日の曜日が取得されます。
- -TYPE コマンドにより、プロジェクト開始日の曜日と日付が表示されます。
- プロジェクトの推定期間を日数で入力するよう要求されます。
- AYMD 関数によりプロジェクト終了日が計算されます。この日付が 1996 年 1 月 1 日以前の場合、-IF コマンドによりラベル「EARLY」への分岐が実行されます。
- 1996 年 1 月 1 日より後にプロジェクトが終了する場合、TYPE コマンドにより「LONG PROJECT」という語句が表示され、処理は終了します。
- プロシジャがラベル「EARLY」に分岐する場合、TYPE コマンドにより「SHORT PROJECT」という語句が表示され、処理は終了します。
オペレーティングシステム RUN コマンドからの関数の呼び出し
文字フォーマットの引数のみを含む関数は、ダイアログマネージャコマンドの -TSO RUN または -MVS RUN コマンドで呼び出すことができます。この種の関数は特定の作業を実行しますが、通常、値を返すことはありません。
関数が数値フォーマットの引数をとる場合、ATODBL 関数により、倍精度浮動小数点数フォーマットに変換する必要があります。これは、-SET コマンドとは異なり、オペレーティングシステムの RUN コマンドは、数値引数を倍精度フォーマットに自動的に変換しないためです。
オペレーティングシステム -RUN コマンドからの関数の呼び出し
{-TSO|-MVS} RUN function, input1, input2, ... [,&output]
オペレーティングシステムです。
関数の名前です。
引数です。関数名と各引数はカンマ (,) で区切ります。文字リテラルは一重引用符 (') で囲まないでください。文字列の長さを引数にとる関数の場合、文字列の入力を要求し、.LENGTH 接尾語で長さをテストすることができます。
ダイアログマネージャ変数です。関数が値を返す場合、この引数を含めます。それ以外の場合は、省略します。出力変数を指定する場合、-SET コマンドにより、この長さを定義しておく必要があります。
たとえば、関数が 8 バイト長の値を返す場合は、関数を呼び出す前に、一重引用符 (') で囲んだ 8 バイト長の変数を定義しておきます。
-SET &output = '12345678';