Création d'une expression numérique

Dans cette section :

Comment :

Référence :

Une expression numérique effectue un calcul qui utilise des constantes numériques, des champs, des opérateurs et des fonctions pour renvoyer une valeur numérique. Lorsque vous utilisez une expression numérique pour attribuer une valeur à un champ, celui-ci doit être au format numérique. Le format par défaut est D12.2.

Une expression numérique peut être composée des composants suivants, qui s'affichent ci-dessous en caractères gras :

Avant qu'elles soient utilisées dans les calculs, les valeurs numériques sont généralement converties au format de point flottant en double précision. Le résultat est converti par la suite au format de champ spécifié. Dans certains cas la conversion peut avoir pour résultat une différence d'arrondi. Notez que les environnements qui supportent l'arithmétique en mode natif traite la fonction d'arrondi différemment. Pour plus de détails, reportez-vous à Evaluation d'expressions numériques avec l'arithmétique en mode natif.

Si un numéro est trop élevé (supérieur à 1075) ou trop bas (inférieur à 10-75), vous recevez un avertissement de dépassement positif ou négatif, et des astérisques s'affichent pour la valeur du champ.

Remarque : vous pouvez modifier le caractère de dépassement en lançant la commande SET OVERFLOWCHAR.

Pour plus d'informations sur l'arrondissement des format des données numériques, consultez Description de données en langage WebFOCUS .


Haut de page

x
Syntaxe : Ecrire un nombre en notation scientifique

Dans une clause IF, utilisez ce qui suit :

IF field op n[.nn]{E|D|e|d}[+|-]p 

Dans une clause WHERE, utilisez ce qui suit :

