NetSuite执行Saved Search的<#list>时如何正确分组记录及报错排查
报错根因
你遇到的错误核心是record变量不存在于当前FTL模板的上下文环境中:调用宏时传入的record.result参数里,顶层的record变量没有被正确赋值,NetSuite Saved Search的结果集默认不会以record作为顶层变量名。
修复方案
第一步:确认结果集变量名
先确认你传入模板的Saved Search结果集对应的变量名:
- 如果是SuiteScript调用FTL模板,通常你跑搜索拿到的结果集会命名为
searchResults,需要提前将这个变量注入模板上下文 - 如果是Advanced PDF/HTML模板直接绑定Saved Search,默认结果集变量名为
results
第二步:修正宏代码(适配空值判断)
<#macro listGroups results groupField> <#if (results?? && results?size > 0)> <#local sortedResults = results?sort_by(groupField)![]> <#local groupStart = 0> <#local lastResult = sortedResults[0]> <#list sortedResults as result> <#if !result?is_first && result[groupField]!'' != lastResult[groupField]!''> <#local groupEnd = result?index> <#nested lastResult[groupField]!'未分类', sortedResults[groupStart ..< groupEnd]![]> <#local groupStart = groupEnd> </#if> <#local lastResult = result> </#list> <#-- 输出最后一个分组 --> <#local groupEnd = sortedResults?size> <#nested lastResult[groupField]!'未分类', sortedResults[groupStart ..< groupEnd]![]> </#if> </#macro>
第三步:修正宏调用代码
注意分组字段不需要加result.前缀,直接和Saved Search结果列的ID保持一致即可,示例中按商品类别分组,字段ID为class:
<@listGroups searchResults "class"; groupName, groupResults> <p>${groupName}</p> <table border="1" cellpadding="5" cellspacing="0"> <tr> <th>商品ID</th> <th>销售描述</th> <th>供应商</th> <th>采购成本</th> </tr> <#list groupResults as groupResult> <tr> <td>${groupResult.itemid!'-'}</td> <td>${groupResult.salesdescription!'-'}</td> <td>${groupResult.othervendor!'-'}</td> <td>${groupResult.vendorcost!0}</td> </tr> </#list> </table> </@listGroups>
注意事项
- 分组字段名需要和你Saved Search结果列的ID完全匹配,如果是自定义字段请填写完整ID,例如
custitem_custom_group_field - 所有字段取值都添加了
!默认值的空值容错逻辑,避免NetSuite字段为空时直接抛出渲染异常 - 如果搜索结果超过1000条,需要在SuiteScript侧先完成全量结果的拉取合并,再传入模板
内容的提问来源于stack exchange,提问作者Vishaun
相关产品推荐
相关产品推荐

