Trabajar con atributos extendidos de tarea
Atributos extendidos de tarea en Microsoft Project le permiten definir campos personalizados y capturar información adicional sobre las tareas. Aspose.Tasks for .NET admite completamente la creación, lectura y gestión de atributos extendidos para tareas tanto en MPP y XML formatos en todas las versiones de Microsoft Project (2003–2019).
¿Qué son los atributos extendidos de tarea?
En Microsoft Project, un atributo extendido es un campo personalizado (como Text1, Cost2, o Flag5) que puede usar para almacenar información empresarial específica no cubierta por los campos estándar. Estos atributos son extremadamente útiles para:
- Seguimiento de metadatos adicionales sobre las tareas (por ejemplo, categoría de la tarea, nivel de riesgo, código de presupuesto).
- Agregar información específica del proyecto requerida para informes.
- Hacer cumplir los estándares de gestión de proyectos de la empresa.
Aspose.Tasks expone esta funcionalidad a través de dos clases principales:
- ExtendedAttributeDefinition – define el campo personalizado (nombre, tipo, reglas de cálculo, valores de búsqueda).
- ExtendedAttribute – almacena el valor real de ese campo personalizado para una tarea específica.
Agregar información de atributo extendido a una tarea
Para agregar un atributo extendido a una tarea mediante programación:
- Crear un
ExtendedAttributeDefinition
que defina el tipo de campo personalizado. - Crear un
ExtendedAttribute
objeto basado en esa definición. - Asigne el atributo a la tarea deseada.
Ejemplo: Agregar atributos extendidos
1// Create new project
2Project project = new Project("New Project.mpp");
3
4// Create an Extended Attribute Definition of Text1 type
5var taskExtendedAttributeText1Definition = ExtendedAttributeDefinition.CreateTaskDefinition(CustomFieldType.Text, ExtendedAttributeTask.Text1, "Task City Name");
6
7// Add it to the project's Extended Attributes collection
8project.ExtendedAttributes.Add(taskExtendedAttributeText1Definition);
9
10// Add a task to the project
11Task task = project.RootTask.Children.Add("Task 1");
12
13// Create an Extended Attribute from the Attribute Definition
14var taskExtendedAttributeText1 = taskExtendedAttributeText1Definition.CreateExtendedAttribute();
15
16// Assign a value to the generated Extended Attribute. The type of the attribute is "Text", the "TextValue" property should be used.
17taskExtendedAttributeText1.TextValue = "London";
18
19// Add the Extended Attribute to task
20task.ExtendedAttributes.Add(taskExtendedAttributeText1);
21
22project.Save("PlainTextExtendedAttribute_out.mpp", SaveFileFormat.MPP);
23
24Project project = new Project("New Project.mpp");
25
26// Create an Extended Attribute Definition of Text2 type
27var taskExtendedAttributeText2Definition = ExtendedAttributeDefinition.CreateLookupTaskDefinition(CustomFieldType.Text, ExtendedAttributeTask.Text2, "Task Towns Name");
28
29// Add lookup values for the extended attribute definition
30taskExtendedAttributeText2Definition.AddLookupValue(new Value { Id = 1, StringValue = "Town1", Description = "This is Town1" });
31taskExtendedAttributeText2Definition.AddLookupValue(new Value { Id = 2, StringValue = "Town2", Description = "This is Town2" });
32
33// Add it to the project's Extended Attributes collection
34project.ExtendedAttributes.Add(taskExtendedAttributeText2Definition);
35
36// Add a task to the project
37var task2 = project.RootTask.Children.Add("Task 2");
38
39// Crate an Extended Attribute from the Text2 Lookup Definition for Id 1
40var taskExtendedAttributeText2 = taskExtendedAttributeText2Definition.CreateExtendedAttribute(taskExtendedAttributeText2Definition.ValueList[1]);
41
42// Add the Extended Attribute to task
43task2.ExtendedAttributes.Add(taskExtendedAttributeText2);
44
45project.Save("TextExtendedAttributeWithLookup_out.mpp", SaveFileFormat.MPP);
46
47Project project2 = new Project("New Project.mpp");
48
49// Create an Extended Attribute Definition of Duration2 type
50var taskExtendedAttributeDuration2Definition = ExtendedAttributeDefinition.CreateLookupTaskDefinition(CustomFieldType.Duration, ExtendedAttributeTask.Duration2, "Some duration");
51
52// Add lookup values for extended attribute definition
53taskExtendedAttributeDuration2Definition.AddLookupValue(new Value { Id = 2, Duration = project2.GetDuration(4, TimeUnitType.Hour), Description = "4 hours" });
54taskExtendedAttributeDuration2Definition.AddLookupValue(new Value { Id = 3, Duration = project2.GetDuration(1, TimeUnitType.Day), Description = "1 day" });
55taskExtendedAttributeDuration2Definition.AddLookupValue(new Value { Id = 4, Duration = project2.GetDuration(1, TimeUnitType.Hour), Description = "1 hour" });
56taskExtendedAttributeDuration2Definition.AddLookupValue(new Value { Id = 7, Duration = project2.GetDuration(10, TimeUnitType.Day), Description = "10 days" });
57
58// Add the definition to the project's Extended Attributes collection
59project2.ExtendedAttributes.Add(taskExtendedAttributeDuration2Definition);
60
61// Add a task to the project
62var task3 = project2.RootTask.Children.Add("Task 3");
63
64// Create an Extended Attribute from the Duration2 Lookup Definition for Id 3
65var taskExtendedAttributeDuration2 = taskExtendedAttributeDuration2Definition.CreateExtendedAttribute(taskExtendedAttributeDuration2Definition.ValueList[3]);
66
67// Add the Extended Attribute to task
68task3.ExtendedAttributes.Add(taskExtendedAttributeDuration2);
69
70project2.Save("DurationExtendedAttributeWithLookup_out.mpp", SaveFileFormat.MPP);
71
72Project project3 = new Project("New Project.mpp");
73
74// Create an Extended Attribute Definition of Finish2 Type
75var taskExtendedAttributeFinish2Definition = ExtendedAttributeDefinition.CreateLookupTaskDefinition(CustomFieldType.Finish, ExtendedAttributeTask.Finish2, "Some finish");
76
77// Add lookup values for extended attribute defintion
78taskExtendedAttributeFinish2Definition.AddLookupValue(new Value { Id = 2, DateTimeValue = new DateTime(1984, 01, 01, 00, 00, 01), Description = "This is Value2" });
79taskExtendedAttributeFinish2Definition.AddLookupValue(new Value { Id = 3, DateTimeValue = new DateTime(1994, 01, 01, 00, 01, 01), Description = "This is Value3" });
80taskExtendedAttributeFinish2Definition.AddLookupValue(new Value { Id = 4, DateTimeValue = new DateTime(2009, 12, 31, 00, 00, 00), Description = "This is Value4" });
81taskExtendedAttributeFinish2Definition.AddLookupValue(new Value { Id = 7, DateTimeValue = DateTime.Now, Description = "This is Value6" });
82
83// Add the definition to the project's Extended Attributes collection
84project3.ExtendedAttributes.Add(taskExtendedAttributeFinish2Definition);
85
86// Add a task to the project
87var task4 = project3.RootTask.Children.Add("Task 4");
88
89// Create an Extended Attribute from the Finish2 Lookup Definition for Id 3
90var taskExtendedAttributeFinish2 = taskExtendedAttributeFinish2Definition.CreateExtendedAttribute(taskExtendedAttributeFinish2Definition.ValueList[3]);
91
92// Add the Extended Attribute to task
93task4.ExtendedAttributes.Add(taskExtendedAttributeFinish2);
94
95project3.Save("FinishExtendedAttributeWithLookup_out.mpp", SaveFileFormat.MPP);
Explicación:
- Primero, definimos un Texto campo personalizado (por ejemplo, Text1).
- Luego creamos una instancia de
ExtendedAttribute
con un valor específico. - Finalmente, lo adjuntamos a la tarea, permitiendo el almacenamiento de información personalizada.
Lectura de atributos extendidos de tarea
Una vez asignados los atributos extendidos, puede leerlos usando la ExtendedAttributes colección de la Task
clase. Esta propiedad devuelve una lista de ExtendedAttribute
objetos, cada uno con detalles sobre los campos personalizados de la tarea.
Ejemplo: Lectura de atributos extendidos
1Project project = new Project("New Project.mpp");
2
3// Read extended attributes for tasks
4foreach (Task task in project.RootTask.Children)
5{
6 foreach (ExtendedAttribute ea in task.ExtendedAttributes)
7 {
8 Console.WriteLine(ea.FieldId);
9 Console.WriteLine(ea.ValueGuid);
10
11 switch (ea.AttributeDefinition.CfType)
12 {
13 case CustomFieldType.Date:
14 case CustomFieldType.Start:
15 case CustomFieldType.Finish:
16 Console.WriteLine(ea.DateValue);
17 break;
18
19 case CustomFieldType.Text:
20 Console.WriteLine(ea.TextValue);
21 break;
22
23 case CustomFieldType.Duration:
24 Console.WriteLine(ea.DurationValue.ToString());
25 break;
26
27 case CustomFieldType.Cost:
28 case CustomFieldType.Number:
29 Console.WriteLine(ea.NumericValue);
30 break;
31
32 case CustomFieldType.Flag:
33 Console.WriteLine(ea.FlagValue);
34 break;
35 }
36 }
37}
Explicación:
- Cada tarea puede contener múltiples atributos extendidos.
- Puede recorrerlos para extraer datos personalizados (por ejemplo, etiquetas de texto, valores numéricos, indicadores).
- Esto permite la integración con informes, paneles de control o la lógica empresarial.
Notas clave
- Los atributos extendidos proporcionan flexibilidad para personalizar los datos del proyecto.
- Puede definir, asignar y leer atributos extendidos programáticamente.
- La
ExtendedAttributeDefinition
clase se utiliza para definir el esquema de un campo personalizado. - La
ExtendedAttribute
clase almacena los valores reales por tarea. - Compatible con todas las versiones principales de MS Project (MPP 2003–2019) y formato XML.
Preguntas frecuentes
P: ¿Puedo crear una tabla de búsqueda para un atributo extendido?
- Sí. La
ExtendedAttributeDefinition
clase admite valores de búsqueda, al igual que en Microsoft Project.
P: ¿Qué tipos de atributos extendidos son compatibles?
- Texto, Número, Costo, Indicador, Fecha, Duración y campos de Inicio/Fin.
P: ¿Puedo modificar los atributos extendidos después de crear la tarea?
- Por supuesto. Puede actualizar o eliminar los atributos extendidos en cualquier momento.
P: ¿Los atributos extendidos se guardan en archivos MPP/XML?
- Sí. Aspose.Tasks preserva los atributos extendidos al guardar los archivos de proyecto modificados.
P: ¿Está esta función disponible tanto en .NET Framework como en .NET Core?
- Sí. Aspose.Tasks for .NET admite ambas plataformas.