CALLコマンドは、プログラムを起動するコマンドです。プログラムに引数が指定されている場合、これらの引数は必ずカッコで囲まれており、コールされるプログラムに渡されます。
パラメータ
コールされるプログラムの名前。
コールされるプログラムに必要な1つ以上のオプションの引数。これらの引数は、コールされるプログラムでARGUMENTを使用して宣言するか、またはARGを使用して参照します。プログラムにARGUMENT文が使用されている場合は、CALLを使用してプログラムを起動する際に、コールされるプログラムで宣言されている引数の順序と一致するように引数を指定します。
使用上の注意
ディメンションの引数
ディメンションの値やディメンション名を引数として渡す場合は、'Jan96'
のように、正確なテキスト値を一重引用符で囲む必要があります。プログラムの引数をARGUMENT文で宣言する場合は、テキスト値を評価するテキスト式を渡すことができます。
プログラムの戻り値
値を返すプログラムをCALLを使用して起動した場合、戻り値は廃棄されます。プログラムがファンクションまたはコマンドとして起動されたか、またはCALLを使用して起動されたかを判別するには、そのプログラムにCALLTYPEファンクションを使用します。
ARGUMENTコマンドまたはARGファンクション
コールされるプログラムでは、ARGUMENT文またはARGファンクションのいずれかを使用して引数を処理できます。CALLによって起動したプログラムやファンクションとして起動したプログラムでは、ARGSファンクションおよびARGFRファンクションは、必ずNA
を返します。
引数がARGUMENT文で宣言されていないプログラムをCALLによって起動した場合、渡された引数はARGファンクションを使用して参照します。ただし、ARGファンクションはテキストを処理するファンクションなので、渡された引数はすべてテキスト値として解釈します。NTEXT引数を渡す場合は、ARGではなく、必ずARGUMENTを使用してNTEXT引数を宣言してください。ARGを使用すると、NTEXT引数はTEXTに変換され、NTEXTの値がデータベースのキャラクタ・セットで表現できないと、データが失われる可能性があります。
ARGUMENT文の処理
プログラムをCALL文を使用して起動するか、またはファンクションとして起動する場合は、次の2段階の処理が発生します。いずれかの段階でエラーが発生した場合、プログラムは実行されません。
指定したデータ型を確定する。コール側プログラムで指定した引数の式は、左から右に評価され、そのデータ型が識別されます。ディメンション値を表す式には、テキスト(TEXT
またはID
)、数値(INTEGER
、DECIMAL
など)またはRELATION値が使用可能です。引数の式の1つにエラーがあると、処理は停止します。
指定した各データ型と宣言したデータ型を一致させる。引数の式の順序は、コールされるプログラムで宣言された引数の順序と一致します。最初の引数の式は最初に宣言された引数変数と一致し、2番目の引数の式は2番目に宣言された引数変数と一致します(以降同様)。それぞれの式は、引数変数の宣言されたデータ型に順次変換されます。
引数変数をディメンション値として宣言すると、コール側プログラムから渡される対応する値は、指定したディメンションの値を表すTEXT
またはID
、論理的なディメンションの位置を表す数値、物理的なディメンションの位置を表すRELATIONのいずれかになります。対応する値が整数以外の数値(DECIMAL
など)の場合は、論理的なディメンション位置を表す最も近いINTEGER
値に丸められます。
引数変数をディメンション値以外の値として宣言し、コール側プログラムから渡された対応する値がRELATION値の場合、エラーが発生します。RELATION値を渡し、それをTEXT
引数として受け取る場合は、CONVERTファンクションを使用し、プログラムの引数リストの値を変換します。
余分な引数を持つARGUMENT文
コール側プログラムで指定した引数の数が、コールされるプログラムで宣言されている引数の数より多い場合、コール側プログラムで指定した余分な引数は無視されます。コール側プログラムで指定した引数の数が、コールされるプログラムで宣言されている引数の数より少ない場合、コールされるプログラムで宣言されている余分な引数変数にはNA
値が代入されます。
値で渡されるARGUMENT文
ARGUMENT文を使用して引数を宣言すると、引数は値でプログラムに渡されます。したがって、コールされるプログラムには引数の値のみが渡され、このプログラムに関連するアナリティック・ワークスペース・オブジェクトへのアクセスは行われません。ただし、アナリティック・ワークスペース・オブジェクトの名前を一重引用符で囲んだ引数として指定した場合は、アナリティック・ワークスペース・オブジェクトの値は渡されません。そのかわりに、このオブジェクトの名前がテキスト文字列として渡されます。例9-59「プログラムまたはファンクションのコール」を参照してください。
例
例9-59 プログラムまたはファンクションのコール
この例では、2つのプログラムroundup.p
とroundup.f
を様々な方法で使用してデータを評価し、出力を生成する例を示します。
roundup.p
プログラムには、10進変数の名前をテキスト文字列として使用し、この変数の値を近似値のINTEGER
に丸めた値のレポートを生成します。roundup.f
プログラムにも10進変数の名前を使用できます。ただし、変数の名前をテキスト文字列として渡すかわりに、変数の値を引数として渡します。roundup.f
では、レポートは生成されません。そのかわりに、10進変数のそれぞれの値が、近似値のINTEGER
に丸められて返されます。
roundup.p
プログラムはCALLによって起動し、REPORT文が記述されています。これとは対照的に、roundup.f
は、戻り値がREPORT文への引数として使用されるユーザー定義ファンクションとして起動します。
roundup.p
プログラムでは、テキスト引数を宣言するためにARGUMENTを使用します。roundup.p
を起動すると、このプログラムでは引数が10進変数の名前として使用されます。コール側プログラムでは、コールされるプログラムがディメンション化された変数のすべての値にアクセスできるようにするために、変数の名前を渡します。コール側プログラムが変数の名前ではなく変数自体を渡した場合は、コールされるプログラムがアクセスできる値は1つに限定されます。このプログラムからは値は返されず、レポートが生成されます。
DEFINE roundup.p PROGRAM INTEGER PROGRAM ARGUMENT varname TEXT Report Down Line Across Month: Heading 'VARNAME' - IF INTPART(&varname) EQ &varname - THEN &varname ELSE INTPART(&varname) + 1 END
次の文
LIMIT division TO 1 LIMIT month TO 1 TO 4 DECIMALS = 0 CALL roundup.p('actual')
生成されるレポートは、次のとおりです。
DIVISION: CAMPING ----------------- Varname------------------ -------------------MONTH------------------- LINE Jan95 Feb95 Mar95 Apr95 -------------- ---------- ---------- ---------- ---------- revenue 533,363 572,797 707,198 968,858 cogs 360,811 400,902 478,982 641,716 gross.margin 172,553 171,895 228,217 327,143 marketing 37,370 38,867 51,224 69,439 selling 89,008 86,458 102,233 139,567 r.d 24,308 23,400 39,943 57,186 opr.income 21,868 23,171 34,819 60,952 taxes 15,971 16,320 23,030 27,584 net.income 5,898 6,851 11,789 33,368
同じレポートを生成するにはこれ以外にも、REPORT文への引数として使用できるユーザー定義ファンクションとして次のようなroundup.f
というプログラムを作成するという方法があります。
DEFINE roundup.f PROGRAM INTEGER PROGRAM ARGUMENT realval DECIMAL IF realval EQ INTPART(realval) THEN RETURN INTPART(realval) ELSE RETURN INTPART(realval) + 1 END
次の文
LIMIT division TO 1 LIMIT month TO 1 TO 4 DECIMALS = 0 REPORT DOWN line ACROSS month: roundup.f(actual)
生成されるレポートは、次のとおりです。
DIVISION: CAMPING ------------ ROUNDUP.F(ACTUAL)------------- -------------------MONTH------------------- LINE Jan95 Feb95 Mar95 Apr95 -------------- ---------- ---------- ---------- ---------- revenue 533,363 572,797 707,198 968,858 cogs 360,811 400,902 478,982 641,716 gross.margin 172,553 171,895 228,217 327,143 marketing 37,370 38,867 51,224 69,439 selling 89,008 86,458 102,233 139,567 r.d 24,308 23,400 39,943 57,186 opr.income 21,868 23,171 34,819 60,952 taxes 15,971 16,320 23,030 27,584 net.income 5,898 6,851 11,789 33,368
(roundup.f
プログラムをroundup.p
プログラムと比較してください。roundup.f
からは値が返されますが、レポートは生成されません。)