SuiteScript 2.0 保存的搜索过滤器:添加不在事务中的字段
Posted
技术标签:
【中文标题】SuiteScript 2.0 保存的搜索过滤器:添加不在事务中的字段【英文标题】:SuiteScript 2.0 Saved Search Filters: Adding Fields not in the Transaction 【发布时间】:2017-08-10 18:15:03 【问题描述】:我正在尝试运行已保存的搜索并向其中添加过滤器,以添加关联记录中的字段,但不添加交易的返回类型。我假设这将是一个连接,但不确定它是如何工作的。搜索是在 Map Reduce 脚本中完成的,它应该执行以下操作:
在事务中查找具有相同名称和不同类类型的项目。 Saved 搜索查找仍处于打开状态的销售订单,并且项目名称和类别是变量。我在 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 阻塞。
感谢您的宝贵时间!
【问题讨论】:
【参考方案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;
【讨论】:
感谢您的建议。我今天会试一试,看看会发生什么。 这些都不起作用,但我认为它缩小了我相信是有原因的。我终于在日志中得到了这个:“Stage: getInputData failed "type":"error.SuiteScriptError","name":"SSS_INVALID_SRCH_OPERATOR","message":"An nlobjSearchFilter contains an invalid operator, or is not in proper syntax : class."" 所以看起来 Class 没有被正确解释。在您建议的两种情况下,我都尝试了 value 和 text 两种方式都失败了。无论如何感谢您的意见! 尝试“startswith”而不是“is” 看来我误解了保存的搜索如何返回信息。我删除了 item.class 并且只将 class 作为参数并且它可以工作。所以我不必在类参数上创建 JOIN。我仍在完善它,但我会尽快发布我的解决方案。 我确实误解了保存的搜索的工作方式以及过滤器是如何添加到搜索中的。我不必创建与类字段的连接,因此搜索现在可以工作。我现在必须弄清楚如何从返回的信息中获取值。这就是我得到的: "recordType":null,"id":"1","values":"GROUP(tranid)":"289092" 我尝试了几种方法来访问该值,但我似乎无法得到它。有什么想法吗?【参考方案2】:事实证明,我对保存的搜索如何收集信息以及如何应用过滤器(基本上是一个无限循环)感到困惑。这个想法是在用户更改项目的类后搜索销售订单,并将销售订单的行项目更新为新的类,如果行项目是相同的项目名称和不同的类。所以过滤器最终看起来像这样:
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”,它是未定义的。我尝试了几种不同的组合,但我无法达到那个值。
由于我使用上述过滤器回答了这个问题,这确实是一个新问题。但如果有人能对此有所了解,我将不胜感激。
【讨论】:
【参考方案3】:最好单独提出第二个问题。无论如何,在您的情况下,由于搜索中的分组功能,应该像这样访问地图阶段的“tranid”:
var searchResult = JSON.parse(context.value);
var salesOrderId = searchResult.id;
var tranId = searchResult.values['GROUP(tranid)'];
【讨论】:
@Finnster:即使您(还)不能投票赞成答案,但您至少可以将它们标记为已接受。只需单击帖子左侧的灰色复选标记即可。请注意,您只能将一个答案标记为已接受。【参考方案4】:我不确定这是否是您的问题,但我发现在某些情况下,当您加载现有搜索时,您无法直接“推送”到搜索过滤器对象,需要先将其分配给临时变量.也许 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;
【讨论】:
过滤器位于另一种交易类型上,而不是我在保存的搜索中搜索的交易类型。这些过滤器应该是联接吗? 好吧,那也没用。我很感激帮助。谢谢!以上是关于SuiteScript 2.0 保存的搜索过滤器:添加不在事务中的字段的主要内容,如果未能解决你的问题,请参考以下文章
设置子列表字段值时的 NetSuite SuiteScript 2.0 invalid_fld_value