【问题标题】:Netsuite: How to attach custom fields to sales ordersNetsuite:如何将自定义字段附加到销售订单
【发布时间】:2011-06-08 19:10:39
【问题描述】:

Netsuite 的文档非常缺乏,它们涵盖了基础知识,然后让您尽情探索。任何没有丰富 PHP 知识的人尝试使用他们的 php 工具包都会跪下求饶。

在整个项目的任何时候,都在反复试验,并试图弄清一切,直到一切开始发挥作用。

我很难将自定义字段分配给销售订单,我知道它必须是对象的对象的对象,才能将 xml 分层以便肥皂接管,但是用什么用什么用什么?

我有一些我工作的代码正在到达某个地方,但它抱怨它不是正确的 RecordRef 类型。如果有人使用 Netsuite 并感受到我的痛苦,请在我拔掉所有头发之前将您的知识借给我。

提前致谢。

代码:

$customFields = array('internalId' => 'custbody_new_die_yn','value' => array('name' => 'custbody_new_die_yn','internalId' => 'NO'));
$customObject = new nsComplexObject("SelectCustomFieldRef");
$customObject->setFields($customFields);

$salesOrderFields = array(

    'entity'        => new nsRecordRef(array('internalId' => $userId)),
    'paymentMethod' => array('internalId' => 8),
    'ccNumber'      => 4111111111111111,
    'ccExpireDate'  => date("c", mktime(0,0,0,11,1,2011)),
    'ccName'        => 'Test Testerson',
    'itemList'  => array(
        'item'  => array(
            'item'      => array('internalId' => 5963),
            'quantity'  => 5
        )
    ),
    'department' => new nsRecordRef(array('internalId' => 1)),
    'class' => new nsRecordRef(array('internalId' => 47)),
    'customFieldList' => $customObject
);

【问题讨论】:

  • 我发现我必须使用 Axis 生成的接口在 Java 中对我的所有 Netsuite Web 服务交互进行原型设计,以弄清楚如何正确构建 SOAP 查询。只有在我让它在 Java 中工作之后,我才会尝试将其转换为 PHP 工具包。我尽可能避免使用 netsuite 使用 PHP。

标签: php soap crm netsuite


【解决方案1】:

我不熟悉将 PHP 与 Netsuite 一起使用,但我已经完成了大量的 c#/.net Netsuite 工作。正如 Craig 所说,我发现使用诸如 c#/.net 之类的语言和 Visual Studio 生成的界面来找出 Netsuite SuiteTalk Web 服务 API 中可用的内容要容易得多。

NetSuite 帮助中心提供了大量有关这些内容的文档 - 绝不是您需要的所有内容,而是一个良好的开端。 Netsuite Help Center

查看 SuiteFlex/SuiteTalk(Web 服务)部分,特别是此页面上的 Ids & References。 Using Internal Ids, External Ids, and References

话虽如此,我将尝试帮助提供一个 .net 示例和向销售订单添加自定义字段的说明。

以下是添加不同 CustomFieldRef 的几个示例:

//A list object to store all the customFieldRefs
List<CustomFieldRef> oCustomFieldRefList = new List<CustomFieldRef>();

//List or Record Type reference
SelectCustomFieldRef custbody_XXX_freight_terms = new SelectCustomFieldRef();
custbody_XXX_freight_terms.internalId = "custbody_XXX_freight_terms";
ListOrRecordRef oFreightTermsRecordRef = new ListOrRecordRef();
oFreightTermsRecordRef.internalId = <internalId of specific record in Netsuite>;
//See the References link above for more info on this - trying to figure out typeId caused me a lot of pain.
oFreightTermsRecordRef.typeId = <internalId of the List Record Type in Netsuite>; 
custbody_XXX_freight_terms.value = oFreightTermsRecordRef;
oCustomFieldRefList.Add(custbody_XXX_freight_terms);

