Définition d'un champ virtuel

Dans cette section :

Comment :

Référence :

Un champ virtuel peut être utilisé dans une requête en tant que champ réel d'une source de données. Le calcul qui détermine la valeur d'un champ virtuel s'effectue sur chaque enregistrement récupéré qui remplit des conditions de filtrage sur des champs réels. Le résultat de l'expression est traité comme un champ réel stocké dans la source de données.

Un champ virtuel peut être défini de l'une des façons suivantes

Conseil : si votre environnement prend en charge le paramètre KEEPDEFINES, vous pouvez régler KEEPDEFINES à ON afin d'empêcher que les champs virtuels ne soient effacés par une commande JOIN subséquente. Pour plus de détails, consultez Jonction de sources de données.


Haut de page

x
Référence : Notes d'utilisation pour la création de champs virtuels

Haut de page

x
Syntaxe : Créer un champ virtuel

Avant de commencer une requête de rapport, incluez ce qui suit :

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

où :

filename
est le nom de la source de données pour laquelle vous définissez le champ virtuel.

Si la requête de rapport spécifie une vue alterne, utilisez filename conjointement avec view_fieldname.

Tous les champs utilisés pour définir le champ virtuel doivent se trouver sur un chemin unique dans la source de données. S'ils ne le font pas, vous pouvez employer la vue alterne, qui exige des commandes DEFINE de vue alterne. Pour un aperçu différent, les champs virtuels ne peuvent pas contenir de noms de champ qualifiés. Pour plus d'informations sur les vues alternes, consultez Rotation d'une structure de données pour une meilleur récupération.

Le ligne de commande DEFINE FILE doit se trouver sur une ligne distincte de ses définitions de champ virtuel.

view_fieldname
est le champ sur lequel une vue alterne est basée dans la requête correspondante. Il peut être nécessaire d'utiliser une vue alterne si les champs utilisés ne se trouvent pas sur un chemin unique dans la vue normale.
CLEAR
efface les champs virtuels utilisés déjà qui sont associés à la source de données spécifiée. CLEAR est la valeur par défaut.
AJOUTER
vous permet de spécifier des champs virtuels additionnels pour une source de données sans lâcher de champs virtuels existants. L'omission de ADD produit les mêmes résultats que l'option CLEAR.
fieldname
Est un nom qui est conforme aux règles de nommage de champs WebFOCUS. Les noms de champs indexés dans les sources de données FOCUS doivent être inférieures ou égales à 12 caractères. Le nom de champ peut être le nom d'un nouveau champ virtuel que vous définissez, ou un champ existant déclaré dans le fichier maître, que vous voulez redéfinir.

Le nom peut inclure toute combinaison de lettres, de chiffres et de soulignements (_), et doit commencer par une lettre.

