【问题标题】:sys_id arrays to is one of not displaying recordssys_id 数组是不显示记录之一
【发布时间】:2017-07-08 21:03:46
【问题描述】:

我正在创建一份报告。在报告条件下,我使用“是其中之一”并通过调用客户端可调用脚本传递 sys_id 数组,包括 javascript:new GetMoreInfoUpdatedChangeTickets().getSysIds();as。我可以将 sys_ids 视为“数据源条件:60a219744fc73200d6940e428110c72b 中的系统 ID”。但是没有显示相应的记录。但是有对应的sys_id记录。

【问题讨论】:

    标签: servicenow


    【解决方案1】:

    我想我在这里看到了问题。不幸的是,客户端可调用脚本通常不是这样工作的。脚本包括,甚至是客户端可调用的,总是在服务器上执行。它们旨在通过来自客户端脚本的异步 GlideAjax 调用来调用。

    有关这方面的更多信息,我鼓励您查看 GlideAjax 上的 this article

    但是,幸运的是,您的实际查询是在服务器上执行的,而不是在客户端上。所以 Script Include is 可能是正确的方法,但您面临的问题是(可能)通过使其成为 GlideAjax 脚本包含,您告诉 ServiceNow 覆盖构造函数(初始化()) 方法,但将其保留为类。


    既然你说你得到了一个 sys_id 返回,那么我描述的可能不是问题,这个解决方案也行不通。但是,我没有足够的信息来给出任何其他答案;因此,如果是这种情况,请运行未显示正确结果的查询,然后右键单击列表顶部的最后一个查询面包屑,然后单击“复制查询”,然后粘贴查询 在此线程的回复中(专门回复我的评论,以便我收到通知),以便我看看。

    显然也请在您的脚本中提供包含的代码,以便我可以帮助您解决问题。


    编辑: 现在,您在回复此评论时添加了代码,我可以看到几个问题。

    您的原件:

    var GetMoreInfoUpdatedChangeTickets = Class.create();
    GetMoreInfoUpdatedChangeTickets.prototype = {
        initialize:   function() {
        }, getSysIds: function getMyGroupMembers() {
            var ga = new GlideRecord('sysapproval_group');
            ga.addQuery('parent.sys_class_name', '=', 'change_request');
            ga.query();
            gs.log("TotalRecords1 Before:: " + ga.getRowCount());
            var sysIdArray = [];
            while (ga.next()) {
                sysIdArray.push(ga.sys_id);
            }
            return sysIdArray;
        }, type:      'GetMoreInfoUpdatedChangeTickets'
    }
    

    以下是我对您的代码所做的所有更改,以及对每个更改的说明:

    首先,在下面代码中的第 5 行,我更改了您的成员函数(又名:“方法”)的声明方式。你有它这样声明: getSysIds: function getMyGroupMembers() {} 所以在这里,你基本上给了它两个名字,并一次以两种方式声明了它。 通常,函数是这样声明的: function functionName(args) {} 然而,在一个对象(或者在这种情况下,一个类——它是一个具有使用“new”关键字返回自身副本的构造函数的对象)内部,我们声明如下函数: functionName: function(args) {}, 正如您在下面的代码中看到的那样,我已经为您进行了调整。

    接下来,在下面的 第 8 行,我从您的 addQuery() 方法调用中删除了多余的“=”运算符,因为“=”在未指定时是隐含的。这不是必需的,但这样看起来更干净。 (我还将您的 GlideRecord 变量从 ga 重命名为 grApprovalGroup,这样更有意义。)

    我已将 sysIdArray 的声明移到函数的顶部,以便与它的执行方式保持一致(并且为了清楚起见)。这也不是必需的,但通常是推荐的。

    第 12 行,在您的原始代码中,如下所示: sysIdArray.push(grApprovalGroup.sys_id); 然而,由于gr.sys_id 是一个对象(类型:“GlideElement” - documentation here),这会将对该对象的引用 推送到数组中。随着该对象的 string value 属性(位置 gr.sys_id 的那个属性发生变化,数组中每个元素的 string value 属性也会发生变化,因为每个element 是对同一对象的引用!有关此的更多信息,请参见文章(我写的)that you can find here。 可以说这不是一个好主意,并且会一遍又一遍地导致相同 sys_id 的列表!为了解决这个问题,我们只需使用最佳实践推荐的“getter”方法(正如我链接的文章所推荐的),如下面代码的第 12 行所示。

    var GetMoreInfoUpdatedChangeTickets = Class.create();
    GetMoreInfoUpdatedChangeTickets.prototype = {
        initialize: function() {
        },
        getSysIds:  function() {
            var sysIdArray = [];
            var grApprovalGroup = new GlideRecord('sysapproval_group');
            grApprovalGroup.addQuery('parent.sys_class_name', 'change_request');
            grApprovalGroup.query();
    
            while (grApprovalGroup.next()) {
                sysIdArray.push(grApprovalGroup.getValue('sys_id'));
            }
            return sysIdArray;
        },
        type:       'GetMoreInfoUpdatedChangeTickets'
    };
    

    最后,我们需要从类中实际提取函数并重命名它,以便脚本包含本身就是函数。

    function GetMoreInfoUpdatedChangeTickets() {
        var sysIdArray = [];
        var grApprovalGroup = new GlideRecord('sysapproval_group');
        grApprovalGroup.addQuery('parent.sys_class_name', 'change_request');
        grApprovalGroup.query();
    
        while (grApprovalGroup.next()) {
            sysIdArray.push(grApprovalGroup.getValue('sys_id'));
        }
        return sysIdArray;
    }
    

    由于您不能在查询 javascript 中使用“new”关键字,因此有必要像这样定义它(没有类),一旦我们完成了,我们可以重新启用“客户端可调用”选项之前已经启用。

    完成此操作后,您应该能够转到以下 URL,并查看正在运行的查询脚本:

    https://YOUR_INSTANCE.service-now.com/sysapproval_group_list.do?sysparm_query=sys_id%3Djavascript%3A%20GetMoreInfoUpdatedChangeTickets()%3B

    【讨论】:

    • 实施您的建议后,我的代码类似于以下: var GetMoreInfoUpdatedChangeTickets= Class.create(); GetMoreInfoUpdatedChangeTickets.prototype = { 初始化:function() { }, getSysIds : function getMyGroupMembers(){ var ga = new GlideRecord('sysapproval_group'); ga.addQuery('parent.sys_class_name', '=', 'change_request'); ga.query(); gs.log("TotalRecords1 Before::" + ga.getRowCount()); var sysIdArray = [];而(ga.next()){ sysIdArray.push(ga.sys_id); } 返回 sysIdArray; },输入:'GetMoreInfoUpdatedChangeTickets' };
    • 在那里,我用更多信息和解决方案更新了我的初始评论。请查看它,如果您需要帮助,请尝试在下次提供所需信息。
    • 转换为数组 grApprovalGroup.getValue('sys_id').toString() 后工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-24
    • 1970-01-01
    • 2018-04-02
    • 2019-06-08
    • 1970-01-01
    相关资源
    最近更新 更多