//Freeform text sorta field            
StringCustomFieldRef objStringCustomFieldRef = new StringCustomFieldRef();
objStringCustomFieldRef.internalId = "custbody_XXX_tracking_link";
objStringCustomFieldRef.value = "StringValue";
oCustomFieldRefList.Add(objStringCustomFieldRef);

//Checkbox field type
BooleanCustomFieldRef custbody_XXX_if_fulfilled = new BooleanCustomFieldRef();
custbody_XXX_if_fulfilled.internalId = "custbody_XXX_if_fulfilled";
custbody_XXX_if_fulfilled.value = true;
oCustomFieldRefList.Add(custbody_XXX_if_fulfilled);

//By far the most complicated example a multi-select list referencing other records in Netsuite
MultiSelectCustomFieldRef custrecord_XXX_transaction_link = new MultiSelectCustomFieldRef();
//internal id of field you are updating
custrecord_XXX_transaction_link.internalId = "custrecord_XXX_transaction_link";

List<ListOrRecordRef> oListOrRecordRefList = new List<ListOrRecordRef>();

ListOrRecordRef oListOrRecordRefItemFulfillment = new ListOrRecordRef();
oListOrRecordRefItemFulfillment.name = "Item Fulfillment";
oListOrRecordRefItemFulfillment.internalId = <ItemFulfillmentInternalId>;
//Item Fulfillment is record type (Transaction -30) - this is from the above Reference links
oListOrRecordRefItemFulfillment.typeId = "-30";
oListOrRecordRefList.Add(oListOrRecordRefItemFulfillment);

ListOrRecordRef oListOrRecordRefSalesOrder = new ListOrRecordRef();
oListOrRecordRefSalesOrder.name = "Sales Order";
oListOrRecordRefSalesOrder.internalId = <SalesOrderInternalId>;
//Sales Order is record type (Transaction -30) - this is from the above Reference links
oListOrRecordRefSalesOrder.typeId = "-30";
oListOrRecordRefList.Add(oListOrRecordRefSalesOrder);

//Add array of all the ListOrRecordRefs to the MultiSelectCustomFieldRef        
custrecord_XXX_transaction_link.value = oListOrRecordRefList.ToArray();
oCustomFieldRefList.Add(custrecord_XXX_transaction_link);

//And then add all these to the Custom Record List (Array) on the Sales Order Record
objSalesOrder.customFieldList = oCustomFieldRefList.ToArray();

从我在上面的示例中可以看出,我认为您的问题在于 ListOrRecordRef typeId。从您的示例中很难分辨出您引用的是什么 typeId,但如果您能弄清楚这一点并在 SelectCustomFieldRef 上设置 TypeId,我认为这应该可以解决您的问题。

【讨论】:

  • 在我通过 netsuite 用户组发布问题 3-4 天后,我发现了这一点,终于有人解决了。在我被告知 NS 如何只接受它之后,这正是您认为 ListOrRecordRef 是问题的原因,很容易理解为什么 NS 以这种方式接受它。感谢您提供详细信息,有一天有人会搜索此内容并发现此内容很有用,这就是我将其标记为已回答的原因。再次感谢。
  • @Rick,您是否知道是否可以通过编程方式识别 typeID?也就是说,通过知道自定义字段的名称,有没有办法确定当前关联的CustomList?
  • 请注意,对于 StringCustomFieldRef,它实际上应该是 scriptId 属性而不是 internalId。下面是该行现在的样子:objStringCustomFieldRef.scriptId = "custbody_XXX_tracking_link";
【解决方案2】:

自定义字段参考内部 ID 是您尝试更新的记录上的参考 ID。这可以在 Netsuite 中该记录的交易主体字段中找到。

ListOrRecordRef 的内部 ID 是您要附加到前面提到的记录的实际列表项或记录的内部 ID

ListOrRecordRef 的 typeID 是自定义列表/记录的内部 ID。这是前一个内部 ID 的父 ID,与原始记录没有内在联系。

【讨论】:

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