Netsuite:如何将采购订单链接到销售订单

时间:2020-05-21 14:34:46

标签: c# netsuite suitetalk

我正在尝试自动将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)该字段在创建或更新记录时可用,但在两种情况下都不可用。

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

谢谢, 赫曼特。


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

  1. 我们使用ADMINISTRATOR角色创建采购订单并将其链接到销售订单。我们的客户已为具有此角色的用户提供了一个用户,我们无权查看屏幕上显示的字段,并且该字段的编辑权限受到限制。但是我们可以编辑屏幕上显示的大多数字段。

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

enter image description here

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

    3.1当我们通过单击销售订单项目网格中的Dropship链接通过NetSuite创建采购订单时,我们可以看到“标记为已发货”按钮。

enter image description here

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

enter image description here

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

enter image description here

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

enter image description here

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

  1. 最后对您提供的以下评论 “销售订单”表单上基本上有一个自定义交易正文字段,一旦创建了采购订单,请在“销售订单”字段中更新新创建的采购订单。

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

enter image description here

所有这些归结为:我们在代码中遗漏了什么,我们必须修复什么才能显示“标记已发货”按钮,“创建自”标签并链接采购订单到销售订单。

谢谢, 赫曼特。

4 个答案:

答案 0 :(得分:1)

我没有答案,但希望我能有所作为。首先,我认为您正在从错误的方向进行操作。我认为您不必创建PO并尝试将其链接到SO,而是必须通过本机Dropship流程初始化PO,然后保存PO。例如,在SuiteScript 2.0中,创建直接运送订单非常容易。这是完成的方式:

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

此新PO填充了SO中的所有有效项,并且保存后所有链接都自动完成(在PO上自动设置createdFrom;在SO项上自动设置createdPo )。我尝试使用两种不同的方法在SuiteTalk中重新创建此方法,但两种方法均失败。他们在这里:

第一种方法尝试使用initialize()方法来模拟SuiteScript方法。这是您从估算创建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。

答案 1 :(得分:1)

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

这些字段是:

  • createdfrom -- 这应该设置为 internalid
  • salesorder
  • orderdoc -- 这应该设置为 internalid
  • salesorder
  • orderline -- 这应该设置为要链接到采购订单的销售订单项目的 1-indexed line id
  • id -- 这应该设置为由 orderdoc(下划线)分隔的 orderline_ 的串联。

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

答案 2 :(得分:0)

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

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

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

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

答案 3 :(得分:0)

根据@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);

谢谢, 赫曼特。