Skip to content

Commit f85706e

Browse files
Detect Circular Reference in Task Dependencies (#1664)
1 parent 8cd697c commit f85706e

File tree

2 files changed

+55
-0
lines changed
  • Server-Side Components/Script Includes/Prevent circular dependencies in task relationships.

2 files changed

+55
-0
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# Detect Circular Reference in Task Dependencies
2+
3+
4+
5+
## Overview
6+
7+
This Script Include helps identify **circular dependencies** in task relationships within ServiceNow. Circular references can cause workflow issues, reporting errors, and logic failures in project management or task tracking modules.
8+
9+
## What It Does
10+
11+
- Traverses task dependencies recursively.
12+
- Detects if a task is indirectly dependent on itself.
13+
- Returns `true` if a circular reference is found, `false` otherwise.
14+
15+
## Use Case
16+
17+
Imagine Task A depends on Task B, and Task B depends on Task A. This creates a circular loop that can break automation or cause infinite recursion. This script helps prevent such configurations.
18+
19+
Tables and modules it would be usefull
20+
It is used for Table: planned_task_rel_planned_task
21+
This table is used to define task dependencies between project tasks in ServiceNow's Strategic Portfolio Management (SPM) or Project Portfolio Management (PPM) modules. It stores relationships such as:
22+
23+
Predecessor Task
24+
Successor Task
25+
Dependency Type (e.g., Finish-to-Start)
26+
27+
28+
29+
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
var DependencyChecker = Class.create();
2+
DependencyChecker.prototype = {
3+
initialize: function() {},
4+
5+
hasCircularReference: function(taskId) {
6+
var visited = {};
7+
return this._check(taskId, visited);
8+
},
9+
10+
_check: function(taskId, visited) {
11+
if (visited[taskId]) return true;
12+
visited[taskId] = true;
13+
14+
var gr = new GlideRecord('task_dependency');
15+
gr.addQuery('dependent_task', taskId);
16+
gr.query();
17+
18+
while (gr.next()) {
19+
if (this._check(gr.task.toString(), visited)) return true;
20+
}
21+
22+
return false;
23+
},
24+
25+
type: 'DependencyChecker'
26+
};

0 commit comments

Comments
 (0)