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 :

Cette fonctionnalité est particulièrement utile lorsque vous devez :

Calcul d’expressions mathématiques

Les fonctions mathématiques suivantes sont prises en charge :

  1. Abs( number )
  2. Atn( number )
  3. Cos( number )
  4. Exp( number )
  5. Fix( number )
  6. Int( number )
  7. Log( number )
  8. Rnd( number )
  9. Sgn( number )
  10. Sin( number )
  11. Sqr( number )
  12. 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 :

  1. Choose( index, choice-1, choice-2, ... , choice-n ) – sélectionne une valeur à partir d’une liste.
  2. IIf( expr, truepart, falsepart ) – renvoie l’une des deux valeurs selon une condition.
  3. IsNumeric( expression ) – vérifie si une expression est numérique.
  4. IsNull( expression ) – vérifie si une expression est nulle.
  5. 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 :

  1. Asc( string ) – renvoie le code ASCII du premier caractère.
  2. Chr( charcode ) – renvoie le caractère correspondant à un code ASCII.
  3. Format( expression, format, firstdayofweek, firstweekofyear ) – formate les nombres/les dates.
  4. Instr( start, string1, string2, compare ) – trouve la position d’une chaîne dans une autre.
  5. LCase( string ) – convertit en minuscules.
  6. Left( string, length ) – extrait les caractères de gauche.
  7. Len( string ) – renvoie la longueur de la chaîne.
  8. LTrim( string ) – supprime les espaces en début.
  9. Mid( string, start, length ) – extrait une sous-chaîne.
  10. Right( string, length ) – extrait les caractères de droite.
  11. RTrim( string ) – supprime les espaces en fin.
  12. Space( number ) – renvoie une chaîne avec des espaces.
  13. StrComp( string1, string2, compare ) – compare deux chaînes.
  14. StrConv( string, conversion, LCID ) – convertit la chaîne selon la locale.
  15. String( number, character ) – renvoie une chaîne répétée n fois.
  16. Trim( string ) – supprime les espaces en début et en fin.
  17. 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 :

  1. CDate( expression ) – convertit une expression en date.
  2. Date() – renvoie la date système actuelle.
  3. DateAdd( interval, number, date ) – ajoute un intervalle à une date.
  4. DateDiff( interval, date1, date2 ) – différence entre deux dates.
  5. DatePart( interval, date ) – extrait une partie d’une date (année, mois, jour, etc.).
  6. DateSerial( year, month, day ) – construit une date à partir de composants.
  7. DateValue( date ) – convertit une chaîne en date.
  8. Day( date ) – jour du mois.
  9. Hour( time ) – extrait l’heure.
  10. IsDate( expression ) – vérifie si une expression est une date valide.
  11. Minute( time ) – extrait les minutes.
  12. Month( date ) – extrait le mois.
  13. Now() – renvoie la date et l’heure actuelles.
  14. ProjDateAdd( date, duration, calendar ) – ajoute une durée en tenant compte du calendrier du projet.
  15. ProjDateConv( expression, dateformat ) – convertit une date au format du projet.
  16. ProjDateDiff( date1, date2, calendar ) – différence en tenant compte du calendrier du projet.
  17. ProjDateSub( date, duration, calendar ) – soustrait une durée.
  18. ProjDateValue( expression ) – évalue une expression de date.
  19. ProjDurConv( expression, durationunits ) – convertit les durées entre unités.
  20. ProjDurValue( duration ) – évalue une expression de durée.
  21. Second( time ) – extrait les secondes.
  22. Time() – renvoie l’heure système actuelle.
  23. Timer() – nombre de secondes depuis minuit.
  24. TimeSerial( hour, minute, second ) – construit une valeur temporelle.
  25. TimeValue( time ) – convertit en heure.
  26. Weekday( date, firstdayofweek ) – renvoie le jour de la semaine.
  27. 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

Voir aussi

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.