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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 30.08.2010, 14:16   #1  
ansoft is offline
ansoft
Участник
Аватар для ansoft
 
123 / 37 (2) +++
Регистрация: 20.10.2005
Вопросы по ReleaseUpdate DAX 2009
Всем доброго времени суток!
Занимаемся переходом с 3 на 2009 и возникли некоторые вопросы. Кому не сложно и сталкивался с такой проблемой помогите советом, ответом, комментарием. В поиске подобного не попадалось.

Используемый софт:
Windows Server 2008 R2 Enterprise Edition (64-bit) NT 6.1 <X64> (Build 7600)
Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64) Enterprise Edition (64-bit)
DAX 2009 SP1 RU5
Ax32Serv.exe (5.0.1500.2985)
Ax32.exe (5.0.1500.2985)
(axsyp.version 5.0.1500.2985)
(axgls.version 5.0.1001.176)
(axglp.version 5.0.1500.2985)

1) Метод ReleaseUpdateDB41_Invent.updateInventItemOrderSetup() содержит следующий кусок кода:
X++:
public void updateInventItemOrderSetup()
{
    InventTableModule       inventTableModule;
    InventItemPurchSetup    inventItemPurchSetup;
    InventItemInventSetup   inventItemInventSetup;
    InventItemSalesSetup    inventItemSalesSetup;
    InventDim               inventDim;
    InventDim               inventDimBlank;
    InventDim               newInventDIm;
    InventDimId             inventDimIdBlank = InventDim::inventDimIdBlank();
    ;

    // first insert the missing InventDimIds
    while select del_InventLocationId from inventTableModule
            notexists join inventDim
            where   !inventDim.ConfigId            &&
                    !inventDim.InventSizeId        &&
                    !inventDim.InventColorId       &&
                    !inventDim.InventSiteId        &&
                    inventDim.InventLocationId == inventTableModule.del_InventLocationId   &&
                    !inventDim.InventBatchId       &&
                    !inventDim.wmsLocationId       &&
                    !inventDim.wmsPalletId         &&
                    /* <SYS>
                    !inventDim.InventSerialId
                    </SYS> */
                    // <GEEU>
                    !inventDim.InventSerialId      &&
                    !inventDim.InventGtdId_RU
                    // </GEEU>
    {
        newInventDIm.InventLocationId = inventTableModule.del_InventLocationId;
        InventDim::findOrCreate(newInventDIm);
    }

    // copy invent items
    insert_recordset inventItemInventSetup (ItemId,
                                            MultipleQty,
                                            StandardQty,
                                            LowestQty,
                                            HighestQty,
                                            Stopped,
                                            MandatoryInventLocation,
                                            LeadTime,
                                            CalendarDays,
                                            InventDimId,
                                            InventDimIdDefault)
        select  ItemId,
                del_Quantity,
                del_StandardQty,
                del_LowestQty,
                del_HighestQty,
                del_Blocked,
                del_MandatoryInventLocation,
                del_DeliveryTime,
                del_CalendarDays from inventTableModule
        where  (inventTableModule.ModuleType == ModuleInventPurchSales::Invent)
            join InventDimId from inventDimBlank
            where inventDimBlank.InventDimId == inventDimIdBlank
            join InventDimId from inventDim
            where   !inventDim.ConfigId            &&
                    !inventDim.InventSizeId        &&
                    !inventDim.InventColorId       &&
                    !inventDim.InventSiteId        &&
                    inventDim.InventLocationId == inventTableModule.del_InventLocationId   &&
                    !inventDim.InventBatchId       &&
                    !inventDim.wmsLocationId       &&
                    !inventDim.wmsPalletId         &&
                    /* <SYS>
                    !inventDim.InventSerialId
                    </SYS> */
                    // <GEEU>
                    !inventDim.InventSerialId      &&
                    !inventDim.InventGtdId_RU
                    // </GEEU>
                notexists join inventItemInventSetup
                where   inventItemInventSetup.InventDimId == inventDimIdBlank &&
                        inventItemInventSetup.ItemId == inventTableModule.ItemId;
...   purch  sales
Когда отрабатывает этот код, то при вставке в inventItemInventSetup ругается на неуникальности индекса по ItemId+InventDimId. Верно ли я понимаю, что при таком запросе в InventDim пишется InventDimDefault и наоборот... и кроме того условие not exists join тоже вроде как неверно, т.е. код вставки должен выглядеть так:
X++:
// copy invent items
    insert_recordset inventItemInventSetup (ItemId,
                                            MultipleQty,
                                            StandardQty,
                                            LowestQty,
                                            HighestQty,
                                            Stopped,
                                            MandatoryInventLocation,
                                            LeadTime,
                                            CalendarDays,
                                            /* ??????????????
                                            InventDimId,
                                            InventDimIdDefault,
                                            */
                                            InventDimIdDefault,
                                            InventDimId)
        select  ItemId,
                del_Quantity,
                del_StandardQty,
                del_LowestQty,
                del_HighestQty,
                del_Blocked,
                del_MandatoryInventLocation,
                del_DeliveryTime,
                del_CalendarDays from inventTableModule
        where  (inventTableModule.ModuleType == ModuleInventPurchSales::Invent)
            join InventDimId from inventDimBlank
            where inventDimBlank.InventDimId == inventDimIdBlank
            join InventDimId from inventDim
            where   !inventDim.ConfigId            &&
                    !inventDim.InventSizeId        &&
                    !inventDim.InventColorId       &&
                    !inventDim.InventSiteId        &&
                    inventDim.InventLocationId == inventTableModule.del_InventLocationId   &&
                    !inventDim.InventBatchId       &&
                    !inventDim.wmsLocationId       &&
                    !inventDim.wmsPalletId         &&
                    /* <SYS>
                    !inventDim.InventSerialId
                    </SYS> */
                    // <GEEU>
                    !inventDim.InventSerialId      &&
                    !inventDim.InventGtdId_RU
                    // </GEEU>
                notexists join inventItemInventSetup
                /* ???????????????
                where   inventItemInventSetup.InventDimId == inventDimIdBlank &&
                        inventItemInventSetup.ItemId == inventTableModule.ItemId;
                */
                where inventItemInventSetup.ItemId == inventTableModule.ItemId &&
                          (inventItemInventSetup.InventDimId == inventDimIdBlank ||
                           inventItemInventSetup.InventDimId == inventDim.inventDimId);
При таком изменении записи вставляются без ошибок, однако не добавляется запись для номенклатуры со значением InventDimId равным InventDimIdBlank, что приводит к тому, что например при создании строки в журнале проводок управления запасами в момент ввода номенклатуры возникает ошибка говорящая об отсутствии настройки "Запасы" для номенклатуры.

2) Множество обновлений БД использует методы update_recordset, например
метод ReleaseUpdateDB41_Invent.updateInventJournalTrans():
X++:
void updateInventJournalTrans()
{
    InventJournalTrans  inventJournalTrans;
    InventJournalTable  inventJournalTable;
    InventTrans         inventTrans;
    NumberSeq           numberSeq;
    InventTrans         receiptInventTrans;
    InventTrans         issueInventTrans;
    ;
    ttsbegin;
    inventJournalTrans.skipDataMethods(true);
    update_recordset inventJournalTrans
        setting toInventTransId    = inventJournalTrans.InventTransId
        where inventJournalTrans.ToInventTransId    == ''
           && inventJournalTrans.JournalType        == InventJournalType::Transfer;
    ttscommit;
    ...
Если не вносить изменений, то метод вылетает с ошибкой при проверке обновления, так как несмотря на skipDataMethods все методы таблицы отрабатывают. Мне встречалось замечание Массовое удаление записей через CCADOConnection о неработающем методе skipDatabaseLog... получается туда же можно отнести и skipDataMethods. Вопрос в том, действительно ли это не работает в DAX 2009 и у всех или только у нас? Ситуация конечно обходится легко:
X++:
    //inventJournalTrans.skipDataMethods(true);
    //update_recordset inventJournalTrans
    //    setting toInventTransId    = inventJournalTrans.InventTransId
    //    where inventJournalTrans.ToInventTransId    == ''
    //       && inventJournalTrans.JournalType        == InventJournalType::Transfer;
    while select forupdate inventJournalTrans
        where inventJournalTrans.ToInventTransId    == ''
           && inventJournalTrans.JournalType        == InventJournalType::Transfer
    {
        inventJournalTrans.toInventTransId = inventJournalTrans.InventTransId;
        inventJournalTrans.doUpdate();
    }
...так все работает прекрасно, но падает производительность при обновлении.
Таких мест где не работает skipDataMethods много... например в чудном методе при пересчетах InventCostClosing.run()... в вызове createInventCostList() есть чудо строка
X++:
// Recompute BOM levels from scratch
    BOMLevelCalc::construct().run();
Мало того что она не смотрит на выбор при пересчете и жутко все тормозит... она тоже содержит в методе updateBOMLevels() строки:
X++:
    ttsbegin;

    inventTable.skipDataMethods(true);

    // Set all BOM levels to zero
    update_recordset inventTable
        setting BOMLevel = 0
        where   inventTable.bomLevel != 0;
     ...
... где при использовании skipDataMethods мы четко попадаем в метод update на InventTable.

3) На последок полностью закоментировали
ReleaseUpdateDB41_Administration.renumberEPParametersKey(), так как корпоротивного портала у нас нет и таблицей EPPARAMETERS:
X++:
sqlStatement = strfmt(@"UPDATE EPPARAMETERS SET KEY_ = (KEY_ + %1) WHERE DATAAREAID=%2",tickCount,ext);
... не пахло ни в AOT ни в SQL.
Скажите, это нормально? В последствии жизни не мешает?

