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