Beispiel-DL/I-Datenbank

Um eine konsistente Erfahrung bereitzustellen und die Beispiele aufeinander aufbauen zu lassen, wird in dieser Dokumentation immer wenn möglich dieselbe DL/I-Datenbank verwendet. Diese Kundendatenbank enthält in der Stammverzeichnisebene grundlegende Kundeninformationen. Für jeden Kunden sind Segmente für den Kreditstatus, den Verlauf und die einzelnen Standorte vorhanden. Jeder Standort besitzt Segmente für Bestellungen und jede Bestellung besitzt Segmente für Artikel.

Datenbanklayout

Der Name der folgenden Datenbank lautet CUSTOMER:
Diagramm der Kundendatenbank
Für die Beispieldatenbank gelten die folgenden Angaben:
  • Die Standortnummer im Segment für den Standort ist für jeden Kunden eindeutig.
  • Das Segment für die Bestellung ist ein verknüpftes Segment, das Daten von zwei Segmenten enthält, die durch eine logische Beziehung verbunden sind. Die Elementbeschreibung, die vorhandene Anzahl, die reservierte Anzahl, der Stückpreis und die Ausgabeeinheit werden alle physisch in einer separaten Bestandsdatenbank gespeichert. Vom Programm aus betrachtet werden diese Informationen aufgrund der logischen Beziehung zwischen den beiden Segmenten als Teil des Segments für den Bestellartikel dargestellt.
  • Pro Kunde gibt es nur ein Segment für den Kredit, es ist also kein Schlüsselfeld erforderlich.
  • Das Segment für den Verlauf ist ein Segment mit variabler Länge.

EGL-DLISegment-Datensätze

In EGL wird jedes dieser Segmente in Ihrem Programm als Datensatz vom Typ 'DLISegment' dargestellt. In den folgenden Codebeispielen wird gezeigt, wie Sie diese Datenbankstruktur in EGL definieren können. Es werden gelegentlich auch Beispiele für DL/I-Aufrufe mithilfe von DL/I-Versionen von Segment- und Feldnamen gezeigt (maximal 8 Zeichen). Auch diese DL/I-Namen werden im Beispiel gezeigt.
//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

In der folgenden PSB-Definition auf dem Host ist DBDNAME auf CUSTOMER festgelegt (der Name der Datenbank). Ein PCB wird mit dem Namen STDCDBL definiert. Mit 'customerPCB' wird im nächsten Abschnitt die Eigenschaft 'pcbName' auf diesen Namen festgelegt.
         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

Mit dem folgenden Code wird der IMS-PSB im EGL-Programm dargestellt:
//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

Beispiel-EGL-Programm

Der folgende Programmentwurf dient der Verwendung der Datenbank 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

Feedback