1

在管理 UI 中,有一个 Tables and Columns 资源管理器,它忠实地显示了一个表的所有可用列,例如事件表:

表列浏览器

我的最终目标是能够查询我可以插入数据的给定表的所有字段(主要以事件和问题表为中心),将其与我拥有的数据进行匹配,然后将带有 PUT 的记录插入到表中. 我遇到的直接问题是,当我按照各种论坛的建议查询 sys_dictionary 时,我只会返回 UI 显示的列的子集。

邮递员查询:

https://{{SNOW_INSTANCE}}.service-now.com/api/now/table/sys_dictionary?sysparm_fields=internal_type,sys_name,name,read_only,max_length,active,mandatory,comments,sys_created_by,element&name={{TableName}}&sysparm_display_value=all

我了解减少的结果集与它们是表中的真实列与指向其他表的链接有关,但我找不到任何描述如何使用 REST api 获取 UI 具有的结果集的文档。

接下来的问题是我找不到带有示例有效负载的示例,其中已为事件表填写了所有标准字段,以便我可以填充与数据一样多的字段。

4

2 回答 2

0

我认为您可以通过创建自己的脚本化 rest api并迭代/检查字段来做到这一点:

(function process(/*RESTAPIRequest*/ request, /*RESTAPIResponse*/ response) {

    var queryParams = request.queryParams; 
    var table = queryParams.table;
    var t = new GlideRecord(table);
    t.initialize();
    var fields = t.getElements(); //or getFields if global scope
    var fieldList = [];

    for (var i = 0; i < fields.length; i++) {
        var glideElement = fields[i]; //or field.get(i) if global scope
        var descriptor = glideElement.getED();

        var fldName = glideElement.getName().toString();
        var fldLabel = descriptor.getLabel().toString();
        var fldType = descriptor.getInternalType().toString();
        var canWrite = glideElement.canWrite();

        if (canWrite){
            fieldList.push({
                name: fldName,
                type: fldType,
                label: fldLabel,
                writable: canWrite
            });
        }       

    }

    return fieldList;


})(request, response);

这应该可以为您省去确定字段继承的麻烦。这是示例输出:

{
  "result": [
    {
      "name": "parent",
      "type": "reference",
      "label": "Parent",
      "writable": true
    },
    {
      "name": "made_sla",
      "type": "boolean",
      "label": "Made SLA",
      "writable": true
    },
    ...
于 2019-07-14T04:36:31.593 回答
0

您没有取回所有列的原因是您正在查询的表继承自另一个表。您需要先检查所有继承关系,找到所有父表,然后查询所有这些表的 sys_dictionary。

在事件表的情况下,需要查询sys_db_object表(所有表的表)才能找到parent,也就是任务表。sys_db_object然后再次查询该表,找到它的parent,它是空的,所以我们有所有相关的表:incidenttask。显然,您可能希望将此代码编写为循环,通过查询列表末尾的表来构建表列表。

获得此列表后,您可以sys_dictionary使用 query: 进行查询sysparm_query=name=incident^ORname=task,它应该返回您的完整列列表。

于 2019-08-23T10:05:20.497 回答