AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Функционал
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 19.04.2002, 19:56   #1  
Роман Кошелев is offline
Роман Кошелев
Продавец игрушек
Аватар для Роман Кошелев
 
433 / 73 (3) ++++
Регистрация: 22.11.2001
Адрес: Москва
Angry Ошибка при переименование номенклатуры и не только
Есть в Аксапте такая возможность: переименование ключевых полей.
При этом возникает обновление всех ссылок.
Например, при переименовании номенклатуры вызывается метод <b>InventTable::renamePrimaryKey</b>,
который по умолчанию обновляет все связанные ссылки и может сделать что-то ещё (у нас он обновляет связи в классификаторе).

Проблема и ошибка (как мне кажется) Аксапты в том, что:
Обновление ссылок происходит в пределах одной компании.
Т.е., если у нас есть две компании с общей номенклатурой (InventTable), но разными проводками по номенклатуре (InventTrans), то, переименовывая номенклату, находясь в одной компании, мы получаем оборванные ссылки Номенклатура-Проводки в другой компании, поскольку там проводки не обновились.

Думаю, это проявляется не только в номенклатуре.

Есть соображения?
__________________
С уважением, Роман Кошелев.
Старый 19.04.2002, 20:16   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Во как... Спасибо, буду знать.

Переименовать вручную.
Только юзай doupdate(), а не update()
Какие таблицы надо затрагивать видно в перекрестных ссылках или в Visual MorphXplorer
Старый 19.04.2002, 20:37   #3  
Роман Кошелев is offline
Роман Кошелев
Продавец игрушек
Аватар для Роман Кошелев
 
433 / 73 (3) ++++
Регистрация: 22.11.2001
Адрес: Москва
Как программным способом узнать, какие таблицы и какие поля в них обновлять?
__________________
С уважением, Роман Кошелев.
Старый 19.04.2002, 20:58   #4  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
а зачем программным?
ты себе жизнь не усложняешь?

сделай job на изменение кода в inventTable. Перечисли в этом job'е все связанные таблицы (пусть их будет хоть 100). Запускай его при необходимости.

Будет необходимость в изменении кода другой таблицы - сделаешь другой job.

Время программирования таких job'ов - максимум полчаса.

А вот если делать универсальный job... Не знаю сколько времени будешь разбирать связи в AOTе...

По-моему, в данном случае рациональнее сделать десяток специализированных job'ов, чем один универсальный.
Старый 19.04.2002, 21:05   #5  
Роман Кошелев is offline
Роман Кошелев
Продавец игрушек
Аватар для Роман Кошелев
 
433 / 73 (3) ++++
Регистрация: 22.11.2001
Адрес: Москва
Никогда не работал с Job'ами. Для чего они нужны?
Что в них писать? Есть пример?
__________________
С уважением, Роман Кошелев.
Старый 19.04.2002, 21:08   #6  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Хм...
класс - набор методов. Запустить класс "вручную" пролематично.

Если тебе нужен ОДИН независимый метод, который можно легко запускать руками, то это как раз job.

Job можно запусать и из меню. Однако, если возникает такая необходимость, то это первый признак того, то функционал надо переносить в класс.
Старый 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 Кб, 541 просмотров)
Тип файла: img1897-1 (6.3 Кб, 591 просмотров)
__________________
С уважением, Роман Кошелев.
Старый 26.04.2002, 11:02   #8  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Прошу прощения, Роман, за вопрос не по теме, но:
У Вас на форме расположены три кнопки. Логично предположить, что процедура запускается нажатием кнопки "Start". Судя по другим кнопкам, система каким-то образом перехватывает нажатие на эти самые другие кнопки ВО ВРЕМЯ работы процедуры.
Если это так, то как это запрограммировать? Ведь обычно во время какой-либо длительной операции АХАРТА не отвечает на внешние события.
Старый 26.04.2002, 14:36   #9  
Роман Кошелев is offline
Роман Кошелев
Продавец игрушек
Аватар для Роман Кошелев
 
433 / 73 (3) ++++
Регистрация: 22.11.2001
Адрес: Москва
Дрон,

Картинка, которую вы видите, суть форма HB_LongOperation,
которая используется нами для контроля над длительными операциями.

Проект переименования номенклатуры задействует эту форму.
Проект переименования не универсальный, так что будьте аккуратнее.

<hr>
Проект "HB_Tutorial_LongOperation":
http://www.axforum.info/forums/showt...s=&postid=1919

Проект "Переименование номенклатуры":
http://www.axforum.info/forums/showt...=&threadid=700
__________________
С уважением, Роман Кошелев.
Старый 26.04.2002, 15:42   #10  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Thumbs up
Спасибо, то что надо!
Старый 22.10.2004, 15:38   #11  
gudzon is offline
gudzon
программист
 
1,166 / 324 (13) ++++++
Регистрация: 06.07.2004
Адрес: Москва
Что-то не пойму....
Добрый день!
Прочитал ветку и решил проверить свою старую модификацию... И, на удивление, все прошло удачно! Все ссылки были сохранены в других компаниях... Может я что-то не так понял? Тестировал на 2.5.
Заранее спасибо...
Старый 22.10.2004, 16:51   #12  
gudzon is offline
gudzon
программист
 
1,166 / 324 (13) ++++++
Регистрация: 06.07.2004
Адрес: Москва
Еще раз здрасте...
Задам свой вопрос поточнее...
Я меняю ключевое поле ( ItemId - номер номенклатуры ) в одной компании... При этом меняются ВСЕ ссылки на номенклатуру... по ВСЕМ компаниям во ВСЕХ таблицах (отборочные накладные, например).
InventTrans у нас общая (может ошибка касается только складских проводок?).
Разъясните, пожалуста... Ну очень важно...
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Ошибка (?) при печати приходного ордера в DAX 4.0 SP2 Ivanhoe DAX: Программирование 7 19.01.2021 14:13
Не запускается Axapta. Общая ошибка сети. Lucky13 DAX: Администрирование 3 25.09.2007 13:02
Импорт списка номенклатуры Роман Кошелев DAX: База знаний и проекты 2 15.06.2006 16:52
Ошибка при обработке С-Ф Sergo DAX: Программирование 7 20.01.2006 11:56
Ошибка при переименование номенклатуры и не только Роман Кошелев DAX: База знаний и проекты 0 19.04.2002 20:32
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 01:55.