WHERE field op EXPN(n[.nn{E|D|e|d}[+|-]p);

Dans une commande COMPUTE, utilisez ce qui suit :

COMPUTE field[/format] = EXPN(n[.nn]{{E|D|e|d}[+|-]p);

Dans une commande DEFINE, utilisez ce qui suit :

DEFINE FILE filename 
field[/format] = EXPN(n[.nn]{E|D|e|d}[+|-]p);
END

Dans une commande DEFINE dans le fichier Master, utilisez ce qui suit :

DEFINE field[/format] = EXPN(n[.nn]{{E|D|e|d}[+|-]p);

où :

field
Est un champ dans une requête.
/format
Est le format facultatif du champ. Pour en savoir plus sur les formats, consultez Description de données en langage WebFOCUS .
op
Est un opérateur relationnel dans une requête.
n.nn
Est une constante numérique qui se compose d'un composant de nombre entier, suivi d'une décimale, suivi d'un composant fractionnaire.
E, D, e, d
Indique la notation scientifique. E, e et D sont interchangeables.
+, -
indique si p est négatif ou positif. Positive est la valeur par défaut.
p
Est la puissance de 10 à laquelle élever le chiffre. La plage de valeurs pour p est comprise entre -78 et +78 sur z/OS, -99 à +99 ailleurs.

Remarque : EXPN est utile pour les calculs sur des champs avec les formats F et D. EXPN est généralement inutile pour les calculs effectués sur les champs au format P ou I.



Exemple : Evaluation d'un chiffre en notation scientifique

Vous pouvez utiliser la notation scientifique dans une clause IF ou WHERE pour exprimer 8000 comme 8E+03 :

IF RCOST LT 8E+03
WHERE RCOST LT EXPN(8E+03)

Haut de page

x
Référence : Opérateurs arithmétiques

Voici une liste des opérateurs arithmétiques que vous pouvez utiliser dans une expression :

Addition

+

Soustraction

-

Multiplication

*

Division

/

L'élévation à une puissance

**

Remarque : si vous essayez de diviser par zéro, la valeur de l'expression est zéro. La multiplication et l'élévation à une puissance ne sont supportées pour aucun type d'expression de date. Pour isoler une partie d'une date, utilisez une commande d'affectation simple.



x
Ordre d'évaluation

Les expressions numériques sont évaluées dans l'ordre suivant :

  1. L'élévation à une puissance.
  2. Division et multiplication.
  3. Addition et soustraction.

Lorsque les opérateurs sont au même niveau, ils sont évalués de gauche à droite. Comme les expressions entre parenthèses sont évaluées avant toute autre expression, vous pouvez utiliser les parenthèses pour changer l'ordre prédéfini. Par exemple, les expressions suivantes produisent des résultats différents à cause des parenthèses :

COMPUTE PROFIT/D12.2  =  RETAIL_PRICE  -  UNIT_COST  *  UNIT_SOLD ;
COMPUTE PROFIT/D12.2  = (RETAIL_PRICE  -  UNIT_COST) *  UNIT_SOLD ;

Dans la première expression, UNIT_SOLD est multiplié par UNIT_COST, et le résultat est soustrait de RETAIL_PRICE. Dans la deuxième expression, UNIT_COST est soustrait de RETAIL_PRICE, et le résultat est multiplié par UNIT_SOLD.

Remarque : il ne peut pas y avoir deux opérateurs consécutifs. L'expression suivante n'est pas valide :

a * -1

Pour la rendre valide, il faut y ajouter des parenthèses :

a* (-1)


Exemple : Contrôle de l'ordre d'évaluation

L'ordre d'évaluation peut avoir une incidence sur le résultat d'une expression. Supposons que vous souhaitez déterminer la perte en dollars de vente-produit attribuée à la renvoie des éléments endommagés. Vous pouvez lancer la requête de rapport suivante :

TABLE FILE SALES
PRINT RETAIL_PRICE RETURNS DAMAGED
COMPUTE RETAIL_LOSS/D12.2 = RETAIL_PRICE * RETURNS + DAMAGED;
BY PROD_CODE
WHERE PROD_CODE IS 'E1';
END

Le calcul

COMPUTE RETAIL_LOSS/D12.2 = RETAIL_PRICE * RETURNS + DAMAGED;

produit un résultat erroné car RETAIL_PRICE est d'abord multiplié par RETURNS, et puis le résultat est ajouté à DAMAGED. Le résultat correct est obtenu en ajoutant RETURNS à DAMAGED, puis en multipliant le résultat par RETAIL_PRICE.

Vous pouvez changer l'ordre d'évaluation en saisissant les expressions entre parenthèses. Une expression entre parenthèses est évaluée avant toute autre expression. Vous pouvez aussi employer des parenthèses pour augmenter la lisibilité.

Avec les parenthèses, voici la syntaxe correcte du calcul précédente :

COMPUTE RETAIL_LOSS/D12.2 = RETAIL_PRICE * (RETURNS + DAMAGED);

La sortie est :

PROD_CODE  RETAIL_PRICE  RETURNS  DAMAGED     RETAIL_LOSS
---------  ------------  -------  -------     -----------
E1                 $.89        4        7            9.79

Haut de page

x
Evaluation d'expressions numériques avec l'arithmétique en mode natif

Lorsque l'arithmétique en mode natif est utilisée, un chemin d'évaluation particulier est suivi pour chaque expression numérique selon le format des opérandes et opérateurs. Si les opérandes sont tous au même format, la plupart des opérations s'effectuent sous ce format-là. Si les opérandes sont à différents formats, ils sont convertis à un même format dans un ordre particulier de priorité de format. Sans tenir compte des formats d'opérande, quelques opérateurs exigent la conversion vers des formats particuliers afin que les opérandes soient au format approprié.


Haut de page

x
Utilisation de formats d'opérande identiques avec l'arithmétique en mode natif

Si tous les opérandes d'un opérateur numérique sont au même format, vous pouvez utiliser la table suivante pour déterminer si les opérations s'effectuent sous ce format natif ou si les opérandes sont convertis avant et après l'exécution de l'opération. Dans les cas où la conversion est nécessaire, les opérandes sont convertis au format opérationnel et le résultat immédiat est renvoyé au format opérationnel. Si le format du résultat diffère de celui de la variable cible, le résultat est converti au format de la variable cible.

Opération

 

Format d'opération

Addition

+

Natif

Soustraction

-

Natif

Multiplication

*

Natif

Division complète

/

Permet un point flottant en précision unique ou en double précision ; convertit tout autre point flottant en double précision.

L'élévation à une puissance

**

Point flottant en double précision



Exemple : Utilisation de formats d'opérande identique (arithmétique en mode natif)

Les variables suivantes sont définies comme nombres entier dans Maintain de WebFOCUS :

COMPUTE OPERANDONE/I4  ;
        OPERANDTWO/I4  ;
        RESULT/I4  ;

La multiplication nécessaire s'effectue dans l'arithmétique en mode natif (arithmétique de nombre entier) :

COMPUTE RESULT/I4 = OPERANDONE * OPERANDTWO  ;

Haut de page

x
Utilisation de différents opérandes avec l'arithmétique en mode natif

Si les opérandes d'un opérateur numérique sont à différents formats, vous pouvez utiliser la table suivante pour déterminer le format commun suite à la conversion. L'opérande inférieur est converti au format de l'opérande supérieur avant d'effectuer l'opération.

Classement

Format

1

Décimal condensé à 16 bytes

2

Point flottant en double précision

3

Décimal condensé à 8 bytes

4

Point flottant en double précision

5

Entier

6

Caractère (alphanumérique et de texte)

Par exemple, si un opérande de décimal condensé à 16 bytes est utilisé dans une expression, tous les autres opérandes sont convertis au format de décimal condensé à 16 bytes pour l'évaluation. Par contre, si une expression ne comprend que des opérandes de nombre entier et alphanumériques, tous les opérandes alphanumériques sont convertis au format de nombre entier.

Une valeur de caractère, (alphanumérique ou de texte) peut être utilisée dans un calcul si c'est une chaîne numérique. Une tentative est effectuée de convertir l'opérande de caractère au format de l'autre opérande dans l'expression. Si les deux opérandes sont au format de caractères, une tentative est effectuée de les convertir en double précision. S'il n'est pas possible d'effectuer une conversion, un message d'erreur s'affiche.

Si vous attribuez une valeur décimale à un nombre entier, la valeur fractionnaire est tronquée.


WebFOCUS