Обновление заказа на продажу с помощью AIF

Я бьюсь головой о стену, пытаясь обновить заказ на продажу на С# через AIF (веб-сервисы Dynamics AX)

У меня есть следующий код:

    /// <summary>
    /// Updates an order in AX
    /// </summary>
    /// <param name="order">Order to update</param>
    public void UpdateOrder(SalesOrder order)
    {
        try
        {
            var client = new write.SalesOrderServiceClient();
            var callContext = new write.CallContext() { Company = "mcompany" };
            var entityKeyList = new write.EntityKey[1];
            var entityKey = new write.EntityKey();
            var keyField = new write.KeyField();
            keyField.Field = "SalesId";
            keyField.Value = order.orderCaseId;                
            entityKey.KeyData = new write.KeyField[1] { keyField };
            entityKeyList = new write.EntityKey[1] { entityKey };

            var salesOrder = new write.AxdSalesOrder
            {
                DocPurpose = write.AxdEnum_XMLDocPurpose.Original,
                SalesTable = new write.AxdEntity_SalesTable[1],
            };


            salesOrder.SalesTable[0] = new write.AxdEntity_SalesTable
            {
                PurchOrderFormNum = order.purchaseOrderFormNumber,
                ReceiptDateRequested = order.receiptDateRequested,
                SalesLine =
                    new write.AxdEntity_SalesLine[order.salesOrderLines.Count()],
                _DocumentHash = order.documentHash
            };

            var orderLinesArray = order.salesOrderLines.ToArray();
            for (int i = 0; i < order.salesOrderLines.Count(); i++)
            {
                salesOrder.SalesTable[0].SalesLine[i] = new write.AxdEntity_SalesLine()
                {
                    SalesQty = orderLinesArray[i].quantity,
                    SalesUnit = orderLinesArray[i].unit,
                };
            }

            client.update(callContext, entityKeyList, salesOrder);
        }
        catch (Exception e)
        {
            Logging.AddLogEntry(e.Message);
        }
    }

Данные для обновляемого заказа AX поступают из объекта моей модели SalesOrder, который я пытаюсь сопоставить с объектом AxdSalesOrder для передачи службе.

Я продолжаю получать следующее исключение:

The key field SalesId cannot be updated.

Кто-нибудь знает, что я делаю неправильно здесь? :-)

Заранее спасибо!


person bomortensen    schedule 18.11.2013    source источник


Ответы (2)


Прежде всего предлагаю вам прочитать (на всякий случай, если вы не читали) -> как обновлять записи в AX через AIF "Обновление данных с помощью AIF [AX 2012]"

Основываясь на вашем коде, я предполагаю, что вы делаете «частичное обновление», но вы не указали следующее

//here you need to specify for EACH record what you need, i.e. "create/update/delete"
salesLine.action = AxdEnum_AxdEntityAction.update; 
salesLine.actionSpecified = true;

Тот же подход, показанный выше, применяется к любой записи, которая должна быть частично обновлена. В XML это будет выглядеть так:

<SalesLine class="entity" action="update">

И, скорее всего, вам нужно было бы указать «ClearNilFieldsOnUpdate».

введите здесь описание изображения

person Yuriy    schedule 20.11.2013
comment
Привет, Юрий, большое спасибо за ваш ответ и извините за задержку этого ответа. Часть AX системы была приостановлена ​​​​в течение довольно долгого времени. Я пытался указать действие в каждой строке, но все равно получаю ошибку Ключевое поле SalesId не может быть обновлено :-( - person bomortensen; 27.11.2013

вам нужно указать действие как для строки, так и для заголовка для частичного обновления. лайк за заголовок

salesTable.action = AxdEnum_AxdEntityAction.update; 
salesTable.actionSpecified = true; 

и для линии

salesLine.action = AxdEnum_AxdEntityAction.create; 
salesLine.actionSpecified = true;
person user2346945    schedule 21.02.2014