Підтримка обчислення функцій у формулах
Aspose.Tasks for .NET API підтримує обчислення функцій, визначених як формули всередині розширених атрибутів проекту.
Це дозволяє розробникам виконувати обчислення, подібні до тих, що доступні в Microsoft Project, що робить можливим реалізацію динамічних полів, які залежать від користувацької логіки.
API надає підтримку обчислення для наступних категорій функцій:
- Математичні функції
- Загальні функції
- Текстові функції
- Функції дати/часу
Ця можливість особливо корисна, коли потрібно:
- Автоматизувати обчислення проекту,
- Впроваджувати власні бізнес-правила,
- Забезпечити сумісність формул між MS Project і Aspose.Tasks.
Обчислення математичних виразів
Підтримуються наступні математичні функції:
- 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}Обчислення загальних функцій
Наступні функції забезпечують логічні та умовні обчислення:
Choose( index, choice-1, choice-2, ... , choice-n )– вибирає значення зі списку.IIf( expr, truepart, falsepart )– повертає одне з двох значень залежно від умови.IsNumeric( expression )– перевіряє, чи є вираз числовим.IsNull( expression )– перевіряє, чи є вираз значенням null.Switch( expr-1, value-1, expr-2, value-2, ... )– оцінює вирази по черзі й повертає перше відповідне значення.
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}Обчислення текстових функцій
Функції обробки рядків дозволяють форматувати та порівнювати:
Asc( string )– повертає ASCII-код першого символу.Chr( charcode )– повертає символ за ASCII-кодом.Format( expression, format, firstdayofweek, firstweekofyear )– форматує числа/дати.Instr( start, string1, string2, compare )– знаходить позицію одного рядка в іншому.LCase( string )– перетворює на малі літери.Left( string, length )– витягує ліві символи.Len( string )– повертає довжину рядка.LTrim( string )– видаляє пробіли на початку.Mid( string, start, length )– витягує підрядок.Right( string, length )– витягує праві символи.RTrim( string )– видаляє пробіли в кінці.Space( number )– повертає рядок із пробілами.StrComp( string1, string2, compare )– порівнює два рядки.StrConv( string, conversion, LCID )– перетворює рядок відповідно до локалі.String( number, character )– повертає рядок, повторенийnразів.Trim( string )– видаляє пробіли на початку та в кінці.UCase( string )– перетворює на великі літери.
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}Обчислення функцій дати/часу
Aspose.Tasks підтримує як стандартні VB-подібні функції дати, так і специфічні для MS Project функції планування:
CDate( expression )– перетворює вираз на дату.Date()– повертає поточну системну дату.DateAdd( interval, number, date )– додає інтервал до дати.DateDiff( interval, date1, date2 )– різниця між двома датами.DatePart( interval, date )– витягує частину дати (рік, місяць, день тощо).DateSerial( year, month, day )– створює дату з компонентів.DateValue( date )– перетворює рядок на дату.Day( date )– день місяця.Hour( time )– витягує годину.IsDate( expression )– перевіряє, чи є вираз дійсною датою.Minute( time )– витягує хвилини.Month( date )– витягує місяць.Now()– повертає поточні дату та час.ProjDateAdd( date, duration, calendar )– додає тривалість з урахуванням календаря проекту.ProjDateConv( expression, dateformat )– перетворює дату у формат проекту.ProjDateDiff( date1, date2, calendar )– різниця з урахуванням календаря проекту.ProjDateSub( date, duration, calendar )– віднімає тривалість.ProjDateValue( expression )– обчислює вираз дати.ProjDurConv( expression, durationunits )– перетворює тривалості між одиницями.ProjDurValue( duration )– обчислює вираз тривалості.Second( time )– витягує секунди.Time()– повертає поточний системний час.Timer()– кількість секунд після опівночі.TimeSerial( hour, minute, second )– створює значення часу.TimeValue( time )– перетворює на час.Weekday( date, firstdayofweek )– повертає день тижня.Year( date )– витягує рік.
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);Практичний приклад
Ось приклад реального використання формул:
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);Ключові переваги підтримки формул
- Повна сумісність із формулами MS Project.
- Здатність автоматизувати динамічні поля та умовну логіку.
- Вбудована підтримка для функцій з урахуванням календаря проекту (ProjDateAdd, ProjDateDiff, тощо).
- Спрощує складні обчислення без написання власного коду на C#.