Показать сообщение отдельно
Старый 25.04.2002, 16:57   #7  
Роман Кошелев is offline
Роман Кошелев
Продавец игрушек
Аватар для Роман Кошелев
 
433 / 73 (3) ++++
Регистрация: 22.11.2001
Адрес: Москва
Исправил
Метод исправления ошибки:

1. Переименовываем номенклатуру, находясь в одной компании. При этом теряются связи в другой компании.
2. Переходим в эту несчастную компанию, переименовываем номенклатуру в старое значение (при этом подцепляются связи в новой и отцепляются в старой компаниях).
3. Завершающим шагом в третий раз переименовываем (в новое название). Все связи во всех коомпаниях сохранены.

Очевидно, что этот метод подходит и для N>2 компаний.

К сообщению присоединён xpo-пример.

Вот его код:
PHP код:
// HB: 25-04-02 Роман Кошелев:
// Корректно переименовыывает номенклатуру (если было abc, будет abc+ и наоборот)
// При этом сохраняются все проводки как в компаниии evk, так и в компании myb.
//
static void HB_RenameInventItemIdABC (Args _args)
{
    
InventTable item;
    
str oldIdnewId;

 
// Процедура переименования
    
void rename (itemId oldItemIditemId newItemId)
    {
        
InventTable T;
        
select firstonly from T where T.ItemId==oldItemId;

        
ttsbegin;
            
T.selectForUpdate();
            
CCPrimaryKey::renamePrimaryKey (TnewItemId,fieldnum(InventTableItemId));
            
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 (oldIdnewId);
    }

 
// Подцепляем проводки с помощью старого идентификатора
 // и опять переименовываем в новый.
    
changeCompany ("myb")
    {
        
rename (newIdoldId);
        
rename (oldIdnewId);
    }


Можно переопределить это всё прямо в SysRecordInfo, но мне некогда.


А так выглядит реальное пакетное переименовывание номенклатуры (10 сек на позицию)
Вложения
Тип файла: xpo hb_renameinventitemidabc.xpo (2.2 Кб, 544 просмотров)
Тип файла: img1897-1 (6.3 Кб, 598 просмотров)
__________________
С уважением, Роман Кошелев.