Линия продаж уже существует. Поля и значения идентификации: Тип документа='',Номер документа='',Номер строки=''

При создании нового заказа на продажу с использованием веб-сервисов Dynamic NAV SOAP возникает ошибка ниже при попытке создать несколько позиций. Информация о заказе с одной позицией успешно добавлена.

Ошибка: строка продаж уже существует. Идентификационные поля и значения: Тип документа='Заказ',Номер документа='1111',Номер строки='10000'

Вот мой код, который я пробовал:

$client  = new SoapClient($soapWsdl, $options);
    
    // Create order header
    $create = new stdClass();
    $sq = new stdClass();  

    $sq->OrderType = "Order";
    $sq->OrderId = "1111";
     $create->SalesOrderWS = $sq;
    $result = $client->create($create);
    
    
    $key = $result->SalesOrderWS->Key;
    
    $update = new stdClass();
    $sq->Key = $key;
    $sq->CustomerID = "9999";
    
    
    $salesLineList = new stdClass();

     $salesLine = new stdClass();
    $salesLine->Order_Type = 'Order';
    $salesLine->OrderID = '1111';
    $salesLine->LineType = 'Item';
    $salesLine->OrderLineNo = '10000';
    $salesLineList->Sales_Order_Lines_WS[0] = $salesLine;
    $sq->SalesOrderLinesWS = $salesLineList;
    
    $salesLine = new stdClass();
    $salesLine->Order_Type = 'Order';
    $salesLine->OrderID = '1111';
    $salesLine->LineType = 'Item';
    $salesLine->OrderLineNo = '20000';
    $salesLineList->Sales_Order_Lines_WS[1] = $salesLine;
    $sq->SalesOrderLinesWS = $salesLineList;
    
    
    $update->SalesOrderWS = $sq;
    $result = $client->Update($update);

Конечно, что-то здесь упущено, но проблему выявить не удалось.

Спасибо.


person Newbie    schedule 31.07.2020    source источник
comment
Проверьте ответ Edds (объяснение)... 1. решение состоит в том, чтобы увеличить номер строки в вашем коде для каждой новой строки, 2. решение состоит в том, чтобы увеличить номер строки на странице NAV внутри события OnInsert...   -  person lanicor    schedule 01.08.2020
comment
Вам следует попробовать отладить сеанс веб-службы. Где-то должна быть ошибка.   -  person Mak Sim    schedule 01.08.2020
comment
@MakSim Я рассмотрел подробное исключение, которое выдает веб-сервис, и получил аналогичную информацию об ошибке, упомянутой в вопросе. Не получая никакого намека на это. Можете ли вы пролить свет на другой способ, как я могу отладить это?   -  person Newbie    schedule 01.08.2020
comment
Ну, вы можете попробовать опубликовать журнал ошибок с трассировкой стека здесь. Что касается отладчика, это зависит от вашей версии Nav. Если он больше 2009 года, то это так же просто, как открыть отладчик (список сеансов) и нажать действие Debug next. Если это 2009 год, вам нужна Visual Studio для отладки.   -  person Mak Sim    schedule 01.08.2020
comment
@MakSim спасибо за информацию. Я выполняю операции, используя веб-сервис NAV SOAP через PHP. У меня не установлено приложение NAV. Я разрабатываю для своего клиента. Есть ли способ отладить это дальше, используя сам веб-сервис?   -  person Newbie    schedule 02.08.2020
comment
Неа. Вы пробовали создавать линии одну за другой?   -  person Mak Sim    schedule 02.08.2020
comment
да, в этом случае единственная первая строка добавляется правильно, и при попытке нажать вторую строку она показывает мне - строки продаж уже существуют с той же ошибкой, которая упоминалась в вопросе. Потратив почти 3-4 дня на это, но пока не нашли решения.   -  person Newbie    schedule 03.08.2020


Ответы (2)


в NAV таблица Sales Line имеет первичный ключ, состоящий из 3 полей:

  • тип документа
  • Документ №.
  • Строка №

Система не будет принимать дубликаты, а приведенные выше комбинации должны быть уникальными. Номер строки — это произвольное целое число, делающее номера строк уникальными, и может содержать любое число. Однако по соглашению номера строк обычно задаются с шагом 10000, т. е. первая строка — 10000, вторая строка — 20000 и т. д.

Я не эксперт по PHP (на самом деле я почти ничего не знаю), но я не вижу в приведенном выше коде, как вы устанавливаете номер строки, когда пишете строки продаж. Таким образом, вставка первой строки будет работать, но следующие строки приведут к дублированию. Я бы предложил, чтобы в рамках написания строки продаж вы включали уникальный номер строки для каждой строки, которую вы пишете, тогда все будет работать нормально. Эдд

person Edd    schedule 31.07.2020
comment
На самом деле, я также пытался добавить номер строки добавочным способом, но это давало мне ту же ошибку, а затем я удалил, поскольку NAV вставляет этот номер по умолчанию. Я обновил свой вопрос, включая параметр «Номер строки», но ошибка осталась прежней. Любое предложение, пожалуйста? - person Newbie; 01.08.2020

Я не эксперт по PHP, но я считаю, что эта строка кода на самом деле вызывает веб-службу, которая создает строки:

$sq->SalesOrderLinesWS = $salesLineList;

В первый раз $salesLineList содержит один элемент с OrderLineNo = 10000. Второй раз $salesLineList содержит два элемента — один с OrderLineNo = 10000 и один с OrderLineNo = 20000.

Это означает, что второй вызов попытается вставить строку 10000, что невозможно, поскольку она уже существует.

Поэтому я предлагаю вам удалить первый вызов и сохранить второй:

$salesLine = new stdClass();
$salesLine->Order_Type = 'Order';
$salesLine->OrderID = '1111';
$salesLine->LineType = 'Item';
$salesLine->OrderLineNo = '10000';
$salesLineList->Sales_Order_Lines_WS[0] = $salesLine;

$salesLine = new stdClass();
$salesLine->Order_Type = 'Order';
$salesLine->OrderID = '1111';
$salesLine->LineType = 'Item';
$salesLine->OrderLineNo = '20000';
$salesLineList->Sales_Order_Lines_WS[1] = $salesLine;

$sq->SalesOrderLinesWS = $salesLineList;
person kaspermoerch    schedule 26.05.2021