Skip to content

Commit 2765bed

Browse files
authored
DynamicTableQueryUtil (#2345)
* Create Readme.md * Create DynamicTableQueryUtil.js * Create clientscript.js
1 parent 1f4b319 commit 2765bed

File tree

3 files changed

+130
-0
lines changed

3 files changed

+130
-0
lines changed
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
var DynamicTableQueryUtil = Class.create();
2+
DynamicTableQueryUtil.prototype = Object.extendsObject(AbstractAjaxProcessor, {
3+
4+
getTableRow: function() {
5+
var tableName = this.getParameter('sysparm_table_name');
6+
var keyField = this.getParameter('sysparm_key_field');
7+
var keyValue = this.getParameter('sysparm_key_value');
8+
var fieldsParam = this.getParameter('sysparm_fields');
9+
var limitFields = !JSUtil.nil(fieldsParam);
10+
var desiredFields = limitFields ? fieldsParam.split(',') : [];
11+
12+
var result = {};
13+
var tableObj = {};
14+
var gr = new GlideRecord(tableName);
15+
16+
// Use addQuery for non-sys_id fields
17+
if (keyField === 'sys_id') {
18+
if (!gr.get(keyValue)) {
19+
return null;
20+
}
21+
} else {
22+
gr.addQuery(keyField, keyValue);
23+
gr.query();
24+
if (!gr.next()) {
25+
return null;
26+
}
27+
}
28+
29+
// Handle variables (if present)
30+
if (gr.variables) {
31+
for (var key in gr.variables) {
32+
if (!JSUtil.nil(gr.variables[key])) {
33+
var variableObj = gr.variables[key];
34+
tableObj['variables.' + key] = {
35+
fieldDisplayVal: variableObj.getDisplayValue() || String(variableObj),
36+
fieldVal: String(variableObj)
37+
};
38+
}
39+
}
40+
}
41+
42+
// Handle standard fields
43+
var fields = gr.getFields();
44+
for (var i = 0; i < fields.size(); i++) {
45+
var field = fields.get(i);
46+
var fieldName = field.getName();
47+
tableObj[fieldName] = {
48+
fieldDisplayVal: field.getDisplayValue() || String(field),
49+
fieldVal: String(field)
50+
};
51+
}
52+
53+
// Add sys_id explicitly
54+
tableObj['sys_id'] = {
55+
fieldDisplayVal: 'Sys ID',
56+
fieldVal: gr.getUniqueValue()
57+
};
58+
59+
// Filter fields if requested
60+
if (limitFields) {
61+
desiredFields.forEach(function(field) {
62+
field = field.trim();
63+
if (tableObj[field]) {
64+
result[field] = tableObj[field];
65+
}
66+
});
67+
} else {
68+
result = tableObj;
69+
}
70+
71+
return new JSON().encode(result);
72+
}
73+
});
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
This solution provides a generic and reusable GlideAjax-based client-server interaction in ServiceNow that allows querying any table by passing:
2+
3+
Table name
4+
Key field and value
5+
Desired fields to retrieve
6+
7+
It dynamically returns field values from the server and populates them on the form, making it ideal for use cases like CMDB enrichment, entitlement lookups, or dynamic form population.
8+
9+
1. Client Script (onChange)
10+
Triggers on field change.
11+
Sends parameters to the Script Include via GlideAjax.
12+
Receives JSON response and sets target field value.
13+
14+
Parameters:
15+
sysparm_table_name: Table to query (e.g., sys_user)
16+
sysparm_key_field: Field to match (e.g., sys_id)
17+
sysparm_key_value: Value to match
18+
sysparm_fields: Comma-separated list of fields to retrieve
19+
20+
2. Script Include: DynamicTableQueryUtil
21+
22+
Processes incoming parameters.
23+
Queries the specified table and retrieves requested fields.
24+
Supports both standard fields and catalog item variables.
25+
Returns a JSON object with field values and display values.
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
function onChange(control, oldValue, newValue, isLoading) {
2+
if (isLoading || newValue === '') {
3+
return;
4+
}
5+
6+
// Define parameters dynamically
7+
var tableName = 'sys_user'; // Change as needed
8+
var keyField = 'sys_id'; // Change as needed
9+
var fieldsToFetch = 'email'; // Comma-separated list
10+
var targetField = 'user'; // Field to populate
11+
12+
var ga = new GlideAjax('DynamicTableQueryUtil');
13+
ga.addParam('sysparm_name', 'getTableRow');
14+
ga.addParam('sysparm_table_name', tableName);
15+
ga.addParam('sysparm_key_field', keyField);
16+
ga.addParam('sysparm_key_value', newValue);
17+
ga.addParam('sysparm_fields', fieldsToFetch);
18+
ga.getXML(function(response) {
19+
var answer = response.responseXML.documentElement.getAttribute("answer");
20+
if (!answer) {
21+
alert('No response from Script Include');
22+
return;
23+
}
24+
25+
var parsedAnswer = JSON.parse(answer);
26+
if (parsedAnswer[fieldsToFetch]) {
27+
g_form.setValue(targetField, parsedAnswer[fieldsToFetch]['fieldVal']);
28+
} else {
29+
alert('error');
30+
}
31+
});
32+
}

0 commit comments

Comments
 (0)