@dli

@dli 複合プロパティーは、値の設定ブロックによってプログラムからの DL/I 呼び出しの振る舞いを指定する場合に使用します。

このプロパティーは、DL/I データベース I/O を実行するプログラム、または IMS/VS や IMS™ BMP ターゲット・プラットフォーム用に生成を予定しているプログラムに組み込む必要があります。

@dli 複合プロパティーには、以下のプロパティー・フィールドが含まれています。
callInterface DLICallInterfaceKind
callInterface プロパティーは、EGL 生成の COBOL プログラムが add および get などの EGL ステートメントに対応して実装する IMS および DL/I 呼び出しの特徴を定義します。 AIBTDLI の設定の使用では、組織は AIBTDLI インターフェース用に適した PSB を構成する必要がありますが、ベスト・プラクティスは AIBTDLI を使用することです。
値は以下のとおりです。
AIBTDLI (デフォルト)
このインターフェースは最近開発されたもので、IMS Application Interface Block (AIB) の機能を活用しています。 インターフェースは、AIB を使用して、アドレスではなく名前によってランタイム PCB にアクセスします。 このインターフェースを使用する前に、データベース管理者がそれぞれのランタイム PCB にシンボル名を割り当てる必要があります。特に、プログラマーは PSBGEN 定義で PCBNAME パラメーターを設定する必要があります。

EGL では、PCB レコードの PCBName プロパティーを設定することにより、名前を識別します。 このプロパティーのデフォルトは、レコードの名前です。

CBLTDLI
このインターフェースでは、プログラムが PCB 名ではなくアドレスを使用するので、PCB へのアクセスがわずかながら高速化します。 ただし、PSBRecord パーツを定義するための要件は、AIBTDLI の場合より多くなります。 さらに重要なことに、呼び出し先プログラムで指定の PCB レコードの名前に単純に依存するのではなく、通常は呼び出し先プログラムに PSB レコードまたは PCB レコードを渡す必要があります。 プログラム呼び出しにおける特別のデータ処理を別にしても、PSB レコードの受け渡しでは呼び出し先プログラムの psbParm プロパティーの設定が必要であり、PCB レコードの受け渡しでは呼び出し先プログラムの pcbParms プロパティーの設定が必要です。 (PSB レコードおよび PCB レコードの両方を渡す場合、PSB は無視されます。)
psb STRING
psb プロパティーは、PSBRecord に基づき、その結果としてプログラムで使用されるプログラム仕様ブロック (ランタイム PSB) に対応する、プログラム変数を識別します。
例えば、次のようになります。
program Prog1 type basicProgram
{ @DLI { psb = "myPSB" }}

// PSBRecord 定義に基づいて変数を宣言
myPSB CustomerPSBRecord;

PSBRecord は、暗黙的な DL/I データベース I/O を使用する場合のデフォルト SSA の作成時に EGL が使用するデータベース階層情報を提供します。 さらに CICS® の場合、PSBRecord は最初の DL/I データベース I/O の発生時に EGL がスケジュールするデフォルト PSB を提供します。

pcbParms STRING[]
パラメーターとして PCB レコードを受け取る呼び出し先プログラムで使用される場合、pcbParms プロパティー・フィールドは、EGL がプログラム PSB レコード・パーツ内の PCB レコードとの (PCB レコード・タイプの) 各パラメーターの突き合わせに使用する文字列のリストを提供します。 callInterface プロパティーの値が AIBTDLI である場合、このプロパティーは無効です。

以下の例に示されているように、配列内の文字列の位置はプログラム PSB レコード・パーツ内の PCB レコードの位置に一致する必要があり、配列内の空ではない各文字列はプログラム・パラメーターのリスト内の PCB レコードの名前と同じである必要があります。

Record PSBRecordPart type PSBRecord {defaultPSBName = "ibmPSB"}
  
  // この例では以下のレコードの詳細は省略されています
  ioPCB IO_PCBRecord;
  dbPCB DB_PCBRecord;       // 受け渡し済み
  db2PCB DB_PCBRecord;
  gsamPCB GSAM_PCBRecord;     // 受け渡し済み
  gsam2PCB GSAM_PCBRecord;
end

program Prog2 type basicProgram 
(GSAM_PCB_parm GSAM_PCBRecord, DB_PCB_parm DB_PCBRecord) { 
	@DLI{
		psb = "myPSB",
		callInterface = CBLTDLI,
		pcbParms = ["", "DB_PCB_parm", "", "GSAM_PCB_parm", ""]
	}
}

	myPSB PSBRecordPart;

pcbParms プロパティーおよび psbParm プロパティーを指定する場合は、前者の PCB 固有のアドレスによって後者の相当するアドレスがオーバーライドされます。

PSB レコード・パーツにあるもののパラメーターに一致しない各 PCB レコードに対して空ストリングが使用される場合でも、 配列内の最後の要素がパラメーターに一致しない PCB レコードを参照していれば、それらの要素の指定を避けることができます。 現在の例では、以下の代入も有効です。
   pcbParms = ["", "DB_PCB_parm", "", "GSAM_PCB_parm"]

後で PCB レコードを PSB レコード・パーツに追加する場合は、PSB レコード・パーツ内の PCB レコードごとに配列エレメントを組み込む (例外なし) ことで、配列エレメントの位置決めに関するエラーを回避できます。

PSB レコード・パーツ内の PCB レコードがそのパーツ内の別の PCB レコードの再定義である場合、元のレコードおよび再定義されたレコードはメモリーの同じ領域を表し、pcbParms の配列の構成時に 1 回のみカウントされます。

psbParm STRING

EGL は、PSB 情報を dliLib.psbData システム変数に格納します。 この変数には 12 バイトの領域があり、ランタイム PSB にアクセスするための名前およびアドレスが格納されます。 EGL では、事前定義のレコード PSBDataRecord を提供し、12 バイトの領域のフィールド構造が提供されます。 callInterface プロパティーの値が CBLTDLI であり、呼び出し先プログラムのパラメーターとして PSB 全体を受け取る必要がある場合は、psbParm プロパティーを使用して PSB 情報が格納されているプログラム・パラメーターを指定します。 このパラメーターの型定義として PSBDataRecord を使用してください。

以下に、psbParm プロパティーの例を示します。
program Prog3 type basicProgram
  ( psbData PSBDataRecord )          // PSB を受け取るためのパラメーター

  { @DLI { psb = "myPSB", psbParm = "psbData", 
           callInterface = CBLTDLI
         }
  }

  // PSBRecord 定義に基づいて変数を宣言
  myPSB CustomerPSBRecord;

EGL プログラムが呼び出されると、EGL では自動的に psbParm プロパティーで特定されるパラメーターからの情報を dliLib.psbData システム変数に割り当てます。

pcbParms プロパティーおよび psbParm プロパティーを指定する場合は、前者の PCB 固有のアドレスによって後者の相当するアドレスがオーバーライドされます。

handleHardDLIErrors BOOLEAN
vgVar.handleHardDLIErrors システム変数のデフォルト値を設定します。 この変数により、try ブロック内の DL/I またはデータベースの入出力操作でハード・エラーが発生した後に、プログラムを継続して実行するかどうかが制御されます。 このプロパティーのデフォルト値は YES であり、変数を 1 に設定します。

VisualAge® Generator からマイグレーションされたコードでは、handleHardDLIErrors を NO に設定 (値を 0 に設定する) する場合を除き、以前と同様には動作しないことがあります。

詳しくは、『例外の処理』を参照してください。


フィードバック