- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
03-11-2025 09:04 AM
Need help identifying why my Catalog CS is not able to get a response from my Script Include (see below):
SI:
var LARFStudentInformation = Class.create();
LARFStudentInformation.prototype = Object.extendsObject(AbstractAjaxProcessor, {
// Client callable function to fetch student data
fetchStudentInfo: function() {
// Get the c_num parameter passed from the client script
var cnum = this.getParameter('c_num'); // Retrieve the c_num passed via GlideAjax
try {
gs.info('Script Include entered with c_num: ' + cnum); // Log entry into the Script Include
if (!cnum) {
gs.error('Error: c_num is required');
return null;
}
var restMessage = new sn_ws.RESTMessageV2();
restMessage.setRestResourceName('DEFAULT');
restMessage.setHttpMethod('GET');
restMessage.setQueryParameter('c_num', cnum);
var response = restMessage.execute();
if (!response) {
gs.error('No response received from REST API for c_num: ' + cnum);
return null;
}
var responseBody = response.getBody();
gs.info('API Response Body for c_num ' + cnum + ': ' + responseBody);
var parsedResponse = JSON.parse(responseBody);
if (!Array.isArray(parsedResponse) || parsedResponse.length === 0) {
gs.error('No student data found for c_num: ' + cnum);
return null;
}
var studentData = parsedResponse[0];
gs.info('Student Data Found: ' + JSON.stringify(studentData));
// Return student data as a JSON string to the client
return JSON.stringify({
pidm: studentData.pidm,
cnumber: studentData.cnumber,
stst_code: studentData.stst_code,
gpa_ind: studentData.gpa_ind,
guest_ind: studentData.guest_ind,
hold_ind: studentData.hold_ind,
hold_codes: studentData.hold_codes
});
} catch (e) {
gs.error('Error fetching student data for c_num: ' + cnum + '. Error: ' + e.message);
return null;
}
}
});
CS:
function onChange(control, oldValue, newValue, isLoading) {
// Exit if the form is still loading
if (isLoading) {
return;
}
// Exit if the c_num field is empty or hasn't changed
if (!newValue || newValue === oldValue) {
return;
}
console.log('onChange triggered. New c_num: ' + newValue); // Log new c_num value
// Call the Script Include function to fetch student information
getStudentInfo(newValue);
}
function getStudentInfo(cnum) {
var ga = new GlideAjax('LARFStudentInformation'); // Name of Script Include must match exactly
ga.addParam('sysparm_name', 'fetchStudentInfo'); // Name of the method to call in the Script Include
ga.addParam('c_num', cnum); // Pass c_num to the Script Include
// Add a callback function to process the response
ga.getXMLAnswer(function(response) {
console.log('GlideAjax response received: ' + response);
// Check if response is valid
if (response) {
var studentInfo = JSON.parse(response);
if (studentInfo) {
g_form.setValue('student_information', JSON.stringify(studentInfo));
} else {
g_form.setValue('student_information', 'No student data found.');
}
} else {
console.error('No response from Script Include for c_num: ' + cnum);
g_form.setValue('student_information', 'Error fetching student data.');
}
});
}
The idea here is there is a field named student_information (string) on the form. When the c_num field changes, the client script should call the Script Include and pass c_num as an http parameter back to the REST API to return the matching string. Maybe there is a better way to do this? We can't use tables to store data, since student data is rather large and contains sensitive information.
Solved! Go to Solution.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
03-11-2025 12:16 PM - edited 03-11-2025 12:17 PM
Hello @appstorm
Please adhere the script include and client script settings shown below:
Here is when I tried with dummy response in my PDI:
Dummy Catalog Item:
Script Include with Glide Ajax Enabled / Client Callable
var LARFStudentInformation = Class.create();
LARFStudentInformation.prototype = Object.extendsObject(AbstractAjaxProcessor, {
// Client callable function to fetch student data
fetchStudentInfo: function() {
// Get the c_num parameter passed from the client script
var cnum = this.getParameter('c_num'); // Retrieve the c_num passed via GlideAjax
try {
gs.info('Script Include entered with c_num: ' + cnum); // Log entry into the Script Include
if (!cnum) {
gs.error('Error: c_num is required');
return null;
}
// var restMessage = new sn_ws.RESTMessageV2();
// restMessage.setRestResourceName('DEFAULT');
// restMessage.setHttpMethod('GET');
// restMessage.setQueryParameter('c_num', cnum);
// var response = restMessage.execute();
//dummy payload
var response = {
getBody: function() {
return JSON.stringify([{
pidm: "12345",
cnumber: "C12345",
stst_code: "VJ",
gpa_ind: "Y",
guest_ind: "N",
hold_ind: "Y",
hold_codes: ["HOLD1", "HOLD2"]
}]);
},
getStatusCode: function() {
return 200;
}
};
if (!response) {
gs.error('No response received from REST API for c_num: ' + cnum);
return null;
}
var responseBody = response.getBody();
gs.info('API Response Body for c_num ' + cnum + ': ' + responseBody);
var parsedResponse = JSON.parse(responseBody);
if (!Array.isArray(parsedResponse) || parsedResponse.length === 0) {
gs.error('No student data found for c_num: ' + cnum);
return null;
}
var studentData = parsedResponse[0];
gs.info('Student Data Found: ' + JSON.stringify(studentData));
// Return student data as a JSON string to the client
return JSON.stringify({
pidm: studentData.pidm,
cnumber: studentData.cnumber,
stst_code: studentData.stst_code,
gpa_ind: studentData.gpa_ind,
guest_ind: studentData.guest_ind,
hold_ind: studentData.hold_ind,
hold_codes: studentData.hold_codes
});
} catch (e) {
gs.error('Error fetching student data for c_num: ' + cnum + '. Error: ' + e.message);
return null;
}
}
});
Catalog Client Script
function onChange(control, oldValue, newValue, isLoading) {
// Exit if the form is still loading
if (isLoading) {
return;
}
// Exit if the c_num field is empty or hasn't changed
if (!newValue || newValue === oldValue) {
return;
}
console.log('onChange triggered. New c_num: ' + newValue); // Log new c_num value
// Call the Script Include function to fetch student information
getStudentInfo(newValue);
}
function getStudentInfo(cnum) {
var ga = new GlideAjax('LARFStudentInformation'); // Name of Script Include must match exactly
ga.addParam('sysparm_name', 'fetchStudentInfo'); // Name of the method to call in the Script Include
ga.addParam('c_num', cnum); // Pass c_num to the Script Include
// Add a callback function to process the response
ga.getXMLAnswer(function(response) {
console.log('GlideAjax response received: ' + response);
// Check if response is valid
if (response) {
try {
var studentInfo = JSON.parse(response);
if (studentInfo) {
//displaying key:value pair formatting
var formattedInfo = '';
for (var key in studentInfo) {
if (studentInfo.hasOwnProperty(key)) {
formattedInfo += key + ': ' + studentInfo[key] + '\n';
}
}
g_form.setValue('student_information', formattedInfo.trim());
} else {
g_form.setValue('student_information', 'No student data found.');
}
} catch (e) {
console.error('Error parsing student information JSON:', e);
g_form.setValue('student_information', 'Error parsing student data.');
}
} else {
console.error('No response from Script Include for c_num: ' + cnum);
g_form.setValue('student_information', 'Error fetching student data.');
}
});
}
Before c_num value change
After c_num value change
Hope it helps!
Hope that helps!
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
03-11-2025 09:51 AM
Your approach is good, and logs should help troubleshoot. Which alerts / messages / logs are you seeing? Is the Script Include in the same scope as the Catalog Item? Are you certain there are no other Script Includes with the same name? Did you add a role to the Access Control when creating the script? Are you testing as an admin?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
03-11-2025 10:03 AM
Thanks Brad! I’m running this at the admin level. The SI uses the snc_internal role. There are no logs being generated from both the error or the information side. The only source of information I have is a console error that generated when the c_num field changes, saying it there is no communication with the Script Include.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
03-11-2025 10:08 AM
That removes a couple of barriers. Scope could still be an issue. If the Catalog Item is in global, the SI should be also, or else you need to include the scope name in the call and make sure it is accessible from all application scopes
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
03-11-2025 10:27 AM
Thanks for the reply! The Catalog Item is in the Universal scope, as well as the Script Include.