Консолидируйте и выставляйте счета по нескольким заказам на покупку. х ++ топор 2012

У меня есть проект интеграции, в котором мне нужно размещать заказы на покупку в x ++. У меня уже есть работающая разноска счетов-фактур по заказу на покупку, просматривая ЗП. заполнение vendInvoiceInfoTable, vendInvoiceInfoSubTable, vendInvoiceInfoLine и vendInvoiceInfoSubLine.

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

            purchFormLetterInvoice = PurchFormLetter_Invoice::newFromSavedInvoice(vendInvoiceInfoTable);
            purchFormLetterInvoice.showQueryForm(false);
            purchFormLetterInvoice.specQty(PurchUpdate::PackingSlip);
            purchFormLetterInvoice.update(vendInvoiceInfoTable, vendInvoiceInfoTable.Num, systemdateget());

Проблема в том, что я хочу добавить в счет несколько заказов на покупку. Я могу добавить строки в счет-фактуру поставщика по коду, и когда я смотрю на интерфейс, он отображается как «несколько» для заказа на покупку и квитанций продукта на передней панели. Я также добавляю справочную таблицу, добавляя приведенный ниже код. Я обычно добавляю этот фрагмент дважды, если у меня есть 2 заказа на покупку, я просто заменяю OriginPurchID.

           vendInvoiceInfoSubTable.clear();
           vendInvoiceInfoSubTable.initValue();
           vendInvoiceInfoSubTable.defaultRow();

           vendInvoiceInfoSubTable.OrigPurchId = "PO-XXX";
           vendInvoiceInfoSubTable.TableRefId = vendInvoiceInfoTable.TableRefId;
           vendInvoiceInfoSubTable.PurchName = purchTable.PurchName;
           vendInvoiceInfoSubTable.insert();

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

 if (vendInvoiceInfoSubTable.SourceAccountingEvent != localAccountingEvent.RecId)
    {
        vendInvoiceInfoTable.ErrorInvalidDistribution = NoYes::Yes;
        throw error("@SYS326999");
    }

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

Даже если я принудительно ввожу следующий «идентификатор события» в vendInvoiceInfoSubTable.SourceAccountingEvent, он терпит неудачу после слов в другом методе. Мне нечего попробовать. Но я считаю, что некоторые ссылки или, возможно, другой способ публикации могут быть решением, но я не уверен. Любая помощь будет оценена, спасибо.

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

