Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
var DynamicTableQueryUtil = Class.create();
DynamicTableQueryUtil.prototype = Object.extendsObject(AbstractAjaxProcessor, {

getTableRow: function() {
var tableName = this.getParameter('sysparm_table_name');
var keyField = this.getParameter('sysparm_key_field');
var keyValue = this.getParameter('sysparm_key_value');
var fieldsParam = this.getParameter('sysparm_fields');
var limitFields = !JSUtil.nil(fieldsParam);
var desiredFields = limitFields ? fieldsParam.split(',') : [];

var result = {};
var tableObj = {};
var gr = new GlideRecord(tableName);

// Use addQuery for non-sys_id fields
if (keyField === 'sys_id') {
if (!gr.get(keyValue)) {
return null;
}
} else {
gr.addQuery(keyField, keyValue);
gr.query();
if (!gr.next()) {
return null;
}
}

// Handle variables (if present)
if (gr.variables) {
for (var key in gr.variables) {
if (!JSUtil.nil(gr.variables[key])) {
var variableObj = gr.variables[key];
tableObj['variables.' + key] = {
fieldDisplayVal: variableObj.getDisplayValue() || String(variableObj),
fieldVal: String(variableObj)
};
}
}
}

// Handle standard fields
var fields = gr.getFields();
for (var i = 0; i < fields.size(); i++) {
var field = fields.get(i);
var fieldName = field.getName();
tableObj[fieldName] = {
fieldDisplayVal: field.getDisplayValue() || String(field),
fieldVal: String(field)
};
}

// Add sys_id explicitly
tableObj['sys_id'] = {
fieldDisplayVal: 'Sys ID',
fieldVal: gr.getUniqueValue()
};

// Filter fields if requested
if (limitFields) {
desiredFields.forEach(function(field) {
field = field.trim();
if (tableObj[field]) {
result[field] = tableObj[field];
}
});
} else {
result = tableObj;
}

return new JSON().encode(result);
}
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
This solution provides a generic and reusable GlideAjax-based client-server interaction in ServiceNow that allows querying any table by passing:

Table name
Key field and value
Desired fields to retrieve

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.

1. Client Script (onChange)
Triggers on field change.
Sends parameters to the Script Include via GlideAjax.
Receives JSON response and sets target field value.

Parameters:
sysparm_table_name: Table to query (e.g., sys_user)
sysparm_key_field: Field to match (e.g., sys_id)
sysparm_key_value: Value to match
sysparm_fields: Comma-separated list of fields to retrieve

2. Script Include: DynamicTableQueryUtil

Processes incoming parameters.
Queries the specified table and retrieves requested fields.
Supports both standard fields and catalog item variables.
Returns a JSON object with field values and display values.
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
function onChange(control, oldValue, newValue, isLoading) {
if (isLoading || newValue === '') {
return;
}

// Define parameters dynamically
var tableName = 'sys_user'; // Change as needed
var keyField = 'sys_id'; // Change as needed
var fieldsToFetch = 'email'; // Comma-separated list
var targetField = 'user'; // Field to populate

var ga = new GlideAjax('DynamicTableQueryUtil');
ga.addParam('sysparm_name', 'getTableRow');
ga.addParam('sysparm_table_name', tableName);
ga.addParam('sysparm_key_field', keyField);
ga.addParam('sysparm_key_value', newValue);
ga.addParam('sysparm_fields', fieldsToFetch);
ga.getXML(function(response) {
var answer = response.responseXML.documentElement.getAttribute("answer");
if (!answer) {
alert('No response from Script Include');
return;
}

var parsedAnswer = JSON.parse(answer);
if (parsedAnswer[fieldsToFetch]) {
g_form.setValue(targetField, parsedAnswer[fieldsToFetch]['fieldVal']);
} else {
alert('error');
}
});
}
Loading