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
Related Scripts
Auto-assign Based on Category
Automatically assign tickets to the appropriate assignment group based on category.
Send Email Notifications
Send customized email notifications when specific conditions are met.
Populate Fields on Insert
Automatically populate fields with default values or calculated values when a record is created.