Skip to Content

Auto-numbering with Custom Prefix

Generate custom record numbers with prefixes based on category, type, or other fields (e.g., HW0001, SW0002, NET0003).

Table: incident When: before
#before #insert #auto-numbering #custom-numbering #sequence #prefix #formatting

Script Code

JavaScript
1(function executeRule(current, previous /*null when async*/) {
2
3  // Configuration: Define number prefixes based on category
4  var prefixMap = {
5    'hardware': 'HW',
6    'software': 'SW',
7    'network': 'NET',
8    'database': 'DB',
9    'inquiry': 'INQ',
10    'default': 'INC'  // Default prefix if category not found
11  };
12
13  try {
14    // Get category to determine prefix
15    var category = current.getValue('category') || 'default';
16    var prefix = prefixMap[category] || prefixMap['default'];
17
18    // Alternative: Use different field for prefix determination
19    // var type = current.getValue('u_type');
20    // var prefix = prefixMap[type] || prefixMap['default'];
21
22    // Get current year for prefix (optional)
23    var year = new GlideDateTime().getYear().toString().substring(2);  // Last 2 digits
24    prefix = prefix + year;  // e.g., HW24
25
26    // Query for the highest number with this prefix
27    var ga = new GlideAggregate('incident');
28    ga.addQuery('number', 'STARTSWITH', prefix);
29    ga.addAggregate('MAX', 'number');
30    ga.query();
31
32    var nextNumber = 1;
33
34    if (ga.next()) {
35      var maxNumber = ga.getAggregate('MAX', 'number');
36
37      if (maxNumber) {
38        // Extract numeric part from the number
39        // Assumes format: PREFIX-NNNN (e.g., HW24-0001)
40        var parts = maxNumber.split('-');
41        if (parts.length > 1) {
42          var numericPart = parseInt(parts[1], 10);
43          if (!isNaN(numericPart)) {
44            nextNumber = numericPart + 1;
45          }
46        }
47      }
48    }
49
50    // Format number with leading zeros (e.g., 0001, 0042, 1234)
51    var paddedNumber = String(nextNumber).padStart(4, '0');
52
53    // Construct final number
54    var customNumber = prefix + '-' + paddedNumber;
55
56    // Set the number
57    current.setValue('number', customNumber);
58
59    gs.info('Auto-numbering: Generated number ' + customNumber + 
60            ' for category: ' + category);
61
62    // Optional: Set a display number field if you want to keep standard number
63    // current.setValue('u_custom_number', customNumber);
64
65  } catch (e) {
66    gs.error('Auto-numbering BR error: ' + e.message);
67
68    // Fallback to default numbering
69    // Let ServiceNow handle the number generation
70  }
71
72  // Alternative approach: Use number maintenance records
73  /*
74  function getNextNumber(prefix) {
75    // Create/use a custom table to track number sequences
76    var grCounter = new GlideRecord('u_number_counter');
77    grCounter.addQuery('prefix', prefix);
78    grCounter.query();
79
80    var nextNum = 1;
81
82    if (grCounter.next()) {
83      nextNum = parseInt(grCounter.current_number) + 1;
84      grCounter.current_number = nextNum;
85      grCounter.update();
86    } else {
87      // Create new counter record
88      grCounter.initialize();
89      grCounter.prefix = prefix;
90      grCounter.current_number = nextNum;
91      grCounter.insert();
92    }
93
94    return nextNum;
95  }
96
97  var nextNum = getNextNumber(prefix);
98  var paddedNumber = String(nextNum).padStart(4, '0');
99  current.setValue('number', prefix + '-' + paddedNumber);
100  */
101
102})(current, previous);

How to Use

1. Create a before Business Rule on your table 2. Check "Insert" checkbox only 3. Set Order to 100 to run early 4. Customize prefixMap with your categories and prefixes 5. Decide on number format (with/without year, padding length) 6. Test number generation across different categories 7. Verify uniqueness and sequence continuity 8. Consider concurrency issues in high-volume environments 9. Alternative: Create custom counter table for better control 10. Document numbering scheme for users

Explore More Scripts

Browse our complete library of ServiceNow scripts

View All Scripts