NetSuite Advanced PDF模板通过销售订单多选字段过滤商品表求助
错误原因
你遇到的报错是误用了NetSuite Advanced PDF模板的专用#LIST指令导致的:NetSuite提供的大写开头#LIST指令仅支持遍历事务行、联系人子列表这类系统内置的子列表对象,无法用来遍历多选字段返回的普通文本/ID数组,这就是你保留高亮代码时报错、移除后功能正常的核心原因。
最优解决方案:无需双层循环,直接用包含判断
你原本的逻辑要实现「只输出匹配多选字段选中值的商品行」,不需要额外嵌套遍历多选字段的数组,直接在商品行循环中加入Freemarker内置的contains判断即可,还能避免双层循环导致的同个商品匹配多个选中值时重复输出的问题:
<!-- 遍历销售订单商品行 --> <#list record.item as line> <!-- 替换为你实际的多选字段ID、商品对应匹配字段ID --> <#if record.custbody_selected_filter_values?contains(line.item.custitem_match_field_id)> <!-- 输出匹配的商品行内容 --> <tr> <td>${line.item}</td> <td>${line.quantity}</td> <td>${line.amount}</td> </tr> </#if> </#list>
若确实需要遍历多选字段数组的正确写法
如果你的业务场景必须要遍历多选字段的每个选中值(比如按选中值分组展示商品),请使用Freemarker原生的小写开头list指令,不要用NetSuite的专用#LIST指令:
<!-- 遍历多选字段的选中值,用Freemarker原生语法 --> <#list record.custbody_selected_filter_values as selected_val> <h3>${selected_val}</h3> <table> <#list record.item as line> <#if line.item.custitem_match_field_id == selected_val> <tr> <td>${line.item}</td> <td>${line.quantity}</td> </tr> </#if> </#list> </table> </#list>
注意事项
- 多选字段默认返回的是选项内部ID数组,如果你要匹配的商品字段是选项文本值,需要先把多选字段的返回值转换为文本数组,或者调整匹配逻辑为内部ID对比,避免匹配失效
- 双层循环会带来额外的性能开销,如果商品行数量较多优先选择单循环加包含判断的方案
内容的提问来源于stack exchange,提问作者Arif WB
相关产品推荐
相关产品推荐

