Handling Task Constraints
Task constraints are used to define a Microsoft Project project’s schedule and define when tasks should be started or finished. Constraints can be flexible - start or end as soon as possible or as late as possible - or inflexible. Inflexible constraints are tied to specific dates.
Working with Constraints
The ConstraintDate and ConstraintType properties are exposed by the static class Tsk class to handle constraints:
- ConstraintDate accepts and returns the DateTime datatype.
- ConstraintType accepts and returns one of the values of the ConstraintType enumeration.
Setting Constraints in Microsoft Project
To set constraints in Microsoft Project:
- On the View menu, select More Views and then Task Entry Form.
- Double click a task on the Task Entry Form.
- Select the Advanced tab.
- Set a constraint by selecting an option from the Constraint type list and a date for the Constraint date list.
Setting Constraints with Aspose.Tasks
The constraint date is NA when the constraint type is As Soon As Possible or As Late As Possible. For date values equal to NA, Aspose.Tasks for C++ API uses the value “1/1/2000” in the evaluation version, and DateTime.MinValue for the licensed product. In the below case, we take a source project file as an input and apply different types of constraints on various tasks in each case. The following code example demonstrates the application of different Constraint types.
The code samples below set the constraint type set to Start No Earlier Than.
1// The path to the documents directory.
2System::String dataDir = RunExamples::GetDataDir(System::Reflection::MethodBase::GetCurrentMethod(ASPOSE_CURRENT_FUNCTION)->get_DeclaringType().get_FullName());
3
4// Create project instance
5System::SharedPtr<Project> project = System::MakeObject<Project>(dataDir + u"ConstraintStartNoEarlierThan.mpp");
6
7// Set constraint Start No Earlier Than on task with Id 1
8System::SharedPtr<Task> summary = project->get_RootTask()->get_Children()->GetById(1);
9summary->Set<ConstraintType>(Tsk::ConstraintType(), Aspose::Tasks::ConstraintType::StartNoEarlierThan);
10summary->Set(Tsk::ConstraintDate(), System::DateTime(2016, 12, 1, 9, 0, 0));
11
12// Save project as pdf
13System::SharedPtr<SaveOptions> o = System::MakeObject<PdfSaveOptions>();
14o->set_StartDate(project->Get<System::DateTime>(Prj::StartDate()));
15o->set_Timescale(Aspose::Tasks::Visualization::Timescale::ThirdsOfMonths);
16project->Save(dataDir + u"project_StartNoEarlierThan_out.pdf", o);
The code samples below set the constraint type set to Finish No Earlier Than.
1// Set constraint Finish No Earlier Than on task with Id 2
2System::SharedPtr<Task> first = project1->get_RootTask()->get_Children()->GetById(2);
3first->Set<ConstraintType>(Tsk::ConstraintType(), Aspose::Tasks::ConstraintType::FinishNoEarlierThan);
4first->Set(Tsk::ConstraintDate(), System::DateTime(2016, 12, 1, 18, 0, 0));
5
6// Save project as pdf
7System::SharedPtr<SaveOptions> options = System::MakeObject<PdfSaveOptions>();
8options->set_StartDate(project1->Get<System::DateTime>(Prj::StartDate()));
9options->set_Timescale(Aspose::Tasks::Visualization::Timescale::ThirdsOfMonths);
10project1->Save(dataDir + u"project_FinishNoEarlierThan_out.pdf", options);
The code samples below set the constraint type set to Must Start On.
1// Set constraint Must Start On for task with Id 5
2System::SharedPtr<Task> roof = project1->get_RootTask()->get_Children()->GetById(5);
3roof->Set<ConstraintType>(Tsk::ConstraintType(), Aspose::Tasks::ConstraintType::MustStartOn);
4roof->Set(Tsk::ConstraintDate(), System::DateTime(2017, 1, 1, 9, 0, 0));
5
6// Save project as pdf
7System::SharedPtr<SaveOptions> options = System::MakeObject<PdfSaveOptions>();
8options->set_StartDate(project1->Get<System::DateTime>(Prj::StartDate()));
9options->set_Timescale(Aspose::Tasks::Visualization::Timescale::ThirdsOfMonths);
10project1->Save(dataDir + u"project_MustStartOn_out.pdf", options);
The code samples below set the constraint type set to As Late As Possible.
1// Set constraint As Late As Possible for task with Id 11
2System::SharedPtr<Task> wallBoard = project1->get_RootTask()->get_Children()->GetById(11);
3wallBoard->Set<ConstraintType>(Tsk::ConstraintType(), Aspose::Tasks::ConstraintType::AsLateAsPossible);
4
5// Save project as pdf
6System::SharedPtr<SaveOptions> options = System::MakeObject<PdfSaveOptions>();
7options->set_StartDate(project1->Get<System::DateTime>(Prj::StartDate()));
8options->set_Timescale(Aspose::Tasks::Visualization::Timescale::ThirdsOfMonths);
9project1->Save(dataDir + u"project_AsLateAsPossible_out.pdf", options);
The code sample below shows the constraint type set to Must Finish On.
1// Set constraint Must Finish On for task with Id 15
2System::SharedPtr<Task> interiorFixtures = project1->get_RootTask()->get_Children()->GetById(15);
3interiorFixtures->Set<ConstraintType>(Tsk::ConstraintType(), Aspose::Tasks::ConstraintType::MustFinishOn);
4interiorFixtures->Set(Tsk::ConstraintDate(), System::DateTime(2017, 3, 1, 18, 0, 0));
5
6// Save project as pdf
7System::SharedPtr<SaveOptions> options = System::MakeObject<PdfSaveOptions>();
8options->set_StartDate(project1->Get<System::DateTime>(Prj::StartDate()));
9options->set_Timescale(Aspose::Tasks::Visualization::Timescale::ThirdsOfMonths);
10project1->Save(dataDir + u"project_MustFinishOn_out.pdf", options);
Getting Constraints
This code sample displays any constraints found when traversing the tasks in the project to a command window.
1System::String dataDir = RunExamples::GetDataDir(System::Reflection::MethodBase::GetCurrentMethod(ASPOSE_CURRENT_FUNCTION)->get_DeclaringType().get_FullName());
2System::SharedPtr<Project> project1 = System::MakeObject<Project>(dataDir + u"Project2.mpp");
3
4// Create a ChildTasksCollector instance
5System::SharedPtr<ChildTasksCollector> collector = System::MakeObject<ChildTasksCollector>();
6
7// Collect all the tasks from RootTask using TaskUtils
8TaskUtils::Apply(project1->get_RootTask(), collector, 0);
9
10// Parse through all the collected tasks
11
12{
13 auto tsk1_enumerator = (collector->get_Tasks())->GetEnumerator();
14 decltype(tsk1_enumerator->get_Current()) tsk1;
15 while (tsk1_enumerator->MoveNext() && (tsk1 = tsk1_enumerator->get_Current(), true))
16 {
17 if (tsk1->Get<System::DateTime>(Tsk::ConstraintDate()).ToShortDateString() == u"1/1/2000")
18 {
19 System::Console::WriteLine(u"NA");
20 }
21 else
22 {
23 System::Console::WriteLine(tsk1->Get<System::DateTime>(Tsk::ConstraintDate()).ToShortDateString());
24 }
25
26 System::Console::WriteLine(System::ObjectExt::ToString(tsk1->Get<ConstraintType>(Tsk::ConstraintType())));
27 }
28}