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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 27.10.2021, 17:52   #1  
FrolovAndy is offline
FrolovAndy
Участник
 
71 / 45 (2) +++
Регистрация: 13.09.2007
Странный код в построении перекрестных ссылок
Всем привет!

Когда стал в выборочном режиме строить перекрестные ссылки, полезли ошибки. Поиск корней ошибок привел к такому вот коду, в классе xRefUpdate метод utilElementsToBexRefedInsert. А конкретно sysDictTable = new SysDictTable(tablename2id(_utilElements.Name))

X++:
        case UtilElementType::TableInstanceMethod,          // table method can be xreffed individually; but skip it, if the complete table are xreffed.
             UtilElementType::TableStaticMethod:

            sysDictTable = new SysDictTable(tablename2id(_utilElements.Name));

            if (sysDictTable)
            {
                select utilElementsToBexRefed
                    where utilElementsToBexRefed.RecordType == sysDictTable.utilElementType() &&
                          utilElementsToBexRefed.Id         == tablename2id(_utilElements.Name);

                if (!utilElementsToBexRefed)
                {
                    utilElementsToBexRefed.clear();
                    utilElementsToBexRefed.RecordType = sysDictTable.utilElementType();
                    utilElementsToBexRefed.ParentId   = _utilElements.ParentId;
                    utilElementsToBexRefed.Name       = _utilElements.Name;
                    utilElementsToBexRefed.insert();
                }
                break;
            }

Кто-то сталкивался с этим? Непонятно, или это ошибка, или какая-то неведомая задумка.
Ведь при таком типе элемента, в поле _utilElements.Name будет имя метода. И тогда теряется какой-либо смысл в выражении tablename2id(_utilElements.Name). Т.е. это поиск кода таблицы через имя ее метода.
Ну ладно когда это не сработало, тогда код просто пропускается. Но хуже когда имя метода совпадает с какой-то таблицей. Например, у меня было так - таблица CustSettlement имеет метод custVendTrans. При обработке в этом участке кода по имени custVendTrans, SysDictTable замечательным образом инициализируется по мапу CustVendTrans. В итоге дальше в utilElementsToBexRefed пишется полная ересь - имя custVendTrans, parentId - от CustSettlement, но тип записи - TableMap.
Пока склоняюсь что это ошибка. Возможно, по логике следовало бы записать: sysDictTable = new SysDictTable(_utilElements.ParentId));
Подскажите, было ли что-то на эту тему? Код давний очень, аж на 4-ке есть. Наверняка за долгое время у кого-то тоже должно было проявиться
За это сообщение автора поблагодарили: S.Kuskov (5).
Старый 28.10.2021, 08:03   #2  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,940 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
У нас свой инкрементный сборщик ссылок.
Поэтому не сталкивались.

Вы же можете провести простой тест своих предположений. Пройти все с отладчиком. Это недолго.
За это сообщение автора поблагодарили: FrolovAndy (2).
Старый 28.10.2021, 10:07   #3  
Pandasama is offline
Pandasama
Участник
 
457 / 134 (5) +++++
Регистрация: 11.08.2014
Адрес: Барнаул
а как, собственно, ошибку получить?
при полном перестроении перекрестных вроде всё ОК работает
Старый 28.10.2021, 11:20   #4  
FrolovAndy is offline
FrolovAndy
Участник
 
71 / 45 (2) +++
Регистрация: 13.09.2007
Цитата:
Сообщение от Pandasama Посмотреть сообщение
а как, собственно, ошибку получить?
при полном перестроении перекрестных вроде всё ОК работает
При выборочном только работает. Ну и соответственно запрос на таком построении как минимум должен включать типы записей таблицы и методы таблиц

При полном перестроении тот код вообще не задействуется
Старый 28.10.2021, 11:24   #5  
FrolovAndy is offline
FrolovAndy
Участник
 
71 / 45 (2) +++
Регистрация: 13.09.2007
Цитата:
Сообщение от Logger Посмотреть сообщение
У нас свой инкрементный сборщик ссылок.
Поэтому не сталкивались.

