Task Constraints
- 7 minutes to read
A task constraint allows a user to limit a task’s start or finish date to a specific date or range of dates. The task’s start or finish date always remains in the specified range regardless of changes in the project.
For example, the release date of a product’s new version is a certain date or later. If development and testing are postponed, this shifts the release to a later date. However, if development and testing are completed earlier, the release remains at the same date.
Constraint Types
The table below contains supported constraints.
Constraint Name | Value | Description | Type |
---|---|---|---|
0 | The task should start as soon as possible. This is the default constraint. | Flexible | |
1 | The task should start as late as possible but it should not delay other tasks so that they violate their constraints. | Flexible | |
2 | The task’s start date should be later than or equal to the specified date. | Semi-Flexible | |
3 | The task’s start date should be earlier than or equal to the specified date. | Semi-Flexible | |
4 | The task’s finish date should be later than or equal to the specified date. | Semi-Flexible | |
5 | The task’s finish date should be earlier than or equal to the specified date. | Semi-Flexible | |
6 | The task’s start date should be equal to the specified date. | Non-Flexible | |
7 | The task’s finish date should be equal to the specified date. | Non-Flexible |
Flexible Constraints
The As Soon As Possible (ASAP) and As Late As Possible (ALAP) constraints are flexible, which means that they do not require a date. The control schedules a task based on dependencies between this task and its predecessors and successors.
As Soon As Possible is the default constraint. It is typically applied to tasks if the project should finish as quickly as possible.
The As Late As Possible constraint can be applied to a task if its successor should start later than this task normally finishes. For example, if supplies need to be delivered to the factory just-in-time before production to reduce storage costs, a user can apply the ALAP constraint to this task.
Semi-Flexible Constraints
The Start No Later Than (SNLT), Start No Earlier Than (SNET), Finish No Later Than (FNLT), and Finish No Earlier Than (FNET) constraints are semi-flexible, which means that they limit the task to a specific date, but this date is the upper or lower limit of possible values.
For example, the Start No Earlier Than constraint limits a task’s start date to a specific range of dates. That is if a user modifies other tasks in the project, the control can reschedule this task to start on the specified or later date.
Note
The control automatically applies the Start No Earlier Than or Finish No Earlier Than constraint if a user changes a task’s start or finish date, accordingly. See more information below.
Non-Flexible Constraints
The Must Start On and Must Finish On constraints are non-flexible, which means they require an exact start or finish date.
Note
Semi-flexible and non-flexible constraints require a date. If the constraint date is not specified, the control automatically applies the current start or finish date depending on the constraint’s type. For example, if a user applies the Must Start On constraint to a task but does not specify the constraint date, the control uses the current start date.
Data Source
Users can apply constraints to tasks if the data source contains fields for this information. The following properties specify the field names:
- ConstraintTypeFieldName — specifies the name of the field that contains constraint types (ASAP, ALAP, and so on). The data type should be ConstraintType or Int32. The ConstraintType enumeration is a set of named integer constants. You can store constraint types as integers in the data source.
- ConstraintDateFieldName — specifies the name of the field that contains limit dates. The data type should be DateTime.
See the following topic for more information on how to specify the data source: Bind to Data Source.
Example
The code below shows how to specify constraints in code. The Must Start On constraint applies to the third task and the As Late As Possible constraint applies to the second task.
using DevExpress.XtraGantt;
using System.Data;
ganttControl1.TreeListMappings.KeyFieldName = "ID";
ganttControl1.TreeListMappings.ParentFieldName = "ParentID";
ganttControl1.ChartMappings.TextFieldName = "Text";
ganttControl1.ChartMappings.StartDateFieldName = "StartDate";
ganttControl1.ChartMappings.FinishDateFieldName = "FinishDate";
ganttControl1.ChartMappings.ConstraintTypeFieldName = "ConstraintType";
ganttControl1.ChartMappings.ConstraintDateFieldName = "ConstraintDate";
ganttControl1.DataSource = GetTasks();
ganttControl1.DependencyMappings.PredecessorFieldName = "PredecessorID";
ganttControl1.DependencyMappings.SuccessorFieldName = "SuccessorID";
ganttControl1.DependencyMappings.TypeFieldName = "DependencyType";
ganttControl1.DependencyMappings.LagFieldName = "TimeLag";
ganttControl1.DependencySource = GetDependencies();
DataTable GetTasks() {
DataTable table = new DataTable();
DataColumn id = new DataColumn("ID", typeof(int));
DataColumn parentId = new DataColumn("ParentID", typeof(int));
DataColumn text = new DataColumn("Text", typeof(string));
DataColumn start = new DataColumn("StartDate", typeof(DateTime));
DataColumn finish = new DataColumn("FinishDate", typeof(DateTime));
DataColumn constraintType = new DataColumn("ConstraintType", typeof(ConstraintType));
DataColumn constraintDate = new DataColumn("ConstraintDate", typeof(DateTime));
table.Columns.AddRange(new DataColumn[] { id, parentId, text, start, finish , constraintType, constraintDate });
table.Rows.Add(new object[] { 1, 0, "Task 1", DateTime.Now, DateTime.Now.AddDays(1) , null, null });
table.Rows.Add(new object[] { 2, 0, "Task 2", DateTime.Now.AddDays(2), DateTime.Now.AddDays(3) , ConstraintType.AsLateAsPossible, null });
table.Rows.Add(new object[] { 3, 0, "Task 3", DateTime.Now.AddDays(3), DateTime.Now.AddDays(4) , ConstraintType.MustStartOn, DateTime.Now.AddDays(3) });
return table;
}
DataTable GetDependencies() {
DataTable table = new DataTable();
DataColumn predecessor = new DataColumn("PredecessorID", typeof(int));
DataColumn successor = new DataColumn("SuccessorID", typeof(int));
DataColumn dependencyType = new DataColumn("DependencyType", typeof(DevExpress.XtraGantt.DependencyType));
DataColumn lag = new DataColumn("TimeLag", typeof(TimeSpan));
table.Columns.AddRange(new DataColumn[] { predecessor, successor, dependencyType, lag });
table.Rows.Add(new object[] { 1, 2, DependencyType.FinishToStart, null });
table.Rows.Add(new object[] { 2, 3, DependencyType.FinishToStart, null });
return table;
}
Apply Constraints Automatically
The control automatically applies the Start No Earlier Than constraint to a task if a user changes its start date and the Finish No Earlier Than constraint if a user changes its finish date.
If a user moves a task in the chart, the Start No Earlier Than constraint applies to a regular task and the Finish No Earlier Than constraint applies to a milestone.
Set the ConstraintMode property to Manual to allow users to apply constraints manually, but not automatically.
using DevExpress.XtraGantt.Options;
ganttControl1.OptionsBehavior.ConstraintMode = ConstraintMode.Manual;
Limitations
Constraints cannot be applied to summary tasks. If the project uses task constraints, users cannot move summary tasks in automatic scheduling mode.