get myCustomer, myLocation;Esta sentencia genera el siguiente pseudocódigo DL/I:
GU STSCCST*D (STQCCNO = :myCustomer.customerNo) STSCLOC (STQCLNO = :myLocation.locationNo)
get myCustomer, myLocation forUpdate; replace myLocation with #dli{ REPL STSCCST*N STSCLOC };La llamada DL/I por omisión que EGL crea para una función delete que sigue a una sentencia get forUpdate con los códigos de mandato D no suprime cada segmento recuperado. Sólo suprime el segmento de objeto de E/S.
redefCustomer CustomerRecordPart {redefines=HistoryRecordPart}; redefLocation LocationRecordPart {redefines=HistoryRecordPart}; ... //leer el próximo segmento, sea cual sea su tipo, del registro histórico while (myHistory not EOF) get next myHistory with #dli{ GN }; //¿de qué tipo era? case (DLIVar.segmentName) when "STSCCST" // era customer myCustomer = redefCustomer; printCustomer(); // myCustomer es global when "STSCLOC" // era location myLocation = redefLocation; printLocation(); ... end end
// PCB de base de datos customerPCB DB_PCBRecord { @PCB { pcbType = DB, pcbName = "STDCDBL", secondaryIndex = "STFCORF", //utilizar nombre DL/I hierarchy = [ @Relationship { segmentRecord = "CustomerRecordPart"}, @Relationship { segmentRecord = "LocationRecord", parentRecord = "CustomerRecordPart" }, @Relationship { segmentRecord = "OrderRecord", parentRecord = "LocationRecordPart" }, ...Realice una operación get para localizar un cliente (customer), como en el ejemplo siguiente:
get myCustomer;EGL generará el siguiente código por omisión:
GU STSCCST (STFCORF = :myOrder.orderReference)Si desea poder elegir entre acceder a los clientes por orderReference o por customerNo, cree un segundo PCB para el índice secundario. En el ejemplo siguiente, el segundo PCB se denomina orderReferencePCB:
// PCB de base de datos --acceso por número de cliente customerPCB DB_PCBRecord { @PCB { pcbType = DB, pcbName = "STDCDBL", hierarchy = [ @Relationship { segmentRecord = "CustomerRecordPart"}, @Relationship { segmentRecord = "LocationRecord", parentRecord = "CustomerRecordPart" }, @Relationship { segmentRecord = "OrderRecord", parentRecord = "LocationRecordPart" }, ... // PCB de base de datos --acceso por referencia de pedido orderReferencePCB DB_PCBRecord { @PCB { pcbType = DB, pcbName = "STDXDBL", secondaryIndex = "STFCORF", //utilizar nombre DL/I hierarchy = [ @Relationship { segmentRecord = "CustomerRecordPart"}, @Relationship { segmentRecord = "LocationRecord", parentRecord = "CustomerRecordPart" }, @Relationship { segmentRecord = "OrderRecord", parentRecord = "LocationRecordPart" }, ...El nombre del PCB (pcbName) debe coincidir con un PCB DL/I real. Ahora, el comportamiento por omisión de EGL será una vez acceder a un registro de cliente utilizando el campo customerNo. Para acceder a él utilizando la clave alternativa, la sentencia de E/S EGL debe especificar el orderReferencePCB con la palabra clave usingPCB , como en el ejemplo siguiente:
get myCustomer usingPCB orderReferencePCB;También puede darse un caso más complejo, si desea cambiar la estructura de toda la base de datos cuando la visualiza el programa. (De nuevo, recuerde que la estructura del PCB del programa EGL debe coincidir con un PCB DL/I existente). Supongamos que desea que la base de datos de cliente parezca una base de datos de pedidos de cara al programa, con el número de referencia exclusivo como clave del segmento orders (pedidos). Puede tener un PCB con la siguiente estructura:
// vista de pedidos de la base de datos de clientes ordersPCB DB_PCBRecord { @PCB { pcbType = DB, pcbName = "STDCDBL", secondaryIndex = "STFCORF", //utilizar nombre DL/I 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" }]}}; endSuponiendo que el número de referencia de pedido sea exclusivo de cada cliente y pedido, y suponiendo que ordersPCB es ahora el PCB por omisión, puede buscar el cliente de un pedido realizando una llamada de vía de acceso modificada que elimine los calificadores de la ubicación y del cliente:
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) };Puede que también desee buscar en función de la información de otro registro. Por ejemplo, podría buscar un cliente en función de un número de cliente (invCustNo) en un registro de facturas (myInvoice) de tipo (InvoiceRecordPart) que es un registro básico y no forma parte de la base de datos. El código sería parecido al siguiente:
get myCustomer with #dli{ GU STSCCST (STQCCNO = :myInvoice.invCustNo) };
Conceptos relacionados:
Soporte de bases de datos DL/I
Soporte de entorno de ejecución IMS
Consulta relacionada:
DLIVar
Ejemplo de base de datos DL/I