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:

Setting Constraints in Microsoft Project

To set constraints in Microsoft Project:

  1. On the View menu, select More Views and then Task Entry Form.
  2. Double click a task on the Task Entry Form.
  3. Select the Advanced tab.
  4. 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}
Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.