Вы же можете провести простой тест своих предположений. Пройти все с отладчиком. Это недолго.
Да, именно с отладчиком все проверялось. Поэтому первое мнение что да, ошибка, но обычно такие ошибки стандарта как правило известны. А здесь почему-то никакой инфы, и фиксов тоже никаких.
Поэтому остается небольшой процент предположения, что это я не понял какую-то хитрую задумку в этом коде

Но вообще да, идея хорошая, также сделать свой сервис по ссылкам, и тогда вопрос об этой ошибке перейдет исключительно в разряд "из любопытства"
Старый 28.10.2021, 11:38   #6  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Сейчас посмотрел на этот метод. Там такая же непонятная логика и для методов класса.
X++:
        case UtilElementType::ClassStaticMethod,
             UtilElementType::ClassInstanceMethod:

            select utilElementsToBexRefed
                where utilElementsToBexRefed.RecordType == UtilElementType::Class &&
                      utilElementsToBexRefed.Id         == className2Id(_utilElements.Name);
и для других элементов таблицы
X++:
case UtilElementType::TableMap,                     // these table childs can't be xreffed individually, so the table has to be xreffed.
             UtilElementType::TableIndex,
             UtilElementType::TableRelation,
             UtilElementType::TableFieldGroup,
             UtilElementType::TableField:

            sysDictTable = new SysDictTable(tablename2id(_utilElements.Name));
Всё это похоже на какую-то копипасту

Последний раз редактировалось S.Kuskov; 28.10.2021 в 11:43.
За это сообщение автора поблагодарили: FrolovAndy (1).
Старый 28.10.2021, 12:24   #7  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Если я правильно понял, то метод

\Classes\xRefUpdate\utilElementsToBexRefedInsert

Это подготовка списка объектов, для которых планируется выполнить обновление перекрестных ссылок. Метод - это не объект. Поэтому нужно указать таблицу. Вопрос в том, какую именно?

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

Та же самая проблема и дальше в этом методе

- TableIndex, TableRelation, TableFieldGroup, TableField
- ClassStaticMethod

Поиск родителя по имени вложенного объекта. Скорее всего, ничего не найдет или найдет не тот объект, для которого нужно обновлять перекрестные ссылки


Вообще говоря, в комментариях же написано, что это все - перестраховка. На случай, если предполагается обновление перекрестных ссылок по одному конкретному методу. Без обновления перекрестных ссылок по самой таблице. Вот я сильно сомневаюсь, что кто-то так делает. Скорее всего, обновление будет по самой таблице, где все это находится и в этом случае в данную ветку кода не попадем

Т.е. формально - да, ошибка. Но фактически, проявляется эта ошибка в очень специфической ситуации.
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
За это сообщение автора поблагодарили: FrolovAndy (2).
Старый 28.10.2021, 12:44   #8  
FrolovAndy is offline
FrolovAndy
Участник
 
71 / 45 (2) +++
Регистрация: 13.09.2007
Вот то что копипаста - да, очень похоже на это. Если весь метод смотреть, похоже не глядя наставили
Ну и тоже верно, что ошибка актуальна только если перестраивать отдельные элементы, а не родительские
Думаю, что тогда нет смысла что-то править, а оставить в запросе только типы записей элементов верхнего уровня, а все дочерние пропустить
Теги
перекрестные ссылки

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Задержка при открытии клиента после обновления перекрёстных ссылок MazZzDaI DAX: Администрирование 4 27.05.2015 07:53
Сколько времени у вас занимает сбор перекрестных ссылок по вашему приложению AX 4.0/2009? gl00mie DAX: Программирование 25 16.04.2012 10:39
ax2009: кто юзал Startup command: CompileAll_+ для периодического обновления перекрестных ссылок? mazzy DAX: Администрирование 11 25.08.2010 08:50
ax2009: почему обновление перекрестных ссылок перестало быть пакетным заданием? mazzy DAX: Программирование 9 21.08.2010 22:08
Обновление перекрестных ссылок ест память Sada DAX: Программирование 22 11.10.2006 18:22
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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