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

NetSuite ClientScript问题:销售订单首行商品加载异常

NetSuite脚本问题求助:销售订单首行商品履行时被排除

我是NetSuite开发新手,开发了一个按钮触发的脚本,用来读取库存转移单信息并转换为销售订单。目前大部分功能正常,但遇到一个问题:生成的销售订单首行商品未正确加载,执行履行操作时该商品会被系统排除。

相关截图情况:

  • 库存转移单包含7个商品行
  • 脚本生成的销售订单显示7个商品行
  • 履行单仅包含6个商品,首行商品被排除

以下是填充商品行的代码片段:

var itSearch = search.create({
           type: "inventorytransfer",
           filters:
           [
              ["type","anyof","InvTrnfr"], 
              "AND", 
              ["internalid","anyof",it.id], 
              "AND", 
              ["mainline","is","F"], 
              "AND", 
              ["location","anyof",it.getValue('transferlocation')]
           ],
           columns:
           [
              search.createColumn({name: "item", label: "Item"}),
              search.createColumn({name: "quantity", label: "Quantity"}),
              search.createColumn({
                 name: "formulanumeric",
                 formula: "0",
                 label: "Rate"
              }),
              search.createColumn({name: "unit", label: "Units"}),
              search.createColumn({name: "location", label: "Location"}),
              search.createColumn({
                 name: "class",
                 formula: it.getValue('class'),
                 label: "Class"
              }),
              search.createColumn({name: "custcol_kx_revenue_start_date", label: "Kx Revenue Start Date"}),
              search.createColumn({name: "custcol_kx_revenue_end_date", label: "Kx Revenue End Date"}),
              search.createColumn({name: "custcol_celigo_sfio_order_id", label: "Salesforce Order Line Id (IO)"}),
              search.createColumn({name: "custcol_celigo_sfio_sf_id", label: "Salesforce Opportunity Line Id (IO)"}),
              search.createColumn({name: "custcol1", label: "Purchase order"})
           ]
        });
         
         var sResult = itSearch.run();
         var resultRange = sResult.getRange({
           start: 0,
           end: 100
         });
         var sLines = resultRange.length;
     

for (var i=0 ; i<sLines ; i++){
              so.selectNewLine({sublistId:'item'});
              so.setCurrentSublistValue({
                      sublistId:'item',
                      fieldId:'item',
                      value:resultRange[i].getValue({name: 'item'}),
                      ignoreFieldChange: true,
                      forceSyncSourcing: true
              });
              so.setCurrentSublistValue({
                      sublistId:'item',
                      fieldId:'quantity',
                      value:resultRange[i].getValue({name: 'quantity'}),
                      ignoreFieldChange: true,
                      forceSyncSourcing: true
              });
              so.setCurrentSublistValue({
                      sublistId:'item',
                      fieldId:'rate',
                      value:'0',
                      ignoreFieldChange: true,
                      forceSyncSourcing: true
              });
              so.setCurrentSublistValue({
                      sublistId:'item',
                      fieldId:'amount',
                      value:'0',
                      ignoreFieldChange: true,
                      forceSyncSourcing: true
              });
              so.setCurrentSublistValue({
                      sublistId:'item',
                      fieldId:'price',
                      value:null,
                      ignoreFieldChange: true,
                      forceSyncSourcing: true
              });
              so.setCurrentSublistValue({
                      sublistId:'item',
                      fieldId:'class',
                      value:resultRange[i].getValue({name: 'class'}),
                      ignoreFieldChange: true,
                      forceSyncSourcing: true
              });
              so.setCurrentSublistValue({
                      sublistId:'item',
                      fieldId:'location',
                      value:resultRange[i].getValue({name: 'location'}),
                      ignoreFieldChange: true,
                      forceSyncSourcing: true
              });
              so.setCurrentSublistValue({
                      sublistId:'item',
                      fieldId:'units',
                      value:resultRange[i].getValue({name: 'units'}),
                      ignoreFieldChange: true,
                      forceSyncSourcing: true
              });
              so.setCurrentSublistValue({
                      sublistId:'item',
                      fieldId:'custcol_kx_revenue_start_date',
                      value:resultRange[i].getValue({name: 'custcol_kx_revenue_start_date'}),
                      ignoreFieldChange: true,
                      forceSyncSourcing: true
              });
              so.setCurrentSublistValue({
                      sublistId:'item',
                      fieldId:'custcol_kx_revenue_end_date',
                      value:resultRange[i].getValue({name: 'custcol_kx_revenue_end_date'}),
                      ignoreFieldChange: true,
                      forceSyncSourcing: true
              });
              so.setCurrentSublistValue({
                      sublistId:'item',
                      fieldId:'custcol_celigo_sfio_order_id',
                      value:resultRange[i].getValue({name: 'custcol_celigo_sfio_order_id'}),
                      ignoreFieldChange: true,
                      forceSyncSourcing: true
              });
              so.setCurrentSublistValue({
                      sublistId:'item',
                      fieldId:'custcol_celigo_sfio_sf_id',
                      value:resultRange[i].getValue({name: 'custcol_celigo_sfio_sf_id'}),
                      ignoreFieldChange: true,
                      forceSyncSourcing: true
              });
              so.setCurrentSublistValue({
                      sublistId:'item',
                      fieldId:'custcol1',
                      value:resultRange[i].getValue({name: 'custcol1'}),
                      ignoreFieldChange: true,
                      forceSyncSourcing: true
              });
              so.setCurrentSublistValue({
                      sublistId:'item',
                      fieldId:'line.cseg_paactivitycode',
                      value:resultRange[i].getValue({name: 'line.cseg_paactivitycode'}),
                      ignoreFieldChange: true,
                      forceSyncSourcing: true
              });

              so.commitLine({sublistId:'item'});
   //             so.selectNewLine({sublistId:'item'});
           }
                
          /*SAVE*/
          var idso = so.save({ignoreMandatoryFields: true});

