サンプル DL/I データベース

この資料では、できる限り同じサンプル DL/I データベースを使用しています。 一貫した使用を体験していただき、それぞれのサンプルを他のサンプルに基づいてビルドできる ようにするためです。 このカスタマー・データベースには、ルート・レベルに基本的なカスタマー情報があります。それぞれの顧客について、クレジット状態、履歴、および個々のロケーションに関するセグメントが存在します。 各ロケーションには、オーダー・セグメントがあり、各オーダーには項目セグメントがあります。

データベース・レイアウト

以下のデータベースは、CUSTOMER という名前です。
カスタマー・データベースの図
サンプル・データベースの詳細は、下記のとおりです。
  • ロケーション・セグメントのロケーション番号は、お客様ごとに固有のものです。
  • オーダー・セグメントは連結セグメントであり、論理関係によって結合した 2 つのセグメントのデータを含んでいます。 品目の説明、手元の数量、注文中の数量、予約済み数量、単価、および配布単位は、すべて別個の在庫データベースに物理的に保存されます。 プログラムの視点からは、2 つのセグメント間の論理関係により、この情報は、オーダー項目セグメントの一部であるかのように示されます。
  • クレジット・セグメントは顧客ごとに 1 つだけ存在するため、キー・フィールドは不要です。
  • 履歴セグメントは、可変長セグメントです。

EGL DLISegment レコード

EGL は、プログラムでこれらのセグメントそれぞれを、DLISegment 型のレコードとして表します。以下のコード・サンプルは、このデータベース構造を EGL でどのように定義できるかを示しています。 場合によって、DL/I バージョンのセグメント名およびフィールド名 (最長 8 文字) を 使用する、DL/I 呼び出しのサンプルも示します。 これらの DL/I 名も、このサンプルで示します。
//define records to match segments in DL/I db
Record CustomerRecordPart type DLISegment 
{ segmentName="STSCCST", keyItem="customerNo" }
	10 customerNo char(6)      { dliFieldName = "STQCCNO" };  //key field
	10 customerName char(25)   { dliFieldName = "STUCCNM" };
	10 customerAddr1 char(25)  { dliFieldName = "STQCCA1" };
	10 customerAddr2 char(25)  { dliFieldName = "STQCCA2" };
	10 customerAddr3 char(25)  { dliFieldName = "STQCCA3" };
end

Record LocationRecordPart type DLISegment 
{ segmentName="STSCLOC", keyItem="locationNo" }
	10 locationNo char(6)      { dliFieldName = "STQCLNO" };  //key field
	10 locationName char(25)   { dliFieldName = "STFCLNM" };
	10 locationAddr1 char(25)  { dliFieldName = "STFCLA1" };
	10 locationAddr2 char(25)  { dliFieldName = "STFCLA2" };
	10 locationAddr3 char(25)  { dliFieldName = "STFCLA3" };
end

Record OrderRecordPart type DLISegment 
{ segmentName="STPCORD", keyItem="orderDateNo" }
	10 orderDateNo char(12)       { dliFieldName = "STQCODN" };  //key field
	10 orderReference char(25)    { dliFieldName = "STFCORF" };
	10 orderItemCount num(6)      { dliFieldName = "STFCOIC" };
	10 orderAmount decimal(12,2)  { dliFieldName = "STFCOAM" };
end

Record ItemRecordPart type DLISegment 
{ segmentName="STLCITM", keyItem="itemKey" }
	10 itemKey char(8);            { dliFieldName = "STKCCKEY" }; //key field
		15 itemInventoryNo char(6)   { dliFieldName = "STKCIIN" };
		15 itemLineNo smallint       { dliFieldName = "STQCILI" };
	10 itemQtyOrdered num(6)       { dliFieldName = "STFCIQO" };
	10 itemQtyShipped num(6)       { dliFieldName = "STFCIQS" };
	10 itemQtyBackOrdered num(6)   { dliFieldName = "STFCIQB" };
	10 itemAmount decimal(12,2)    { dliFieldName = "STFCIAM" };
	10 itemNumber char(6)          { dliFieldName = "STQIINO" };
	10 itemDescription char(25)    { dliFieldName = "STFIIDS" };
	10 itemQtyOnHand num(6)        { dliFieldName = "STFIIQH" };
	10 itemQtyOnOrder num(6)       { dliFieldName = "STFIIOH" };
	10 itemQtyReserved num(6)      { dliFieldName = "STFIIQR" };
	10 itemUnitPrice char(6)       { dliFieldName = "STFIIPR" };
	10 itemUnitOfIssue char(1)     { dliFieldName = "STFIIUN" };
