Приложение 3

Текст программы экспорта классов из 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