- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
05-12-2025 11:20 PM
Solved! Go to Solution.

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
05-13-2025 01:14 AM
Try below approach.
- Write an onChange client script on primary contact as below"
function onChange(control, oldValue, newValue, isLoading) { if (isLoading || newValue == '') { return; } // Call GlideAjax to check existing RITMs var ga = new GlideAjax('CheckUserRITMs'); ga.addParam('sysparm_name', 'hasExistingRITM'); ga.addParam('sysparm_user_id', newValue); ga.addParam('sysparm_catalog_item', g_form.getUniqueValue()); // catalog item sys_id ga.getXMLAnswer(function(response) { if (response == 'true') { g_form.showFieldMsg('primary_contact', 'This user has already requested this item.', 'error'); //check field name } else { g_form.hideFieldMsg('primary_contact', true); //check field name } }); }
- Write a New Client callable script include as below
Name: CheckUserRITMs
Accessible from: All application scopes
Client Callable: Truevar CheckUserRITMs = Class.create(); CheckUserRITMs.prototype = Object.extendsObject(AbstractAjaxProcessor, { hasExistingRITM: function() { var userId = this.getParameter('sysparm_user_id'); var catalogItemId = this.getParameter('sysparm_catalog_item'); if (!userId || !catalogItemId) { return 'false'; } var ritmGR = new GlideRecord('sc_req_item'); ritmGR.addQuery('cat_item', catalogItemId); ritmGR.addQuery('u_primary_contact', userId); // replace with actual field name if different ritmGR.query(); if (ritmGR.hasNext()) { return 'true'; } return 'false'; } });
This will show an error message at the field level and also user cannot submit even if they click the order button.
Accept the solution and mark as helpful if it does, to benefit future readers.
Regards,
Sumanth
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
05-13-2025 06:47 AM
it seems script include is not getting called and hence the 3 parameters are coming as empty
a) account variable refers to which table?
b) the onChange is running on which table? that variable refers to which table?
Client Script:
1) pass the catalog item sysId as hard-coded value
function onChange(control, oldValue, newValue, isLoading) {
if (isLoading || newValue == '') {
return;
}
if (g_user.hasRole('agent_workspace_user')) {
alert('welcome');
var ga = new GlideAjax('BT_CSR_SSR_CatalogUtils');
ga.addParam('sysparm_name', 'hasExistingRITM');
ga.addParam('sysparm_user_id', newValue);
ga.addParam('sysparm_account', g_form.getValue('account'));
ga.addParam('sysparm_catalog_item', 'catalogItemSysId'); // catalog item sys_id
ga.getXMLAnswer(function(response) {
alert(response);
if (response == 'true') {
alert(true);
g_form.showFieldMsg('contact_name', 'This user has already requested this item.', 'error'); //check field name
} else {
alert(false);
g_form.showFieldMsg('contact_name', 'This user has already nottttt requested this item.', 'error'); //check field name
}
});
}
}
Script Include: it should be client callable
1) pass the correct sysparm name
var BT_CSR_SSR_CatalogUtils = Class.create();
BT_CSR_SSR_CatalogUtils.prototype = Object.extendsObject(AbstractAjaxProcessor, {
hasExistingRITM: function() {
var checkingRITM;
var userId = this.getParameter('sysparm_user_id');
var catalogItemId = this.getParameter('sysparm_catalog_item');
var userAccount = this.getParameter('sysparm_account');
gs.info('agentIsh279 ' + userId);
gs.info('agentIsh280 ' + catalogItemId);
gs.info('agentIsh281 ' + userAccount);
var ritmGR = new GlideRecord('sc_req_item');
ritmGR.addEncodedQuery('cat_item.sys_id=' + catalogItemId + '^company.sys_id=' + userAccount + '^requested_for.sys_id=' + userId);
ritmGR.setLimit(1);
ritmGR.query();
gs.info('agentIsh292 ' + ritmGR.getRowCount());
return ritmGR.hasNext().toString();
},
type: 'BT_CSR_SSR_CatalogUtils'
});
If my response helped please mark it correct and close the thread so that it benefits future readers.
Ankur
✨ Certified Technical Architect || ✨ 9x ServiceNow MVP || ✨ ServiceNow Community Leader

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
05-13-2025 05:52 AM
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
05-13-2025 06:38 AM
@SumanthDosapati it is not coming up
ritm_record is there, then also it is returning false, instead it should true
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
05-13-2025 06:47 AM
it seems script include is not getting called and hence the 3 parameters are coming as empty
a) account variable refers to which table?
b) the onChange is running on which table? that variable refers to which table?
Client Script:
1) pass the catalog item sysId as hard-coded value
function onChange(control, oldValue, newValue, isLoading) {
if (isLoading || newValue == '') {
return;
}
if (g_user.hasRole('agent_workspace_user')) {
alert('welcome');
var ga = new GlideAjax('BT_CSR_SSR_CatalogUtils');
ga.addParam('sysparm_name', 'hasExistingRITM');
ga.addParam('sysparm_user_id', newValue);
ga.addParam('sysparm_account', g_form.getValue('account'));
ga.addParam('sysparm_catalog_item', 'catalogItemSysId'); // catalog item sys_id
ga.getXMLAnswer(function(response) {
alert(response);
if (response == 'true') {
alert(true);
g_form.showFieldMsg('contact_name', 'This user has already requested this item.', 'error'); //check field name
} else {
alert(false);
g_form.showFieldMsg('contact_name', 'This user has already nottttt requested this item.', 'error'); //check field name
}
});
}
}
Script Include: it should be client callable
1) pass the correct sysparm name
var BT_CSR_SSR_CatalogUtils = Class.create();
BT_CSR_SSR_CatalogUtils.prototype = Object.extendsObject(AbstractAjaxProcessor, {
hasExistingRITM: function() {
var checkingRITM;
var userId = this.getParameter('sysparm_user_id');
var catalogItemId = this.getParameter('sysparm_catalog_item');
var userAccount = this.getParameter('sysparm_account');
gs.info('agentIsh279 ' + userId);
gs.info('agentIsh280 ' + catalogItemId);
gs.info('agentIsh281 ' + userAccount);
var ritmGR = new GlideRecord('sc_req_item');
ritmGR.addEncodedQuery('cat_item.sys_id=' + catalogItemId + '^company.sys_id=' + userAccount + '^requested_for.sys_id=' + userId);
ritmGR.setLimit(1);
ritmGR.query();
gs.info('agentIsh292 ' + ritmGR.getRowCount());
return ritmGR.hasNext().toString();
},
type: 'BT_CSR_SSR_CatalogUtils'
});
If my response helped please mark it correct and close the thread so that it benefits future readers.
Ankur
✨ Certified Technical Architect || ✨ 9x ServiceNow MVP || ✨ ServiceNow Community Leader
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
05-13-2025 07:07 AM
@Ankur Bawiskar Now values of account, cat_item, account are coming up in the logs and even in the catalog script I have changed the sysparm name's in the client script also.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
05-13-2025 07:14 AM
you didn't provide answers to my earlier question
what debugging did you do next?
a) account variable refers to which table?
b) the onChange is running on which table? that variable refers to which table?
If my response helped please mark it correct and close the thread so that it benefits future readers.
Ankur
✨ Certified Technical Architect || ✨ 9x ServiceNow MVP || ✨ ServiceNow Community Leader