예제 DL/I 데이터베이스

일관된 예제를 제공하고 각 예제를 다른 예제에 빌드하기 위해 이 문서에서는 가능한 동일한 예제 DL/I 데이터베이스를 사용합니다. 이 고객 데이터베이스에는 루트 레벨의 기본 고객 정보가 있습니다. 각 고객에 대해 신용 상태, 히스토리, 개인 위치의 세그먼트가 있습니다. 각 위치에는 주문 세그먼트가 있고 각 주문에는 항목 세그먼트가 있습니다.

데이터베이스 레이아웃

다음 데이터베이스는 CUSTOMER로 이름 지정됩니다.
고객 데이터베이스 다이어그램
다음 세부사항은 예제 데이터베이스를 참조합니다.
  • 위치 세그먼트의 위치 번호는 각 고객마다 고유합니다.
  • 주문 세그먼트는 논리적 관계로 연결된 두 세그먼트의 데이터를 포함하는 연결 세그먼트입니다. 항목 설명, 보유 수량, 주문 수량, 예약 수량, 단가, 발행 단위는 실제적으로 별도의 인벤토리 데이터베이스에 모두 저장됩니다. 프로그램의 관점에서 보면 두 세그먼트 간의 논리적 관계 때문에 이 정보는 주문 항목 세그먼트의 파트였던 것처럼 보입니다.
  • 고객당 대변 세그먼트는 하나만 있으므로 키 필드가 필요하지 않습니다.
  • 히스토리 세그먼트는 변수 길이 세그먼트입니다.

EGL DLISegment 레코드

EGL은 프로그램의 각 세그먼트를 DLISegment 유형의 레코드로 나타냅니다. 다음 코드 샘플은 EGL에서 이 데이터베이스 구조를 정의할 수 있는 방법을 표시합니다. 또한 진행에 따라 세그먼트 및 필드 이름(최대 8자)의 DL/I 버전을 사용하는 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()
	...
	endend