Un campo virtual se puede usar en una solicitud como si fuera un verdadero campo del origen de datos. El cálculo que determina el valor de un campo virtual se realiza en cada registro recuperado que pasa cualquier condición de investigación en campos reales. El resultado de la expresión se trata como si fuera un verdadero campo almacenado en el origen de datos.
Diferentes modos de definir un campo virtual:
Para más información, consulte el manual Cómo describir datos con el lenguaje WebFOCUS.
Sugerencia: Si su entorno admite el parámetro KEEPDEFINES, puede activar KEEPDEFINES para evitar que los campos virtuales sean eliminados por un comando JOIN posterior. Para más detalles, consulte Cómo unir orígenes de datos.
Antes de iniciar una solicitud de informe, incluya
DEFINE FILE filename[.view_fieldname] [CLEAR|ADD] fieldname[/format] [TITLE 'line1[,line2 ...'] [DESCRIPTION 'description']=expression; fieldname[/format][WITH realfield]=expression; fieldname[/format] REDEFINES qualifier.fieldname=expression; . . . END
donde:
Si la solicitud de informe especifica una vista alternativa, utilice filename junto con view_fieldname.
Todos los campos utilizados para definir el campo virtual deben estar en una sola ruta en el origen de datos. Si ese no fuera el caso, utilice una vista alternativa, lo que requiere comandos DEFINE de vista alternativa. Para una vista alternativa, los campos virtuales no pueden tener nombres de campo cualificados. Para obtener información acerca de vistas alternativas, vaya a Cómo rotar una estructura de datos para mejorar la recuperación.
La línea de comando DEFINE FILE debe encontrarse en una línea diferente de sus definiciones de campo virtual.
El nombre podría incluir cualquier combinación de letras, dígitos y subrayado (_) y debe empezar con una letra.
No use nombres de campo del tipo Cn, En o Xn (donde n es cualquier secuencia de uno o dos dígitos), porque están reservados para otros usos.
Los campos en la expresión pueden ser campos de datos reales, campos de datos en orígenes de datos unidos o de referencia cruzada o campos virtuales previamente definidos. Para obtener información relacionada, consulte Notas sobre cómo crear campos virtuales.
Nota: Para más información sobre los atributos no disponibles para los campos virtuales, consulte El atributo MISSING en un comando DEFINE o COMPUTE .
En la solicitud siguiente, el valor de RATIO se calcula dividiendo el valor de DELIVER_AMT entre OPENING_AMT. El comando DEFINE crea RATIO como un campo virtual que se utiliza en la solicitud como si fuera un campo real en el origen de datos.
DEFINE FILE SALES RATIO = DELIVER_AMT/OPENING_AMT; END TABLE FILE SALES PRINT DELIVER_AMT AND OPENING_AMT AND RATIO WHERE DELIVER_AMT GT 50 END
La salida es:
DELIVER_AMT OPENING_AMT RATIO ----------- ----------- ----- 80 65 1.23 100 100 1.00 80 90 .89
La siguiente solicitud redefine el campo de salario en el origen de datos EMPDATA para imprimir asteriscos para los títulos de trabajos que contienen la palabra EXECUTIVE:
DEFINE FILE EMPDATA SALARY REDEFINES EMPDATA.SALARY = IF TITLE CONTAINS 'EXECUTIVE' THEN 999999999999 ELSE EMPDATA.SALARY; END TABLE FILE EMPDATA SUM SALARY BY TITLE WHERE TITLE CONTAINS 'MANAGER' OR 'MARKETING' OR 'SALES' ON TABLE SET PAGE OFF END
La salida es:
TITLE SALARY ----- ------ EXEC MANAGER $54,100.00 EXECUTIVE MANAGER *************** MANAGER $270,500.00 MARKETING DIRECTOR $176,800.00 MARKETING EXECUTIVE *************** MARKETING SUPERVISOR $50,500.00 SALES EXECUTIVE *************** SALES MANAGER $70,000.00 SALES SPECIALIST $82,000.00 SENIOR SALES EXEC. $43,400.00
La siguiente solicitud une el origen de datos EMPDATA a sí mismo. Esto genera una estructura de dos segmentos en la que ambos presentan el mismo nombre. A continuación, la solicitud redefine el campo de salario en el segmento superior (nombre de etiqueta ORIG) para que todos los nombres que empiezan por la letra L queden reemplazados por asteriscos, mientras que, en el segmento secundario (nombre de etiqueta NEW), el campo anterior queda redefinido para reemplazar por asteriscos los nombres que empiecen por M:
JOIN PIN IN EMPDATA TAG ORIG TO PIN IN EMPDATA TAG NEW AS AJ DEFINE FILE EMPDATA SALARY/D12.2M REDEFINES ORIG.SALARY = IF LASTNAME LIKE 'L%' THEN 999999999999 ELSE ORIG.SALARY; SALARY/D12.2M REDEFINES NEW.SALARY = IF LASTNAME LIKE 'M%' THEN 999999999999 ELSE NEW.SALARY * 1.2; END TABLE FILE EMPDATA PRINT ORIG.SALARY AS 'ORIGINAL' NEW.SALARY AS 'NEW' BY LASTNAME WHERE LASTNAME FROM 'HIRSCHMAN' TO 'OLSON' ON TABLE SET PAGE NOPAGE END
La salida es:
LASTNAME ORIGINAL NEW -------- -------- --- HIRSCHMAN $62,500.00 $75,000.00 KASHMAN $33,300.00 $39,960.00 LASTRA *************** $138,000.00 LEWIS *************** $60,600.00 LIEBER *************** $62,400.00 LOPEZ *************** $31,680.00 MARTIN $49,000.00 *************** MEDINA $39,000.00 *************** MORAN $30,800.00 *************** NOZAWA $80,500.00 $96,600.00 OLSON $30,500.00 $36,600.00
Cómo: |
Puede que desee tener más de un conjunto de campos virtuales para el mismo origen de datos y utilizar algunos o todos los campos virtuales en la solicitud. La opción ADD le permite especificar campos virtuales adicionales sin borrar los existentes. Si omite la opción ADD, se borran los campos virtuales definidos previamente en ese origen de datos.
Si desea borrar un campo virtual en un origen de datos determinado, utilice la opción CLEAR.
DEFINE FILE filename ADD
donde:
El siguiente ejemplo explica el uso de las opciones ADD y CLEAR para campos virtuales:
1. DEFINE FILE CAR ETYPE/A2=DECODE STANDARD (OHV O OHC O ELSE L); END 2. DEFINE FILE CAR ADD TAX/D8.2=IF MPG LT 15 THEN .06*RCOST ELSE .04*RCOST; FCOST = RCOST+TAX; END
Cómo: |
Puede mostrar todos los campos virtuales con el comando ? DEFINE comando DEFINE.
? DEFINE
Para más información, consulte el manual Cómo desarrollar aplicaciones de informes .
Lo mostrado a continuación puede eliminar un campo virtual creado en un procedimiento:
Al contrario que en los campos creados en un procedimiento, los campos virtuales del archivo máster no se eliminan siguiendo los métodos citados anteriormente.
Para borrar todos los campos virtuales de todos los orígenes de datos, emita el siguiente comando:
DEFINE FILE * CLEAR END
El siguiente ejemplo explica el uso de las opciones CLEAR para campos virtuales:
1. DEFINE FILE CAR ETYPE/A2=DECODE STANDARD (OHV O OHC O ELSE L); END 2. DEFINE FILE CAR CLEAR COST = RCOST-DCOST; END
Los campos virtuales tienen una ubicación lógica en la estructura de origen de datos, tal como los campos de orígenes de datos permanentes. El hogar lógico de un campo virtual se encuentra en el segmento más bajo, al que debe acceder para evaluar la expresión, y determina la hora de ejecución del campo. Tenga en cuenta la siguiente estructura de origen de datos y comando DEFINE:
DEFINE RATIO = DELIVER_AMT/RETAIL_PRICE ;
La expresión para RATIO incluye por lo menos un campo real de origen de datos. Con respecto a las capacidades de informe, el campo RATIO es como un campo real en el archivo máster y está situado en el segmento más bajo.
En algunas aplicaciones puede disponer que una expresión que no contenga campos reales de origen de datos evalúe un campo virtual. Dicha expresión podría referirse solamente a campos temporales o literales. Por ejemplo,
NCOUNT/I5 = NCOUNT+1;
o
DATE/YMD = '19990101';
Dado que ninguna expresión contiene un campo de origen de datos (NCOUNT y el literal no existen en el archivo máster), no se pueden determinar sus posiciones lógicas en el origen de datos. Tiene que especificar en qué segmento desea colocar la expresión. Para relacionar un campo virtual con un segmento específico, utilice la frase WITH. El nombre de campo que sigue a WITH puede ser el de cualquier campo real en el archivo máster.
Para los orígenes de datos FOCUS, puede aumentar la velocidad de recuperación con un índice externo en el campo virtual. En este caso, puede relacionar el índice con un segmento de destino fuera del segmento que contiene el campo virtual. Consulte el manual Cómo desarrollar aplicaciones de informes , para más información acerca de los índices externos.
El campo NCOUNT se coloca en el mismo segmento que el campo UNITS. NCOUNT se calcula cada vez que se recupera una nueva ocurrencia de segmento.
DEFINE FILE GGSALES NCOUNT/I5 WITH UNITS = NCOUNT+1; END
Los cálculos de un campo virtual pueden incluir campos de todos los segmentos de un origen de datos, pero deben encontrarse en una ruta única de arriba a abajo. Por supuesto que los diferentes campos virtuales podrían encontrarse a lo largo de rutas diferentes. Por ejemplo, examine la siguiente estructura de origen de datos:
Esta estructura de origen de datos no le permite escribir la expresión siguiente:
NEWAMT = SALARY+GROSS;
La expresión no es válida porque la estructura implica que puede haber varios segmentos SALARY para un determinado EMPLOYEE y no está claro qué SALARY relacionar con cual GROSS.
Para realizar esta operación puede utilizar la opción de vista alternativa que se explica en Cómo mejorar su procesamiento de informes.
Cómo: |
Los campos virtuales pueden compilarse en código máquina para aumentar la velocidad de cálculo.
Al activar la compilación de expresiones, también se compilan las expresiones de los criterios IF. En algunos casos, las expresiones de una prueba IF pueden tener demasiados elementos para ser compilados (el límite es de 8192). En este caso, aparece un mensaje FOC1975, indicando que no se ha podido compilar la expresión. Sin embargo, el informe se completa y la expresión se evalúa correctamente sin la compilación.
Puede evitar que se compilen los campos virtuales e interpretarlos en tiempo de ejecución cambiando la configuración del parámetro DEFINES SET. Los cálculos se interpretan cada vez que se realiza un cálculo, lo cual aumenta el tiempo de ejecución del procedimiento.
Para poder compilar los cálculos debe haber un compilador C disponible en Windows y UNIX. En z/OS, los cálculos se compilan directamente en código máquina. Si la compilación falla por algún motivo, WebFOCUS suprime automáticamente la opción SET DEFINES=COMPILED. Para más detalles sobre este parámetro, consulte el manual Cómo desarrollar aplicaciones de informes.
Cómo: |
Ocasionalmente, puede que tenga que añadir código nuevo a una aplicación existente. Cuando se añade código, siempre existe la posibilidad de sobrescribir campos virtuales existentes al reutilizar los nombres de forma inadvertida.
El comando DEFINE FILE SAVE forma un nuevo contexto para campos virtuales. Cada nuevo contexto crea un nuevo nivel o comando de entorno. Cuando ingrese por primera vez al nuevo entorno, todos los campos virtuales definidos en el nivel anterior estarán disponibles en el nuevo nivel. Remplazar o eliminar una definición de campo virtual afecta solamente al nivel actual. Puede regresar al contexto predeterminado con el comando DEFINE FILE RETURN y las definiciones de campo virtual permanecerán intactas.
Por lo tanto, se pueden eliminar todos los campos virtuales creados en la nueva aplicación antes de regresar a la aplicación que llama, sin afectar los campos virtuales existentes en esa aplicación.
Para ver un ejemplo de DEFINE FILE SAVE and DEFINE FILE RETURN, vaya a Cómo unir orígenes de datos.
Nota: Se puede emitir un comando JOIN después de un comando DEFINE FILE SAVE. Sin embargo, para borrar el contexto de la join, debe emitir un comando JOIN CLEAR si la join se encuentra aún vigente. Si solamente se emitieran campos virtuales y DEFINE FILE ADD después de un comando DEFINE FILE SAVE, puede borrarlos emitiendo un comando DEFINE FILE RETURN.
DEFINE FILE filename SAVE fld1/format1=expression1; fld2/format2=expression2; END TABLE FILE filename ... MODIFY FILE filename ... DEFINE FILE filename RETURN END
donde:
Cómo: Referencia: |
Formatear dinámicamente le permite aplicar diferentes formatos a datos específicos en una columna usando un campo temporal que contiene propiedades dinámicas de los datos.
Antes de poder formatear una columna del informe usando el formato dinámico, deberá crear el informe y después aplicar el campo temporal a una columna en el informe. Por ejemplo, puede crear un campo temporal que contiene diferentes formatos de divisa decimal para países como Japón (que no utiliza posiciones decimales) e Inglaterra (que usa 2 posiciones decimales). Estos formatos de divisa se consideran formatos dinámicos. Después podrá aplicar el campo temporal que contiene el formato dinámico a una columna Sales. En un informe, la columna Sales refleja los distintos formatos de moneda de cada país.
El campo con las especificaciones de formato puede ser:
El campo que contenga los formatos debe ser alfanumérico y tener al menos nueve caracteres de longitud. Sólo se utilizan los primeros ocho caracteres para el formato.
El formato a partir de campos podría especificar una longitud mayor que la del campo original. Sin embargo, si la nueva longitud es mayor que la longitud original en más de un tercio, el ancho de la columna de informe podría no ser lo suficientemente largo como para mantener el valor (indicado con asteriscos en el campo).
Puede aplicar formato basado en campos a cualquier tipo de campo. Ahora bien, el nuevo formato debe ser compatible con el formato original:
Si el formato basado en campos no es válido o especifica un tipo de conversión no permitido, el campo aparece con signos de más (++++) en la salida de informe.
DEFINE FILE filename format_field/A8 = expression; END
DEFINE format_field/A8 = expression; $
COMPUTE format_field/A8 = expression;
donde:
Después de que se define el campo de formato, puede aplicarlo en una solicitud de informe:
TABLE FILE filename display fieldname/format_field[/just] END
donde:
La siguiente solicitud da formato al campo SALES según el valor del campo COUNTRY:
DEFINE FILE CAR MYFORMAT/A8=DECODE COUNTRY ('ENGLAND' 'P15.3C' 'JAPAN' 'P15.0' ELSE 'P15.2M'); END
TABLE FILE CAR SUM SALES/MYFORMAT BY COUNTRY END
La salida es:
COUNTRY SALES ------- ----- ENGLAND 12,000.000 FRANCE $.00 ITALY $30,200.00 JAPAN 78030. W GERMANY $88,190.00
Referencia: |
Los adaptadores de SQL pueden pasar campos virtuales que invocan ciertas funciones escalares de SQL, para su procesamiento en el motor relacional. Esto permite usar las funciones de SQL en una solicitud, incluso cuando no existe un equivalente en el lenguaje WebFOCUS. La función debe estar basada en filas y tener una lista de parámetros compuesta por una lista de los nombres de columnas o constantes, delimitada por comas. Para hacer referencia a la función en una expresión, añada SQL al comienzo del nombre de la función.
Si el campo virtual se encuentra en el archivo máster, las solicitudes de TABLE, además de las solicitudes de SQL que cumplan con el Passthru automático (APT), podrán acceder al campo. Si el campo virtual ha sido creado por un comando DEFINE FILE, las solicitudes de TABLE podrán acceder al campo. El nombre de la función y los parámetros se pasan al motor relacional sin haber sido traducidos. Por tanto, la expresión que produce el campo DEFINE debe estar optimizada, de lo contrario, fallará.
(FOC32605) NON OPTIMIZABLE EXPRESSION WITH SQL. SYNTAX
En este ejemplos vamos a usar la demostración Retail de WebFOCUS. Para crear este origen de datos de ejemplo para un adaptador relacional, pulse con el botón derecho sobre la aplicación en que desea ubicar el ejemplo, seleccione Nuevo y escoja Ejemplos del menú de contexto. A continuación, seleccione WebFOCUS - Retail Demo de la lista desplegable Procedimientos y datos de ejemplo de y pulse Crear.
La siguiente solicitud, basada en el origen de datos Retail de WebFOCUS, usa la función SQL CONCAT para concatenar la categoría producto con la subcategoría producto.
SET TRACEUSER = ON SET TRACEOFF = ALL SET TRACEON = STMTRACE//CLIENT SET TRACESTAMP=OFF SET XRETRIEVAL = OFF DEFINE FILE WF_RETAIL CAT_SUBCAT/A50 = SQL.CONCAT(PRODUCT_CATEGORY, PRODUCT_SUBCATEG); END TABLE FILE WF_RETAIL PRINT CAT_SUBCAT BY PRODUCT_CATEGORY NOPRINT END
La salida del seguimiento muestra que la llamada de función de SQL ha pasado al RDBMS.
SELECT CONCAT(T2."PRODUCT_CATEGORY",T2."PRODUCT_SUBCATEG"), T2."PRODUCT_CATEGORY", T2."PRODUCT_SUBCATEG" FROM wfr_product T2 ORDER BY T2."PRODUCT_CATEGORY" FOR FETCH ONLY;
WebFOCUS |