Вот большая часть кода при удалении личной информации ..

           purchTable = purchTable::find(poNum);

    vendInvoiceInfoTable.clear();
        vendInvoiceInfoTable.initValue();

        vendInvoiceInfoTable.initFromPurchTable(purchTable);

        vendInvoiceInfoTable.OrderAccount= purchtable.OrderAccount;
        vendInvoiceInfoTable.InvoiceAccount= purchTable.InvoiceAccount;


        vendInvoiceInfoTable.Approved = NoYes::Yes;
        vendInvoiceInfoTable.DocumentOrigin  = DocumentOrigin::Manual;
        vendInvoiceInfoTable.CurrencyCode = purchTable.CurrencyCode;
        vendInvoiceInfoTable.DocumentDate=invoiceDate;
        vendInvoiceInfoTable.Description=invoiceHeader.get_Description();
        vendInvoiceInfoTable.DeliveryName = purchTable.DeliveryName;
        vendInvoiceInfoTable.PurchName = purchTable.PurchName;
        vendInvoiceInfoTable.BatchAdministration = NoYes::Yes;
        vendInvoiceInfoTable.ParmJobStatus = ParmJobStatus::Waiting;
        vendInvoiceInfoTable.FixedDueDate = purchTable.FixedDueDate;
        vendInvoiceInfoTable.LastMatchVariance = LastMatchVarianceOptions::OK;
        vendInvoiceInfoTable.TransDate = systemDateGet();
        vendInvoiceInfoTable.VendInvoiceSaveStatus = VendInvoiceSaveStatus::Pending;
        vendInvoiceInfoTable.Num=InvoiceNum;
        vendInvoiceInfoTable.InventSiteId=purchtable.InventSiteId;



        vendInvoiceInfoTable.defaultField(fieldNum(VendInvoiceInfoTable,RemittanceLocation),null,purchTable);
        vendInvoiceInfoTable.defaultField(fieldNum(VendInvoiceInfoTable,FixedDueDate),null,purchTable);
        vendInvoiceInfoTable.defaultField(fieldNum(VendInvoiceInfoTable,ExchRate),null,purchTable);
        vendInvoiceInfoTable.defaultField(fieldNum(VendInvoiceInfoTable,TransDate),null,purchTable);
        vendInvoiceInfoTable.defaultField(fieldNum(VendInvoiceInfoTable,PaymMode),null,purchTable);
        vendInvoiceInfoTable.defaultField(fieldNum(VendInvoiceInfoTable,PaymSpec),null,purchTable);

         vendInvoiceInfoTable.insert();

     if(vendInvoiceInfoTable)
          {


           vendInvoiceInfoSubTable.clear();
           vendInvoiceInfoSubTable.initValue();
           vendInvoiceInfoSubTable.defaultRow();

           vendInvoiceInfoSubTable.ParmId = vendInvoiceInfoTable.ParmId;
           vendInvoiceInfoSubTable.OrigPurchId = "po-number1";
           vendInvoiceInfoSubTable.TableRefId = vendInvoiceInfoTable.TableRefId;
           vendInvoiceInfoSubTable.PurchName = purchTable.PurchName;
           vendInvoiceInfoSubTable.insert();



           vendInvoiceInfoSubTable.clear();
           vendInvoiceInfoSubTable.initValue();
           vendInvoiceInfoSubTable.defaultRow();

           vendInvoiceInfoSubTable.ParmId = vendInvoiceInfoTable.ParmId;

           vendInvoiceInfoSubTable.OrigPurchId = "po-number2";
           vendInvoiceInfoSubTable.TableRefId = vendInvoiceInfoTable.TableRefId;
          vendInvoiceInfoSubTable.PurchName = purchTable.PurchName;
            vendInvoiceInfoSubTable.insert();

         //vendInvoiceInfoTable.selectForUpdate(true);
       // vendInvoiceInfoTable.SourceDocumentHeader = 0;
       // vendInvoiceInfoTable.SourceDocumentLine = 0;
       // vendInvoiceInfoTable.doUpdate();
          //  sourceDocumentProcessorFacade::submitSourceDocumentImplementation(vendInvoiceInfoTable,1);

 }

  //next part will loop through and create all the lines

   while(enumerator.MoveNext())
    {
    vendInvoiceInfoLine.clear();
    vendInvoiceInfoLine.initValue();
    vendInvoiceInfoLine.initFromPurchLine(purchLine);

    vendInvoiceInfoLine.DeliveryName = vendInvoiceInfoTable.DeliveryName;
    vendInvoiceInfoLine.ParmId = vendInvoiceInfoTable.ParmId;

    vendInvoiceInfoLine.TableRefId = vendInvoiceInfoTable.TableRefId;
    vendInvoiceInfoLine.currencyCode = vendInvoiceInfoTable.CurrencyCode;

    vendInvoiceInfoLine.InvoiceAccount = vendInvoiceInfoTable.InvoiceAccount;
    vendInvoiceInfoLine.InventDimId = purchLine.InventDimId;
    vendInvoiceInfoLine.OrderAccount  = vendInvoiceInfoTable.OrderAccount;
    vendInvoiceInfoLine.InventTransId = purchLine.InventTransId;
    vendInvoiceInfoLine.PurchPrice=purchLine.PurchPrice;
    vendInvoiceInfoLine.InventNow = calculatedQty;
    vendInvoiceInfoLine.ReceiveNow = calculatedQty;
    vendInvoiceInfoLine.RemainBefore = calculatedQty;
    vendInvoiceInfoLine.RemainBeforeInvent = calculatedQty;
    vendInvoiceInfoLine.DefaultDimension = purchLine.DefaultDimension;
    vendInvoiceInfoLine.LineAmount = amt;
    vendInvoiceInfoLine.insert();


   while select * from vendPackingSlipTrans
                                                         where vendPackingSlipTrans.OrigPurchid==purchLine.PurchId
                                                            && vendPackingSlipTrans.InventTransId==purchLine.InventTransId
                                                {
                                                vendInvoiceInfoSubLine.clear();
                                                vendInvoiceInfoSubLine.initValue();
                                                vendInvoiceInfoSubLine.defaultRow();
                                                vendInvoiceInfoSubLine.ParmId = vendInvoiceInfoTable.ParmId;
                                                vendInvoiceInfoSubLine.LineRefRecId = vendInvoiceInfoLine.RecId;
                                                vendInvoiceInfoSubLine.ReceiveNow = vendPackingSlipTrans.Qty;
                                                vendInvoiceInfoSubLine.InventNow = vendPackingSlipTrans.Qty;
                                                vendInvoiceInfoSubLine.JournalRefRecId = vendPackingSlipTrans.RecId;
                                                vendInvoiceInfoSubLine.JournalRefTableId = vendPackingSlipTrans.TableId;
                                                vendInvoiceInfoSubLine.DocumentId = vendPackingSlipTrans.PackingSlipId;
                                                vendInvoiceInfoSubLine.insert();



                                                }

}

            purchFormLetterInvoice = PurchFormLetter_Invoice::newFromSavedInvoice(vendInvoiceInfoTable);
            purchFormLetterInvoice.showQueryForm(false);
            purchFormLetterInvoice.specQty(PurchUpdate::PackingSlip);
            purchFormLetterInvoice.update(vendInvoiceInfoTable, vendInvoiceInfoTable.Num, systemdateget());

