Example DL/I database

To provide a consistent experience and to let each example build on others, this documentation uses the same example DL/I database wherever possible. This customer database has basic customer information at the root level. For each customer there are segments for credit status, history, and individual locations. Each location has order segments, and each order has line item segments.
Customer database diagram
EGL represents each of these segments in your program as records of type DLISegment. The following code sample shows how you can declare this database structure in EGL. From time to time we will also show examples of DL/I calls using DL/I versions of segment and field names (8 characters maximum). Those DL/I names are also shown in the example.
package customer;

//define records to match segments in DL/I db
Record myCustomerRecordPart 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 myLocationRecordPart 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 myOrderRecordPart 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 myItemRecordPart type DLISegment 
{ segmentName="STLCITM", keyItem="itemKey" }
	10 itemKey char(8);            //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 = "STFIIQH" };
	10 itemQtyReserved num(6)      { dliFieldName = "STFIIQR" };
	10 itemUnitPrice char(6)       { dliFieldName = "STFIIPR" };
	10 itemUnitOfIssue char(1)     { dliFieldName = "STFIIUN" };
end

Record myCreditRecordPart type DLISegment 
{ segmentName="STSCSTA" }
	10 creditLimit char(12)      { dliFieldName = "STFCSCL" };
	10 creditBalance char(12)    { dliFieldName = "STFCSBL" };
end

Record myHistoryRecordPart 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

//declare overall db layout in PSB
Record myCustomerPSBRecordPart type PSBRecord { defaultPSBName="STBICLG" }
	// three PCBs required for CBLTDLI on IMS
	iopcb IO_PCBRecord { @PCB { pcbType = TP } };
	elaalt ALT_PCBRecord { @PCB { pcbType = TP } };
	elaexp ALT_PCBRecord { @PCB { pcbType = TP } };
	
	// database PCB
	customerPCB DB_PCBRecord { @PCB {
		pcbType = DB,
		pcbName = "STDCDBL",
		hierarchy = [
			@Relationship { segmentRecord = "myCustomerRecordPart" },
			@Relationship { 
				segmentRecord = "myLocationRecordPart", parentRecord = "myCustomerRecordPart" },
			@Relationship { 
				segmentRecord = "myOrderRecordPart", parentRecord = "myLocationRecordPart" },
			@Relationship { 
				segmentRecord = "myItemRecordPart", parentRecord = "myOrderRecordPart" },
			@Relationship { 
				segmentRecord = "myCreditRecordPart", parentRecord = "myCustomerRecordPart" },
			@Relationship { 
				segmentRecord = "myHistoryRecordPart", parentRecord = "myCustomerRecordPart" }]}};
end

program PrintCatalog type basicProgram { 
	@DLI{ 		
		psb = "myPSB", 		
		callInterface = CBLTDLI, 		
		// leave space for IO and ALT PCBs 		
		pcbParms = ["", "", "", "customerPCB"] 	} }

	//create instances of the records
	myCustomer  myCustomerRecordPart;
	myLocation  myLocationRecordPart;
	myOrder     myOrderRecordPart;
	myItem      myItemRecordPart;
	myCrStatus  myCreditRecordPart
	myHistory   myHistoryRecordPart

	myPSB       CustomerPSB; 

	function main()
	...
	end
end

Related concepts:
Basic DL/I database concepts
DL/I database support
Record types and properties
Related reference:
@DLI

Feedback
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.