
本文旨在帮助 ServiceNow 开发者解决目录项中引用类型变量的引用限定符不生效的问题。通过本文,你将学习如何利用脚本包含和 GlideRecord,结合 sys_idIN 操作符,动态过滤引用类型变量的选项,使其仅显示与特定条件匹配的值。
问题描述
在 ServiceNow 的目录项中,我们经常需要使用引用类型变量,并根据用户的选择或其他变量的值来动态过滤引用选项。例如,一个 listId 变量引用 service_offer 表,我们希望根据 account 变量的值,只显示与该账户相关的服务项目。虽然配置了引用限定符,但实际效果却是显示了 service_offer 表中的所有值,未能实现动态过滤。
解决方案
解决此问题的关键在于正确使用 sys_idIN 操作符,并确保脚本包含返回的是一个包含有效 sys_id 的字符串。
-
修改引用限定符脚本:
将引用限定符脚本修改为以下格式:
javascript: "sys_idIN" + new OfferingServices().gettingList(current.variables.account);
这里,sys_idIN 操作符会接收一个以逗号分隔的 sys_id 字符串,并只显示 sys_id 在该字符串中的记录。
-
修改脚本包含:
确保脚本包含 OfferingServices 中的 gettingList 函数返回的是一个以逗号分隔的 sys_id 字符串。
var OfferingServices = Class.create(); OfferingServices.prototype = Object.extendsObject(global.AbstractAjaxProcessor, { gettingList: function(value){ var results = []; if(value){ var gr = new GlideRecord('service_offer'); gr.addQuery('account', value); // 直接使用 account 字段,假设它是一个引用类型 gr.query(); while (gr.next()) { results.push(gr.getValue('sys_id')); // 只需 sys_id } } //gs.info('sys_ids ==> '+ results.join(',')); //调试用,可以注释掉 return results.join(','); }, type: 'OfferingServices' });注意:
- 将 gr.addQuery(‘account.sys_id’, value) 修改为 gr.addQuery(‘account’, value)。 假设 account 字段本身就是一个引用类型字段,直接比较 sys_id 更简洁。
- results.push({ name: gr.getValue(‘name’), deviceSolutionID: gr.getValue(‘sol_id’) });修改为results.push(gr.getValue(‘sys_id’)); 只需要返回 sys_id 即可,无需其他字段。
- 将 return JSON.stringify(results); 修改为 return results.join(‘,’);,返回一个以逗号分隔的 sys_id 字符串。
- 确保脚本包含是客户端可调用的(Client Callable)。
- 添加 type: ‘OfferingServices’ 到脚本包含定义中。
示例
假设 service_offer 表中有以下数据:
| sys_id | name | account (sys_id) |
|---|---|---|
| 111111111111111111111111111 | Offer A | 222222222222222222222222222 |
| 333333333333333333333333333 | Offer B | 222222222222222222222222222 |
| 444444444444444444444444444 | Offer C | 555555555555555555555555555 |
当 current.variables.account 的值为 222222222222222222222222222 时,OfferingServices().gettingList(current.variables.account) 将返回字符串 “111111111111111111111111111,333333333333333333333333333”。因此,listId 变量的引用选项将只显示 “Offer A” 和 “Offer B”。
注意事项
- 确保 account 变量的值是有效的 sys_id。
- 如果脚本包含返回的字符串过长,可能会超出 URL 的长度限制。在这种情况下,可以考虑使用 GlideAjax 和服务器端脚本来处理。
- 使用 gs.info() 进行调试时,请确保在生产环境中移除或注释掉这些代码。
总结
通过使用 sys_idIN 操作符和正确编写脚本包含,我们可以轻松地实现 ServiceNow 目录项中引用类型变量的动态过滤,从而提高用户体验和数据准确性。记住,关键在于理解 sys_idIN 的工作原理,并确保脚本包含返回的是一个有效的 sys_id 字符串。


