Unterstützung für die Auswertung von Funktionen in Formeln

Aspose.Tasks for .NET API unterstützt die Auswertung von als Formeln definierten Funktionen innerhalb der Extended Attributes eines Projekts.
Dadurch können Entwickler Berechnungen durchführen, die denen in Microsoft Project ähneln, wodurch es möglich wird, dynamische Felder zu implementieren, die von benutzerdefinierter Logik abhängen.

Die API bietet Unterstützung für die Auswertung der folgenden Funktionskategorien:

Diese Funktion ist besonders nützlich, wenn Sie Folgendes tun müssen:

Berechnung mathematischer Ausdrücke

Die folgenden mathematischen Funktionen werden unterstützt:

  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}

Berechnung allgemeiner Funktionen

Die folgenden Funktionen bieten logische und bedingte Auswertungen:

  1. Choose( index, choice-1, choice-2, ... , choice-n ) – wählt einen Wert aus einer Liste aus.
  2. IIf( expr, truepart, falsepart ) – gibt abhängig von einer Bedingung einen von zwei Werten zurück.
  3. IsNumeric( expression ) – prüft, ob ein Ausdruck numerisch ist.
  4. IsNull( expression ) – prüft, ob ein Ausdruck null ist.
  5. Switch( expr-1, value-1, expr-2, value-2, ... ) – wertet Ausdrücke der Reihe nach aus und gibt den ersten passenden Wert zurück.
 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}

Berechnung von Textfunktionen

Zeichenkettenmanipulationsfunktionen ermöglichen Formatierung und Vergleich:

  1. Asc( string ) – gibt den ASCII-Code des ersten Zeichens zurück.
  2. Chr( charcode ) – gibt das Zeichen für einen ASCII-Code zurück.
  3. Format( expression, format, firstdayofweek, firstweekofyear ) – formatiert Zahlen/Datumsangaben.
  4. Instr( start, string1, string2, compare ) – findet die Position einer Zeichenkette innerhalb einer anderen.
  5. LCase( string ) – wandelt in Kleinbuchstaben um.
  6. Left( string, length ) – extrahiert die linksstehenden Zeichen.
  7. Len( string ) – gibt die Zeichenkettenlänge zurück.
  8. LTrim( string ) – entfernt führende Leerzeichen.
  9. Mid( string, start, length ) – extrahiert eine Teilzeichenkette.
  10. Right( string, length ) – extrahiert die rechtsstehenden Zeichen.
  11. RTrim( string ) – entfernt nachfolgende Leerzeichen.
  12. Space( number ) – gibt eine Zeichenkette mit Leerzeichen zurück.
  13. StrComp( string1, string2, compare ) – vergleicht zwei Zeichenketten.
  14. StrConv( string, conversion, LCID ) – konvertiert eine Zeichenkette entsprechend der Gebietsschemaeinstellungen.
  15. String( number, character ) – gibt eine Zeichenkette zurück, die n Mal.
  16. Trim( string ) – entfernt führende und nachfolgende Leerzeichen.
  17. UCase( string ) – wandelt in Großbuchstaben um.
 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}

Berechnung von Datums-/Zeitfunktionen

Aspose.Tasks unterstützt sowohl Standard-Datumsfunktionen im VB-Stil als auch MS Project-spezifische Planungsfunktionen:

  1. CDate( expression ) – wandelt einen Ausdruck in ein Datum um.
  2. Date() – gibt das aktuelle Systemdatum zurück.
  3. DateAdd( interval, number, date ) – addiert ein Intervall zu einem Datum.
  4. DateDiff( interval, date1, date2 ) – berechnet die Differenz zwischen zwei Daten.
  5. DatePart( interval, date ) – extrahiert Teile eines Datums (Jahr, Monat, Tag usw.).
  6. DateSerial( year, month, day ) – erstellt ein Datum aus Komponenten.
  7. DateValue( date ) – wandelt eine Zeichenkette in ein Datum um.
  8. Day( date ) – Tag des Monats.
  9. Hour( time ) – extrahiert die Stunde.
  10. IsDate( expression ) – prüft, ob ein Ausdruck ein gültiges Datum ist.
  11. Minute( time ) – extrahiert die Minuten.
  12. Month( date ) – extrahiert den Monat.
  13. Now() – gibt aktuelles Datum und Uhrzeit zurück.
  14. ProjDateAdd( date, duration, calendar ) – addiert eine Dauer unter Berücksichtigung des Projektkalenders.
  15. ProjDateConv( expression, dateformat ) – konvertiert ein Datum in das Projektformat.
  16. ProjDateDiff( date1, date2, calendar ) – berechnet die Differenz unter Berücksichtigung des Projektkalenders.
  17. ProjDateSub( date, duration, calendar ) – zieht eine Dauer ab.
  18. ProjDateValue( expression ) – wertet einen Datums-Ausdruck aus.
  19. ProjDurConv( expression, durationunits ) – konvertiert Dauern zwischen Einheiten.
  20. ProjDurValue( duration ) – wertet einen Dauer-Ausdruck aus.
  21. Second( time ) – extrahiert die Sekunden.
  22. Time() – gibt die aktuelle Systemzeit zurück.
  23. Timer() – Anzahl der Sekunden seit Mitternacht.
  24. TimeSerial( hour, minute, second ) – erstellt einen Zeitwert.
  25. TimeValue( time ) – wandelt in eine Zeit um.
  26. Weekday( date, firstdayofweek ) – gibt den Wochentag zurück.
  27. Year( date ) – extrahiert das Jahr.
 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);

Praxisbeispiel

Hier ein praxisnahes Szenario zur Verwendung von Formeln:

 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);

Wesentliche Vorteile der Formelauswertung

Siehe auch

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.