Netsuite:如何 link 采购订单到销售订单

Netsuite: How to link Purchase Order to Sales Order

我正在尝试自动将 NetSuite 采购订单 link 转换为 NetSuite 销售订单,以下是我尝试完成此任务的代码。但是我遇到了错误(见底部)。你能检查一下并让我知道我在这里遗漏了什么吗?

采购订单创建代码:

var createPurchaseOrder = new PurchaseOrder();

createPurchaseOrder.entity = new RecordRef()
{
internalId = “653”
//type = RecordType.purchaseOrder,
//typeSpecified = true
};

RecordRef soRecordRef = new RecordRef();
soRecordRef.internalId = “XXXXXXXX”;
soRecordRef.type = RecordType.salesOrder;
soRecordRef.typeSpecified = true;

createPurchaseOrder.createdFrom = soRecordRef;

RecordRef depRecordRef = new RecordRef();
depRecordRef.internalId = “3”;
depRecordRef.name = “eBay : eBay FNC”;
depRecordRef.type = RecordType.department;
depRecordRef.typeSpecified = true;

createPurchaseOrder.department = depRecordRef;

PurchaseOrderItem[] Items = new PurchaseOrderItem[1];

Items[0] = new PurchaseOrderItem();
RecordRef item = new RecordRef();
item.type = RecordType.nonInventoryPurchaseItem;
item.typeSpecified = true;
item.internalId = “XXXXX”;
Items[0].item = item;

Items[0].rate = “5”;
Items[0].quantity = 1;
Items[0].quantitySpecified = true;

PurchaseOrderItemList purchaseOrderItemList = new PurchaseOrderItemList();
purchaseOrderItemList.item = Items;
createPurchaseOrder.itemList = purchaseOrderItemList;

WriteResponse response = Service.add(createPurchaseOrder);

我用来更新销售订单中的采购订单编号的代码:

var updateSalesOrder = new SalesOrder();
updateSalesOrder.internalId = “XXXXXXXX”;

SalesOrderItem[] soItems = new SalesOrderItem[1];

var soItem = new SalesOrderItem();

RecordRef roItem = new RecordRef();
roItem.type = RecordType.inventoryItem;
roItem.typeSpecified = true;
roItem.internalId = “XXXXX”;
soItem.item = roItem;

RecordRef prLevel = new RecordRef();
prLevel.type = RecordType.priceLevel;
prLevel.internalId = “-1”;
prLevel.typeSpecified = true;

soItem.price = prLevel;
soItem.rate = “15”;
soItem.quantity = 1;
soItem.quantitySpecified = true;

RecordRef poItem = new RecordRef();
poItem.type = RecordType.purchaseOrder;
poItem.typeSpecified = true;
poItem.internalId = purchaseOrder.internalId;
soItem.createdPo = poItem;

soItems[0] = soItem;

SalesOrderItemList salesOrderItemList = new SalesOrderItemList();
salesOrderItemList.item = soItems;
updateSalesOrder.itemList = salesOrderItemList;

response = Service.update(updateSalesOrder);
if (response.status.isSuccess != true) throw new Exception(response.status.statusDetail[0].message);

但是我得到以下错误: 由于以下原因之一,您无权为元素 createPOSpecified 设置值:1) 该字段是只读的; 2) 相关功能被禁用; 3) 该字段在创建或更新记录时可用,但在这两种情况下都不可用。

注意: createPOSpecified 不显示在 NetSuite 的销售订单屏幕中。当我尝试更新表单中存在的销售订单中的字段时,我能够成功更新它,但我尝试更新的字段 (createPOSpecified) 在此销售表单中不可用。在这种情况下,我该如何更新呢?这也是 link 将采购订单与销售订单合并的更好方法吗?

谢谢, 赫曼特


2020 年 5 月 25 日更新(回复 Anand Rajaram)

  1. 我们正在使用管理员角色创建采购订单并将其link发送到销售订单。具有此角色的用户已由我们的客户提供,我们无权查看屏幕上显示的字段并且已被限制编辑。但是我们可以编辑屏幕上显示的大部分字段。

  2. createPOSpecified 不是自定义字段。它是 SALESORDETITEM class 中的 属性。它不会显示在任何销售订单表格中。

  1. 如果这是创建采购订单并将其link发送到销售订单的正确代码,那么我几乎没有疑问:

    3.1 当我们通过 NetSuite 通过单击销售订单项目网格中的代发货 link 创建采购订单时,我们能够看到标记已发货按钮。

但是当我们通过代码创建采购订单时,它显示接收按钮并且采购订单状态没有变化。

3.2 **createdFrom** field is displaying as below when we create purchase order through netsuite.

当我们通过代码创建采购订单时,此字段不显示。我们提供了 createdFrom 属性 的信息,但不确定为什么不显示

我们假设这是有助于 link 销售订单的字段。我们在创建项目履行和供应商账单时提供了此信息,并且这些信息已正确 link 销售订单,但我们不确定为什么采购订单未 link 销售订单。

  1. 最后关于您提供的以下评论 这基本上是在销售订单表单上有一个自定义交易主体字段,一旦创建了采购订单,就在销售订单字段中更新新创建的采购订单。

