Skip to content

Commit 45fd932

Browse files
authored
Merge pull request #2169 from shivamvish160/archive-final
Dynamic Record Archiving Logic
2 parents b47ca16 + 490a0c8 commit 45fd932

File tree

2 files changed

+85
-0
lines changed

2 files changed

+85
-0
lines changed
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# Dynamic Record Archiving Logic
2+
3+
## Overview
4+
This snippet provides a reusable logic to archive or flag records in ServiceNow that are older than a specified threshold. It helps maintain data hygiene, improve performance, and support compliance with data retention policies.
5+
6+
You can choose between two modes:
7+
- **Flag Mode**: Marks records as archived using a custom field (`u_archived`).
8+
- **Move Mode**: Moves records to a corresponding archive table (e.g., `incident_archive`) and deletes the original.
9+
10+
---
11+
12+
## Use Case
13+
- Archive incidents older than 1 year.
14+
- Clean up old tasks, requests, or custom records.
15+
- Automate data lifecycle management via Scheduled Jobs.
16+
17+
---
18+
19+
## Parameters
20+
| Parameter | Description |
21+
|---------------------|-----------------------------------------------------------------------------|
22+
| `tableName` | Name of the table to archive (e.g., `incident`) |
23+
| `dateField` | Date field to filter by (e.g., `opened_at`, `created_on`) |
24+
| `archiveThresholdDays` | Number of days before today to consider for archiving (e.g., `365`) |
25+
| `archiveMode` | `'flag'` to mark records, `'move'` to transfer to archive table |
26+
27+
---
28+
29+
## Example Usage
30+
```javascript
31+
var archiver = new RecordArchiver('incident', 'opened_at', 365, 'flag');
32+
archiver.archiveRecords();
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
var RecordArchiver = Class.create();
2+
RecordArchiver.prototype = {
3+
initialize: function(tableName, dateField, archiveThresholdDays, archiveMode) {
4+
this.tableName = tableName;
5+
this.dateField = dateField;
6+
this.archiveThresholdDays = archiveThresholdDays;
7+
this.archiveMode = archiveMode || 'flag'; // 'flag' or 'move'
8+
},
9+
10+
archiveRecords: function() {
11+
var thresholdDate = new GlideDateTime();
12+
thresholdDate.addDaysUTC(-this.archiveThresholdDays);
13+
14+
var gr = new GlideRecord(this.tableName);
15+
gr.addQuery(this.dateField, '<=', thresholdDate);
16+
gr.query();
17+
18+
var count = 0;
19+
while (gr.next()) {
20+
if (this.archiveMode === 'flag') {
21+
gr.setValue('u_archived', true); // Assumes a custom field 'u_archived'
22+
gr.update();
23+
} else if (this.archiveMode === 'move') {
24+
this._moveToArchiveTable(gr);
25+
}
26+
count++;
27+
}
28+
29+
gs.info('Archived ' + count + ' records from ' + this.tableName);
30+
},
31+
32+
_moveToArchiveTable: function(record) {
33+
var archiveGr = new GlideRecord(this.tableName + '_archive');
34+
archiveGr.initialize();
35+
36+
var fields = record.getFields();
37+
for (var i = 0; i < fields.size(); i++) {
38+
var fieldName = fields.get(i).getName();
39+
if (archiveGr.isValidField(fieldName)) {
40+
archiveGr.setValue(fieldName, record.getValue(fieldName));
41+
}
42+
}
43+
44+
archiveGr.insert();
45+
record.deleteRecord();
46+
},
47+
48+
type: 'RecordArchiver'
49+
};
50+
51+
// Example usage:
52+
//var archiver = new RecordArchiver('incident', 'opened_at', 365, 'flag'); // Archive incidents older than 1 year
53+
//archiver.archiveRecords();

0 commit comments

Comments
 (0)