You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于已有关联限制Reference字段可选值的技术实现求助

问题排查与修正:实现用户关联商品的过滤选择

需求回顾

在NewLinkTbl表单中,选择UserRef字段后,GoodsRef字段仅显示该用户未在LinkTbl中关联过的商品。涉及表结构:

  • UsersTbl:存储用户基础数据
  • GoodsTbl:存储商品基础数据
  • LinkTbl:记录用户与商品的已关联关系
  • NewLinkTbl:用于新建用户-商品关联的业务表

原代码核心问题分析

1. Script Include 查询逻辑完全错误

  • 错误查询了NewLinkedTbl,实际应查询LinkTbl获取用户已关联的商品记录
  • 条件逻辑写反:需要先筛选出用户已关联的商品,再排除这些商品,而非查找其他用户的关联记录
  • 字段查询语法违规:addQuery('NewLinkedTbl.UserRef', '<>' + userRef) 写法错误,GlideRecord查询字段无需带表名,且不能直接拼接参数字符串

2. 数据获取方法错误

  • grAMObj.get_values() 不是ServiceNow合法API,正确获取字段值应使用getValue()或getDisplayValue()

3. 客户端脚本处理错误

  • 用g_form.setValue()设置Reference字段的可选列表是错误操作,需通过clearOptions()清空原有选项后,用addOption()添加过滤后的商品选项
  • 字段名匹配错误:原代码中linked_goods_name并非NewLinkTbl的GoodsRef字段,需替换为实际系统字段名

修正后的代码实现

Client Script(NewLinkTbl的UserRef字段onChange事件)

function onChange(control, oldValue, newValue, isLoading, isTemplate) {
    if (isLoading || newValue === '') {
        // 加载状态或清空用户时,重置商品选项
        g_form.clearOptions('goods_ref');
        return;
    }

    var ga = new GlideAjax('ScriptIncludeJS');
    ga.addParam('sysparam_name', 'getNotLinkedGoods');
    ga.addParam('sysparam_user', newValue);
    ga.getXMLAnswer(DisplayGoods);
}

function DisplayGoods(response) {
    var goodsList = JSON.parse(response);
    var goodsField = 'goods_ref'; // 替换为GoodsRef字段的实际系统名称

    // 清空原有选项并添加默认提示
    g_form.clearOptions(goodsField);
    g_form.addOption(goodsField, '', '-- 选择商品 --');

    // 遍历添加过滤后的商品选项
    goodsList.forEach(function(goods) {
        g_form.addOption(goodsField, goods.goods_id, goods.goods_name);
    });
}

Client Callable类型Script Include(ScriptIncludeJS)

var ScriptIncludeJS = Class.create();
ScriptIncludeJS.prototype = Object.extendsObject(global.AbstractAjaxProcessor, {

    getNotLinkedGoods: function() {
        var userRef = this.getParameter('sysparam_user');
        var linkedGoodsIds = [];
        var goodsResult = [];

        // 第一步:查询当前用户已关联的商品ID集合
        var linkGr = new GlideRecord('link_tbl'); // 替换为LinkTbl的实际系统表名
        linkGr.addQuery('user_ref', userRef);
        linkGr.query();
        while (linkGr.next()) {
            linkedGoodsIds.push(linkGr.getValue('goods_ref'));
        }

        // 第二步:查询未被该用户关联的商品
        var goodsGr = new GlideRecord('goods_tbl'); // 替换为GoodsTbl的实际系统表名
        if (linkedGoodsIds.length > 0) {
            goodsGr.addQuery('sys_id', 'NOT IN', linkedGoodsIds);
        }
        goodsGr.orderBy('goods_name');
        goodsGr.query();

        // 组装返回的商品数据
        while (goodsGr.next()) {
            goodsResult.push({
                goods_id: goodsGr.getValue('sys_id'),
                goods_name: goodsGr.getDisplayValue('goods_name')
            });
        }

        return JSON.stringify(goodsResult);
    },

    type: 'ScriptIncludeJS'
});

注意事项

  1. 替换代码中注释标注的实际系统表名和字段名,需匹配ServiceNow中配置的真实表/字段系统名称
  2. 确保ScriptIncludeJS已设置为Client Callable属性
  3. 测试前确认操作用户拥有对应表的读取权限

内容的提问来源于stack exchange,提问作者gagneet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 21:07:36