Цитата:
Сообщение от
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;
}