Il ne faut pas utiliser les noms de champ de type Cn, En ou Xn (où n est toute séquence composée d'un ou de deux chiffres), car ils sont destinés à d'autres emplois.

format
Est le format du champ. La valeur par défaut est D12.2. Pour plus d'informations sur les formats de champ, consultez Description de données en langage WebFOCUS .
WITH realfield
Associe un champ virtuel à un segment de source de données contenant un champ réel. Pour plus d'informations, consultez Notes d'utilisation pour la création de champs virtuels.
line1, line2...
Sont les lignes de titre de colonne par défaut à afficher pour le champ virtuel à moins qu'elles ne soient remplacées par une phrase AS.
description
Est la description à associer au champ virtuel. La description s'affiche dans les outils qui parcourent les fichiers maîtres.
REDEFINES qualificateur.fieldname
vous permet de redéfinir ou de recalculer un champ dont le nom existe dans plus d'un segment. Si vous modifiez le format du champ lors de sa redéfinition, la longueur dans le nouveau format doit être similaire ou inférieur à l'original. De plus, la conversion entre les types de données alphanumériques et numériques n'est pas pris en charge.
expression
Peut être une expression arithmétique et/ou logique ou une fonction, évaluée pour établir la valeur de fieldname (consultez Utilisation d'expressions). Il faut terminer chaque expression avec un point-virgule, sauf la dernière, où le point-virgule est facultatif.

Les champs dans une expression peuvent être des champs de données réels, des champs de données dans des sources de données de référence ou jointes, ou des champs virtuels définis auparavant. Pour plus de détails, consultez Notes d'utilisation pour la création de champs virtuels.

END
est requis pour mettre fin à la commande DEFINE FILE. END doit être sur une ligne tout seul dans la procédure.

Remarque : pour consulter les informations sur les attributs pour les champs virtuels, référez-vous à Attribut MISSING dans les commandes DEFINE et COMPUTE.



Exemple : Définition d'un champ virtuel

Dans la requête suivante, la valeur de RATIO est calculée en divisant la valeur de DELIVER_AMT par OPENING_AMT. La commande DEFINE crée RATIO en tant que champ virtuel, qui est utilisé dans la requête comme s'il était un champ réel dans la source de données.

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 sortie est :

DELIVER_AMT  OPENING_AMT           RATIO
-----------  -----------           -----
         80           65            1.23
        100          100            1.00
         80           90             .89


Exemple : Redéfinir un champ

La requête suivante redéfini les champ de salaires dans la source de données EMPDATA pour qu'ils impriment les astérisques pour les titres de tâches contenant le mot 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 sortie est :

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


Exemple : Redéfinir un champ avec le même nom dans plusieurs segments

La requête suivante joint la source de données EMPDATA à elle-même. Cette action crée une structure à deux segments dans laquelle les noms sont les mêmes dans les deux segments. La requête redéfini ensuite le champ de salaires dans le segment supérieur (nom de balise : ORIG) de façon à ce que les noms commençant avec la lettre L soient remplacés par des astérisques, et redéfini le champ des salaires dans le segment enfant (nom de balise : NEW) de façon à ce que les noms commençant avec la lettre M soient remplacés par des astérisques :

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 sortie est :

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

Haut de page

x
Définition de plusieurs champs virtuels

Comment :

Vous pouvez choisir de ne disposer que d'un ensemble de champs virtuels pour la même source de données, et utiliser plusieurs ou tous les champs virtuels dans une requête. L'option ADD vous permet de spécifier des champs virtuels supplémentaires sans supprimer ceux existants. Si vous omettez l'option ADD, les champs virtuels définis auparavant dans cette source de données-là sont effacés.

Si vous souhaitez supprimer un champ virtuel pour une source de données en particulier, utilisez l'option CLEAR.



x
Syntaxe : Ajouter un champ virtuel à des champs virtuels existants
DEFINE FILE filename ADD

où :

filename
est la source de données.


Exemple : Ajout de champs virtuels

L'exemple suivant illustre l'utilisation des options ADD et CLEAR pour les champs virtuels :

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. La première commande DEFINE crée le champ virtuel TYPE pour la source de données CAR. Pour en savoir plus sur la fonction DECODE, reportez-vous au manuel Utiliser les fonctions .
  2. Deux ou plus de champs virtuels, TAX et FCOST, sont créés pour la base de données CAR. L'option ADD vous permet de faire référence aux champs ETYPE, TAX et FCOST dans d'autres requêtes.

Haut de page

x
Affichage de champs virtuels

Comment :

Vous pouvez afficher tous les champs virtuels à l'aide de ? commande DEFINE.



x
Syntaxe : Afficher des champs virtuels
? DEFINE

Pour plus d'informations, consultez le manuel Développement d'applications de reporting .



x
Comment : Afficher des champs virtuels

Cliquez dans l'onglet Champs DEFINE dans l'outil DEFINE.


Haut de page

x
Effacement d'un champ virtuel

Les éléments suivants peuvent effacer un champ virtuel créé dans une procédure :

A la différence des champs virtuels créés dans une procédure, les champs virtuels d'un fichier Master ne peuvent pas être effacés par les méthodes décrites ci-dessus.

Pour supprimer tous les champs virtuels de toutes les sources de données, lancez la commande suivante :

DEFINE FILE * CLEAR
END


Exemple : Effacement de champs virtuels

L'exemple suivant illustre l'utilisation des options CLEAR pour les champs virtuels :

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. La première commande DEFINE crée le champ virtuel TYPE pour la source de données CAR. Pour en savoir plus sur la fonction DECODE, consultez Développement d'applications de reporting .
  2. L'option CLEAR efface les champs virtuels définis auparavant, et seulement le champ virtuel COST dans la dernière commande DEFINE est disponible pour l'utilisation dans d'autres requêtes.

Haut de page

x
Définir un emplacement de segment pour un champ virtuel

Les champs virtuels ont un emplacement logique dans la structure de source de données, de la même façon que les champs de source de données. L'emplacement logique d'un champ virtuel se trouve sur le segment le plus bas qui n'a pas été accédé lors de l'évaluation de l'expression, et détermine le temps d'exécution du champ. Examinez la structure de source de données et la commande DEFINE suivantes :

champ virtuel

DEFINE RATIO = DELIVER_AMT/RETAIL_PRICE ;

L'expression de RATIO comprend au moins une source de données réelle. En ce qui concerne les capacités de rapport, le champ RATIO est identique à un champ réel dans le fichier maître, et se trouve dans le segment le plus bas.

Dans certaines applications, vous pouvez faire évaluer un champ virtuel par une expression ne contenant aucun champ d'une source de données réelle. Une telle expression peut faire référence seulement aux champs temporaires ou aux littéraux. Par exemple,

NCOUNT/I5 = NCOUNT+1;

ou

DATE/YMD = '19990101';

Comme aucune des deux expressions ne contient un champ de source de données (NCOUNT et le littéral n'existent pas dans le fichier maître), il n'est pas possible de déterminer leurs positions logiques dans la source de données. Il faut spécifier dans quel segment vous souhaitez placer l’expression. Pour associer un champ virtuel à un segment particulier, utilisez la phrase WITH. Le nom de champ suivant WITH peut être tout champ réel dans le fichier maître.

En ce qui concerne les sources de données FOCUS, vous pouvez peut-être augmenter la vitesse de récupération avec un index externe sur le champ virtuel. Dans ce cas, vous pouvez associer l'index à un segment racine en dehors du segment contenant le champ virtuel. Consultez le manuel Développement d'applications de reporting pour plus d'informations sur les index externes.



Exemple : Etablissement d'un emplacement de segment

Le champ NCOUNT est placé dans le même segment que le champ UNITS. NCOUNT est calculé chaque fois qu'une nouvelle instance de segments est récupérée.

DEFINE FILE GGSALES
NCOUNT/I5 WITH UNITS = NCOUNT+1;
END

Haut de page

x
Définition de champs virtuels avec une source de données multi-chemins

Les calculs d'un champ virtuel peuvent inclure des champs de tous les segments d'une source de données, mais ils doivent se trouver sur un chemin de haut en bas unique. Différents champs virtuels peuvent, bien sûr, se trouver sur différents chemins. Par exemple, considérez la structure de source de données suivante :

champs virtuels différents

Cette structure de source de données ne vous permet pas d'écrire l'expression suivante :

NEWAMT = SALARY+GROSS;

L'expression est invalide parce que la structure implique qu'il peut y avoir plusieurs segments SALARY pour un champ EMPLOYEE donné, et il n'est pas facile de déterminer quel segment SALARY à associer au segment GROSS.

Pour réaliser une telle opération, vous pouvez employer l'option de vue alterne décrite à la rubrique Amélioration du traitement de rapports.


Haut de page

x
Augmentation de la vitesse de calcul dans les champs virtuels

Comment :

La vitesse de calcul peut être augmentée en compilant les champs virtuels en code machine.

Quand vous activez la compilation des expressions, les expressions dans les critères IF sont aussi compilés. Dans certains cas, une expression dans un test IF va contenir trop d'éléments pour être compilée (la limite est 8192). Dans ce cas, un message FOC1975 est généré pour indiquer que l'expression n'a pas pu être compilée. Cependant, le rapport est complété avec succès, et l'expression est évaluée correctement sans compilation.

Vous pouvez empêcher la compilation d'autres champs, et assurer leur interprétation lors de l'exécution, en changeant la définition du paramètre DEFINES SET. Des calculs sont alors interprétés chaque fois que le calcul s'effectue, ce qui augmente le temps d'exécution de la procédure.

Pour compiler les calculs il faut un compilateur C disponible sur les systèmes Windows et UNIX. Sur les systèmes z./OS, les calculs sont compilés directement en code machine. Si, pour une raison quelconque, la compilation échoue, WebFOCUS supprime automatiquement l'option SET DEFINES=COMPILED. Pour des détails sur le paramètre WEBARCHIVE, reportez-vous au guide Développement d'applications de reporting .



x
Syntaxe : Définir la compilation de champs virtuels
SET DEFINES = {COMPILED|OLD}

où :

COMPILED

compile les champs virtuels. COMPILED est la valeur par défaut sur z/OS.

OLD

ne compile pas les champs virtuels. OLD est la valeur par défaut sur Windows et UNIX.


Haut de page

x
Maintien de champs virtuels avec DEFINE FILE SAVE et RETURN

Comment :

De temps à autre, il faut ajouter du nouveau code à une application existante. En ajoutant du code à une application, il est possible que les champs virtuels soient écrasés par la réutilisation involontaire de leurs noms.

La commande DEFINE FILE SAVE crée un nouveau contexte pour les champs virtuels. Tous les nouveaux contextes créent une nouvelle couche ou un nouvel environnement de commande. En entrant dans le nouvel environnement pour la première fois, tous les champs virtuels définis dans la couche précédente sont disponibles dans la nouvelle couche. Le remplacement ou l'effacement d'une définition de champ virtuel n'ont une incidence que sur la couche actuelle. Vous pouvez revenir au contexte par défaut avec la commande DEFINE FILE RETURN, et les définitions de champ virtuel demeurent inchangées.

Par conséquent, tous les champs virtuels sont créés dans la nouvelle application et peuvent être enlevés avant de revenir à l'application d'appel, sans avoir d'incidence sur les champs virtuels existants dans cette application-là.

Pour voir un exemple des commandes DEFINE FILE SAVE et DEFINE FILE RETURN, consultez Jonction de sources de données.

Remarque : une commande JOIN peut être lancée après une commande DEFINE FILE SAVE. Cependant, afin d'effacer le contexte de jointure, il faut lancer une commande JOIN CLEAR si la jointure est toujours active. Si seuls des champs virtuels et une commande DEFINE FILE ADD ont été lancés après une commande DEFINE FILE SAVE, vous pouvez les effacer en lançant une commande DEFINE FILE RETURN.



x
Syntaxe : Empêcher l'écrasement de champs virtuels
DEFINE FILE filename SAVE 
fld1/format1=expression1; 
fld2/format2=expression2;
END
TABLE FILE filename ...
MODIFY FILE filename ...
DEFINE FILE filename RETURN
END

où :

SAVE
crée un nouveau contexte pour les champs virtuels.
filename
est le nom du fichier maître qui obtient un nouveau contexte et qui applique les champs virtuels subséquents avant le lancement de la commande DEFINE FILE RETURN.
RETOUR
efface le contexte actuel s'il a été créé par DEFINE FILE SAVE, et rétablit le contexte précédent.

Haut de page

x
Application de champs virtuels dynamiquement formatés aux colonnes de rapport

Comment :

Référence :

Le formatage dynamique vous permet d'appliquer différents formats à des données particulières dans une colonne, en utilisant un champ temporaire qui contient des paramètres de données dynamiques.

Avant de pouvoir formater une colonne de rapport à l'aide du format dynamique, vous devez créer le rapport, puis appliquer le champ temporaire à une colonne de ce rapport. Par exemple, vous pouvez créer un champ temporaire contenant les différents formats monétaires décimaux des pays tels que le Japon (format sans décimales) et l'Angleterre (format utilisant 2 décimales). Ces formats monétaires sont considérés comme des formats dynamiques. Vous pouvez ensuite appliquer le champ temporaire contenant les paramètres de format dynamique à une colonne Ventes . Dans un rapport, la colonne de ventes reflète les différents formats de devise de chaque pays.

Le champ contenant les spécifications de format peut être :

Le champ contenant les formats doit être alphanumérique et comporter au moins huit caractères. Seulement les premiers huit caractères sont utilisés pour le formatage.

Le format basé sur les champs peut spécifier une longueur qui est plus longue que celle du champ original. Cependant, si la nouvelle longueur est plus d'un tiers plus longue que la longueur originale, il se peut que la largeur de la colonne de rapport ne soit pas assez grande pour tenir la valeur (ce qui est indiqué par des astérisques).

Vous pouvez appliquer un format basé sur les champs à tout type de champ. Le nouveau format doit toutefois être compatible avec le format original :

Si le format basé champs est invalide ou s'il spécifie un type de conversion inadmissible, le champ s'affiche avec des signes plus (++++) dans la sortie de rapport.



x
Syntaxe : Définir et appliquer un champ de format

Une fois le champ de format défini, vous pouvez appliquer le format à la requête de rapport :

TABLE FILE filename 
display fieldname/format_field[/just]
END

où :

affichage
Est toute commande d'affichage valide.
fieldname
Est un champ dans la requête à reformater.
format_field
Est le nom du champ contenant les formats. Si le nom du champ de format est le même qu'un format explicite, le format explicite est utilisé. Par exemple, un champ appelé I8 ne peut pas être utilisé pour le formatage basé champs car il sera interprété comme étant le format explicite I8.
just
indique une justification à gauche (L), à droite (R) ou centrée (C). L'option de justification peut être spécifiée avant ou après le champ de format, séparée du format par une barre oblique.


Exemple : Création de champs formatés dynamiquement

La requête suivante formate le champ SALES selon la valeur du champ 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 sortie est :

COUNTRY          SALES
-------          -----
ENGLAND     12,000.000
FRANCE            $.00
ITALY       $30,200.00
JAPAN           78030.
W GERMANY   $88,190.00


x
Référence : Notes sur le formatage basé champs

Haut de page

x
Passer des appels de fonction directement vers un moteur relationnel à l'aide de la syntaxe SQL.Function

Référence :

Les adaptateurs SQL peuvent passer des champs virtuels qui appellent certaines fonctions scalaires SQL vers le moteur relationnel pour le traitement. Cette action vous permet d'utiliser les fonctions SQL dans une requête même lorsqu'elles n'ont aucun équivalent dans la langue WebFOCUS. Cette fonction doit être basée sur des lignes et contenir une liste de paramètres constituée d'une liste de noms de colonnes ou de constantes délimitées par des virgules. Pour référencer la fonction dans une expression, ajoutez au nom de la fonction le préfixe SQL.

Si le champ virtuel se trouve dans un fichier maître, les requêtes TABLE et les requêtes SQL qui qualifient pour un Passthru automatique (APT) peuvent accéder au champ. Si le champ virtuel est créé par une commande DEFINE FILE, les requêtes TABLE peuvent accéder au champ. Le nom et les paramètres de la fonction sont passés sans traduction vers le moteur relationnel. Cependant, l'expression qui crée le champ DEFINE doit être optimisée, ou la requête échouera.



x
Référence : Notes d'utilisation pour les appels de fonctions directes SQL


Exemple : Appeler la fonction SQL CONCAT dans une requête

Cet exemple utilise l'exemple de démo WebFOCUS. Vous pouvez créer l'exemple de cette sources de données pour un adaptateur relationnel en effectuant un clic droit sur l'application dans laquelle vous souhaitez placer cet exemple, puis sélectionnez Nouveau et Exemples à partir du menu contextuel. Sélectionnez ensuite WebFOCUS - Démo à partir de la liste déroulante Exemples de procédures et de données pour puis cliquez sur Créer.

La requête suivante à partir de la source de données Démo WebFOCUS utilise la fonction SQL CONCAT pour concaténer la catégorie du produit avec la sous-catégorie du produit.

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 sortie de la trace montre que l'appel de la fonction SQL a été passé vers le SGBDR.

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