Заранее спасибо.
Старый 30.08.2010, 14:31   #2  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
про skip могу сказать, что в связке skipDataMethods() хорошо бы ещё использовать метод skipDatabaseLog(). Насколько я помню, если настроено логирование изменений по таблице, то при использовании update_recordset без скипа database лога будут отрабатывать методы таблицы.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
За это сообщение автора поблагодарили: ansoft (1).
Старый 30.08.2010, 14:54   #3  
ansoft is offline
ansoft
Участник
Аватар для ansoft
 
123 / 37 (2) +++
Регистрация: 20.10.2005
Спасибо... надо проверить...
Я тока замечу что releaseUpdate-ы писали вроде знатоки типа... почему-то они не пихнули skipDatabaseLog, возможно, потому что у них логов на такие таблицы нет...
Старый 30.08.2010, 14:57   #4  
Damn is offline
Damn
Участник
 
436 / 154 (6) ++++++
Регистрация: 28.05.2003
Адрес: в глуши
В методе ReleaseUpdateDB41_Invent.updateInventItemOrderSetup() у меня ошибка возникала из-за того что в аксапте тройке в InventDim были добавлены дополнительные складские аналитики. Немного модифицировать метод и всё в порядке.

А вот данные из таблицы DatabaseLog на время переноса данных из тройки в Ax2009 лучше удалить. От греха, так сказать. И никакие skipDatabaseLog уже не нужны будут.
__________________
Дмитрий
Старый 30.08.2010, 15:10   #5  
ansoft is offline
ansoft
Участник
Аватар для ansoft
 
