Метод исправления ошибки:
1. Переименовываем номенклатуру, находясь в одной компании. При этом теряются связи в другой компании.
2. Переходим в эту несчастную компанию, переименовываем номенклатуру в старое значение (при этом подцепляются связи в новой и отцепляются в старой компаниях).
3. Завершающим шагом в третий раз переименовываем (в новое название). Все связи во всех коомпаниях сохранены.
Очевидно, что этот метод подходит и для N>2 компаний.
К сообщению присоединён xpo-пример.
Вот его код:
PHP код:
// HB: 25-04-02 Роман Кошелев:
// Корректно переименовыывает номенклатуру (если было abc, будет abc+ и наоборот)
// При этом сохраняются все проводки как в компаниии evk, так и в компании myb.
//
static void HB_RenameInventItemIdABC (Args _args)
{
InventTable item;
str oldId, newId;
// Процедура переименования
void rename (itemId oldItemId, itemId newItemId)
{
InventTable T;
select firstonly * from T where T.ItemId==oldItemId;
ttsbegin;
T.selectForUpdate();
CCPrimaryKey::renamePrimaryKey (T, newItemId,fieldnum(InventTable, ItemId));
T.ItemId = newItemId;
T.renamePrimaryKey();
ttscommit;
}
;
// Узнаём во что переименовывать (в abc или в abc+)
// Внимание! Должна существовать номенклатура abc или abc+ !!
select firstonly * from item where item.ItemId=="abc";
if (!item.RecId) // abc+ -> abc
{
select firstonly * from item where item.ItemId=="abc+";
if (!item.RecId)
{
return;
}
oldId = "abc+";
newId = "abc";
}
else // abc -> abc+
{
oldId = "abc";
newId = "abc+";
}
// Переименовываем в новый. При этом отвалятся проводки в компании myb
changeCompany ("evk")
{
rename (oldId, newId);
}
// Подцепляем проводки с помощью старого идентификатора
// и опять переименовываем в новый.
changeCompany ("myb")
{
rename (newId, oldId);
rename (oldId, newId);
}
}
Можно переопределить это всё прямо в SysRecordInfo, но мне некогда.
А так выглядит реальное пакетное переименовывание номенклатуры (10 сек на позицию)