Показать сообщение отдельно
Старый 22.02.2011, 11:15   #5  
Che is offline
Che
Участник
 
92 / 12 (1) ++
Регистрация: 25.01.2010
Цитата:
Сообщение от 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
}
Мало ли кому поможет)

Последний раз редактировалось Che; 22.02.2011 в 11:22.