Acumatica Contract Based API SalesOrder.Detail возвращает ноль при работе с материалом курса I210 - PullRequest
0 голосов
/ 04 октября 2018

Я активно прорабатываю материалы курса I210 по контрактному API.Я выполняю упражнения на самой последней версии 2018 R2, поэтому я предполагаю, что могут быть некоторые различия, которые могут быть причиной этой проблемы.

Первый пример, который возвращает проблему, приведен в Пример 4.1.2 Когда код достигает этой строки SalesOrderDetail orderLine = order.Details.Single(... Свойство details имеет значение null, что, в свою очередь, вызывает «Ссылку на объект, не установленную для экземпляра объекта».исключение.Многие другие примеры после этого также вызывают SalesOrder.Details, который также возвращает то же исключение.

Любая помощь, указывающая мне правильное направление при работе над версией 2018 R2, будет принята с благодарностью.Заранее спасибо.Роберт

// 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();
}

1 Ответ

0 голосов
/ 04 октября 2018

По умолчанию детали не возвращаются, это оптимизация для быстрого получения главного документа.Хитрость в том, чтобы использовать свойство ReturnBehavior .Вам также необходимо объявить коллекцию Details в вызове веб-службы.

Код:

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 }
    }
};
...