Поддержка вычисления функций в формулах
Aspose.Tasks для .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#.