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 repetidan
veces.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.