09.05.2015, 20:39 | #1 |
Участник
|
Иерархия классов, как обновить?
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); } } } 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 |
Участник
|
А почему не хотите воспользоваться DictClass.extendedBy()?
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: Raven Melancholic (10). |
10.05.2015, 07:16 | #3 |
Участник
|
Цитата:
Сообщение от AndyD
А почему не хотите воспользоваться DictClass.extendedBy()?
Спасибо, буду за компом проверю. |
|
11.05.2015, 19:49 | #4 |
Участник
|
Все замечательно, DictClass.extendedBy() работает сразу после появления нового класса.
Только скорость вызова extendedBy первый раз в сессии очень сильно меньше, чем поиск по xRefTypeHierarchy. Последующие вызовы по скорости одинаковы (судя по всему, результаты кэшируются). Мне часто придется вызывать поиск в новых сессиях (NET коннектор). Поэтому надеяться на кэш не приходится. Попробую скрестить скорость поиска по xRefTypeHierarchy и независимость от перекрестных ссылок extendedBy. |
|
|
|