1

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

在事务中查找具有相同名称和不同类别类型的项目。已保存的搜索查找仍处于打开状态的销售订单,并且项目名称和类别是变量。我在 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] }));

谁能指出为什么这不起作用?我取出过滤器,搜索运行完美。我在搜索中添加了过滤器和 getInputData 阻塞。

感谢您的时间!

4

4 回答 4

1

当然,如果这是“交易”搜索,过滤器应该是“加入”。尝试将第一个过滤字段从“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;
于 2017-08-12T20:14:39.940 回答
1

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

 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;

有了这个,搜索工作。我现在在下面的一个回复中描述了一个新问题。map 函数中的 searchResults 如下所示:

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

我似乎无法从该键值对中获取值。我使用“实体”,它是未定义的。我使用“tranid”,它是未定义的。我已经尝试了几种不同的组合,但我无法达到那个值。

由于我用上述过滤器回答了这个问题,这确实是一个新问题。但如果有人能对此有所了解,我将不胜感激。

于 2017-08-14T18:33:57.473 回答
1

最好单独提出第二个问题。无论如何,在您的情况下,由于搜索中的分组功能,应该像这样访问地图阶段的“tranid”:

        var searchResult = JSON.parse(context.value);
        var salesOrderId = searchResult.id;
        var tranId = searchResult.values['GROUP(tranid)'];
于 2017-08-15T04:47:28.460 回答
0

我不确定这是否是您的问题,但我发现在某些情况下,当您加载现有搜索时,您无法直接“推送”到搜索过滤器对象,需要先将其分配给临时变量。也许在 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;
于 2017-08-10T23:39:03.770 回答