person Sirus    schedule 07.02.2020    source источник


Ответы (1)


Какое значение имеет vendInvoiceInfoSubTable.SourceAccountingEvent? Это 0?

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

Возможно, вам понадобится использовать следующую строку:

SourceDocumentProcessorFacade::submitSourceDocumentLineImplementation(...);

Раньше был отличный блог о Source Document Framework, но он исчез. Вы все еще можете найти его на обратном пути здесь:

https://web.archive.org/web/20150323025403/http://blogs.msdn.com/b/ax_gfm_framework_team_blog/archive/2012/04/26/exnding-the-source-document-framework.aspx

Если ваша проблема не связана с платформой исходного документа, этот ответ мало поможет.

person Alex Kwitny    schedule 08.02.2020
comment
Да, это 0 для подтаблицы дополнительного заказа на поставку при отладке. Первая подтаблица имеет действительное исходное событие учета, а вторая - 0 и не выполняется. Не совсем уверен, что это такое. - person Sirus; 09.02.2020
comment
Я смотрел SourceDocumentProcessorFacade :: submitSourceDocumentLineImplementation (vendInvoiceInfoLine, 1); Кажется, ничего не работает, и я все еще получаю ту же ошибку, не совсем уверен, что я сделал, чтобы исправить. - person Sirus; 10.02.2020
comment
@Sirus - установите там точку останова (возможно, вам придется выключить CIL) и опубликуйте счета вручную. У меня нет всего вашего кода, поэтому у меня нет полной картины, но я думаю, что ваша проблема связана с этой структурой. Вам может понадобиться упаковочный лист, дополнительная таблица и т. Д., Я не уверен, без реальной отладки. Если вы можете опубликовать весь свой код в более повторяемом стиле работы, это будет легче понять. Однако в сети должны быть всевозможные коды для выставления счетов. - person Alex Kwitny; 10.02.2020
comment
Я отредактировал свое первоначальное сообщение, добавив больше кода ... в Интернете нет большого количества кода, который действительно работает для объединения нескольких POS в счете-фактуре - person Sirus; 10.02.2020
comment
Есть ли причина, по которой вы используете этот метод? Вы напрямую заполняете базовые таблицы, а затем пытаетесь протолкнуть их через процесс выставления счетов, что означает, что вы должны получить все правильно для успешной публикации. Вы пробовали метод TmpFrmVirtual? Dynamicsuser.net/ax/f/developers/ 87761 /. - person Alex Kwitny; 10.02.2020
comment
На самом деле этот маленький фрагмент кода все исправил. localAccountingEvent = AccountingEvent :: getLastEvent (PurchTable :: find (vendInvoiceInfoSubTable.OrigPurchId) .SourceDocumentHeader); vendInvoiceInfoSubTable.SourceAccountingEvent = localAccountingEvent.RecId; vendInvoiceInfoSubTable.update (); Это заполненное событие исходной учетной записи для моей второй подтаблицы, которая по какой-то причине никогда не использовала этот метод в базовом коде для заполнения. - person Sirus; 10.02.2020
comment
Также я перепробовал множество различных методов для выполнения заказов на поставку. и это был единственный метод для нашей среды и требований, который работал. Я тоже видел эту статью раньше ... у меня не работало - person Sirus; 10.02.2020
comment
Вам следует действительно убедиться, что он работает правильно, даже если кажется, что он работает. Это просто последнее бухгалтерское событие, связанное с заказом на покупку, и я говорю, что вам может потребоваться отправить новое бухгалтерское событие для использования с вашей публикацией. Я думаю, что это атомарный процесс, который он получает во время вашей публикации, но я не могу вспомнить. Вам следует вручную разместить несколько заказов на покупку, проверить свои последние SourceDocument* поля на VendInvoice[Jour/Trans] и посмотреть, соответствуют ли они тому, что было бы возвращено getLastEvent(...). Проверьте также в различных местах публикации. - person Alex Kwitny; 10.02.2020
comment
Если это неправильно, возможно, это останется незамеченным в течение долгого времени, пока не будет проведен какой-то бухгалтерский аудит, тогда я думаю, что при просмотре журнала вспомогательной книги или распределений бухгалтерского учета все не выровняется, и тогда вы можете понять, что вы делали тонны сообщений и просто сбрасывание плохих ссылок в это поле ... или это может работать отлично? Я бы просто удостоверился, что ты это правильно поняла. - person Alex Kwitny; 10.02.2020
comment
Да, я проведу еще много тестов. Я не понимаю, что при отладке есть метод, называемый initSubTableSourceAccountingEventNew (), который принимает vendInvoiceInfoSubTable. Это устанавливает первую подтаблицу, но вторая подтаблица с другим номером заказа никогда не вызывает этот метод, поэтому он не устанавливается и, следовательно, не работает. Там отключение .... - person Sirus; 10.02.2020
comment
Если вы говорите о \C\PurchFormletterParmDataInvoice\initSubTableSourceAccountingEvent(), он украшен [SysObsoleteAttribute('This method is no longer used.', true)] - person Alex Kwitny; 11.02.2020
comment
Нет, я говорю об этом имени, но с новым в конце. - person Sirus; 11.02.2020
comment
Ах, надо любить сортировку методом AX. В будущем будет полезнее указывать имя класса + имя метода. Просто взглянув на код, я бы предположил, что \C\PurchFormletterParmDataInvoice\chooseLinesFromPurchSelectLinesManager #157 ищет отличные от комментариев // create VendInvoiceInfoSubTable row for each distinct OrigPurchId, и почему он не вызывает множественные? Похоже, у вас это работает и / или тестируется, так что, надеюсь, все в порядке. - person Alex Kwitny; 11.02.2020
comment
То, что я обнаружил во время отправки кода, вызывает метод updateParmID, который затем вызывает PurchFormletterParmDataInvoice :: initSubTableSourceAccountingEventNew, только если это IsAccountingEventchanged имеет значение false. первый всегда ложен. Затем, когда он просматривает все vendInvoiceInfoSubTables, после обновления первой он возвращает true, поэтому пропускает любые дополнительные подтаблицы для обновления своего события учета .. странно .. - person Sirus; 11.02.2020
comment
Мой код также не вызывает \ PurchFormletterParmDataInvoice \ chooseLinesFromPurchSelectLinesManager fyi - person Sirus; 11.02.2020