AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 08.11.2019, 03:36   #1  
alicedr is offline
alicedr
Участник
 
173 / 43 (2) +++
Регистрация: 06.07.2012
Адрес: Канада
D365FO salesTable.PackedExtensions для MCRSalesTable
D365FO 10.0.4 PU28. Call Center.
Проблема в том, что у клиента после неполной разноске накладной (когда остаются товары для следующей доставки), накладная стопается и кнопка "Complete" снова становится активной.
Полностью аналогичный случай на моей ВМ работает как надо и кнопка Complete не появляется.

Оказалось, что после создания накладной и добавления платежей при выполнении submit для накладной при очередном Salestable.update() происходит создание записи в MCRSalesTable c обновлением поля OutOfBalanceReleased - на моей ВМ.
У клиента MCRSalesTable не создается.

Дальнейшее вскрытие показало что в ВМ клиента в SysExtensionSerializerMap.postUpdate() не создается запись в MCRSalesTable потому что this.PackedExtensions == conNull() - см. рисунок внизу.

Компиляция AppSuite модуля и DBsync не помогли. Что делать дальше - пока не знаю. Буду рада любым предположениям.
Миниатюры
Нажмите на изображение для увеличения
Название: 2019-11-08_010814.jpg
Просмотров: 213
Размер:	139.9 Кб
ID:	12422  
Старый 08.11.2019, 10:01   #2  
axm2017 is offline
axm2017
Участник
 
1,747 / 292 (13) ++++++
Регистрация: 15.05.2017
Я бы попытался понять соответствует ли текущий код идеям framework-а (может где-то что-то нарушили):

краткая инструкция как должно быть
https://daxonline.org/9-table-extension-framework.html
Обратил внимание на packExtensionTable и подобные вещи.

Последний раз редактировалось axm2017; 08.11.2019 в 10:05.
Старый 08.11.2019, 16:58   #3  
alicedr is offline
alicedr
Участник
 
173 / 43 (2) +++
Регистрация: 06.07.2012
Адрес: Канада
Дык все таблицы стандартные. Pack идет в salestable.mcrPackMCRSalesTable() (по крайней мере дебаггер туда заходит)
Старый 08.11.2019, 20:01   #4  
axm2017 is offline
axm2017
Участник
 
1,747 / 292 (13) ++++++
Регистрация: 15.05.2017
Цитата:
Сообщение от alicedr Посмотреть сообщение
Дык все таблицы стандартные. Pack идет в salestable.mcrPackMCRSalesTable() (по крайней мере дебаггер туда заходит)
Вы смотрите как понимаю update а инициализации наверное все же на insert.
Стандарт не факт что идёт без логических ошибок.
Старый 11.11.2019, 19:38   #5  
alicedr is offline
alicedr
Участник
 
173 / 43 (2) +++
Регистрация: 06.07.2012
Адрес: Канада
на ВМ где все работает как надо, запись в MCRSalesTable создается когда пользователь нажимает кнопку Submit (это MCRSalesOrderRecap.SubmitOrder()). Call stack с ВМ где запись создается - на скриншоте внизу.
MCRSalesTable.Insert() делается на Salestable.update():

