sys_id数组是不显示记录

时间:2017-07-08 21:03:47

标签: servicenow

我正在制作一份报告。在我使用的报告条件中,'是'之一。并通过调用客户端可调用脚本传递sys_id数组包括javascript:new GetMoreInfoUpdatedChangeTickets()。getSysIds(); as。我可以看到sys_ids为"数据源条件:60a219744fc73200d6940e428110c72b"中的系统ID。但相应的记录没有显示出来。但是可以使用相应的sys_id记录。

1 个答案:

答案 0 :(得分:3)

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

有关此问题的更多信息,建议您查看GlideAjax上的this article

但是,幸运的是,您的实际查询在服务器上执行,而不是在客户端上执行。因此,脚本包含 可能是正确的方法,但您面临的问题(可能)是通过使其成为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行,我已经改变了你的成员函数(又名:“method”)的声明方式。你有这样声明: getSysIds: function getMyGroupMembers() {} 所以在这里,你基本上给它两个名字并一次用两种方式宣告它。 通常,函数声明如下: function functionName(args) {} 但是,在一个对象内部(或者在这种情况下,一个Class - 它是一个带有使用“new”关键字返回自身副本的构造函数的对象),我们声明这样的函数: functionName: function(args) {}, 正如您在下面的代码中看到的那样,我已经为您做了调整。

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

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

原始代码中的

第12行,如下所示: sysIdArray.push(grApprovalGroup.sys_id); 但是,由于gr.sys_id对象(类型:“GlideElement” - documentation here),因此将引用推送到该对象的数组中。由于该对象的字符串值属性(位置gr.sys_id上的属性发生更改,数组中每个元素的字符串值属性也是如此,因为每个元素都是同一个对象的引用!有关此内容的更多信息,请参阅文章(我写的)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”关键字,所以有必要像这样定义它(没有类),一旦我们完成了,我们可以重新启用“client callable”选项你先前启用了。

完成后,您应该可以转到以下网址,并查看您的查询脚本:

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

相关问题