Цитата:
Сообщение от
Evgeniy2020
рекомендую сначала сделать пробное суммирование по inventtrans по 200 - 1000 номенклатур и сравнить полученное значение с inventsum по этим же номенклатурам. если различий будет очень очень мало, то можно и по inventsum остатки считать.
но у нас было много кастомизаций. в итоге беглое сравнение показало что для первых 1000 номенклатур в 30% случаях суммы отличаются.
видимо где не успевало обновится inventsum
если у вас различия меньше 5% то можно наверно и по inventsum.
Ок! Спасибо! Но я думаю при возникновении ошибок воспользуюсь джобиком:
X++:
static void Job70(Args _args)
{
InventTrans inventTransStatus;
RecordSortedList cacheInventSum;
InventSum inventSum;
InventSum inventSumCurrent;
InventDimId lastDimId;
ItemId itemId;
boolean mustInventBeControlled;
boolean ok;
Dialog dialog = new Dialog("Пересчет");
DialogField dfItemId;
InventTable iTb;
void testSum(InventSum _inventSum)
{
inventSumCurrent.itemId = _inventSum.itemId;
inventSumCurrent.inventDimId = _inventSum.inventDimId;
cacheInventSum.find(inventSumCurrent);
cacheInventSum.del(inventSumCurrent);
}
dfItemId = dialog.addFieldValue(typeid(ItemId),itemId,"Номенклатура");
if(!dialog.run()) return; itemId = dfItemId.value();
cacheInventSum = new RecordSortedList(TableNum(InventSum));
cacheInventSum.sortOrder(FieldNum(InventSum,itemId),FieldNum(InventSum,inventDimId));
//Che
while select iTb where iTb.ItemId like itemId
{
//Che
// mustInventBeControlled = InventTable::find(itemId).inventItemType().mustInventBeControlled();
mustInventBeControlled = InventTable::find(iTb.ItemId).inventItemType().mustInventBeControlled();
ttsbegin;
// while select forupdate inventSum where inventSum.itemId == itemId
while select forupdate inventSum where inventSum.itemId == iTb.ItemId
{
cacheInventSum.ins(inventSum);
inventSum.delete();
}
if(mustInventBeControlled)
{
while select sum(qty),sum(costAmountPosted),sum(costAmountAdjustment),sum(CostAmountSecCurPosted_RU),sum(CostAmountSecCurAdjustment_RU),sum(CostAmountSecCurPhysical_RU),sum(costAmountPhysical)
from inventTransStatus group by itemId,inventDimId,statusReceipt,statusIssue,datePhysical,dateInvent,dateExpected
// where inventTransStatus.itemId == itemId
where inventTransStatus.itemId == iTb.ItemId
{
if (ok)
{
if (inventTransStatus.inventDimId != lastDimId)
{
// inventSum.itemId = itemId;
inventSum.itemId = iTb.ItemId;
inventSum.inventDimId = lastDimId;
inventSum.insert();
testSum(inventSum);
inventSum.clear();
}//if (inventTransStatus.inventDimId != lastDimId)
} //if (ok)
else ok = true;
lastDimId = inventTransStatus.inventDimId;
inventSum.addInventTransOnSum(inventTransStatus);
} //while
}//if(mustInventBeControlled)
if (ok)
{
// inventSum.itemId = itemId;
inventSum.itemId = iTb.ItemId;
inventSum.inventDimId = lastDimId;
inventSum.insert();
testSum(inventSum);
}//if (ok)
ttscommit;
}//while select iTb where iTb.ItemId like itemId
}
Мало ли кому поможет)