Champs de formule
La valeur d'un champ personnalisé de formule est automatiquement calculée par Celoxis selon sa formule. Ce calcul est effectué à chaque affichage du champ. Le langage d'expression des formules est sophistiqué et permet des manipulations de données complexes, notamment des opérations arithmétiques et des transformations de chaînes de caractères et de dates.

Syntaxe
Celoxis interprète tout ce qui se trouve entre ${ et } comme une expression. Les formules peuvent être définies comme des expressions pures, par exemple ${me.budget * 0.10}, ou contenir un mélange de texte et d'expressions, comme « Le projet ${me.name} a été créé le ${me.created} ». tout ce qui est entre accolades ${ et } est traité comme une expression et évalué, tandis que tout ce qui se trouve à l'extérieur est copié tel quel dans le résultat. Par exemple, si les formules étaient associées à un projet nommé XYZ et dont le budget était de 10 000 $, le résultat serait 1000 et « Le projet XYZ a été créé le jeudi 20 juin 2013 à 08:30:16 EDT » .
L'opérateur point
L'opérateur point permet de faire référence à une propriété d'un objet. Dans l'exemple `${me.budget * 0.10}`, ` me.budget` fait référence au budget du projet si le champ personnalisé est associé à un projet. L'opérateur point peut également servir à appeler une fonction (ou méthode) d'un objet. Dans l'exemple `${me.name.toUpperCase()}`, ` toUpperCase` est un appel de fonction qui convertit le nom du projet en majuscules.
Opérateurs
- Arithmétique:
+,-(binaire),*,/etdiv,%etmod,-(unaire) - Concaténation de chaînes:
+= - Opérateurs logiques:
et,&&,ou,||,non,! - Relationnel:
==,eq,!=,ne,<,lt,>,gt,<=,ge,>=,le. Les comparaisons peuvent être effectuées avec d'autres valeurs ou avec des littéraux booléens, de chaîne de caractères, entiers ou à virgule flottante. - Vide : L’
videest une opération préfixe qui permet de déterminer si une valeur estnulleou vide. - Conditionnelle:
A ? B : C. ÉvaluezBouC, selon le résultat de l'évaluation deA. - Affectation:
= - Point-virgule:
;
La priorité des opérateurs, du plus élevé au plus bas et de gauche à droite, est la suivante :
[] .()(utilisé pour modifier la priorité des opérateurs)-(unaire)non ! vide* / div % mod+ -(binaire)+=< > <= >= lt gt le ge== != eq ne&& et|| ou? :=;
Mots réservés
Les mots suivants sont réservés à l'EL et ne doivent pas être utilisés comme identifiants :
et | ou | pas | eq |
ne | lt | gt | le |
ge | vrai | FAUX | nul |
instance de | vide | div | mod |
Exemples de base
| Formule | Résultat |
|---|---|
${1 > (4/2)} | FAUX |
${4.0 >= 3} | vrai |
${100.0 == 100} | vrai |
${(10*10) ne 100} | FAUX |
${'a' < 'b'} | vrai |
${'hip' gt 'hit'} | FAUX |
${4 > 3} | vrai |
${1.2E4 + 1.4} | 12001.4 |
${3 div 4} | 0.75 |
${10 mod 4} | 2 |
${!empty me.code} | Renvoie faux si le code est nul ou une chaîne vide. |
Fonctions utilitaires
L'ensemble suivant de fonctions d'assistance a été fourni :
formatDate(date) | La valeur formatée de la date (sans l'heure) selon les préférences du spectateur. |
formatDateTime(datetime) | Valeur formatée de la date et de l'heure selon les préférences du spectateur. |
formatNumber(nombre) | La valeur formatée du nombre selon les paramètres régionaux du spectateur. |
formatDevise(nombre) | La valeur de la devise est formatée selon la devise spécifiée dans les préférences de l'entreprise et le format numérique selon les paramètres régionaux du destinataire. Ex. : 25 000 $ |
heuresToHHMM(nombre) | Formate les heures au format HH:MM. Par exemple, 2,5 deviendra 2:30 |
plafond(nombre) | L'entier supérieur le plus proche à la valeur d'entrée. Par exemple, ${ceil(5.3)} renverra 6 |
étage(numéro) | L'entier inférieur le plus proche à la valeur saisie. Par exemple, ${floor(4.8)} renverra 4 |
abs(nombre) | La valeur absolue d'un nombre. Par exemple, ${abs(-3.2)} renverra 3.2 |
rond(nombre) | La valeur arrondie de l'entrée. Par exemple, ${round(3.6)} renverra 4 |
arrondirÀ(chiffres, nombre) | Arrondit la valeur du nombre saisi au nombre de chiffres spécifié. Par exemple, `${roundTo(2, 3.667)}` renverra 3,67 ; tandis que `${roundTo(0, 3.667)}` renverra 4. |
Chaîne.contient(meule de foin, aiguille) | Vérifier si une aiguille existe dans une botte de foin |
Chaîne.se terminePar(chaîne, suffixe) | Vérifier si la chaîne se termine par un suffixe |
Chaîne.remplacer(txt, rechercher, remplacer) | Remplace toutes les occurrences de « search » dans le texte par « replace » |
Chaîne.commencePar(chaîne, préfixe) | Vérifier si la chaîne commence par un préfixe |
Chaîne.trim(chaîne) | Supprime les espaces et les caractères de contrôle en fin de chaîne. |
Chaîne.viderSiNull(str) | Si la chaîne str est nulle, la fonction renvoie une chaîne vide ; sinon, elle renvoie la chaîne str elle-même. |
Date.avant(date1, date2) | Renvoie vrai si date1 est antérieure à date2. |
Date.égal(date1, date2) | Renvoie vrai si date1 est égal à date2. |
Date.après(date1, date2) | Renvoie vrai si date1 est postérieure à date2. |
Date.format(date, format) | La valeur formatée de la date selon le format spécifié. Pour connaître les formats pris en charge, consultez cette page. |
Date.heuresEntre(de, à) | Renvoie le nombre d'heures écoulées entre from et to. |
Date.heures de travailEntre(de, à) | Renvoie le nombre d'heures travaillées entre les dates de début et de fin , selon le calendrier de travail par défaut de l'entreprise. Si la période entre ces dates est supérieure à 30 jours, le nombre d'heures est renvoyé. |
Date.plusHeures(date, heures) | Ajoute des heures à la date et renvoie cette date. |
Date.isoToDate(chaîne) | Convertit une chaîne de caractères au format ISO en date. |
Date.maintenant() | Renvoie une date représentant la date et l'heure actuelles |
Collection.size(v) | Retourne la taille de v. |
Collection.contient(meule de foin, aiguille) | Vérifier si une aiguille existe dans une botte de foin |
Collection.containsAny(meule de foin, aiguilles) | Vérifiez s'il existe au moins une aiguille dans la botte de foin. |
Collection.containsAll(meule de foin, aiguilles) | Vérifiez si toutes les aiguilles se trouvent dans la meule de foin. |
Écrire des formules multilignes
Pour écrire le code de la formule sur plusieurs lignes, utilisez les = et ; . La valeur de retour est la dernière instruction de la formule. Par exemple :
${ apc = me.actualPercentComplete; ppc = me.plannedPercentComplete; (apc - ppc)/ppc }Le type de données renvoyé par la formule
Lors de la définition d'une formule, vous devez sélectionner un type de données. Ce type indique au système le résultat attendu. Celoxis formate automatiquement la valeur de retour en fonction du type de données. Par exemple, si vous indiquez un type de retour monétaire et que votre formule renvoie le nombre 10 000, le résultat sera de 10 000 $. Celoxis formate automatiquement le nombre et y ajoute le symbole monétaire.
L' objet moi
L' « me » dans la formule représente l'objet pour lequel la formule est évaluée. Par exemple, supposons que notre champ de formule « Avance client » soit défini comme ${me.budget * 0.1} , c'est-à-dire qu'il représente 10 % du budget. Si nous avons associé ce champ à la fois aux projets et aux tâches, alors lors de l'évaluation de la formule pour un projet, l' « me » sera un projet, tandis que pour une tâche, il sera une tâche.
Référence de terrain
Pour afficher la liste des champs disponibles, cliquez sur l' Référence du champ dans l'écran d'ajout/modification d'un champ personnalisé. Cliquez sur l'icône « + » pour développer la liste des variables disponibles pour les différentes entités.
Gestion des erreurs
En cas d'erreur lors de l'évaluation d'une formule (par exemple, si vous avez passé un nombre au lieu d'une chaîne de caractères), le message « ERR ! » s'affiche . Survolez-le avec votre souris pour obtenir une description plus détaillée du problème.
Exemples
Supposons que nous ayons un projet avec les données suivantes.
| Étiquette | Champ | Valeur |
|---|---|---|
| IDENTIFIANT | identifiant | 1234 |
| Nom | nom | Aménagement d'un espace de bureau |
| Commencer | démarrerCalendrier | 10 janvier 2011 |
| Budget | budget | 5000 |
| coût estimé | coût estimé | 4000 |
| coût réel | coût réel | 3800 |
Nous allons maintenant examiner quelques exemples simples. Nous supposerons que la formule est associée à des projets et que l'exemple de résultat concerne le projet décrit précédemment.
| Formule | Sortir | Commentaires |
|---|---|---|
${me.id * 10} | 12340 | L'identifiant est multiplié par 10 |
moi.id * 10 | moi.id * 10 | Non inclus dans ${} et donc copié tel quel dans la sortie. |
ID:${me.id} | ID : 1234 | Texte mêlé à une expression |
${me.name + 100} | SE TROMPER! | Impossible d'effectuer des opérations arithmétiques sur le type String. |
${moi.abcd} | SE TROMPER! | « moi » ne possède pas de propriété nommée abcd. |
${formatDate(me.startCalendar)} | 10 janvier 2011 | Formate la date de début selon le style de format de date de l'utilisateur. |
${me.actualCost gt (me.budget*.9) ? 'ALERTE' : 'OK'} | ALERTE | Un exemple de comment écrire une structure if/then/else |
${formatCurrency(me.budget)} | $ 5,000 | En supposant que votre symbole monétaire soit $ |
${round(((me.budget - me.actualCost)*100)/me.budget)}% | 24% | Calcule le pourcentage du budget restant |
Exemple avancé : Votre propre indicateur de santé de planning
Supposons que vous souhaitiez disposer d'un indicateur de santé du planning basé sur des données de référence, c'est-à-dire la date que vous avez réellement promise au client plutôt que sur la date de fin du plan actuel.
Vous allez créer un champ de formule, l'associer à des projets, définir son type de données de sortie sur Texte et saisir la formule comme suit :
${ pc = me.actualPercentComplete; pFinish = me.projectedFinishCalendar; bFinish = me.baselineFinish; now = Date.now(); label = 'Inconnu'; label = Date.before(pFinish, bFinish) ? 'À temps' : label; label = Date.after(pFinish, bFinish) ? 'À risque' : label; label = Date.after(now, bFinish) ? 'En retard' : label; label = pc == 100 ? 'Terminé' : label; label }Dans la Couleur de la formule, indiquez les correspondances comme suit :
| Résultat | Couleur |
|---|---|
À l'heure | Vert |
À risque | Orange |
En retard | Rouge |
Complété | Brun |
Exemple de sortie
