Показать сообщение отдельно
Старый 25.09.2011, 20:56   #12  
someOne is offline
someOne
Участник
Аватар для someOne
 
174 / 432 (15) +++++++
Регистрация: 11.12.2008
Адрес: Москва
Цитата:
Сообщение от fara21 Посмотреть сообщение
Цель перекодирования - привести в порядок номеклатурный справочник, исключить дублирующие записи с одинаковым наименованием.
Для "объединения" номенклатуры используем код, как указано ниже.
Очень удобно "броться" с "задвоенностью" по номенклатуре.

При этом объединяются и проводки по номенклатуре, и текущие остатки в разрезе складских аналитик.


X++:
static server void renameItemIdAx(ItemId _fromItemId, ItemId _toItemId)
{
    inventTable               inventTable;
    inventTable               inventTableTo;
    inventTableModule         inventTableModule;
    InventItemLocation        inventItemLocation;
    inventSum                 inventSum;
    inventSum                 inventSumUpd;
    InventTxt                 inventTxt;
    InventSumReCalcItem       inventSumReCalcItem;
    ReqItemTable              reqItemTable;
    InventBatch               inventBatch;
    InventBatch               inventBatchFind;
    CustVendExternalItem      custVendExternalItem;
    InventItemBarcode         inventItemBarcode;
    InventItemBarcode         inventItemBarcodeFind;

    InventItemPurchSetup      inventItemPurchSetup;
    InventItemSalesSetup      inventItemSalesSetup;
    InventItemInventSetup     inventItemInventSetup;

    InventItemPrice           inventItemPrice;

    if (_fromItemId == _toItemId)
    {
        error(strfmt("Нельзя объединить номенклатуру %1 саму в себя", _toItemId));
        return;
    }

    inventTableModule.skipDataMethods(true);
    inventTableModule.skipDeleteActions(true);
    inventTableModule.skipDeleteMethod(true);

    inventItemLocation.skipDataMethods(true);
    inventItemLocation.skipDeleteActions(true);
    inventItemLocation.skipDeleteMethod(true);

    inventSumUpd.skipDataMethods();
    inventSumUpd.skipDeleteActions();
    inventSumUpd.skipDeleteMethod();

    inventTable = InventTable::find(_toItemId);

    if (inventTable.RecId == 0)
    {
        error(strfmt("Номер %1 не найден в справочнике номенклатуры", _toItemId));
        continue;
    }

    inventTable = InventTable::find(_fromItemId);

    if (inventTable.RecId == 0)
    {
        error(strfmt("Номер %1 не найден в справочнике номенклатуры", _fromItemId));
        continue;
    }

    ttsbegin;

    while select inventItemBarcode
    where inventItemBarcode.itemId == _fromItemId
    {
        delete_from inventItemBarcodeFind
        where inventItemBarcodeFind.itemId      == _toItemId &&
              inventItemBarcodeFind.itemBarCode == inventItemBarcode.itemBarCode;
    }

    while select inventBatch
    where InventBatch.itemId == _fromItemId
    {
        inventBatchFind = inventBatch::find(inventBatch.inventBatchId, _toItemId, true);
        if (inventBatchFind.RecId != 0)
            inventBatchFind.delete();

    }


    delete_from reqItemTable
    where reqItemTable.ItemId == _fromItemId;


    delete_from custVendExternalItem
    where custVendExternalItem.ItemId == _fromItemId;



    delete_from inventItemPurchSetup
    where inventItemPurchSetup.ItemId == _fromItemId;

    delete_from inventItemSalesSetup
    where inventItemSalesSetup.ItemId == _fromItemId;

    delete_from inventItemInventSetup
    where inventItemInventSetup.ItemId == _fromItemId;

    delete_from inventItemPrice
    where inventItemPrice.ItemId == _fromItemId;

    while select inventSum
    where inventSum.ItemId == _fromitemId
    {
        inventSumUpd = inventSum::find(_toItemId, inventSum.InventDimId, true);
        if (inventSumUpd.RecId !=0)
        {
            inventSumUpd.PostedQty              += inventSum.PostedQty;
            inventSumUpd.PostedValue            += inventSum.PostedValue;
            inventSumUpd.PhysicalValue          += inventSum.PhysicalValue;
            inventSumUpd.Deducted               += inventSum.Deducted;
            inventSumUpd.Received               += inventSum.Received;
            inventSumUpd.ReservPhysical         += inventSum.ReservPhysical;
            inventSumUpd.ReservOrdered          += inventSum.ReservOrdered;
            inventSumUpd.Registered             += inventSum.Registered;
            inventSumUpd.Picked                 += inventSum.Picked;
            inventSumUpd.OnOrder                += inventSum.OnOrder;
            inventSumUpd.Ordered                += inventSum.Ordered;
            inventSumUpd.Arrived                += inventSum.Arrived;
            inventSumUpd.QuotationReceipt       += inventSum.QuotationReceipt;
            inventSumUpd.QuotationIssue         += inventSum.QuotationIssue;
            inventSumUpd.AvailPhysical          += inventSum.AvailPhysical;
            inventSumUpd.AvailOrdered           += inventSum.AvailOrdered;
            inventSumUpd.PostedValueSecCur_RU   += inventSum.PostedValueSecCur_RU;
            inventSumUpd.PhysicalValueSecCur_RU += inventSum.PhysicalValueSecCur_RU;
            inventSumUpd.PhysicalInvent         += inventSum.PhysicalInvent;
            inventSumUpd.update();
        }
    }

    while select forupdate  inventSumUpd
    where inventSumUpd.ItemId == _toItemId
    {
        inventSumUpd.ItemId = "-1";
        inventSumUpd.doUpdate();
    }

    while select inventSum
    where inventSum.ItemId == _toItemId
    {
        info(inventSum.ItemId);
    }

    inventTable = InventTable::find(_toItemId, true);
    inventTable.ItemId = "-1";
    inventTable.doUpdate();

    update_recordset inventTableModule
    setting ItemId = "-1"
    where inventTableModule.ItemId == _toItemId;

    update_recordset inventItemLocation
    setting ItemId = "-1"
    where inventItemLocation.ItemId == _toItemId;

    delete_from inventTxt
    where inventTxt.ItemId == _toItemId;

    inventTable = InventTable::find(_fromItemId, true);
    inventTable.ItemId = _toItemId;
    inventTable.renamePrimaryKey();
    inventTable.doUpdate();

    inventTable = InventTable::find(_toItemId, true);
    inventTable.ItemId = "-2";
    inventTable.doUpdate();

    update_recordset inventTableModule
    setting ItemId = "-2"
    where inventTableModule.ItemId == _toItemId;

    update_recordset inventItemLocation
    setting ItemId = "-2"
    where inventItemLocation.ItemId == _toItemId;

    while select forupdate  inventSumUpd
    where inventSumUpd.ItemId == _toItemId
    {
        inventSumUpd.ItemId = "-2";
        inventSumUpd.doUpdate();
    }

    inventTable = InventTable::find("-1", true);
    inventTable.ItemId = _toItemId;
    inventTable.doUpdate();

    update_recordset inventTableModule
    setting ItemId = _toItemId
    where inventTableModule.ItemId == "-1";

    update_recordset inventItemLocation
    setting ItemId = _toItemId
    where inventItemLocation.ItemId == "-1";

    while select forupdate  inventSumUpd
    where inventSumUpd.ItemId == "-1"
    {
        inventSumUpd.ItemId = _toItemId;
        inventSumUpd.doUpdate();
    }

    inventTable = InventTable::find(_toItemId);

    inventTable = InventTable::find("-2", true);
    inventTable.delete();

    inventSumReCalcItem = new InventSumReCalcItem(_toItemId, false, CheckFix::Fix);
    inventSumReCalcItem.updateNow();

    ttscommit;
}
За это сообщение автора поблагодарили: fara21 (1).