III - Les fonctions31- Introduction :Comme tous bons générateurs d'états (et FR en fait parti), on dispose d'un évaluateur d'expression mathématique ou logique.
Dans ce chapitre, on tient compte des modifications apportées à FR avec le patch 1.2.Le générateur d'expressions est comme vous pourrez le voir légèrement inspiré de celui de QR (dans sa forme, mais pas dans le fond). Ce générateur est la petite pierre que j'apporte à ce travail colossal qu'est FR.
32- Ce qui est disponible en standard
32.1-Les opérateurs32.2-Les fonctions
Type Logique >,<, OR, AND, NOT , = , <>, >=, <= Mathématique -, *, +,/, MOD, DIV Pour les néophites, MOD correspond à MODulo et DIV, correspond à une division dont le résultat est un nombre entier.
32.21-Description dans le fichier FR.LNG33 - Ajouter vos fonctions
Pour que le générateur d'expression fonctionne correctement, il faut que les fonctions utilisables par FR soient en plus décrites dans le fichier FR.LNG pour la simple raison que cela va lui permettre d'afficher une aide (très sommaire) sur la fonction sélectionnée, une aide sur les paramètres qui sert également pour savoir quand lancer l'éditeur de paramètres et en fin, de permettre à l'éditeur de trier les fonctions par catégorie.Pour cela, il suffit d'ajouter au fichier FR.LNG la ligne suivante :
FCT = CATEGORIE | FCT(<X>,<Y>,<Z>) | Aide sur la fonction
avec :| (AltGr+6) correspond aux séparateurs.
- FCT, c'est le nom de la fonction
- CATEGORIE, c'est le nom de la catégorie dont dépend la fonction.
- FCT(<X>,<Y>,<Z>), c'est la visualisation des paramètres nécessaires avec 3 paramètres maximum nommés X,Y et Z.
- Aide .. ,c'est une petite aide qui doit permettre à l'utilisateur de comprendre le but de la fonction.
32.22-Les fonctions standards.
Chaque paramètre est séparé par une virgule et peut être une expression, une constantes, une variable, un champ de donnée, ...
Les constantes de type alphanumérique doivent être bornée par un caractère " .
Les variables sont bornées par '[' et ']'.
Les champs de données sont bornées comme les variables et on le format suivant : Nom_dataset."Nom_de_champ"Fonctions de statistiques
- SUM(<X>) : Retourne la somme des valeurs prisent par <X>. <X> est généralement un champ de données.
- AVG(<X>) : Retourne la moyenne des valeurs prisent par <X>. <X> est généralement un champ de données.
- COUNT : Compteur.
- MIN(<X>) : Retourne la valeur minimum des valeurs prisent par <X>. <X> est généralement un champ de données.
- MAX(<X>) : Retourne la valeur maximum des valeurs prisent par <X>. <X> est généralement un champ de données.
Fonctions sur les dates
- FORMATDATETIME(<X>,<Y>) : Retourne la date compressée (TDateTime) <Y> dans le format <X>. <X> utilise la description standard de delphi pour les formats.
- FORMATFLOAT(<X>,<Y>) : Retourne le numérique <Y> dans le format <X>. <X> utilise la description standard de delphi pour les formats.
- STRTODATE(<X>) : Retourne la représentation numérique (TDateTime) de la chaîne <X>. <X> doit respecter le format des dates.
- STRTOTIME(<X>) : Retourne la représentation numérique (TDateTime) de la chaîne <X>. <X> doit respecter le format des heures.
Fonctions sur les chaînes de caractères
- LOWERCASE(<X>) : Retourne la chaîne <X> en minuscule.
- UPPERCASE(<X>) : Retourne la chaîne <X> en majuscule.
- NAMECASE(<X>) : Retoune la chaîne <X> en minuscule avec la première lettre en majuscule.
- COPY(<X>,<Y>,<Z>) : Retourne une sous-chaîne de <X> depuis la position <Y> et d'une longueur <Z>.
Fonctions sur les numériques
- FRAC(<X>) : Retourne la partie décimale du numérique <X>.
- INT(<X>) : Retourne la partie entière du numérique <X>.
- ROUND(<X>) : Retourne un entier correspondant à l'arrondie de <X>.
- STR(<X>) : Retourne une chaîne en convertissant le numérique <X>.
Fonctions logiques
- IF(<X>,<Y>,<Z>) : Retourne <Y> si l'expression <X> est vérifiée sinon <Z>.
C'est d'une simplicité déconcertante !Voici un code source pour ajouter les fonctions, POS et SQRT :
{*******************************************} { } { FastReport v2.2 } { } { Exemple de création de fonctions } { (C) Guilbaud Olivier } { golivier@bigfoot.com } { } { FastReport :(c) 1998-99 by Tzyganenko A. } { } { Merci de transmettre vos commantaires & } { modifications } {Ceci est un FREEWARE il peut être utilisé } {librement. } {*******************************************} {Histo : } { 03/06/99 : Création } unit FR_OGFct; interface implementation Uses FR_Pars,FR_Class; // Déclaration minimum Type // Déclaration de notre objet TfrOGFunctionLibrary = class(TfrFunctionLibrary) public constructor Create; override; procedure DoFunction(FNo:Integer; p1,p2,p3:Variant; var val:String); override; end; //************************** //* TfrOGFunctionLibrary //************************** constructor TfrOGFunctionLibrary.Create; begin inherited Create; // Ici, on déclare toutes les fonctions // que l'on va traiter (attention 3 caractères mini) with List do begin Add('POS'); ADD('SQRT'); end; end; // Ici on traite les fonctions procedure TfrOGFunctionLibrary.DoFunction(FNo:Integer; p1,p2,p3:Variant; var val:String); Var Par1,Par2: Variant; Resultat : Variant; begin Try Case FNo of //FNo représente le N° d'index de la fct //déclarée dans Create; 0 : Begin //Traitement de la fonction POS Par1:=VarToStr(Parser.Calc(p1)); //On utilise Parser car Px Par2:=VarToStr(Parser.Calc(P2)); // est peut être une expression Resultat:=Pos(Par1,Par2); end; 1 : Resultat:=SQRT(Parser.Calc(P1)); //Traitement de la fonction SQRT end; Except // Chaîne retournée en cas d'erreur Resultat:='Erreur fonction '+List.Strings[FNo]; end; Val:=VarToStr(Resultat); // Le résultat est une chaîne end; //******************************** // Initialisation des fonctions pour qu'elles soient // prisent en charge par F.R. // ATTENTION : La méthode pour enregistrer les librairies de fonctions // limite (!!) le nombre à 31 Procedure DoInit; Begin frRegisterFunctionLibrary(TfrOGFunctionLibrary); end; initialization DoInit; end.Puis dans le fichier FR.LNG, vous ajoutez les deux lignes suivantes :
SQRT = Math & Trigo | SQRT(<X>) | Retrourne la racine carré de <X>
POS = Chaînes | POS(<X>,<Y>) | Retourne la position de la chaîne <X> dans <Y>Et voilà, le tour est joué ! donc maintenant, j'attends vos oeuvres ..