123 / 37 (2) +++
Регистрация: 20.10.2005
У нас тоже добавлены дополнительные аналитики... для них я модификации опустил...
Вопрос в том верно ли в стандарте сопоставлены по порядку поля вставки и поля выборки InventDimId и inventDimIdBlank?
Цитата:
А вот данные из таблицы DatabaseLog на время переноса данных из тройки в Ax2009 лучше удалить
DatabaseLog ессно пуст... просто он будет "набиватся" при обновлении, если не отключить ведение лога. Основная проблема даже не в логе, а в том что при update_recordset выполняются методы на таблицах с проверками и т.п.
Старый 30.08.2010, 15:36   #6  
Damn is offline
Damn
Участник
 
436 / 154 (6) ++++++
Регистрация: 28.05.2003
Адрес: в глуши
метод ReleaseUpdateDB41_Invent.updateInventItemOrderSetup() написан и работает верно.

И с методом ReleaseUpdateDB41_Invent.updateInventJournalTrans() после удаления данных в DatabaseLog проблем не возникало. Методы типа update() и insert() не вызываются.
__________________
Дмитрий
Старый 30.08.2010, 20:14   #7  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от ansoft Посмотреть сообщение
полностью закоментировали
ReleaseUpdateDB41_Administration.renumberEPParametersKey(), так как корпоротивного портала у нас нет и таблицей EPPARAMETERS:
X++:
sqlStatement = strfmt(@"UPDATE EPPARAMETERS SET KEY_ = (KEY_ + %1) WHERE DATAAREAID=%2",tickCount,ext);
... не пахло ни в AOT ни в SQL.
Таблица такая появилась в 4-ке, а в 2009-й от нее отказались, поэтому там она называется уже DEL_EPParameters.
Цитата:
Сообщение от ansoft Посмотреть сообщение
Я тока замечу что releaseUpdate-ы писали вроде знатоки типа...
Чем больше вы будете ковыряться в скриптах обновления данных для 2009-й, тем более иронично будете воспринимать это заявление, особенно когда дойдет дело до алгоритмической оптимизации их производительности (то, что лечится добавлением skipDatabaseLog(true), - это ерунда)
Старый 31.08.2010, 12:21   #8  
ansoft is offline
ansoft
Участник
Аватар для ansoft
 
123 / 37 (2) +++
Регистрация: 20.10.2005
Спасибо... буду разбираться что у меня не так...
Для ReleaseUpdateDB41_Invent.updateInventJournalTrans() чудно помогает skipDatabaseLog как и сказал lev
Теги
ax2009, ax3.0, skipdatamethods, upgrade, переход

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
emeadaxsupport: List of fixes that improve performance of certain features in Dynamics AX 2009 Blog bot DAX Blogs 0 13.10.2009 19:06
aEremenko: DAX 2009: Вопросы и ответы Blog bot DAX Blogs 0 25.04.2009 01:07
msdynamicsax: DAX 2009 and MS SQL 2008 Blog bot DAX Blogs 0 09.08.2008 14:05
axStart: Microsoft Dynamics AX 2009 Hot Topics Web Seminar Series Blog bot DAX Blogs 0 06.08.2008 12:05
msdynamicsax: Enterprise Portal development in DAX 2009 Blog bot DAX Blogs 0 18.04.2008 07:06

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 22:53.