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