问题原因分析

  1. 搜索列缺失关键字段:代码中最后给line.cseg_paactivitycode赋值,但搜索的columns里没有包含这个字段,导致首行该字段值为空或无效,触发系统验证逻辑,履行时被排除。
  2. 自动计算字段手动赋值冲突:手动设置amount为0,而amount是NetSuite自动计算的字段(rate*quantity),强制赋值可能干扰系统对行项目的有效性判断。
  3. 字段同步参数过度使用:所有字段设置都用了forceSyncSourcing: true,可能导致字段同步逻辑混乱,首行的商品状态、库存可用性等依赖字段没有正确加载。
  4. 字段设置顺序不合理:设置item后立刻批量设置其他字段,没有给系统足够时间同步item的相关属性(如可履行状态),导致首行数据未被正确初始化。

解决方案

  1. 补充搜索列缺失字段:在itSearch的columns数组中添加cseg_paactivitycode字段:
    search.createColumn({name: "cseg_paactivitycode", label: "Activity Code"})
    
  2. 移除自动计算字段的手动赋值:删除设置amount的代码行,让系统自动计算该字段值。
  3. 调整字段同步参数与顺序:
    • 仅在设置item时使用forceSyncSourcing: true,其他字段设置改为forceSyncSourcing: false,避免过度同步。
    • 调整字段设置顺序:先设置item,等待同步后再设置quantity、rate,最后设置自定义字段和分类字段。
      示例调整后的代码片段:
    so.selectNewLine({sublistId:'item'});
    // 设置item并强制同步
    so.setCurrentSublistValue({
            sublistId:'item',
            fieldId:'item',
            value:resultRange[i].getValue({name: 'item'}),
            ignoreFieldChange: false,
            forceSyncSourcing: true
    });
    // 其他字段设置无需强制同步
    so.setCurrentSublistValue({
            sublistId:'item',
            fieldId:'quantity',
            value:resultRange[i].getValue({name: 'quantity'}),
            ignoreFieldChange: true,
            forceSyncSourcing: false
    });
    so.setCurrentSublistValue({
            sublistId:'item',
            fieldId:'rate',
            value:'0',
            ignoreFieldChange: true,
            forceSyncSourcing: false
    });
    // 移除amount设置行
    so.setCurrentSublistValue({
            sublistId:'item',
            fieldId:'price',
            value:null,
            ignoreFieldChange: true,
            forceSyncSourcing: false
    });
    // 后续其他字段设置同理,forceSyncSourcing改为false
    
  4. 添加行项目有效性验证:在commitLine前,检查item和quantity是否有效,避免无效行被提交:
    var itemId = resultRange[i].getValue({name: 'item'});
    var qty = parseInt(resultRange[i].getValue({name: 'quantity'}), 10);
    if (!itemId || isNaN(qty) || qty <= 0) {
        so.cancelLine({sublistId:'item'});
        continue;
    }
    
  5. 检查销售订单表单配置:确认使用的销售订单表单中,首行的必填字段都已被脚本正确赋值,没有遗漏必填项导致行项目未被正确保存。

内容的提问来源于stack exchange,提问作者UE33

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 15:51:32