Tenga en cuenta que el código DL/I implícito y explícito utiliza una potente sintaxis pseudo-DL/I que presenta algunas diferencias con respecto al código DL/I real. Para obtener más información, consulte la directiva #dli.
Si no está familiarizado con DL/I, consulte la sección Conceptos básicos acerca de DL/I.
La tabla siguiente muestra las sentencias de E/S de EGL que puede utilizar para acceder a bases de datos DL/I. La tabla incluye llamadas DL/I de ejemplo que cada palabra clave puede generar. Cuando se codifica una sentencia EGL add, por ejemplo, se genera una llamada DL/I ISRT. Puede previsualizar una versión no formateada de las llamadas DL/I que EGL generará colocando el cursor en una línea de código que contenga una palabra clave y pulsando sobre ella con el botón derecho del ratón. En el menú emergente, seleccione Sentencia DLI > Ver.
También puede codificar llamadas DL/I directamente, utilizando la sintaxis with #dli{ sentencia }. Esta sintaxis permite especificar con más detalle cómo debe acceder el programa a la base de datos, como es necesario si las llamadas DL/I por omisión generadas por EGL desde sentencias de E/S no son suficientes.
La lista siguiente muestra sentencias de E/S de EGL que soportan bases de datos de DL/I.
Vuelve a colocar un segmento cambiado en una base de datos. Primero debe utilizar una sentencia get...forUpdate, get next...forUpdate o get next inParent...forUpdate (generando una sentencia DL/I GHU, GHN o GHNP) para localizar y retener el registro.
En ningún caso se pueden actualizar varios segmentos de base de datos con una única sentencia EGL replace por omisión.
La sentencia de EGL set (específicamente la sentencia con la forma set record position) también soporta DL/I. Esta sentencia no realiza E/S pero localiza un segmento especificado en una base de datos. Para conocer detalles acerca del funcionamiento de la sentencia, consulte la sección dedicada a set.
Debe declarar una variable basada en el componente PSBRecord y después asignar el nombre de variable a la propiedad psb del programa. EGL utiliza el registro para generar el código que crea y valida las llamadas DL/I.
Dentro de cada registro PCB, se utiliza la propiedad compleja @PCB para definir el tipo y el nombre del PCB y, en algunos casos, la jerarquía de los segmentos visibles para dicho PCB. Para obtener detalles acerca de los tipos de registros, consulte las secciones Propiedades de un componente de registro PCB y Tipos y propiedades de registros.
Finalmente, puede declarar un registro fijo basado en el componente de registro predefinido PSBDataRecord. Puede utilizar el registro para interactuar con la variable de sistema DLILib.psbData, que contiene tanto el nombre del PSB de tiempo de ejecución como una dirección con la que se accede a dicho PSB. El registro es útil si necesita pasar el PSB (en realidad, un nombre y una dirección) a otro programa o recibir el PSB de otro programa.
Cada tipo de segmento al que desee acceder en una base de datos DL/I debe tener un registro equivalente de tipo DLISegment en el programa.
Considere el ejemplo de base de datos de cliente y el código relacionado del Ejemplo de base de datos DL/I. Para cada cliente hay segmentos para el estado de crédito, historial y ubicaciones individuales. Cada ubicación tiene segmentos de pedido, y cada pedido tiene segmentos de elementos de línea. En este caso, creará registros de tipo DLISegment para Cliente, Crédito, Historial, Ubicación, Pedido y Elemento de línea.
En ausencia de una directiva #dli, EGL crea argumentos de búsqueda de segmentos (SSA) por omisión para localizar segmentos DL/I específicos. Como se muestra en el ejemplo siguiente, la propiedad hostVarQualifier de un componente de registro DLISegment identifica un registro que contendrá un valor de clave utilizado en un SSA por omisión.
Record CustomerRecordPart type DLISegment { segmentName="STSCCST", keyItem="customerNo" } 10 customerNo char(6) { dliFieldName = "STQCCNO" }; //campo de clave ... end Record LocationRecordPart type DLISegment { segmentName="STSCLOC", keyItem="locationNo" } 10 locationNo char(6) { dliFieldName = "STQCLNO" }; //campo de clave ... end Record CustomerPSBRecordPart type PSBRecord { defaultPSBName="STBICLG" } // PCB de base de datos customerPCB DB_PCBRecord { @PCB { pcbType = DB, pcbName = "STDCDBL", hierarchy = [ @Relationship { segmentRecord = "CustomerRecordPart" }, @Relationship { segmentRecord = "LocationRecordPart", parentRecord="CustomerRecordPart" }, ...]}}; end
Program myProgram { @DLI{ psb = "myCustomerPSB" }} //definir variables myCustomerPSB CustomerPSBRecordPart; myCustomer CustomerRecordPart; myLocation LocationRecordPart;
get myLocation;
GU STSCCST (STQCCNO = :CustomerRecordPart.customerNo) STSCLOC (STQCLNO = :myLocation.locationNo)
Observe que, aunque EGL ha asociado correctamente la variable myLocation con el segmento STSCLOC, EGL no ha podido encontrar la variable myCustomer. EGL sólo sabía que myLocation es de tipo LocationRecordPart, cuyo segmento padre es CustomerRecordPart, y que el keyItem de CustomerRecordPart es customerNo.
Record CustomerRecordPart type DLISegment { segmentName="STSCCST", hostVarQualifier="myCustomer", keyItem="customerNo" }
GU STSCCST (STQCCNO = :myCustomer.customerNo) STSCLOC (STQCLNO = :myLocation.locationNo)
También podría utilizar la propiedad hostVarQualifier para hacer referencia a un campo de un registro que no se base en un segmento de la base de datos. Por ejemplo, si desea que EGL busque el valor de clave del segmento de cliente en un registro básico (como por ejemplo un registro de transacción), debe asignar el nombre de ese registro a la propiedad hostVarQualifier.
Si está trabajando con un campo de registro DLISegment cuyo nombre no coincide con el nombre del campo de segmento de base de datos equivalente, establezca la propiedad de campo de registro dliFieldName en el nombre del campo de segmento.
En CICS, puede planificar el PSB identificado en psbName; la planificación se producirá después de que una operación de compromiso haya borrado psbRef. Para utilizar esta posibilidad, establezca psbRef en 0.
Record CustomerRecordPart type DLISegment { segmentName="STSCCST", keyItem="customerNo" } 10 customerNo char(6) { dliFieldName = "STQCCNO" }; //campo de clave 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
Para conocer los diseños de registro completos de esta base de datos de ejemplo, consulte la sección Ejemplo de base de datos DL/I.
Este tipo de declaraciones de registro describen la estructura de los segmentos de base de datos como visible para este programa. Durante la ejecución, el PCB de tiempo de ejecución determina lo que puede visualizar un programa individual.
La estructura de un registro debe coincidir con la estructura del segmento tal como DL/I lo presenta al programa. Defina los campos keyItem y lengthItem con la misma longitud y posición que tienen en el segmento DL/I. Si el segmento es un hijo lógico, la estructura debe incluir la clave concatenada del padre destino, así como los datos de intersección. Si el segmento es un segmento concatenado de una base de datos lógica, la estructura debe incluir la clave, los datos de intersección y el segmento padre destino.
Debido a que las bases de datos DL/I son jerárquicas, el programa debe realizar el seguimiento de la ubicación actual dentro de la base de datos. Para localizar un segmento hijo específico, debe especificar el segmento padre de ese hijo (si existe), el segmento padre de ese padre (si existe) y así sucesivamente hasta llegar a la raíz de la base de datos.
//crear instancias de los registros myCustomer CustomerRecordPart; myLocation LocationRecordPart; myOrder OrderRecordPart; myItem ItemRecordPart; //crear un argumento de búsqueda de segmento myCustomer.customerNo = "5001"; myLocation.locationNo = "22"; myOrder.orderDateNo = "20050730A003"; myItem.itemInventoryNo = "CHAIR"; //clave compuesta de 1er componente myItem.itemLineNo = 27; //obtener el elemento y retenerlo try get myItem forUpdate; onException myErrorHandler(2); end
Durante la ejecución, DL/I realizará una llamada GU (get unique) con un argumento de búsqueda de segmento concatenado de 30 bytes que incluirá los campos de clave del cliente (6 bytes), pedido (12 bytes) y elemento (6 + 2 bytes).
Conceptos relacionados
Conceptos básicos de base de datos DL/I
Tipos de registros y propiedades
Bloques de establecimiento de valor
Tareas relacionadas
Excepciones del sistema de EGL
Visualizar código DL/I implícito
Consulta relacionada
Directiva #dli
@DLI
add
delete
Biblioteca EGL DLILib
Biblioteca VGLib de EGL
Ejemplo de base de datos DL/I
get
get next
get next inParent
Códigos de error de IMS y DL/I
Propiedades de componentes de registro PCB
replace
set