C# Acumatica基于合同的API SalesOrder.Detail在处理I210课程材料时返回null

C# Acumatica基于合同的API SalesOrder.Detail在处理I210课程材料时返回null,c#,acumatica,C#,Acumatica,我正在积极阅读关于基于合同的API的I210课程材料。我正在对最新版本2018 R2进行练习,因此我认为可能存在导致此问题的一些差异 返回问题的第一个示例在示例4.1.2中 当代码到达这一行时 saleorderdetail orderLine=order.Details.Single(… details属性为null,这反过来会引发“未设置为对象实例的对象引用”。异常。 在此之后的许多其他示例也调用SalesOrder.Details,它也返回相同的异常 如果您能为我在2018 R2版本上提供

我正在积极阅读关于基于合同的API的I210课程材料。我正在对最新版本2018 R2进行练习,因此我认为可能存在导致此问题的一些差异

返回问题的第一个示例在示例4.1.2中 当代码到达这一行时
saleorderdetail orderLine=order.Details.Single(…
details属性为null,这反过来会引发“未设置为对象实例的对象引用”。异常。 在此之后的许多其他示例也调用SalesOrder.Details,它也返回相同的异常

如果您能为我在2018 R2版本上提供帮助,为我指明正确的方向,我们将不胜感激。 提前谢谢。 罗伯特


默认情况下不会返回详细信息,这是一种优化,可以更快地检索主控文档。诀窍是使用属性。您还需要在web服务调用中声明详细信息集合

代码:


默认情况下不会返回详细信息,这是一种优化,可以更快地检索主控文档。诀窍是使用属性。您还需要在web服务调用中声明详细信息集合

代码:


我建议检查一下格式,因为它现在是一个相当麻烦的阅读,特别是代码。我编辑了这个问题来格式化代码示例。非常确定它是故意取消缩进的,因为RTF编辑器经常会中断缩进的代码。我建议检查一下格式,因为它现在是一个相当麻烦的阅读,特别是代码我编辑了这个问题以格式化代码示例。我很确定它是故意取消缩进的,因为RTF编辑器经常会打断缩进的代码。非常感谢!!!在我添加了返回行为后,一切都按预期进行了。对于代码格式化,我感到抱歉。这是我的第一个堆栈溢出问题,我不熟悉如何格式化。Don我不介意,我在设置SO格式时也遇到了同样的困难。您可以将我的答案标记为已接受(选中标记)如果解决方案有效。它说我需要收集15个经验点,然后才能标记为已回答。我认为我问这个问题很愚蠢。如果问题得到回答,我应该有发言权。我发现了一些其他问题,但解决了,如果我发布这些问题,可能会帮助其他人。也许这会提高我的经验点。没问题,t他的网站很有用,但有很多愚蠢的规则。@RobertWaite IIRC你需要15个信誉点才能投票,但没有一个信誉点才能接受答案。非常感谢!!!我添加了返回行为后,一切都按预期进行了。很抱歉对代码格式设置感到抱歉。这是我的第一个堆栈溢出问题,我不熟悉如何设置格式。不介意但是,我在设置SO格式时遇到了同样的困难。您可以将我的答案标记为已接受(选中标记)如果解决方案有效。它说我需要收集15个经验点,然后才能标记为已回答。我认为我问这个问题很愚蠢。如果问题得到回答,我应该有发言权。我发现了一些其他问题,但解决了,如果我发布这些问题,可能会帮助其他人。也许这会提高我的经验点。没问题,t他的网站很有用,但有很多愚蠢的规则。@RobertWaite IIRC你需要15个声望点才能投票,但没有一个能接受答案。
// Updating the detail lines of a sales order
public static void UpdateSO(DefaultSoapClient soapClient)
{
    Console.WriteLine("Updating a sales order...");

    //Sales order data
    string orderType = "SO";
    string customerOrder = "SO248-563-06"; 

    // A unique value that
    // identifies a sales order
    string firstItemInventoryID = "CONTABLE1";
    string firstItemWarehouse = "MAIN";
    string secondItemInventoryID = "AALEGO500";
    string secondItemWarehouse = "MAIN";
    decimal secondItemQuantity = 4;

    // Find the sales order to be updated
    SalesOrder soToBeFound = new SalesOrder
    {
        OrderType = new StringSearch { Value = orderType },
        CustomerOrder = new StringSearch { Value = customerOrder },
    };

    SalesOrder order = (SalesOrder)soapClient.Get(soToBeFound);

    // Find the line to be deleted and mark it for deletion
    // The Single method makes the program find
    // the only SalesOrderDetail of order.Details
    // that has the specified InventoryID and WarehouseID
    SalesOrderDetail orderLine = order.Details.Single(orderLineToBeDeleted =>
                                                      orderLineToBeDeleted.InventoryID.Value == firstItemInventoryID &&
                                                      orderLineToBeDeleted.WarehouseID.Value == firstItemWarehouse);
    orderLine.Delete = true;

    // Find the line to be updated and update the quantity in it
    orderLine = order.Details.Single(orderLineToBeUpdated => orderLineToBeUpdated.InventoryID.Value == secondItemInventoryID &&
                                     orderLineToBeUpdated.WarehouseID.Value == secondItemWarehouse);

    orderLine.Quantity = new DecimalValue { Value = secondItemQuantity };

    // Clear the Hold check box
    order.Hold = new BooleanValue { Value = false };

    // Update the sales order
    order = (SalesOrder)soapClient.Put(order);

    // Display the summary of the updated record
    Console.WriteLine("Order type: " + order.OrderType.Value);
    Console.WriteLine("Order number: " + order.OrderNbr.Value);
    Console.WriteLine("Ordered quantity: " + order.OrderedQty.Value);
    Console.WriteLine("Order total: " + order.OrderTotal.Value);
    Console.WriteLine();
    Console.WriteLine("Press any key to continue");
    Console.ReadLine();
}
SalesOrder soToBeFound = new SalesOrder
{
    ReturnBehavior = ReturnBehavior.All,
    OrderType = new StringSearch { Value = orderType },
    CustomerOrder = new StringSearch { Value = customerOrder },
    Details = new SalesOrderDetail[]
    {
        new SalesOrderDetail { ReturnBehavior = ReturnBehavior.All }
    }
};