call

EGL の call ステートメントは、メインプログラムから呼び出し先プログラムへ制御権を移動します。 呼び出し先プログラムは、終了時に制御権をメインプログラムに戻します。

メインプログラムはオプションでパラメーターを呼び出し先パラメーターに渡します。呼び出し先プログラムが渡されたデータを変更すると、呼び出し側が使用できるストレージ領域も変わります。 メインプログラムと呼び出し先プログラムの違いについて詳しくは、『プログラム・パーツ』を参照してください。

プログラム呼び出しは、ローカルまたはリモートです。ローカル呼び出しの定義は、プラットフォームによって異なります。

呼び出し先プログラムは、EGL で生成されたプログラムであるか、外部定義されていると見なされるかのいずれかです。 プログラムが外部定義されていることを示す方法に関する詳細については、このトピックの『構文』セクションで isExternal プロパティーの説明を参照してください。

call ステートメントで渡す引数の数、型、および順序は、呼び出し先プログラムで予期されるパラメーターの数、型、および順序と一致している必要があります。一回のローカル呼び出しで渡すことができるパラメーターの数に制限はありません。リモート呼び出しの場合、受け渡し可能なパラメーターの数およびサイズに対する制限があります。すべてのリモート呼び出し実装は、少なくとも 30 のパラメーター (結合パラメーター長が 32,000 バイト未満) での受け渡しをサポートします。独自の設計で、30 を超えるパラメーターか、呼び出しごとに 32,000 バイトを超える受け渡しを必要とする場合、すべての必要な実装でテストして、受け渡しに必要なデータ量がサポートされていることを確認します。

リテラルおよび定数には、以下の規則が適用されます。

サービス呼び出しでの call ステートメントの使用に関する詳細については、『サービス・アクセスのための call ステートメントとコールバック関数のコーディング』を参照してください。

VisualAge® Generator からマイグレーションしたプログラムを呼び出す場合、VisualAge Generator Developer は通常、固定テキスト変数型を使用することを覚えておいてください。 textLiteralDefaultIsString プロパティーを使用するか、リテラルに型を指定することにより、文字リテラルの型を制御できます。textLiteralDefaultIsString プロパティーの詳細については、textLiteralDefaultIsStringを参照してください。リテラルについては、リテラルを参照してください。

構文

call 文の構文図
programName
呼び出し先プログラムの名前。 プログラムは、EGL で生成されたプログラムであるか、外部定義されていると見なさるかのいずれかです。 多くのプログラム名 (UNIX 上のプログラム名や Java で作成されたプログラム名など) には、大/小文字の区別があります。 EGL デバッガー内のプログラム名には、大/小文字の区別がありません。 名前は、引用符なしの直接のパーツ参照、引用符で囲まれたリテラル文字列、または変数、 あるいは定数名にすることができます。
argument
コンマで区切られた一連の値参照の 1 つ。 引数にはプリミティブ変数、書式、レコード、プリミティブ型の配列、レコードの配列、非数値リテラル、または非数値定数を指定できます。 EGL が生成時に呼び出し先プログラムにアクセスできる場合は、引数には、より複雑な日時式、数式、またはテキスト式を指定できます。ANY、ArrayDictionary、BLOB、CLOB、DataTable、または Dictionary 型のフィールドを渡すことはできません。 これらの型の配列や、これらの型のいずれかを含むレコードを渡すことはできません。 ローカル呼び出しの場合、引数の数に制限はありません。リモート呼び出しは、30 個を超える引数をサポートしない可能性があります。
properties
以下のプロパティーをサポートします。
isExternal
Boolean プロパティーです。
  • デフォルトである NO は、外部プログラムが呼び出されているかどうかをリンケージ・オプション・パーツ内の callLink 要素が指定することを示します。callLink 要素に値を設定した方が柔軟性が高くなります。設定はコードには組み込まれません。

    callLink 要素の関連属性は、ローカル呼び出しの場合は pgmType で、リモート呼び出しまたは EJB 呼び出しの場合は remotePgmType です。

  • YES は、非 EGL 生成のプログラムが呼び出されていることを示します。
