You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 18:35:36