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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 09.05.2015, 20:39   #1  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,164 / 1293 (48) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Иерархия классов, как обновить?
DAX2009
Пишу небольшую утилиту, в которой нужно создавать экземпляр класса или его наследника. На входе имею ClassId базового класса и некоторые параметры, определяющие наследника этого класса. По этим параметрам нужно создать элемент конкретного класса (если кому интересно, то это эмуляция использования атрибутов, введенных в DAX2012, для использования в DAX2009).
Задача: имея идентификатор класса, получить список идентификаторов классов, состоящий из идентифкатора самого базового класса и его наследников (как прямых, так и внуков, правнуков и т.п.)
Для определения иерархии использую таблицу xRefTypeHierarchy:
X++:
    void findDescendents(ClassId _parentId)
    {
        ;

        if (!xRefTypeHierarchy_findOrCreate(Types::Class, _parentId).Children)
        {
            return;
        }

        while select typeHierarchy
            where typeHierarchy.Parent      == _parentId
                && typeHierarchy.BaseType   == Types::Class

        {
            setHierarchy.add(typeHierarchy.Id);

            if (typeHierarchy.Children && typeHierarchy.Id)
            {
                findDescendents(typeHierarchy.Id);
            }
        }
    }
Метод xRefTypeHierarchy_findOrCreate просто ищет запись в иерархии.
X++:
    xRefTypeHierarchy xRefTypeHierarchy_find(Types _baseType, ClassId _id)
    {
        xRefTypeHierarchy xRefTypeHierarchy;

        select firstonly xRefTypeHierarchy
            index BaseTypeIdIdx
            where xRefTypeHierarchy.BaseType    == _baseType
                && xRefTypeHierarchy.Id         == _id
        ;

        return xRefTypeHierarchy;
    }

    xRefTypeHierarchy xRefTypeHierarchy_findOrCreate(Types _baseType, ClassId _id)
    {
        xRefTypeHierarchy xRefTypeHierarchy = xRefTypeHierarchy_find(_baseType, _id);

        if (!xRefTypeHierarchy)
        {
            new xRefUpdateTypeHierarchy().run();

            xRefTypeHierarchy = xRefTypeHierarchy_find(_baseType, _id);
        }

        return xRefTypeHierarchy;
    }
Если полностью перестроить перекрестные ссылки (отметив флаг перестройки иерархии), то все нормально. Без перестройки перекрестных ссылок наследники класса не находятся. Пробовал вызывать:
X++:
    new xRefUpdateTypeHierarchy().run();
Не помогает. Помогает только полная перестройка перекрестных ссылок с отметкой о необходимости обновления иерархии классов. Что-то не очень хочется перестраивать ссылки при каждом добавлении класса (проект в активной стадии и новые классы добавляются часто).
Пока в голову приходит пробег по всем классам с проверкой того входит ли он в иерархию базового класса.
Может быть есть какие-то другие способы определения иерархии?
Старый 09.05.2015, 22:21   #2  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
А почему не хотите воспользоваться DictClass.extendedBy()?
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: Raven Melancholic (10).
Старый 10.05.2015, 07:16   #3  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,164 / 1293 (48) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Цитата:
Сообщение от AndyD Посмотреть сообщение
А почему не хотите воспользоваться DictClass.extendedBy()?
Потому что даже не подумал про него - решил изобрести велосипед по нескольким найденным примерам.
Спасибо, буду за компом проверю.
Старый 11.05.2015, 19:49   #4  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,164 / 1293 (48) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Все замечательно, DictClass.extendedBy() работает сразу после появления нового класса.
Только скорость вызова extendedBy первый раз в сессии очень сильно меньше, чем поиск по xRefTypeHierarchy. Последующие вызовы по скорости одинаковы (судя по всему, результаты кэшируются).
Мне часто придется вызывать поиск в новых сессиях (NET коннектор). Поэтому надеяться на кэш не приходится. Попробую скрестить скорость поиска по xRefTypeHierarchy и независимость от перекрестных ссылок extendedBy.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Взаимодействие с Excel через .NET (семейство классов SysExcel) gl00mie DAX: Программирование 102 11.08.2022 17:09
Иерархия стандартных классов DAX 2009 Kiot DAX: Прочие вопросы 3 21.04.2015 14:10
Протоколирование запуска классов наследников RunBase polygris DAX: Программирование 9 11.02.2010 15:59
Почему дата поставки в подпроизводстве становится при обновить приемка сегодняшней датой???? Murlin DAX: Функционал 8 27.08.2009 14:51
Как быстро освоить библиотеку классов Аксапты? spartan DAX: Программирование 9 11.05.2005 12:07

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

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

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