get myCustomer, myLocation;この文は、次の DL/I 疑似コードを生成します。
GU STSCCST*D (STQCCNO = :myCustomer.customerNo) STSCLOC (STQCLNO = :myLocation.locationNo)
get myCustomer, myLocation forUpdate;
replace myLocation with #dli{
REPL STSCCST*N
STSCLOC };
D コマンド・コード付きの get forUpdate
文に続く delete 関数のデフォルトの
DL/I 呼び出し EGL ビルドでは、取り出された各セグメントを削除しません。
I/O オブジェクト・セグメントのみを削除します。redefCustomer CustomerRecordPart {redefines=HistoryRecordPart};
redefLocation LocationRecordPart {redefines=HistoryRecordPart};
...
//read next segment, whatever type it is, into history record
while (myHistory not EOF)
get next myHistory with #dli{
GN };
//so what type was it?
case (DLIVar.segmentName)
when "STSCCST" // it was a customer
myCustomer = redefCustomer;
printCustomer(); // myCustomer is global
when "STSCLOC" // it was a location
myLocation = redefLocation;
printLocation();
...
end
end
// database PCB
customerPCB DB_PCBRecord { @PCB {
pcbType = DB,
pcbName = "STDCDBL",
secondaryIndex = "STFCORF", //use DL/I name
hierarchy = [
@Relationship { segmentRecord = "CustomerRecordPart"},
@Relationship {
segmentRecord = "LocationRecord",
parentRecord = "CustomerRecordPart" },
@Relationship {
segmentRecord = "OrderRecord",
parentRecord = "LocationRecordPart" },
...
以下の例のように、顧客を見つけるために get 操作を実行します。
get myCustomer;EGL はデフォルトで以下のコードを生成します。
GU STSCCST (STFCORF = :myOrder.orderReference)顧客へのアクセスを、orderReference 別と customerNo 別とで選択できるようにしたい場合は、2 次索引のために 2 番目の PCB を作成します。 以下の例では、2 次 PCB は orderReferencePCB という名前です。
// データベース PCB--顧客番号別のアクセス
customerPCB DB_PCBRecord { @PCB {
pcbType = DB,
pcbName = "STDCDBL",
hierarchy = [
@Relationship { segmentRecord = "CustomerRecordPart"},
@Relationship {
segmentRecord = "LocationRecord",
parentRecord = "CustomerRecordPart" },
@Relationship {
segmentRecord = "OrderRecord",
parentRecord = "LocationRecordPart" },
...
// database PCB--access by order reference
orderReferencePCB DB_PCBRecord { @PCB {
pcbType = DB,
pcbName = "STDXDBL",
secondaryIndex = "STFCORF", //use DL/I name
hierarchy = [
@Relationship { segmentRecord = "CustomerRecordPart"},
@Relationship {
segmentRecord = "LocationRecord",
parentRecord = "CustomerRecordPart" },
@Relationship {
segmentRecord = "OrderRecord",
parentRecord = "LocationRecordPart" },
...
pcbName は実際の DL/I PCB と一致する必要があります。ここで、EGL
のデフォルトの振る舞いは、customerNo フィールドを使用してもう一度、顧客レコードにアクセスすることになります。
Alt キーを使用してアクセスするには、ご使用の EGL I/O 文で、以下の例のように
usingPCB キーワードで orderReferencePCB を指定する必要があります。
get myCustomer usingPCB orderReferencePCB;また、 ご使用のプログラムから見られるデータベース全体の構造を変更したい場合など、 さらに複雑なケースもあります。 (繰り返しますが、EGL プログラムの PCB 構造は既存の DL/I PCB と一致している必要があることに留意してください。) 顧客データベースを、ご使用のプログラムにとっては、注文セグメントに対するキーとして固有の参照番号を持つ 注文データベースのように見せたいとします。 以下の構造の PCB を持つことができます。
// 顧客データベースの注文ビュー
ordersPCB DB_PCBRecord { @PCB {
pcbType = DB,
pcbName = "STDCDBL",
secondaryIndex = "STFCORF", //use DL/I name
hierarchy = [
@Relationship { segmentRecord = "OrderRecordPart" },
@Relationship {
segmentRecord = "LocationRecordPart",
parentRecord = "OrderRecordPart" },
@Relationship {
segmentRecord = "CustomerRecordPart",
parentRecord = "LocationRecordPart" },
@Relationship {
segmentRecord = "CreditRecordPart",
parentRecord = "CustomerRecordPart" },
@Relationship {
segmentRecord = "HistoryRecordPart",
parentRecord = "CustomerRecordPart" },
@Relationship {
segmentRecord = "ItemRecordPart",
parentRecord = "OrderRecordPart" }]}};
end
注文参照番号が各顧客および注文ごとに固有であり、ordersPCB が現在のデフォルト PCB
であるとすると、ロケーションおよび顧客の修飾を除去する変更されたパス呼び出しを行うことで、
注文をした顧客を見つけることができます。
get myOrder, myCustomer with #dli{
GU STPCORD (STQCODN = :myOrder.orderReference)
STSCLOC
STSCCST };
targetBalance MONEY;
targetBalance = 10,000.00;
get myCrStatus with #dli{
GU STSCCST*D STSCSTA (STFCSBL >= :targetBalance) };
また、別のレコードの情報に基づいて検索したい場合もあります。
例えば、基本レコードであって、データベースの一部ではないタイプ (InvoiceRecordPart)
である送り状レコード (myInvoice) で、顧客番号 (invCustNo) に基づいて顧客を検索したい場合です。
そのコードは、以下のようなものになります。
get myCustomer with #dli{
GU STSCCST (STQCCNO = :myInvoice.invCustNo) };
関連概念:
DL/I データベース・サポート
IMS ランタイム・ サポート
関連リファレンス:
DLIVar
DL/I データベース・サンプル