Текст программы экспорта классов из Cache в Обобщенный документ
getclass
; смотрим список всех имеющихся классов
New result, classname, cdef, superclass, a, i, j, Tmp1, Tmp2, Tmp3, x, y, TmpC,
TmpS,
; получение объектной ссылки на множество экземпляров классов
Set result=##class(%ResultSet).%New("%ClassDefinition.ClassInfo")
Do result.Execute()
For Quit:result.Next()=0 Do
. Set classname = result.GetDataByName("Name") ; получение имени очередного
класса
. Do GetProp(classname)
; формирование вспомогательных массивов Tmp2 и Tmp3
Set x = “”
For Set x = $Order(Tmp1(x)) Quit: x=“” Do ; запись в переменную x имени
;
следующего по порядку класса из массива Tmp1
. Set TmpC = x, a=0, y = x, TmpS2=" "
. Set TmpS=Tmp1(y, “Super”) ; запись в переменную TmpS имени родительского
класса
. For Quit:TmpS=“” Do ; выход из цикла, если нет родительского класса, иначе
переход на верхний уровень
; иерархии
.. Set TmpS=Tmp1(y, “Super”) Quit: TmpS = “ ”
.. Set a=a+1, TmpS2=TmpS, y = TmpS
.Set Tmp2(TmpC,TmpS2,a)= “” ; запись в массив Tmp2 имя класса, имя родительского
класса, номер уровня
; иерархии
.Set i=0
.If ‘$Data(Tmp3(TmpS2)) Do
.. Set Tmp3(TmpS2)= i, i=i+1
.. Quit
.Else Quit
; формирование потока
Set x = “”
For Set x=$Order(Tmp2(x)) Quit: x=“” Do ; запись в переменную x имени следующего
;
по порядку класса из массива Tmp2
. Set superclass = Tmp1(x, “Super”) ; запись в переменную superclass имени
родительского класса
. Set y = “”
. Set a = $Order(Tmp2(x, superclass, )) ; извлечение номера уровня иерархии
класса из Tmp2
. Set:TmpS="" TmpS=" "
. For y=$Order(Tmp1(x, “Property”, y)) Quit: y=“” Do ; запись в переменную
y имени
;
следующего по порядку свойства класса
.. Set Potoc(Tmp3(superclass), “Yfeat”, “level”, a+2, y) = “”
Q
GetProp(classname) ;Функция сохранения
свойств заданного класса в массив Tmp1
if classname="" Quit:$Q "" Q
Set cdef=##class(%ClassDefinition).%OpenId(classname) ; получение объектной
ссылки на текущий класс
if cdef.System q 0 ; выход, если класс является системным определение свойств
Set count=cdef.Properties.Count() ; общее количество свойств
if count>0 Do
.For i=1:1:count Set Tmp1(classname, “Property”, cdef.Properties.GetAt(i).Name)
= “”
; определение родительского класса
Set superclass=cdef.Super
Set Tmp1(classname, “Super”) = superclass
Do cdef.%Close()
Q 1