NetSuite:原生打印时如何为高级PDF/HTML模板添加完整记录?
解决方案:原生打印Advanced PDF/HTML模板时关联父销售订单记录
核心结论
原生打印按钮触发Advanced PDF/HTML Template时,无法直接通过N/render.addRecord()注入完整记录对象,但可以通过User Event脚本结合JSON数据传递的方式实现类似效果,满足直接访问父订单字段、匹配行项目的需求。
1. User Event脚本实现(BeforeLoad事件捕获PRINT动作)
在Item Fulfillment的User Event脚本中,捕获打印动作后加载父销售订单,将所需字段及行项目转为JSON存入自定义页面字段:
/** * @NApiVersion 2.x * @NScriptType UserEventScript */ define(['N/record'], function(record) { function beforeLoad(context) { // 仅处理打印触发的加载事件 if (context.type !== context.UserEventType.PRINT) return; var itemFulfillment = context.newRecord; var soId = itemFulfillment.getValue({ fieldId: 'createdfrom' }); if (!soId) return; // 加载完整销售订单记录 var salesOrder = record.load({ type: record.Type.SALES_ORDER, id: soId, isDynamic: false }); // 构造包含所需字段的订单数据对象 var soData = { memo: salesOrder.getValue({ fieldId: 'memo' }), trandate: salesOrder.getValue({ fieldId: 'trandate' }), items: [] }; // 提取订单行项目数据 var lineCount = salesOrder.getLineCount({ sublistId: 'item' }); for (var i = 0; i < lineCount; i++) { soData.items.push({ itemId: salesOrder.getSublistValue({ sublistId: 'item', fieldId: 'item', line: i }), quantity: salesOrder.getSublistValue({ sublistId: 'item', fieldId: 'quantity', line: i }) }); } // 将JSON数据存入自定义页面字段,供FTL模板访问 context.form.addField({ id: 'custpage_salesorder_data', type: 'textarea', label: 'Sales Order Data' }).defaultValue = JSON.stringify(soData); } return { beforeLoad: beforeLoad }; });
2. Advanced PDF/HTML模板解析并使用数据
在FTL模板中,将JSON字符串解析为对象,即可直接访问订单字段并匹配行项目:
<#-- 解析自定义字段中的JSON数据为对象 --> <#assign salesorder = custpage_salesorder_data?eval> <#-- 访问销售订单表头字段 --> <p>销售订单备注: ${salesorder.memo}</p> <p>订单日期: ${salesorder.trandate?date}</p> <#-- 匹配发货单行与销售订单行 --> <table border="1"> <thead> <tr> <th>商品名称</th> <th>订单数量</th> <th>发货数量</th> </tr> </thead> <tbody> <#list record.item as fulfillItem> <#-- 通过商品ID匹配对应订单行 --> <#assign orderItem = salesorder.items?filter(it -> it.itemId == fulfillItem.item)?first> <tr> <td>${fulfillItem.itemname}</td> <td>${orderItem.quantity?default(0)}</td> <td>${fulfillItem.quantity}</td> </tr> </#list> </tbody> </table>
关键说明
- 原生打印流程无法直接注入完整
record对象到FTL上下文,JSON传递是最优替代方案 - 若需要更多订单字段,只需在User Event脚本中扩展
soData对象的属性即可 - 行项目通过商品ID关联,确保发货单行与订单行精准匹配
内容的提问来源于stack exchange,提问作者Nadav Julius
相关产品推荐
相关产品推荐

