SuiteScript 2.0 保存的搜索过滤器:添加不在事务中的字段

SuiteScript 2.0 Saved Search Filters: Adding Fields not in the Transaction

我正在尝试 运行 保存的搜索并向其添加过滤器以添加关联记录的字段,但不添加 return 类型的交易。我假设这将是一个连接,但不确定它是如何工作的。搜索是在 Map Reduce 脚本中完成的,它应该执行以下操作:

在交易中查找具有相同名称和不同 class 类型的项目。 Saved 搜索查找仍未结清的 Sales Orders,项目名称和 class 是变量。我在 getInputData 函数中很容易获得该信息,但 运行 遇到添加过滤器的问题。那应该怎么看?我有这个作为代码:

var mySearch = search.load({ id: 'customsearch_so_itemclassid' });
mySearch.filters.push(search.createFilter({ name: 'itemid', join: 'item', operator: 'IS', values: [itemName] }));
mySearch.filters.push(search.createFilter({ name: 'class', join: 'item', operator: 'ISNOT', values: [itemClass] }));

我的过滤器看起来像这样:

var mySearch = search.load({ id: 'customsearch_so_itemclassid' });
mySearch.filters.push(search.createFilter({ name: 'itemid', operator: 'IS', values: [itemName] }));
mySearch.filters.push(search.createFilter({ name: 'class', operator: 'ISNOT', values: [itemClass] }));

任何人都可以指出为什么这不起作用吗?我取出过滤器并完美地搜索 运行s。我在搜索中添加了过滤器和 getInputData 扼流圈。

感谢您的宝贵时间!

我不确定这是否是您的问题,但我发现在某些情况下,当您加载现有搜索时,您无法 "push" 直接到搜索过滤器对象,而需要将其分配给首先是一个临时变量。也许 Rhino 后端有些奇怪。

var mySearch = search.load({ id: 'customsearch_so_itemclassid' });
var filters = mySearch.filters;
filters.push(search.createFilter({ name: 'itemid', operator: 'IS', values: [itemName] }));
filters.push(search.createFilter({ name: 'class', operator: 'ISNOT', values: [itemClass] }));
mySearch.filters = filters;

当然,如果这是 "transaction" 搜索,过滤器应该是 "join"。尝试将第一个筛选字段从 "itemid" 更改为 "name"。像这样:

var mySearch = search.load({ id: 'customsearch_so_itemclassid' });
mySearch.filters.push(search.createFilter({ name: 'name', join: 'item', operator: 'IS', values: [itemName] }));
mySearch.filters.push(search.createFilter({ name: 'class', join: 'item', operator: 'ISNOT', values: [itemClass] }));

我知道这听起来很愚蠢,但请尝试一下。
还有一种不同的方法——您可以使用 filterExpression,而不是过滤器。像这样:

var mySearch = search.load({ id: 'customsearch_so_itemclassid' });
var myAdditionalFilters = [ 'and', ['item.name', 'is', [itemName] ],
                            'and', ['item.class', 'isnot', [itemClass] ]
                          ];
var myNewFilterExpression = mySearch.filterExpression.concat(myAdditionalFilters);
mySearch.filterExpression = myNewFilterExpression;

事实证明,我对保存的搜索如何收集信息以及应用过滤器的方式感到困惑,我的创建方式基本上是一个无限循环。这个想法是在用户更改项目的 class 后搜索销售订单,并将销售订单的行项目更新为新的 class 如果行项目是相同的项目名称和不同的 Class.所以过滤器最终看起来像这样:

 var mySearch = search.load({ id: 'customsearch_so_itemclassid' });
 var filters = mySearch.filters;
 filters.push(search.createFilter({ name: 'name', join: 'item', operator: 'IS', values: [itemName] }));
 filters.push(search.createFilter({ name: 'class', operator: 'NONEOF', values: [itemClass] }));
 mySearch.filters = filters;

至此,搜索成功了。我现在在下面的一个回复中描述了一个新问题。地图函数中的搜索结果如下所示:

{"recordType":null,"id":"1","values":{"GROUP(tranid)":"289092"}}

我似乎无法从该键值对中获取值。我使用 "entity" 并且它是未定义的。我使用 "tranid" 并且它是未定义的。我尝试了几种不同的组合,但无法达到该值。

因为我用上面的过滤器回答了这个问题,所以这确实是一个新问题。但是,如果有人能对此有所启发,我将不胜感激。

你的第二个问题还是分开问比较好。无论如何,在你的情况下,由于搜索中的分组功能,地图阶段的 'tranid' 应该这样访问:

        var searchResult = JSON.parse(context.value);
        var salesOrderId = searchResult.id;
        var tranId = searchResult.values['GROUP(tranid)'];