isNoRefresh
呼び出し元がテキスト書式を表示し、以下のいずれかの状況が有効になっている場合のみ有効である boolean プロパティー。
  • 呼び出し先プログラムがテキスト書式を表示しない。
  • 呼び出し元が呼び出し後にフルスクリーン・テキスト書式を書き込む。

このプロパティーには、以下の 2 つの値があります。

  • デフォルトである NO は、画面の最新表示を回避するかどうかをリンケージ・オプション・パーツ内の callLink 要素が指定することを示します。(特に、refreshScreen 属性では) callLink 要素に値を設定した方が柔軟性が高くなります。決定はコードには組み込まれません。
  • YES は、呼び出し先プログラムが制御を戻すときに、画面の最新表示を回避することを示します。
linkageKey
リンケージ・オプション・パーツで callLink 要素を参照する文字列。 この文字列は、その要素内の pgm 属性と一致します。詳細については、『linkageKey』を参照してください。
timeout
サービスの呼び出しと応答の間で経過する有効な最大ミリ秒数を表す整数。call ステートメントでは、このプロパティーは、値が Web サーバー上の EGL Rich UI プロキシーがサービスを呼び出すときと、プロキシーが応答を受信するときの間の最大ミリ秒数である Rich UI アプリケーション専用です。詳細については、『サービス・アクセスのための call ステートメントとコールバック関数のコーディング』を参照してください。

有効な呼び出し

EGL 生成コードとの間で使用できる有効な呼び出しは、以下の表のとおりです。

表 1. EGL における有効な呼び出し
呼び出し側オブジェクト 呼び出されるオブジェクト
J2EE の外部の Java クラス内 EGL 生成 Java ラッパー EGL 生成 Java プログラム (J2EE 以外)
J2EE アプリケーション・クライアント内 EGL 生成 Java プログラム
EGL 生成 EJB セッション Bean
IMS/VS プログラム (EGL または EGL 以外で生成された)
IMS™ トランザクション
CICS プログラム (EGL または EGL 以外で生成された)
J2EE アプリケーション・クライアント内 EGL 生成 Java ラッパー EGL 生成 Java プログラム (J2EE 以外)
J2EE アプリケーション・クライアント内 EGL 生成 Java プログラム
EGL 生成 EJB セッション Bean
IMS/VS プログラム (EGL または EGL 以外で生成された)
IMS トランザクション
CICS プログラム (EGL または EGL 以外で生成された)
J2EE Web アプリケーション内 EGL 生成 Java ラッパー EGL 生成 Java プログラム (J2EE 以外)
J2EE アプリケーション・クライアント内 EGL 生成 Java プログラム
同一の J2EE Web アプリケーション内 EGL 生成 Java プログラム
EGL 生成 EJB セッション Bean
IMS/VS プログラム (EGL または EGL 以外で生成された)
IMS トランザクション
CICS プログラム (EGL または EGL 以外で生成された)
J2EE の外部の EGL 生成 Java プログラム EGL Java プログラム (J2EE 以外)
J2EE アプリケーション・クライアント内の EGL Java プログラム
EGL EJB セッション Bean
IBM® i 上の Java プログラム
IBM i 上の COBOL プログラム
C または C++ で作成された非 EGL プログラム
IMS/VS プログラム (EGL または EGL 以外で生成された)
IMS トランザクション
CICS プログラム (EGL または EGL 以外で生成された)
J2EE アプリケーション・クライアント内の EGL Java プログラム EGL Java プログラム (J2EE 以外)
J2EE アプリケーション・クライアント内の EGL Java プログラム
EGL EJB セッション Bean
IBM i 上の Java プログラム
IBM i 上の COBOL プログラム
C または C++ で作成された非 EGL プログラム
IMS/VS プログラム (EGL または EGL 以外で生成された)
IMS トランザクション
CICS プログラム (EGL または EGL 以外で生成された)
J2EE Web アプリケーション内の EGL Java プログラム EGL Java プログラム (J2EE 以外)
J2EE アプリケーション・クライアント内の EGL Java プログラム
同じ J2EE Web アプリケーション内の EGL Java プログラム
IBM i 上の Java プログラム
IBM i 上の COBOL プログラム
C または C++ で作成された非生成プログラム
CICS プログラム (EGL または EGL 以外で生成された)
EGL EJB セッション Bean EGL Java プログラム (J2EE 以外)
J2EE アプリケーション・クライアント内の EGL Java プログラム
EGL EJB セッション Bean
C または C++ で作成された非生成プログラム
CICS プログラム (EGL または EGL 以外で生成された)
EGL CICS プログラム CICS プログラム (EGL または EGL 以外で生成された)
EGL z/OS バッチ・プログラム
EGL z/OS バッチ・プログラム 任意の言語 (EGL を含む) で作成されて、z/OS (CICS または IMS の外部) で 実行されるバッチ・プログラム
非 EGL CICS プログラム CICS COBOL プログラム (EGL または EGL 以外で生成された)
任意の言語 (EGL を含む) で作成されて、z/OS (CICS または IMS の外部) で 実行されるバッチ・プログラム
IBM i 上の EGL COBOL プログラム IBM i 上の EGL COBOL プログラム
任意の言語で作成され、IBM i で実行される非 EGL プログラム
任意の言語で作成され、IBM i で実行される非 EGL プログラム IBM i 上の EGL COBOL プログラム
任意の言語で作成され、IBM i で実行される非 EGL プログラム

