- 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 07:26 AM
everything looks fine.
Check below two:
- Sysids printed in 279, 280, 281 are correct
- Add .toString() at the end of three lines of this.getParameter in script include.
- If still didnt work, try removing the whole encoded query and copy paste the query from your list view for testing purpose and see if it is going inside.
- If it still fails, then something is broken, I would suggest to create a new client script and script include.
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-20-2025 06:25 AM
Thank you, @SumanthDosapati @SumanthDosapati @shantanu_patel8 for all your replays