X++:
public class SysExtensionSerializerMap extends common
{
/*  ....................  */
    /// <summary>
    /// Updates / inserts the packed extension table record after the base table record is updated.
    /// </summary>
    /// <remarks>
    /// This method should be called immediately after super() of base table's <C>update</C> method.
    /// </remarks>
    public void postUpdate()
    {
        SysExtensionSerializerExtensionMap      currentExtensionTable;
        SysExtensionSerializerExtensionMap      extensionTableToUpdate;
        SysExtensionSerializerExtensionMap      extensionTableInUse;
        int                                     i;
        boolean                                 checkForLinkedExtensionTables;
        container                               newPackedExtensions;
        boolean                                 updated;
        Array                                   extensionTableArray = new Array(Types::Record);
        container                               extensionTableTableIdList;
        TableId                                 currentExtensionTableTableId;
        container                               hasLinkedExtensionTableCon;
        boolean                                 hasLinkedExtensionTable;

        if (this.RecId && this.PackedExtensions != conNull())
        {
            for (i = 1; i <= conLen(this.PackedExtensions); i++)
            {
                currentExtensionTable = con2Buf(conPeek(this.PackedExtensions, i));
                extensionTableArray.value(i, currentExtensionTable);

                currentExtensionTableTableId = currentExtensionTable.TableId;

                // if buffer is not form DS there is no need to check for extension table on client
                checkForLinkedExtensionTables = checkForLinkedExtensionTables || FormDataUtil::isFormDataSource(this);

                extensionTableTableIdList += [currentExtensionTableTableId];
            }

            if (checkForLinkedExtensionTables)
            {
                hasLinkedExtensionTableCon = SysExtensionSerializerFormRunHelper::hasExtensionTable(this, extensionTableTableIdList);
            }

            ttsbegin;
            for (i = 1; i <= extensionTableArray.lastIndex(); i++)
            {
                updated = false;

                currentExtensionTable = extensionTableArray.value(i);

 /* ............................ */

                // If it is not an existed record, insert it.
                if (updated == false)
                {
                    currentExtensionTable.BaseRecId = this.RecId;
                    currentExtensionTable.insert();  //<<-----------------------------
                }

                newPackedExtensions += [buf2Con(currentExtensionTable, true)];
            }
            ttscommit;

            this.PackedExtensions = newPackedExtensions;
        }
    }
Миниатюры
Нажмите на изображение для увеличения
Название: 2019-11-11_183014.jpg
Просмотров: 221
Размер:	226.3 Кб
ID:	12427  
Старый 11.11.2019, 20:41   #6  
axm2017 is offline
axm2017
Участник
 
1,747 / 292 (13) ++++++
Регистрация: 15.05.2017
Проблема же не в добавлении записи, а в том что PackedExtensions пустой. Заполняется это поле имхо не на update.
Старый 11.11.2019, 23:05   #7  
alicedr is offline
alicedr
Участник
 
173 / 43 (2) +++
Регистрация: 06.07.2012
Адрес: Канада
насколько я вижу, заполняется поле тут (в дебаггере вижу что таки заполняется):
X++:
class MCRPaymentReview
{
/*...................................*/
public static boolean outOfBalance(MCRCustPaymTotals _mcrCustPaymTotals,
                             AmountCur _overUnderPaymAmount = 0,
                             AmountCur _totalSalesAmount = 0)
    {
/*.....................................*/
else
        {
            // Update back status gets called from so many places that a new
            //                      enum value was added so that only end order can put a
            //                      sales order on out of balance "hold".
            //                   So once end order validates that this is not out of balance
            //                      make sure that it doesn't happen again unless the order
            //                      is modified.
            mcrSalesTable.OutOfBalanceReleased = MCROutOfBalanceReleaseType::Verified;
        }

        ttsBegin;
        if (salesTable.validateWrite())
        {
            salesTable.mcrPackMCRSalesTable(mcrSalesTable);   //<<----------------------------
            salesTable.update();
        }
        else
        {
            throw error("@SYS104318");
        }

        ttsCommit;

        return isValid;
X++:
public class SalesTable extends common
{
/*....................................*/
    /// <summary>
    /// Packs the retail sales table extension table into <c>MCRSalesTable</c> field.
    /// </summary>
    /// <param name="_mcrSalesTable">
    /// Extension table to be packed.
    /// </param>
    public void mcrPackMCRSalesTable(MCRSalesTable _mcrSalesTable)
    {
        _mcrSalesTable.SalesTable = this.RecId;
        this.SysExtensionSerializerMap::packExtensionTable(_mcrSalesTable);
    }
Старый 12.11.2019, 12:44   #8  
axm2017 is offline
axm2017
Участник
 
1,747 / 292 (13) ++++++
Регистрация: 15.05.2017
Судя по коду которые есть у меня выполнение этого кода привязано к вот такой проверке
X++:
public boolean mcrIsCallCenter()
    {
        if (MCROrderParameters::isCallCenterEnabledAndInUse())
        {
            return RetailMCRChannelTable::findRecId(RetailSalesTable::findSalesTable(this).RetailChannel).RecId != 0;
        }
        else
        {
            return false;
        }
    }
То есть надо выполнить пару условий.
Возможно вы их выполняете а вот клиент хз
Теги
mcrsalestable, packedextensions, sysextensionserializermap

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
sertandev: How to receive D365FO push notifications using Azure Notification Hubs Blog bot DAX Blogs 0 04.07.2019 18:11
sertandev: How to integrate D365FO with Microsoft Flow using the new Business Events Blog bot DAX Blogs 0 23.05.2019 16:11
d365technext: Pass field value from SalesTable to CustTrans in AX 2012 & D365FO Blog bot DAX Blogs 0 15.11.2018 09:11
erconsult: Copy-paste with keyboard script 2: from Excel to D365FO Blog bot DAX Blogs 0 03.08.2018 11:12
littleax: Part1. Dynamics ax 2012. Split construct method by models. Blog bot DAX Blogs 0 28.05.2014 10:11
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 17:53.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.