end

Record CreditRecordPart type DLISegment 
{ segmentName="STSCSTA" }
	10 creditLimit decimal(12,2)   { dliFieldName = "STFCSCL" };
	10 creditBalance decimal(12,2) { dliFieldName = "STFCSBL" };
end

Record HistoryRecordPart type DLISegment 
{ segmentName="STSCHIS", lengthItem="historySegmentLength", 
  keyItem="historyDateNo" }
	10 historySegmentLength smallint { dliFieldName = "STGCSL" };
	10 historyDateNo char(12)        { dliFieldName = "STQCHDN" };
	10 historyReference char(25)     { dliFieldName = "STFCHRF" };
	10 historyItemCount smallint     { dliFieldName = "STFCHIC" };
	10 historyAmount decimal(12,2)   { dliFieldName = "STQCHAM" };
	10 historyStatus char(77)        { dliFieldName = "STQCLOS" };
end

IMS PSB

以下に示すホスト上の PSB 定義では、DBDNAME は CUSTOMER というデータベースの名前に設定されます。 PCB は、名前 STDCDBL で定義され、次のセクションで customerPCB は 、pcbName プロパティーをこの名前に設定します。
         TITLE 'PSB FOR PROCESSING SAMPLE DATA BASES'
ELAALT   PCB    TYPE=TP,MODIFY=YES
ELAEXP   PCB    TYPE=TP,MODIFY=YES,EXPRESS=YES
STDCDBL  PCB    TYPE=DB,DBDNAME=CUSTOMER,PROCOPT=AP,KEYLEN=50,POS=S
         SENSEG NAME=STSCCST,PARENT=0
         SENSEG NAME=STSCLOC,PARENT=STSCCST
         SENSEG NAME=STPCORD,PARENT=STSCLOC
         SENSEG NAME=STLCITM,PARENT=STPCORD
         SENSEG NAME=STSCSTA,PARENT=STSCCST
         SENSEG NAME=STSCHIS,PARENT=STSCCST
         PSBGEN LANG=ASSEM,CMPAT=YES,PSBNAME=STBICLG
         END 

EGL PSBRecord

以下のコードは、EGL プログラムの IMS™ PSB を表したものです。
//define overall db layout in PSB
Record CustomerPSBRecordPart type PSBRecord { defaultPSBName="STBICLG" }
	// three PCBs required for CBLTDLI on IMS
	iopcb IO_PCBRecord { @PCB { pcbType = PCBKind.TP } };
	elaalt ALT_PCBRecord { @PCB { pcbType = PCBKind.TP } };
	elaexp ALT_PCBRecord { @PCB { pcbType = PCBKind.TP } };
	
	// database PCB
	customerPCB DB_PCBRecord { @PCB {
		pcbType = DB,
		pcbName = "STDCDBL",
		hierarchy = [
			@relationship { segmentRecord = "CustomerRecordPart" },
			@relationship { 
				segmentRecord = "LocationRecordPart", parentRecord = "CustomerRecordPart" },
			@relationship { 
				segmentRecord = "OrderRecordPart", parentRecord = "LocationRecordPart" },
			@relationship { 
				segmentRecord = "ItemRecordPart", parentRecord = "OrderRecordPart" },
			@relationship { 
				segmentRecord = "CreditRecordPart", parentRecord = "CustomerRecordPart" },
			@relationship { 
				segmentRecord = "HistoryRecordPart", parentRecord = "CustomerRecordPart" }]}};
end

サンプル EGL プログラム

以下のプログラムの概要は、CUSTOMER データベースを使用するようにセットアップされます。
program PrintCatalog type basicProgram { alias="PRINT",
	@DLI{ 		
		psb = "myPSB", 		
		callInterface = CBLTDLI	} }

	//create variables for the records
	myCustomer  CustomerRecordPart;
	myLocation  LocationRecordPart;
	myOrder     OrderRecordPart;
	myItem      ItemRecordPart;
	myCrStatus  CreditRecordPart
	myHistory   HistoryRecordPart

	myPSB       CustomerPSBRecordPart; 

	function main()
	...
	end
end

フィードバック