En esta sección: |
Existen dos maneras de conservar campos virtuales mientras se analiza una join. Una consiste en utilizar KEEPDEFINES y la otra en utilizar DEFINE FILE SAVE y DEFINE FILE RETURN.
Cómo: Referencia: |
El parámetro KEEPDEFINES determina si se conserva o elimina un campo virtual creado por el comando DEFINE para un host o estructura unida después de ejecutar el comando JOIN. Aplica cuando el comando DEFINE precede al comando JOIN.
Los campos virtuales anteriores constituyen lo que se conoce como un contexto. Cada nuevo contexto crea un nuevo nivel o comando de entorno. Cuando introduce el nuevo entorno por primera vez, todos los campos virtuales del nivel anterior quedan disponibles en el nuevo nivel. Remplazar o eliminar una definición de campo virtual afecta solamente al nivel actual. Cuando regresa al nivel anterior, sus definiciones de campo virtual quedan intactas.
Los nuevos campos DEFINE emitidos después del comando JOIN constituyen otro contexto y, por esa razón, generan una pila de contextos. En cada contexto, todos los campos virtuales de todos los contextos anteriores son accesibles.
Los comandos JOIN CLEAR as_name eliminan todos los contextos creados después de emitir el JOIN as_name.
En las joins condicionales basadas en DEFINE, la configuración KEEPDEFINES debe estar activada. Luego debe crear todos los campos virtuales antes de emitir el comando JOIN condicional basado en DEFINE. Esto difiere de las joins tradicionales basadas en DEFINE en que el campo virtual se crea después del comando JOIN. Además, un campo virtual puede ser parte de La sintaxis JOIN o WHERE.
Los comandos DEFINE emitidos después del comando JOIN no reemplazan o eliminan los campos virtuales creados anteriormente a la join, toda vez que se ha creado un nuevo contexto.
SET KEEPDEFINES = {ON|OFF}
donde:
Los campos virtuales que se definan antes de poner KEEPDEFINES ON no se conservarán después de incluir el comando JOIN.
El primer campo virtual, DAYSKEPT, se define antes de emitir cualquier join, pero después de activar KEEPDEFINES. DAYSKEPT es la cantidad de días que van desde la fecha de devolución de una cinta de vídeo alquilada y la fecha de alquiler de ésta.
SET KEEPDEFINES = ON DEFINE FILE VIDEOTRK DAYSKEPT/I5 = RETURNDATE - TRANSDATE; END
El comando ? DEFINE muestra que este es el único campo virtual definido hasta el momento:
? DEFINE
FILE FIELD NAME FORMAT SEGMENT VIEW TYPE VIDEOTRK DAYSKEPT I5 4
La siguiente solicitud imprime todas las transacciones en las que el número de días en que se guarda es dos:
TABLE FILE VIDEOTRK PRINT MOVIECODE TRANSDATE RETURNDATE DAYSKEPT COMPUTE ACTUAL_DAYS/I2 = RETURNDATE-TRANSDATE; WHERE DAYSKEPT EQ 2 END
Las primeras líneas de salida muestran que cada fecha de devolución viene dos días después de la fecha de transacción:
MOVIECODE TRANSDATE RETURNDATE DAYSKEPT ACTUAL_DAYS --------- --------- ---------- -------- ----------- 001MCA 91/06/27 91/06/29 2 2 692PAR 91/06/27 91/06/29 2 2 259MGM 91/06/19 91/06/21 2 2
Ahora se combina el origen de datos VIDEOTRK con el origen de datos MOVIES. La consulta ? DEFINE muestra que la join no eliminó el campo virtual DAYSKEPT:
JOIN MOVIECODE IN VIDEOTRK TO ALL MOVIECODE IN MOVIES AS J1 ? DEFINE
FILE FIELD NAME FORMAT SEGMENT VIEW TYPE VIDEOTRK DAYSKEPT I5 4
Luego se define un nuevo campo virtual, YEARS, para la join entre VIDEOTRK y MOVIES:
DEFINE FILE VIDEOTRK YEARS/I5 = (TRANSDATE - RELDATE)/365; END
La consulta ? DEFINE muestra que el campo virtual creado antes de la join, no fue eliminado por este nuevo campo virtual porque se encontraba en un contexto diferente:
? DEFINE
FILE FIELD NAME FORMAT SEGMENT VIEW TYPE VIDEOTRK DAYSKEPT I5 4 VIDEOTRK YEARS I5 5
Luego, se redefine el campo DAYSKEPT de manera que devuelva la cantidad real de días más un día.
DEFINE FILE VIDEOTRK DAYSKEPT/I5 = RETURNDATE - TRANSDATE + 1; END
El manual ? DEFINE muestra que existen dos versiones del campo virtual DAYSKEPT. Sin embargo, YEARS fue eliminado porque se encontraba en el mismo contexto (después de la join) que la nueva versión de DAYSKEPT y el comando DEFINE no especificaba la opción ADD:
? DEFINE
FILE FIELD NAME FORMAT SEGMENT VIEW TYPE VIDEOTRK DAYSKEPT I5 4 VIDEOTRK DAYSKEPT I5 4
La misma solicitud utiliza ahora la nueva definición de DAYSKEPT. Fíjese que la cantidad de días transcurridos entre la fecha de devolución y la fecha de transacción es de un día, no de dos; esto es así por el cambio en la definición de DAYSKEPT:
MOVIECODE TRANSDATE RETURNDATE DAYSKEPT ACTUAL_DAYS --------- --------- ---------- -------- ----------- 040ORI 91/06/20 91/06/21 2 1 505MGM 91/06/21 91/06/22 2 1 710VES 91/06/26 91/06/27 2 1
Ahora se elimina J1. También se elimina la redefinición de DAYSKEPT:
JOIN CLEAR J1 ? DEFINE
FILE FIELD NAME FORMAT SEGMENT VIEW TYPE VIDEOTRK DAYSKEPT I5 4
La salida de informe muestra que la definición original de DAYSKEPT se encuentra activa en este momento:
MOVIECODE TRANSDATE RETURNDATE DAYSKEPT ACTUAL_DAYS --------- --------- ---------- -------- ----------- 001MCA 91/06/27 91/06/29 2 2 692PAR 91/06/27 91/06/29 2 2 259MGM 91/06/19 91/06/21 2 2
El comando DEFINE FILE SAVE forma un nuevo contexto para campos virtuales, que luego se pueden eliminar con DEFINE FILE RETURN. Para más detalles, consulte Cómo crear campos temporales.
El comando siguiente le permite conservar campos virtuales en un contexto de archivo:
SET KEEPDEFINES=ON
El siguiente comando define el campo virtual A para el origen de datos VIDEOTRK y lo coloca en el contexto actual:
DEFINE FILE VIDEOTRK A/A5='JAWS'; END
El siguiente comando crea un nuevo contexto y guarda al campo virtual B en ese contexto:
DEFINE FILE VIDEOTRK SAVE B/A5='ROCKY'; END ? DEFINE
La salida del comando ? DEFINE lista los campos virtuales A y B:
FILE FIELD NAME FORMAT SEGMENT VIEW TYPE VIDEOTRK A A5 VIDEOTRK B A5
El siguiente comando DEFINE crea el campo virtual C. Dado que no se utilizó la opción ADD en el comando DEFINE, se eliminan todos los campos virtuales previamente definidos:
DEFINE FILE VIDEOTRK C/A10='AIRPLANE'; END ? DEFINE
La salida del comando ? DEFINE muestra que C es el único campo virtual definido:
FILE FIELD NAME FORMAT SEGMENT VIEW TYPE VIDEOTRK C A10
El siguiente comando JOIN crea un nuevo contexto. Dado que se ha activado KEEPDEFINES, el comando JOIN no elimina el campo virtual C:
JOIN MOVIECODE IN VIDEOTRK TAG V1 TO MOVIECODE IN MOVIES TAG M1 AS J1 ? DEFINE
La salida del comando ? DEFINE muestra que el campo C aún se encuentra definido:
FILE FIELD NAME FORMAT SEGMENT VIEW TYPE VIDEOTRK C A10
La próxima instrución DEFINE crea el campo virtual D en el nuevo contexto creado por el comando JOIN:
DEFINE FILE VIDEOTRK SAVE D/A10='TOY STORY'; END ? DEFINE
La salida del comando ? DEFINE muestra que los campos virtuales C y D se encuentran definidos:
FILE FIELD NAME FORMAT SEGMENT VIEW TYPE VIDEOTRK C A10 VIDEOTRK D A10
El comando DEFINE FILE RETURN elimina el campo virtual D creado en el contexto actual (después de la JOIN):
DEFINE FILE VIDEOTRK RETURN END ? DEFINE
La salida del comando ? DEFINE muestra que se eliminó el campo virtual D, pero que el campo C sigue estando definido:
FILE FIELD NAME FORMAT SEGMENT VIEW TYPE VIDEOTRK C A10
El siguiente comando DEFINE FILE RETURN no elimina el campo virtual C porque el campo C no ha sido eliminado con un comando DEFINE FILE SAVE:
DEFINE FILE VIDEOTRK RETURN END ? DEFINE
La salida del comando ? DEFINE muestra que el campo C aún se encuentra definido:
FILE FIELD NAME FORMAT SEGMENT VIEW TYPE VIDEOTRK C A10
Nota: DEFINE FILE RETURN se activa solamente cuando DEFINE FILE SAVE está activada.
El comando condicional JOIN puede hacer referencia a cualquiera y a todos los campos en el segmento combinado así como a cualquiera y a todos los campos en el segmento principal, u otro superior en la ruta del principal.
Cuando se encuentran activas, estas expresiones de join filtran el segmento en que residen (el segmento secundatio o combinado). Es decir que si ningún segmento secundario pasa la prueba definida por la expresión, la join sigue las reglas de SET ALL=OFF o de SET ALL=ON cuando no existe segmento secundario alguno. A diferencia de las frases WHERE en comandos TABLE, el filtraje de JOIN_WHERE no filtra automáticamente el segmento principal cuando SET ALL=ON.
Los criterios WHERE se activan en una join sólo cuando se hace referencia a una solicitud TABLE en un segmento de referencia cruzada o su secundario. Si no se hace tal referencia, no se activa la WHERE.
El atributo AT se utiliza para enlazar el segmento principal o host al segmento secundario o de referencia cruzada correcto. Los valores de campo utilizados como parámetro AT no se emplean para causar el enlace. Se utilizan solamente como segmentos de referencia.
Nota: Si no existen criterios WHERE activos, recibe un producto cartesiano.
WebFOCUS |