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" }]}};
end
Suponiendo 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