Prise en charge de l'évaluation des fonctions dans les formules
Aspose.Tasks for .NET API prend en charge l’évaluation des fonctions définies comme formules dans les Extended Attributes d’un projet.
Cela permet aux développeurs d’effectuer des calculs similaires à ceux disponibles dans Microsoft Project, ce qui rend possible l’implémentation de champs dynamiques dépendant d’une logique personnalisée.
L’API offre un support d’évaluation pour les catégories de fonctions suivantes :
- Fonctions mathématiques
- Fonctions générales
- Fonctions de texte
- Fonctions Date/Heure
Cette fonctionnalité est particulièrement utile lorsque vous devez :
- Automatiser les calculs de projet,
- Mettre en œuvre des règles métier personnalisées,
- Assurer la compatibilité des formules entre MS Project et Aspose.Tasks.
Calcul d’expressions mathématiques
Les fonctions mathématiques suivantes sont prises en charge :
- Abs( number )
- Atn( number )
- Cos( number )
- Exp( number )
- Fix( number )
- Int( number )
- Log( number )
- Rnd( number )
- Sgn( number )
- Sin( number )
- Sqr( number )
- Tan( number )
1static void EvaluateSine()
2{
3 Project project = CreateTestProjectWithCustomField();
4
5 // Set formula Sin(pi/2)
6 project.ExtendedAttributes[0].Formula = "Sin(3.1415926/2)";
7
8 // Print Calculated value
9 Task task = project.RootTask.Children.GetById(1);
10 Console.WriteLine("Sin(pi/2): {0}", task.ExtendedAttributes[0].NumericValue);
11}
12
13static Project CreateTestProjectWithCustomField()
14{
15 Project project = new Project();
16 ExtendedAttributeDefinition attr = ExtendedAttributeDefinition.CreateTaskDefinition(CustomFieldType.Number, ExtendedAttributeTask.Number1, "Sine");
17 project.ExtendedAttributes.Add(attr);
18
19 Task task = project.RootTask.Children.Add("Task");
20
21 ExtendedAttribute a = attr.CreateExtendedAttribute();
22 task.ExtendedAttributes.Add(a);
23 return project;
24}
Calcul des fonctions générales
Les fonctions suivantes fournissent des évaluations logiques et conditionnelles :
Choose( index, choice-1, choice-2, ... , choice-n )
– sélectionne une valeur à partir d’une liste.IIf( expr, truepart, falsepart )
– renvoie l’une des deux valeurs selon une condition.IsNumeric( expression )
– vérifie si une expression est numérique.IsNull( expression )
– vérifie si une expression est nulle.Switch( expr-1, value-1, expr-2, value-2, ... )
– évalue les expressions dans l’ordre et renvoie la première valeur correspondante.
1static void EvaluateChoose()
2{
3 Project project = CreateTestProjectWithCustomField();
4
5 // Set Formula
6 project.ExtendedAttributes[0].Formula = "Choose(3, \"This is a\", \"right\", \"choice\")";
7
8 // Print extended attribute value
9 Task task = project.RootTask.Children.GetById(1);
10 Console.WriteLine(task.ExtendedAttributes[0].TextValue);
11}
12
13static void EvaluateIsNumeric()
14{
15 string[] numericFormulas = { "IsNumeric('AAA')", "IsNumeric(1)", "IsNumeric(1<0)", "IsNumeric(\"1.1\")", "IsNumeric(Choose((2 + Sgn(2^-3)), 123, \"one two three\"))" };
16
17 Project project = CreateTestProjectWithCustomField();
18
19 foreach (string numericFormula in numericFormulas)
20 {
21 // Set Formula
22 project.ExtendedAttributes[0].Formula = numericFormula;
23
24 // Print extended attribute value
25 Task task = project.RootTask.Children.GetById(1);
26 Console.WriteLine(task.ExtendedAttributes[0].TextValue);
27 }
28}
29
30static void EvaluateSwitch()
31{
32 Project project = CreateTestProjectWithCustomField();
33
34 // Set Formula
35 project.ExtendedAttributes[0].Formula = "Switch( 0 < 1, \"0 is lesser than 1\", 0 > 1, \"0 is greater than 1\")";
36
37 // Print extended attribute value
38 Task task = project.RootTask.Children.GetById(1);
39 Console.WriteLine(task.ExtendedAttributes[0].TextValue);
40}
Calcul des fonctions de texte
Les fonctions de manipulation de chaînes permettent le formatage et la comparaison :
Asc( string )
– renvoie le code ASCII du premier caractère.Chr( charcode )
– renvoie le caractère correspondant à un code ASCII.Format( expression, format, firstdayofweek, firstweekofyear )
– formate les nombres/les dates.Instr( start, string1, string2, compare )
– trouve la position d’une chaîne dans une autre.LCase( string )
– convertit en minuscules.Left( string, length )
– extrait les caractères de gauche.Len( string )
– renvoie la longueur de la chaîne.LTrim( string )
– supprime les espaces en début.Mid( string, start, length )
– extrait une sous-chaîne.Right( string, length )
– extrait les caractères de droite.RTrim( string )
– supprime les espaces en fin.Space( number )
– renvoie une chaîne avec des espaces.StrComp( string1, string2, compare )
– compare deux chaînes.StrConv( string, conversion, LCID )
– convertit la chaîne selon la locale.String( number, character )
– renvoie une chaîne répétéen
fois.Trim( string )
– supprime les espaces en début et en fin.UCase( string )
– convertit en majuscules.
1static void EvaluateStrConv()
2{
3 Project project = CreateTestProjectWithCustomField();
4 Task task = project.RootTask.Children.GetById(1);
5
6 // Set formulas and print extended attribute value
7 project.ExtendedAttributes[0].Formula = "StrConv(\"sTring and sTRINg\",3)";
8 Console.WriteLine(task.ExtendedAttributes[0].TextValue);
9 project.ExtendedAttributes[0].Formula = "StrConv(\"sTring and sTRINg\",1)";
10 Console.WriteLine(task.ExtendedAttributes[0].TextValue);
11 project.ExtendedAttributes[0].Formula = "StrConv(\"sTring and sTRINg\",2)";
12 Console.WriteLine(task.ExtendedAttributes[0].TextValue);
13}
14
15static void EvaluateStringFunction()
16{
17 Project project = CreateTestProjectWithCustomField();
18 Task task = project.RootTask.Children.GetById(1);
19
20 // Set formulas and print extended attribute value
21 project.ExtendedAttributes[0].Formula = "String(5, 40)";
22 Console.WriteLine(task.ExtendedAttributes[0].TextValue);
23 project.ExtendedAttributes[0].Formula = "String(5, \"A\")";
24 Console.WriteLine(task.ExtendedAttributes[0].TextValue);
25 project.ExtendedAttributes[0].Formula = "String(-5, \"A\")";
26 // #Error
27 Console.WriteLine(task.ExtendedAttributes[0].TextValue);
28}
Calcul des fonctions Date/Heure
Aspose.Tasks prend en charge à la fois les fonctions de date standard de style VB et les fonctions de planification spécifiques à MS Project :
CDate( expression )
– convertit une expression en date.Date()
– renvoie la date système actuelle.DateAdd( interval, number, date )
– ajoute un intervalle à une date.DateDiff( interval, date1, date2 )
– différence entre deux dates.DatePart( interval, date )
– extrait une partie d’une date (année, mois, jour, etc.).DateSerial( year, month, day )
– construit une date à partir de composants.DateValue( date )
– convertit une chaîne en date.Day( date )
– jour du mois.Hour( time )
– extrait l’heure.IsDate( expression )
– vérifie si une expression est une date valide.Minute( time )
– extrait les minutes.Month( date )
– extrait le mois.Now()
– renvoie la date et l’heure actuelles.ProjDateAdd( date, duration, calendar )
– ajoute une durée en tenant compte du calendrier du projet.ProjDateConv( expression, dateformat )
– convertit une date au format du projet.ProjDateDiff( date1, date2, calendar )
– différence en tenant compte du calendrier du projet.ProjDateSub( date, duration, calendar )
– soustrait une durée.ProjDateValue( expression )
– évalue une expression de date.ProjDurConv( expression, durationunits )
– convertit les durées entre unités.ProjDurValue( duration )
– évalue une expression de durée.Second( time )
– extrait les secondes.Time()
– renvoie l’heure système actuelle.Timer()
– nombre de secondes depuis minuit.TimeSerial( hour, minute, second )
– construit une valeur temporelle.TimeValue( time )
– convertit en heure.Weekday( date, firstdayofweek )
– renvoie le jour de la semaine.Year( date )
– extrait l’année.
1Project project = CreateTestProject();
2Task task = project.RootTask.Children.GetById(1);
3
4ExtendedAttributeDefinition numberDefinition = ExtendedAttributeDefinition.CreateTaskDefinition(ExtendedAttributeTask.Number1, null);
5project.ExtendedAttributes.Add(numberDefinition);
6
7ExtendedAttribute numberAttribute = numberDefinition.CreateExtendedAttribute();
8task.ExtendedAttributes.Add(numberAttribute);
9
10// Set ProjDateDiff formula and print extended attribute value
11numberDefinition.Formula = "ProjDateDiff(\"03/23/2015\",\"03/18/2015\")";
12Console.WriteLine(numberAttribute.NumericValue);
13numberDefinition.Formula = "ProjDateDiff(\"03/23/2015\",\"03/25/2015\")";
14Console.WriteLine(numberAttribute.NumericValue);
15
16ExtendedAttributeDefinition dateDefinition = ExtendedAttributeDefinition.CreateTaskDefinition(ExtendedAttributeTask.Date1, null);
17project.ExtendedAttributes.Add(dateDefinition);
18ExtendedAttribute dateAttribute = dateDefinition.CreateExtendedAttribute();
19task.ExtendedAttributes.Add(dateAttribute);
20
21ExtendedAttributeDefinition durationDefinition = ExtendedAttributeDefinition.CreateTaskDefinition(ExtendedAttributeTask.Duration4, "Custom duration field");
22project.ExtendedAttributes.Add(durationDefinition);
23ExtendedAttribute durationAttribute = durationDefinition.CreateExtendedAttribute();
24task.ExtendedAttributes.Add(durationAttribute);
25
26ExtendedAttributeDefinition textDefinition = ExtendedAttributeDefinition.CreateTaskDefinition(ExtendedAttributeTask.Text5, "Custom text field");
27project.ExtendedAttributes.Add(textDefinition);
28ExtendedAttribute textAttribute = textDefinition.CreateExtendedAttribute();
29task.ExtendedAttributes.Add(textAttribute);
30
31// Set ProjDateSub formula and print extended attribute value
32dateDefinition.Formula = "ProjDateSub(\"3/19/2015\", \"1d\")";
33Console.WriteLine(dateAttribute.DateValue);
34
35// We can set ProjDurConv formula to duration-valued attribute as well as to text-valued attribute.
36
37// Set ProjDurConv formula to duration-valued extended attribute and print its value.
38durationDefinition.Formula = "ProjDurConv([Duration], pjHours)";
39Console.WriteLine(durationAttribute.DurationValue);
40
41// Set ProjDurConv formula to text-valued extended attribute and print its value.
42textDefinition.Formula = "ProjDurConv([Duration], pjHours)";
43Console.WriteLine(textAttribute.TextValue);
44
45textDefinition.Formula = "ProjDurConv([Duration], pjWeeks)";
46Console.WriteLine(textAttribute.TextValue);
47
48// Set Second formula and print entended attribute value
49numberDefinition.Formula = "Second(\"4/21/2015 2:53:41 AM\")";
50Console.WriteLine(numberAttribute.NumericValue);
51
52// Set Weekday formula and print entended attribute value
53numberDefinition.Formula = "Weekday(\"24/3/2015\", 1)";
54Console.WriteLine(numberAttribute.NumericValue);
55numberDefinition.Formula = "Weekday(\"24/3/2015\", 2)";
56Console.WriteLine(numberAttribute.NumericValue);
57numberDefinition.Formula = "Weekday(\"24/3/2015\", 3)";
58Console.WriteLine(numberAttribute.NumericValue);
Exemple pratique
Voici un scénario réel d’utilisation des formules :
1 var project = new Project();
2 var task = project.RootTask.Children.Add("Task 1");
3
4 // Create an extended attribute with a custom formula
5 ExtendedAttributeDefinition attrDef = ExtendedAttributeDefinition.CreateTaskDefinition(
6 ExtendedAttributeTask.Text1, "Custom Formula");
7 attrDef.Formula = "IIf([Duration] > 480, \"Long Task\", \"Short Task\")";
8 project.ExtendedAttributes.Add(attrDef);
9
10 var attr = attrDef.CreateExtendedAttribute();
11 task.ExtendedAttributes.Add(attr);
12
13 // The formula is automatically evaluated by Aspose.Tasks
14 Console.WriteLine(task.Get(Tsk.Name) + " -> " + task.ExtendedAttributes[0].TextValue);
Principaux avantages du support des formules
- Compatibilité totale avec les formules MS Project.
- Capacité à automatiser champs dynamiques et logique conditionnelle.
- Prise en charge intégrée de fonctions prenant en compte le calendrier du projet (ProjDateAdd, ProjDateDiff, etc.).
- Simplifie les calculs complexes sans écrire de code C# personnalisé.