From d05ad62502a079eaa377fba63e24be19b87c87e0 Mon Sep 17 00:00:00 2001 From: bharakm Date: Mon, 20 Oct 2025 09:56:58 -0500 Subject: [PATCH 1/3] Create Readme.md --- .../Readme.md | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 Client-Side Components/Catalog Client Script/Reusable GlideAjax Client Script/Readme.md diff --git a/Client-Side Components/Catalog Client Script/Reusable GlideAjax Client Script/Readme.md b/Client-Side Components/Catalog Client Script/Reusable GlideAjax Client Script/Readme.md new file mode 100644 index 0000000000..9815575f4b --- /dev/null +++ b/Client-Side Components/Catalog Client Script/Reusable GlideAjax Client Script/Readme.md @@ -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. From d5f7734dadcecb51b1e979ea4d3b1e84f2b66344 Mon Sep 17 00:00:00 2001 From: bharakm Date: Mon, 20 Oct 2025 09:57:45 -0500 Subject: [PATCH 2/3] Create DynamicTableQueryUtil.js --- .../DynamicTableQueryUtil.js | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 Client-Side Components/Catalog Client Script/Reusable GlideAjax Client Script/DynamicTableQueryUtil.js diff --git a/Client-Side Components/Catalog Client Script/Reusable GlideAjax Client Script/DynamicTableQueryUtil.js b/Client-Side Components/Catalog Client Script/Reusable GlideAjax Client Script/DynamicTableQueryUtil.js new file mode 100644 index 0000000000..689c1812af --- /dev/null +++ b/Client-Side Components/Catalog Client Script/Reusable GlideAjax Client Script/DynamicTableQueryUtil.js @@ -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); + } +}); From b10fae5da0ed924d4fe4c140df0dea2c0de0f535 Mon Sep 17 00:00:00 2001 From: bharakm Date: Mon, 20 Oct 2025 09:58:52 -0500 Subject: [PATCH 3/3] Create clientscript.js --- .../clientscript.js | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 Client-Side Components/Catalog Client Script/Reusable GlideAjax Client Script/clientscript.js diff --git a/Client-Side Components/Catalog Client Script/Reusable GlideAjax Client Script/clientscript.js b/Client-Side Components/Catalog Client Script/Reusable GlideAjax Client Script/clientscript.js new file mode 100644 index 0000000000..a4e2bc8a1a --- /dev/null +++ b/Client-Side Components/Catalog Client Script/Reusable GlideAjax Client Script/clientscript.js @@ -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'); + } + }); +}