如何按Memo字段分组NetSuite高级PDF客户对账单并生成分组小计?
NetSuite高级PDF按Memo分组做小计的实现方法
核心逻辑
用FreeMarker的列表循环+变量追踪来实现分组,本质就是先把发票按Memo排序,然后遍历的时候盯着当前Memo,不一样就输出上一组的小计,接着重新累计,最后别忘了输出最后一组的数值。
具体操作步骤
先给发票按Memo排序
模板开头先把发票集合按Memo字段排序,不然分组会混乱:<#assign sortedInvoices = invoices?sort_by("memo")>注意:
invoices是模板里拿到的发票集合变量,你得换成自己模板里的实际变量名,比如有的模板用transactions或者records。初始化追踪变量
循环前先定义两个变量,一个记录当前的Memo,一个存储当前组的累计金额:<#assign currentMemo = ""> <#assign memoSubtotal = 0>循环处理发票+分组算小计
遍历排序后的发票,判断当前发票的Memo和记录的是否一致,不一致就输出上一组的小计,然后重置变量;一致就继续累加金额:<#list sortedInvoices as inv> <#if inv.memo != currentMemo> <#-- 如果不是第一次循环,输出上一组的小计 --> <#if currentMemo != ""> <tr> <td colspan="4" align="right"><strong>${currentMemo} 小计:</strong></td> <td align="right">${memoSubtotal?string.currency}</td> </tr> </#if> <#-- 更新当前Memo,重置小计为当前发票金额 --> <#assign currentMemo = inv.memo> <#assign memoSubtotal = inv.amount> <#-- 可选:输出分组标题,让结构更清晰 --> <tr> <td colspan="5"><strong>备注项: ${currentMemo}</strong></td> </tr> <#else> <#-- 同一Memo,累加金额 --> <#assign memoSubtotal = memoSubtotal + inv.amount> </#if> <#-- 输出当前发票的明细行,这里按你模板的表格结构改字段 --> <tr> <td>${inv.tranid}</td> <td>${inv.trandate?date}</td> <td>${inv.memo}</td> <td>${inv.item}</td> <td>${inv.amount?string.currency}</td> </tr> </#list> <#-- 循环结束后,输出最后一组的小计 --> <#if currentMemo != ""> <tr> <td colspan="4" align="right"><strong>${currentMemo} 小计:</strong></td> <td align="right">${memoSubtotal?string.currency}</td> </tr> </#if>要注意的坑
- 字段名要对应:NetSuite里发票的金额字段可能是
amount、total或者其他,你得根据自己模板里的实际字段调整。 - 处理空Memo:如果有发票没填Memo,要加非空判断,比如
<#if (inv.memo?? && inv.memo != "")>,避免把空字符串当成一个分组。 - 表格样式适配:
colspan要和你模板里的表格列数对应,对齐方式也得和现有格式匹配,不然PDF排版会错乱。
- 字段名要对应:NetSuite里发票的金额字段可能是
验证方法
找几个带不同Memo的测试发票,把代码粘到你的高级PDF模板里,预览一下看看分组和小计是否正确。
内容的提问来源于stack exchange,提问作者beepboop
相关产品推荐
相关产品推荐

