Soporte para la evaluación de funciones en fórmulas
Aspose.Tasks for .NET API admite evaluar funciones definidas como fórmulas dentro de los Extended Attributes de un proyecto.
Esto permite a los desarrolladores realizar cálculos similares a los disponibles en Microsoft Project, haciendo posible implementar campos dinámicos que dependen de lógica personalizada.
La API proporciona soporte de evaluación para las siguientes categorías de funciones:
- Funciones matemáticas
- Funciones generales
- Funciones de texto
- Funciones de fecha/hora
Esta característica es particularmente útil cuando necesita:
- Automatizar cálculos del proyecto,
- Implementar reglas de negocio personalizadas,
- Garantizar la compatibilidad de fórmulas entre MS Project y Aspose.Tasks.
Cálculo de expresiones matemáticas
Se admiten las siguientes funciones matemáticas:
- 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}Cálculo de funciones generales
Las siguientes funciones proporcionan evaluaciones lógicas y condicionales:
Choose( index, choice-1, choice-2, ... , choice-n )– selecciona un valor de una lista.IIf( expr, truepart, falsepart )– devuelve uno de dos valores dependiendo de una condición.IsNumeric( expression )– comprueba si una expresión es numérica.IsNull( expression )– comprueba si una expresión es nula.Switch( expr-1, value-1, expr-2, value-2, ... )– evalúa expresiones en orden y devuelve el primer valor coincidente.
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}Cálculo de funciones de texto
Las funciones de manipulación de cadenas permiten el formateo y la comparación:
Asc( string )– devuelve el código ASCII del primer carácter.Chr( charcode )– devuelve el carácter correspondiente a un código ASCII.Format( expression, format, firstdayofweek, firstweekofyear )– formatea números/fechas.Instr( start, string1, string2, compare )– encuentra la posición de una cadena dentro de otra.LCase( string )– convierte a minúsculas.Left( string, length )– extrae caracteres desde la izquierda.Len( string )– devuelve la longitud de la cadena.LTrim( string )– elimina los espacios iniciales.Mid( string, start, length )– extrae una subcadena.Right( string, length )– extrae caracteres desde la derecha.RTrim( string )– elimina los espacios finales.Space( number )– devuelve una cadena con espacios.StrComp( string1, string2, compare )– compara dos cadenas.StrConv( string, conversion, LCID )– convierte la cadena según la configuración regional.String( number, character )– devuelve una cadena repetidanveces.Trim( string )– elimina espacios al inicio y al final.UCase( string )– convierte a mayúsculas.
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}Cálculo de funciones de fecha/hora
Aspose.Tasks admite tanto las funciones de fecha de estilo VB estándar como las funciones de programación específicas de MS Project:
CDate( expression )– convierte una expresión a una fecha.Date()– devuelve la fecha actual del sistema.DateAdd( interval, number, date )– agrega un intervalo a una fecha.DateDiff( interval, date1, date2 )– diferencia entre dos fechas.DatePart( interval, date )– extrae parte de una fecha (año, mes, día, etc.).DateSerial( year, month, day )– construye una fecha a partir de componentes.DateValue( date )– convierte una cadena a fecha.Day( date )– día del mes.Hour( time )– extrae la hora.IsDate( expression )– comprueba si una expresión es una fecha válida.Minute( time )– extrae los minutos.Month( date )– extrae el mes.Now()– devuelve la fecha y hora actuales.ProjDateAdd( date, duration, calendar )– añade duración considerando el calendario del proyecto.ProjDateConv( expression, dateformat )– convierte la fecha al formato del proyecto.ProjDateDiff( date1, date2, calendar )– diferencia considerando el calendario del proyecto.ProjDateSub( date, duration, calendar )– resta una duración.ProjDateValue( expression )– evalúa una expresión de fecha.ProjDurConv( expression, durationunits )– convierte duraciones entre unidades.ProjDurValue( duration )– evalúa una expresión de duración.Second( time )– extrae los segundos.Time()– devuelve la hora actual del sistema.Timer()– número de segundos desde la medianoche.TimeSerial( hour, minute, second )– construye un valor de hora.TimeValue( time )– convierte a una hora.Weekday( date, firstdayofweek )– devuelve el día de la semana.Year( date )– extrae el año.
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);Ejemplo práctico
Aquí hay un escenario real de uso de fórmulas:
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);Beneficios clave del soporte de fórmulas
- Total compatibilidad con las fórmulas de MS Project.
- Capacidad para automatizar campos dinámicos y lógica condicional.
- Soporte integrado para funciones que consideran el calendario del proyecto (ProjDateAdd, ProjDateDiff, etc.).
- Simplifica cálculos complejos sin escribir código C# personalizado.