如何使用SuiteScript 2更改销售订单的行项目

时间:2016-05-29 19:25:45

标签: netsuite suitescript

好的,这适用于SuiteScript 1,但由于某些原因我无法使用SuiteScript 2.我缺少什么?

客户端(在更改/在线更改的字段)或服务器端(在提交时),我无法更改销售订单上的行,例如设置自定义字段。

这些都不奏效。要么没有找到该功能,要么没有任何反应。我已经尝试了各种不同的功能和组合来设置文本或值。我似乎没有工作:

1

Rec.setSublistText({
    sublistId : 'item',
    fieldId : 'custcol_example',
    line : i,
    value : "A"
});

2

Rec.selectLine({
    sublistId : 'item',
    line : i
});
Rec.setCurrentSublistText({
    sublistId : 'item',
    fieldId : 'custcol_example',
    value : "A",
    ignoreFieldChange: true
});
Rec.commitLine();

这在SuiteScript 1

中非常有效
function clientFieldChanged(type, name, linenum) {
    var Count = nlapiGetLineItemCount("item");
    for (var i = 1; i <= Count; i++) {
        nlapiSelectLineItem("item", i);
        nlapiSetCurrentLineItemValue("item", "custcol_example", "A", false, false);
        nlapiCommitLineItem("item");
    }
}

根据要求,更完整的SS2示例。不起作用。

function fieldChanged(scriptContext) {
        var Rec = scriptContext.currentRecord;
        var Count = Rec.getLineCount("item");
        for (var i = 0; i < Count; i++) {
            Rec.selectLine({
                sublistId : 'item',
                line : i
            });
            Rec.setCurrentSublistText({
                sublistId : 'item',
                fieldId : 'custcol_example',
                line : i,
                value : "A"
            });
            Rec.commitLine();
        }
}

6 个答案:

答案 0 :(得分:1)

您的代码1中存在轻微错误。

Rec.setSublistText({
    sublistId : 'item',
    fieldId : 'custcol_example',
    line : i,
    value : "A"
});

由于您使用的是setSublistText(),因此您应该使用'text':'A',而不是值。它是这样的:

Rec.setSublistText({
    sublistId : 'item',
    fieldId : 'custcol_example',
    line : i,
    text: "A"
});

希望这有帮助。

答案 1 :(得分:0)

您的代码看起来应该适用于这两种情况。您是否尝试过使用JS控制台,并逐行重复这些脚本?

例如,在Chrome中,开始编辑交易记录,然后点击Ctrl-Shift-I打开开发控制台。在那里,您可以逐行复制和粘贴代码,以交互方式查看每个操作的效果。希望那时,你可以发现出错的地方。

答案 2 :(得分:0)

您能否展示更多代码并解释这是什么类型的脚本?

确保您的索引变量正确; 1.0中的子列表行索引从1开始,而在2.0中,它们从0开始。

要使用selectLine*Current* API,必须以动态模式加载记录。在客户端脚本中,currentRecord应始终处于动态模式,但在其他脚本类型中,您需要以动态模式显式加载记录。在标准模式而不是动态模式下处理记录时,无法找到函数selectLine 错误。

下面是一个只在控制台或调试器中运行的2.0示例。它以动态模式加载销售订单,然后将所有项目行标记为已关闭。请注意itemIndex如何从0开始。

require(["N/record"], function (rec) {
  var salesOrder = rec.load({
    "type": rec.Type.SALES_ORDER,
    "id": 7610,
    "isDynamic": true
  });

  closeOrderDynamic(salesOrder);

  // Utility function that closes the provided Sales Order record
  // order must be in Dynamic mode
  function closeOrderDynamic(order) {
    var itemIndex = 0;
    var itemCount = order.getLineCount({
      "sublistId": "item"
    });

    while (itemIndex < itemCount) {
      order.selectLine({
        "sublistId": "item",
        "line": itemIndex
      });
      order.setCurrentSublistValue({
        "sublistId": "item",
        "fieldId": "isclosed",
        "value": true
      });
      // Must commit the line after we've changed it to save modifications
      order.commitLine({
        "sublistId": "item"
      });
      itemIndex++;
    }
  }
});

答案 3 :(得分:0)

根据您的SS1代码,您应该使用setCurrentSublistValuesetSublistValue

Rec.selectLine({
    sublistId : 'item',
    line : i
});
Rec.setCurrentSublistValue({
    sublistId : 'item',
    fieldId : 'custcol_example',
    value : "A",
    ignoreFieldChange: true
});
Rec.commitLine();

答案 4 :(得分:0)

我在尝试获取联系人的地址记录时遇到了类似的错误。看起来要从子列表子记录中获取数据,您必须使用record.load加载记录,并将其置于动态模式。

我的是AfterSubmit功能,所以它可能无法解决您的问题。希望有所帮助。以下是record.load功能的链接,如果您还没有。

https://netsuite.custhelp.com/app/answers/detail/a_id/45155/kw/record.load

答案 5 :(得分:0)

提交该行后,您需要保存记录。

rec.commitLine();
rec.save();