Cómo definir un campo virtual

En esta sección:

Cómo:

Referencia:

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:

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.


Principio de página

x
Referencia: Notas sobre cómo crear campos virtuales

Principio de página

x
Sintaxis: Cómo Crear un campo virtual

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:

filename
Es el nombre del origen de datos para el que está definiendo el campo virtual.

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.

view_fieldname
Es el campo en que se basa una vista alternativa en la solicitud correspondiente. Podría necesitar una vista alternativa si los campos utilizados no están en una sola ruta en la vista normal.
CLEAR
Borra los campos virtuales definidos anteriormente y asociados con el origen de datos especificado. El valor predeterminado es CLEAR.
ADD
Le permite especificar campos virtuales adicionales para un origen de datos sin tener que prescindir de campos virtuales existentes. La omisión de ADD genera los mismos resultados que la opción CLEAR.
fieldname
Es el nombre compatible con las reglas de nomenclatura de campos WebFOCUS. Los nombres de campo indexados deben contener un número de caracteres menor o igual a doce, en orígenes de datos FOCUS. Puede ser el nombre de un nuevo campo virtual que defina, o bien de un campo existente declarado en el archivo máster que desee redefinir.

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.

format
Es el formato del campo El valor predefinido es D12.2. Para más información sobre formatos de campo, consulte el manual Cómo describir datos con el lenguaje WebFOCUS. .
WITH realfield
Asocia un campo virtual con un segmento de origen de datos que contenga un campo real. Para más información, consulte Notas sobre cómo crear campos virtuales
line1, line2...
Son las líneas del título común predeterminado que aparecen para el campo virtual, a menos que se anulen mediante una frase AS.
description
Es la descripción que se va asociar al campo virtual. La descripción aparece en las herramientas encargadas de examinar los archivos máster.
REDEFINES qualifier.fieldname
Le permite redefinir o recalcular un campo cuyo nombre existe en más de un segmento. Si cambia el formato del campo a la hora de redefinirlo, la longitud en el formato nuevo debe ser igual o más corta que en el original. Además, no se admite la conversión entre tipos de datos numéricos y alfanuméricos.
expression
Puede ser una expresión o función aritmética o lógica evaluada para establecer el valor de fieldname (vaya a Cómo utilizar expresiones). Debe terminar cada expresión con punto y coma, excepto la última, en que el punto y coma es opcional.

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.

END
Se requiere para terminar el comando DEFINE FILE. END debe ocupar una línea independiente en el procedimiento.

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 .



Ejemplo: Cómo definir un campo virtual

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


Ejemplo: Cómo redefinir un campo

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


Ejemplo: Cómo redefinir un campo con el mismo nombre en segmentos múltiples

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

Principio de página

x
Cómo definir múltiples campos virtuales

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.



x
Sintaxis: Cómo Añadir un campo virtual a campos virtuales existentes
DEFINE FILE filename ADD

donde:

filename
Es el origen de datos.


Ejemplo: Cómo añadir campos virtuales

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
  1. El primer comando DEFINE crea el campo virtual TYPE del origen de datos CAR. Para más información sobre la función DECODE, consulte el manual Cómo usar las funciones. .
  2. Se crean dos o más campos virtuales, TAX y FOCST, para el origen de datos CAR. La opción ADD le permite mencionar ETYPE, TAX y FCOST en referencias futuras.

Principio de página

x
Cómo mostrar campos virtuales

Cómo:

Puede mostrar todos los campos virtuales con el comando ? DEFINE comando DEFINE.



x
Sintaxis: Cómo Mostrar campos virtuales
? DEFINE

Para más información, consulte el manual Cómo desarrollar aplicaciones de informes .



x
Procedimiento: Cómo Mostrar campos virtuales

Pulse la pestaña Campos definidos de la herramienta Define.


Principio de página

x
Cómo limpiar un campo virtual

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


Ejemplo: Cómo borrar campos virtuales

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
  1. El primer comando DEFINE crea el campo virtual TYPE del origen de datos CAR. Para obtener más información sobre la función DECODE, consulte el manual Cómo desarrollar aplicaciones de informes.
  2. La opción CLEAR borra todos los campos virtuales definidos anteriormente y sólo se mantiene disponible el campo virtual COST del último DEFINE para solicitudes posteriores.

Principio de página

x
Cómo establecer la ubicación de un segmento para un campo virtual

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:

campo virtual

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.



Ejemplo: Cómo establecer la ubicación de un segmento

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

Principio de página

x
Cómo definir campos virtuales mediante un origen de datos de múltiples rutas

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:

campos virtuales diferentes

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.


Principio de página

x
Cómo aumentar la velocidad de los cálculos en campos virtuales

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.



x
Sintaxis: Cómo Establecer la compilación de campos virtuales
SET DEFINES = {COMPILED|OLD}

donde:

COMPILED

Compila campos virtuales. COMPILED es el valor predeterminado en z/OS.

OLD

No compila campos virtuales. OLD es el valor predeterminado en Windows y UNIX.


Principio de página

x
Cómo conservar campos virtuales con DEFINE FILE SAVE y RETURN

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.



x
Sintaxis: Cómo Proteger a los campos virtuales para que no sean reemplazados
DEFINE FILE filename SAVE 
fld1/format1=expression1; 
fld2/format2=expression2;
END
TABLE FILE filename ...
MODIFY FILE filename ...
DEFINE FILE filename RETURN
END

donde:

SAVE
Crea un nuevo contexto para campos virtuales.
filename
Es el nombre del archivo máster que obtiene un nuevo contexto y al que se aplican los campos virtuales posteriores antes de que se emita el comando DEFINE FILE RETURN.
RETURN
Borra el contexto actual si es que fue creado mediante DEFINE FILE SAVE y restaura el contexto anterior.

Principio de página

x
Cómo aplicar campos virtuales formateados dinámicamente a columnas de informes

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.



x
Sintaxis: Cómo Definir y aplicar un formato de campo

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:

display
Es cualquier comando de visualización, válido.
fieldname
Es un campo en la solicitud que debe ser reformateado.
format_field
Es el nombre del campo que contiene los formatos. Si el nombre del campo de formato es igual a un formato explícito, se utiliza el formato explícito. Por ejemplo, no se puede utilizar un campo llamado I8 para formatear a partir de campos, porque se interpreta com el formato I8 explícito.
just
Es una opción de justificación: L, R o C. La opción de justificación se puede colocar antes o después del campo de formato, separada del formato por una barra (/).


Ejemplo: Cómo crear campos con formato dinámico

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


x
Referencia: Notas de uso sobre reformateo basado en campos

Principio de página

x
Cómo pasar llamadas de función directamente a un motor relacional utilizando la sintaxis SQL.Function

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á.



x
Referencia: Notas de uso de las llamadas directas de función de SQL


Ejemplo: Cómo llamar a la función SQL CONCAT en una solicitud

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