【问题标题】:Netsuite: How to link Purchase Order to Sales OrderNetsuite:如何将采购订单链接到销售订单
【发布时间】:2020-09-08 05:25:00
【问题描述】:

我正在尝试自动将 NetSuite 采购订单链接到 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 ) 在此销售表单中不可用。在这种情况下,我该如何更新?这也是将采购订单与销售订单联系起来的更好方法吗?

谢谢, 赫曼特。


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

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

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

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

    3.1 当我们通过 NetSuite 通过单击销售订单项目网格中的 dropship 链接创建采购订单时,我们可以看到 Mark Shipped 按钮。

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

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

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

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

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

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

所以这一切归结为:我们在代码中遗漏了什么以及我们必须修复什么以显示“标记已发货”按钮、“创建自”标签和链接采购订单到销售订单。

谢谢, 赫曼特。

【问题讨论】:

    标签: c# netsuite suitetalk


    【解决方案1】:

    我没有答案,但希望我能做出贡献。首先,我认为你从错误的方向接近这个。我认为您必须通过本机 dropship 流程初始化 PO,然后保存 PO,而不是创建 PO 然后尝试将其链接到 SO。例如,在 SuiteScript 2.0 中创建一个 dropship 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 的所有有效项目,当它被保存时,所有链接都会自动完成(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。这很令人沮丧。

    第二种方法实质上是尝试以编程方式点击订单项上的“直接发货”链接。它失败并出现与您之前遇到的类似的错误:

    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 创建直接发货/特殊订单 PO。

    【讨论】:

    • 感谢 Will,您对使用 SuiteScript 的建议帮助我们找到了解决方案。我们使用 SuiteScript 1.0 来实现这一点。由于评论区不允许使用格式化文本,因此我将脚本更新为我自己的答案,但我已授予您赏金。
    【解决方案2】:

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

    这些字段是:

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

    这四个字段允许您将任意采购订单行与销售订单行相关联,即使这些行并未从对record.create 的调用中拉入采购订单。

    【讨论】:

      【解决方案3】:

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

      1. 权限问题:您尝试创建和链接两个事务的角色是什么?该角色是否具有适当的权限来实现相同的目标?自定义字段“createPOSpecified”中是否添加了任何限制?

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

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

      【讨论】:

      • Anand Rajaram,我在底部的主帖中更新了我的反馈,标题为 2020 年 5 月 25 日更新(回应 Anand Rajaram)。请查看并让我知道我缺少什么
      【解决方案4】:

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

      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);
      

      谢谢, 赫曼特。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多