我正在尝试运行已保存的搜索并为其添加一个过滤器,用于添加关联记录中的字段,但不会返回事务的返回类型。我假设这将是一个连接,但不完全确定这是如何工作的。搜索在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] }));
有人能指出为什么这不起作用?我拿出过滤器,搜索运行完美。我在搜索中添加了filter和getInputData choke。
感谢您的时间!
答案 0 :(得分: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;
答案 1 :(得分: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”,它是未定义的。我尝试了几种不同的组合,但我无法达到这个价值。
由于我用上述过滤器回答了这个问题,这确实是一个新问题。但如果有人能对此有所了解,我将非常感激。
答案 2 :(得分:1)
最好将你的第二个问题分开。无论如何,在你的情况下,由于搜索中的分组功能,地图阶段的'tranid'应该像这样访问:
var searchResult = JSON.parse(context.value);
var salesOrderId = searchResult.id;
var tranId = searchResult.values['GROUP(tranid)'];
答案 3 :(得分: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;