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