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(); Пока в голову приходит пробег по всем классам с проверкой того входит ли он в иерархию базового класса. Может быть есть какие-то другие способы определения иерархии? |
|
|
|