NetSuite中使用Freemarker复制列表并按Package分组的问题咨询
问题根源
- NetSuite 模板上下文中的
record.item默认是子列表哈希类型,你直接将其赋值给mylist作为初始值,mylist初始类型就不是标准列表(Sequence) - 你使用
mylist + item的拼接逻辑不对,Freemarker 中列表拼接元素需要和列表类型合并,直接加单个哈希对象会让返回结果变为哈希类型
修复方案(原去重逻辑)
初始化空列表作为mylist的初始值,拼接时用单元素列表和原列表合并,同时提前初始化cPackage避免首次判断报错:
<#-- 初始化空列表,确保初始类型为Sequence --> <#assign mylist = []> <#-- 初始化cPackage默认值,避免首次判断报变量不存在错误 --> <#assign cPackage = ""> <#list record.item?sort_by("custcolzab_comp_name","custcolzab_ev_supp_plan","item") as item> <#if item.custcol_ev_package != cPackage> <#-- 拼接单元素列表,保证返回值始终为列表类型 --> <#assign mylist = mylist + [item]> </#if> <#assign cPackage = item.custcol_ev_package> </#list>
修复后可以用${mylist?is_sequence}验证类型,返回true即为符合要求的列表类型,正常遍历打印即可:
<#list mylist as item> - ${item.item} | ${item.custcol_ev_package} | ${item.amount} </#list>
更高效的分组实现
如果你核心需求是按Package字段对Item分组,可以直接用Freemarker内置的?group_by函数,无需手动遍历构建列表:
<#-- 排序后直接按Package字段分组,返回的packageGroups是哈希结构,key为Package值,value为对应Item的列表 --> <#assign packageGroups = record.item?sort_by("custcolzab_comp_name","custcolzab_ev_supp_plan","item")?group_by("custcol_ev_package")> <#-- 遍历分组示例 --> <#list packageGroups?keys as packageName> ### 包名:${packageName} <#list packageGroups[packageName] as item> - 商品名:${item.item} | 金额:${item.amount} | 供应商:${item.custcolzab_comp_name} </#list> </#list>
内容的提问来源于stack exchange,提问作者Jim Schweder
相关产品推荐
相关产品推荐

