|
30.08.2010, 14:16 | #1 |
Участник
|
Вопросы по 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 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); 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; ... 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(); X++: ttsbegin; inventTable.skipDataMethods(true); // Set all BOM levels to zero update_recordset inventTable setting BOMLevel = 0 where inventTable.bomLevel != 0; ... 3) На последок полностью закоментировали ReleaseUpdateDB41_Administration.renumberEPParametersKey(), так как корпоротивного портала у нас нет и таблицей EPPARAMETERS: X++: sqlStatement = strfmt(@"UPDATE EPPARAMETERS SET KEY_ = (KEY_ + %1) WHERE DATAAREAID=%2",tickCount,ext); Скажите, это нормально? В последствии жизни не мешает? Заранее спасибо. |
|
30.08.2010, 14:31 | #2 |
Ищущий знания...
|
про skip могу сказать, что в связке skipDataMethods() хорошо бы ещё использовать метод skipDatabaseLog(). Насколько я помню, если настроено логирование изменений по таблице, то при использовании update_recordset без скипа database лога будут отрабатывать методы таблицы.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
|
За это сообщение автора поблагодарили: ansoft (1). |
30.08.2010, 14:54 | #3 |
Участник
|
Спасибо... надо проверить...
Я тока замечу что releaseUpdate-ы писали вроде знатоки типа... почему-то они не пихнули skipDatabaseLog, возможно, потому что у них логов на такие таблицы нет... |
|
30.08.2010, 20:14 | #4 |
Участник
|
Цитата:
Сообщение от ansoft
полностью закоментировали
ReleaseUpdateDB41_Administration.renumberEPParametersKey(), так как корпоротивного портала у нас нет и таблицей EPPARAMETERS: X++: sqlStatement = strfmt(@"UPDATE EPPARAMETERS SET KEY_ = (KEY_ + %1) WHERE DATAAREAID=%2",tickCount,ext); Чем больше вы будете ковыряться в скриптах обновления данных для 2009-й, тем более иронично будете воспринимать это заявление, особенно когда дойдет дело до алгоритмической оптимизации их производительности (то, что лечится добавлением skipDatabaseLog(true), - это ерунда) |
|
30.08.2010, 14:57 | #5 |
Участник
|
В методе ReleaseUpdateDB41_Invent.updateInventItemOrderSetup() у меня ошибка возникала из-за того что в аксапте тройке в InventDim были добавлены дополнительные складские аналитики. Немного модифицировать метод и всё в порядке.
А вот данные из таблицы DatabaseLog на время переноса данных из тройки в Ax2009 лучше удалить. От греха, так сказать. И никакие skipDatabaseLog уже не нужны будут.
__________________
Дмитрий |
|
30.08.2010, 15:10 | #6 |
Участник
|
У нас тоже добавлены дополнительные аналитики... для них я модификации опустил...
Вопрос в том верно ли в стандарте сопоставлены по порядку поля вставки и поля выборки InventDimId и inventDimIdBlank? Цитата:
А вот данные из таблицы DatabaseLog на время переноса данных из тройки в Ax2009 лучше удалить
|
|
30.08.2010, 15:36 | #7 |
Участник
|
метод ReleaseUpdateDB41_Invent.updateInventItemOrderSetup() написан и работает верно.
И с методом ReleaseUpdateDB41_Invent.updateInventJournalTrans() после удаления данных в DatabaseLog проблем не возникало. Методы типа update() и insert() не вызываются.
__________________
Дмитрий |
|
31.08.2010, 12:21 | #8 |
Участник
|
Спасибо... буду разбираться что у меня не так...
Для ReleaseUpdateDB41_Invent.updateInventJournalTrans() чудно помогает skipDatabaseLog как и сказал lev |
|
Теги |
ax2009, ax3.0, skipdatamethods, upgrade, переход |
|
|