我们的销售订单表单中没有任何用于提供采购订单的自定义交易正文字段。但是一旦通过 NetSuite 创建采购订单,采购订单编号将显示在销售订单项目网格中。

所以这一切归结为: 我们在代码中遗漏了什么以及我们必须修复什么才能显示 "Mark Shipped" 按钮,“创建自”标签并link将采购订单转为销售订单。

谢谢, 赫曼特

所以以下可能是您的问题:

  1. 权限问题:你想创建什么角色和link这两个事务?该角色是否具有实现相同目标的适当权限?自定义字段中是否还添加了任何限制条件"createPOSpecified"?

  2. 自定义字段设置:您提到字段 "createPOSpecified" 在销售订单表单中不可用。查看自定义字段定义并查看该字段是否应用于 "Sales"。否则,该字段将不会在所有销售交易表单中可用,您将无法在脚本中更新它。同样在自定义字段设置中,验证该字段是否设置为 "Read Only"。如果是,则将其更改为正常或禁用(如果您不希望用户手动编辑它)。

关于您的最后一个问题,是的,这是在 NetSuite 中自定义 link 销售订单和采购订单交易的合适方式。这基本上是在销售订单表单上有一个自定义交易主体字段,一旦创建了采购订单,就在销售订单字段中更新新创建的采购订单。

我没有答案,但希望我能做出贡献。首先,我认为你是从错误的方向来处理这个问题的。与其创建 PO 然后尝试将其 link 发送到 SO,我认为您必须通过本机 dropship 流程初始化 PO,然后保存 PO。例如,在 SuiteScript 2.0 中创建直运 PO 非常简单。操作方法如下:

var purchaseOrder = record.create ({
    type: record.Type.PURCHASE_ORDER,
    isDynamic: true,
    defaultValues: {
        recordmode: 'dynamic',
        soid: '11111',
        dropship: true, 
        custid: '22222',
        entity: '33333'
    }
})

这个新的 PO 填充了 SO 中的所有有效项目,当它被保存时,所有 linking 都会自动完成(createdFrom 在 PO 上自动设置;createdPo在 SO 项上自动设置)。我尝试使用两种不同的方法在 SuiteTalk 中重新创建它,但都失败了。他们在这里:

第一种方法尝试使用 initialize() 方法模拟 SuiteScript 方法。这就是从 Estimate 创建 SO 或从 SO 创建 IF 的方式,所以看起来很有希望:

var initrec = new InitializeRecord
{
    type = InitializeType.purchaseOrder,
    reference = new InitializeRef
    {
        internalId = "11111",
        type = InitializeRefType.salesOrder,
        typeSpecified = true
    }
};
var res = NSBase.Client.Service.initialize(initrec);
// "You can not initialize purchaseOrder by referencing salesOrder."

错误不言自明。无法使用 initialize() 从 SO 创建 PO。这很令人沮丧。

第二种方法本质上是尝试以编程方式单击行项目上的 "drop ship" link。它失败并出现与您之前遇到的错误类似的错误:

var objSO = new SalesOrder();
objSO.internalId = "11111";
objSO.itemList = new SalesOrderItemList
{
    item = new SalesOrderItem[]
    {
        new SalesOrderItem { line = 10, lineSpecified = true, createPo = SalesOrderItemCreatePo._dropShipment, createPoSpecified = true }
    },
    replaceAll = false
};
var result = Service.update(objSO);
// "You do not have permissions to set a value for element item.createpo due to one of the following reasons: 1) The field is read-only; 2) An associated feature is disabled; 3) The field is available either when a record is created or updated, but not in both cases."

不幸的是,这是我能做的最好的了。初始化方法看起来绝对是最有可能解决问题的方法,它失败的事实让我想知道是否有可能使用 SuiteTalk 创建一个 drop ship/special order PO。

根据@Will Charbonneau 的建议,我们使用 SuiteScript 1.0 测试了以下脚本,它帮助我们link 将采购订单转换为销售订单。

var po = nlapiCreateRecord('purchaseorder', {recordmode:"dynamic", soid:soInternalId,poentity:vendorEntity,vendor:vendorEntity,entity:custEntity});
var id = nlapiSubmitRecord(po, true)

nlapiLogExecution("DEBUG", "DropShip PO Created", "PO=" + id);

谢谢, 赫曼.

作为 Will C. 出色回答的附录,您可以在 suitescript 中使用三个未记录的字段将采购订单行与销售订单行相关联。

这些字段是:

  • createdfrom -- 这应该设置为 salesorder
  • internalid
  • orderdoc -- 这应该设置为 salesorder
  • internalid
  • orderline -- 这应该设置为您想要 link 到采购订单
  • 的销售订单项目的 1 索引行 ID
  • id -- 这应该设置为由 _(下划线)分隔的 orderdocorderline 的串联。

这四个字段允许您将任意采购订单行与销售订单行相关联,即使这些行未通过调用 record.create.

拉入采购订单。