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.
Скажите, это нормально? В последствии жизни не мешает?

Заранее спасибо.
Теги
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, время: 13:04.