非 EGL 生成の Java コードから EGL 生成の Java コードを呼び出すには、EGL 外部型または Java アクセス関数を使用します。

以下の例は、ローンの利息を計算する呼び出し先プログラムを示しています。

  if (userRequest == "C")
    try
      call programA(myCustomer, interestRate);
    onException(myEx InvocationException)
      myErrorHandler(12);
    end
  end

エラー条件

各引数で渡されるバイト数は、受け取るパラメーターによって予期されるバイト数と同じにする必要があります。詳細については、『互換性』を参照してください。

リモート側の呼び出し先プログラム内の例外は、呼び出し側プログラムに直接伝搬することはありません。その代わり、InvocationException によってラップされます。 リモート側の呼び出し先プログラムが例外を処理しない場合は、呼び出し先プログラムが終了し、 呼び出し元は InvocationException をスローします。

互換性

表 2. call 文の互換性に関する考慮事項
プラットフォーム 問題
Java 生成
  • 長さのミスマッチは、次のように、実行時に修正したことで型ミスマッチが生じる場合にのみエラーの原因となります。
    • 呼び出し先プログラムが受け取るバイト数が少な過ぎ、渡されるデータの末尾がブランクで埋められる場合
    • 呼び出し先プログラムが受け取るバイト数が多過ぎ、渡されるデータの末尾が切り捨てられる場合。
    例えば、NUM 型の変数にブランクが追加され、呼び出し先プログラムがその変数のデータの使用を試行した場合、EGL は RuntimeException をスローします。 CHAR 型の変数にブランクが追加された場合は例外は生じません。
  • call ステートメントまたはサービス関数の呼び出しで、引数として渡される SMALLFLOAT および FLOAT 変数の場合、Java ランタイムは、remoteComType が CICSECI、CICSJ2C、CICSSSL、IMSJ2C、または IMSTCP の場合は IBM 370 フォーマットを使用します。 Java ランタイムは、他の種類の呼び出し または関数の呼び出しのためにデータを変換するときに、IEEE フォーマットを使用します。
COBOL 生成 再帰的プログラム呼び出しは、zSeries の場合のみ許可されます。このサポートは、再帰を許可する COBOL に依存しています。これは CICS では通常は問題になりませんが、バッチ・モードで問題になる可能性があります。シンボリック・パラメーター ALLOWRECURSIVEPROGRAMS を YES に設定することにより再帰呼び出しを使用可能にする必要があります。 詳しくは、ユーザーが設定可能な事前定義シンボリック・パラメーターを参照してください。
CICS 各引数で渡されるバイト数が CICS プログラムで予期されるバイト数と同じでない場合、実行時に異常終了が発生します。
Rich UI call ステートメントの 1 バージョンはサポートされますが、サービスを呼び出すのみです。詳細については、『サービス・アクセスのための call ステートメントとコールバック関数のコーディング』を参照してください。

フィードバック