Load all task dates#
Get the start, end and duration of every scheduled task from one solve, for example to fill your UI when a project first opens.
By default, updates in a ScheduleResult is sparse: it lists only the tasks that moved. Set SolveOptions::include_unchanged and the same solve also reports the tasks that didn't move. You don't need a separate call.
Steps#
-
Build the solve options with
include_unchangedset totrue:use SolveOptions; let options = SolveOptions ; -
Pass the options to the solve that loads the data. Use
Project::solvewithSome(data)for a long-lived project, orschedulefor a one-shot job. -
Read every entry of
result.updates. Each entry hasstart_date,end_dateanddurationset.
The full example below schedules three tasks. review doesn't move, but it's still reported:
use ;
Get the full list from an already solved project#
To reload every date later, call solve(None, ...) with the same options. On a solved project with no pending edits, the call doesn't replan or change the accepted state, and baseline_id stays the same:
let all_dates = project.solve?;
Switch back to sparse results for the edits that follow. SolveOptions::default() returns only what changed:
let next = project.solve?;
The result cache uses the whole SolveOptions as its key. An include_unchanged call never gets a cached sparse result, and a sparse call never gets a cached full one.
What is and isn't reported#
- The result includes every scheduled task: leaf tasks, summaries and milestones. Check
Mutation::kindto tell them apart. - Tasks with
unscheduled: trueare never reported. leveling_delayandpausesnever appear, because a solve doesn't change them.baseline_idfollows real changes only. Asking for unchanged tasks doesn't create a new baseline.- With
subtree, the result holds every task in the subtree, including the subtree tasks' ancestors. Tasks outside the subtree appear only when a sparse subtree solve would report them too, because they changed or were edited. - On a project with a dependency cycle, nothing is scheduled. The result still lists every scheduled task, in model order, with its dates and duration as stored.
subtreeis ignored, and no entry has areason, even withreasons: true. Project::previewandProject::levelalways return sparse updates.
Result#
The example prints one line per task, including review, which didn't move (the lines may come in a different order):
design 2026-01-01 00:00..2026-01-03 00:00 2
build 2026-01-03 00:00..2026-01-04 00:00 1
review 2026-01-05 00:00..2026-01-06 00:00 1
Without include_unchanged, the same solve reports only build.
See Reading results for how to write the dates back into your model.