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
Pour plus d'informations, consultez le manuel Description de données en langage WebFOCUS .
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.
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ù :
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.
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.
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.
Remarque : pour consulter les informations sur les attributs pour les champs virtuels, référez-vous à Attribut MISSING dans les commandes DEFINE et COMPUTE.
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
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
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
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.
DEFINE FILE filename ADD
où :
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
Comment : |
Vous pouvez afficher tous les champs virtuels à l'aide de ? commande DEFINE.
? DEFINE
Pour plus d'informations, consultez le manuel Développement d'applications de reporting .
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
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
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 :
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.
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
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 :
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.
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 .
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.
DEFINE FILE filename SAVE fld1/format1=expression1; fld2/format2=expression2; END TABLE FILE filename ... MODIFY FILE filename ... DEFINE FILE filename RETURN END
où :
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.
DEFINE FILE filename format_field/A8 = expression; END
DEFINE format_field/A8 = expression; $
COMPUTE format_field/A8 = expression;
où :
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ù :
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
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.
(FOC32605) NON OPTIMIZABLE EXPRESSION WITH SQL. SYNTAX
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 |