powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Как при компиляции данного класса создать новый класс?
26 сообщений из 26, показаны все 2 страниц
Как при компиляции данного класса создать новый класс?
    #38867010
konstantin_11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я уже знаю как создать новый класс программно ( пример )

Подскажите, пожалуйста:

как запустить метод создания нового класса во время компиляции другого класса, т.е. как сделать класс, при компиляции которого бы автоматом создавался новый класс?


как при этом сделать так, чтобы сообщения компилятора попадали в окно вывод студии? или это автоматом получится?
...
Рейтинг: 0 / 0
Как при компиляции данного класса создать новый класс?
    #38867021
Александр Коблов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
konstantin_11,

Может проекции вам помогут: http://docs.intersystems.com/cache20141/csp/docbook/DocBook.UI.Page.cls?KEY=GOBJ_projections

Или генераторы: http://docs.intersystems.com/cache20141/csp/docbook/DocBook.UI.Page.cls?KEY=GOBJ_methodgen

А вы какую задачу решаете? Зачем вам это нужно?
...
Рейтинг: 0 / 0
Как при компиляции данного класса создать новый класс?
    #38867045
Фотография ну я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
konstantin_11Я уже знаю как создать новый класс программно ( пример )

Подскажите, пожалуйста:

как запустить метод создания нового класса во время компиляции другого класса, т.е. как сделать класс, при компиляции которого бы автоматом создавался новый класс?


как при этом сделать так, чтобы сообщения компилятора попадали в окно вывод студии? или это автоматом получится?

В любом методе вставьте директиву препроцессора
#execute commands
например
#execute w !,$zv,!
При компиляции класса будет работать генератор соответствующих ему рутин, потом компиляция этих рутин, и эти команды выполнятся. Все что выводится через write, это все будет попадать в окно вывода студии. В этом контесте и делайте класс.
...
Рейтинг: 0 / 0
Как при компиляции данного класса создать новый класс?
    #38867053
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
konstantin_11 ,

Или директивы препроцессора: #Execute , ##Expression, ##Function
...
Рейтинг: 0 / 0
Как при компиляции данного класса создать новый класс?
    #38867066
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
konstantin_11как при этом сделать так, чтобы сообщения компилятора попадали в окно вывод студии? или это автоматом получится? Compiler Qualifiers :Пример
Код: plaintext
1.
2.
3.
4.
5.
6.
USER>d $system.OBJ.Compile("my.class","cu-d/multicompile")

USER>d $system.OBJ.Compile("my.class","cud/multicompile")
 
Компиляция началась в 29.01.2015 17:05:41 с квалификаторами 'cud/multicompile'
Class my.class обновлён.
Компиляция успешно завершена за 0.001 сек.
...
Рейтинг: 0 / 0
Как при компиляции данного класса создать новый класс?
    #38867095
konstantin_11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я подгружаю XML из внешнего файла в класс (в XData). И я добился результата, спасибо за помощь. Привожу код на случай, если еще кому пригодится.Class Test.GenerateClass
{

ClassMethod Generate() [ CodeMode = objectgenerator ]
{
  #dim className as %String = "Test.GenerateClass.generated"
  
  #; create class definition
  set cdef = ##class(%Dictionary.ClassDefinition).%New()
  set cdef.Name = className
  
  #; open xdata file
  set file = ##class(%Library.FileCharacterStream).%New()
  set file.Filename = "C:\Temp\file.xml"
  
  #; create xdata definition
  set xdata = ##class(%Dictionary.XDataDefinition).%New()
  set xdata.Name = "XSL"
  
  #; copy xdata stream from file
  do xdata.Data.CopyFrom( file )
  do xdata.%Save()
  
  #; and add xdata definition and save the class
  do cdef.XDatas.Insert( xdata )
  do cdef.%Save()
  
  #; compile the class
  do $SYSTEM.OBJ.Compile(className)
}

}
...
Рейтинг: 0 / 0
Как при компиляции данного класса создать новый класс?
    #38867140
Шваров Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
konstantin_11Я подгружаю XML из внешнего файла в класс (в XData). И я добился результата, спасибо за помощь. Привожу код на случай, если еще кому пригодится.Class Test.GenerateClass
{

ClassMethod Generate() [ CodeMode = objectgenerator ]
{
  #dim className as %String = "Test.GenerateClass.generated"
  
  #; create class definition
  set cdef = ##class(%Dictionary.ClassDefinition).%New()
  set cdef.Name = className
  
  #; open xdata file
  set file = ##class(%Library.FileCharacterStream).%New()
  set file.Filename = "C:\Temp\file.xml"
  
  #; create xdata definition
  set xdata = ##class(%Dictionary.XDataDefinition).%New()
  set xdata.Name = "XSL"
  
  #; copy xdata stream from file
  do xdata.Data.CopyFrom( file )
  do xdata.%Save()
  
  #; and add xdata definition and save the class
  do cdef.XDatas.Insert( xdata )
  do cdef.%Save()
  
  #; compile the class
  do $SYSTEM.OBJ.Compile(className)
}

}

продублируйте еще вот сюда пожалуйста?
...
Рейтинг: 0 / 0
Как при компиляции данного класса создать новый класс?
    #38867221
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
konstantin_11Я подгружаю XML из внешнего файла в класс (в XData). И я добился результата, спасибо за помощь. Привожу код на случай, если еще кому пригодится.Это не объясняет того, зачем вы это делаете ?
Может вы что-то делаете не так, раз вы такое делаете ?
Можете написать, зачем вам класс из одного XData ?
...
Рейтинг: 0 / 0
Как при компиляции данного класса создать новый класс?
    #38867337
konstantin_11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DAiMorkonstantin_11Я подгружаю XML из внешнего файла в класс (в XData). Это не объясняет того, зачем вы это делаете ?
Может вы что-то делаете не так, раз вы такое делаете ?
Можете написать, зачем вам класс из одного XData ?
Для формирования отчетов (печатных форм) в формате Word 2003 XML, в XData хранится XSL-шаблон отчета. Отдельный класс, ибо шаблон этот большой - в зависимости от отчетов - 200-500 кб -, и плохо читаемый. "Засорять" им класс генерации отчета я не хочу. Впрочем, это полезный вопрос - как сделать XData генерируемой? Я имею ввиду не в отдельном классе, а в этом же. Пока я в этом не разбирался, но и XData со свойством generated нигде в исходниках не встречал.
...
Рейтинг: 0 / 0
Как при компиляции данного класса создать новый класс?
    #38867666
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
konstantin_11,

а формируете отчеты с помощью ZEN, или чего то еще, вам обязательно нужно хранить XSL в XData ?
а кто генерирует XSL и почему он генерируемый ?
...
Рейтинг: 0 / 0
Как при компиляции данного класса создать новый класс?
    #38867833
doublefint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
konstantin_11, и остаются вопросы отладки и обработки ошибок, (тестирования?) при компиляции-генерации...
Соглашусь с DAiMor, похоже вы решаете обычную задачу своеобразным способом.
...
Рейтинг: 0 / 0
Как при компиляции данного класса создать новый класс?
    #38868191
konstantin_11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DAiMorkonstantin_11,
а формируете отчеты с помощью ZEN, или чего то еще, вам обязательно нужно хранить XSL в XData? а кто генерирует XSL и почему он генерируемый?
Отчеты формируются из XML, содержащего данные отчета, с помощью XSL-преобразования этих данных в выходной файл Word XML.

doublefintkonstantin_11, и остаются вопросы отладки и обработки ошибок, (тестирования?) при компиляции-генерации...
Соглашусь с DAiMor, похоже вы решаете обычную задачу своеобразным способом.
Ошибки при компиляции отображаются там же, где и обычно, не вижу тут никакой проблемы. И я не знаю готовое решение, позволяющее формировать отчеты в формате Word. К тому же я практически всё сделал. Осталась единственная проблема с кодировкой, которую мне никак не удается побороть.

Суть вот в чем: XSL-преобразование с помощью %XML.XSLT.Transformer методов возвращает двоичный поток, который мне никак не удается преобразовать в текстовый с правильной кодировкой =(
Код: sql
1.
2.
3.
4.
#dim srcXML as %Stream.TmpCharacter
#dim XSL as %Stream.TmpCharacter
#dim dstXML as %Stream.TmpBinary
do ##class(%XML.XSLT.Transformer).TransformStream(srcXML, XSL, dstXML)


Кодировка всех потоков UTF-8 (двоичного тоже UTF-8 - сохранял в файл, проверял).

Проблема в том, что при сохранении XSL результата преобразования в XData выполняется какое-то перекодирование, и результат получается неверный. Собственно, выполняется оно в этот момент
Код: sql
1.
do xdata.Data.CopyFrom( dstXML )


Тип у xdata.Data - %Stream.TmpCharacter, и как ему сообщить, что всё уже перекодировано и ничего перекодировать не надо - я не знаю. Попытки подсунуть в качестве dstXML поток другого типа успехом не увенчались.

Наверняка ведь есть какой-то простой способ создать текстовый поток из двоичного, указав при этом кодировку?
...
Рейтинг: 0 / 0
Как при компиляции данного класса создать новый класс?
    #38868205
konstantin_11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, если чем-то поможет - при выводе двоичного потока на экран, или при преобразовании его в TmpCharacter и затем выводе на экран, он перекодируется в CP-1251, при сохранении в XData класса - в ISO-8859-1. По крайней мере так говорит декодер . Похоже, что кодировка потоку просто не сопоставлена (что, вобщем-то, и логично), и разные средства транслируют его как хотят. Где-то дефолтная кодировка CP-1251, где-то ISO-8859-1...
...
Рейтинг: 0 / 0
Как при компиляции данного класса создать новый класс?
    #38868237
2acid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вроде как проблем с кодировкой не заметил, кусок кода ...ClassMethod test() As %Status
{
  set xslStream = ##class(%Dictionary.CompiledXData).%OpenId(..%ClassName(1) _ "||dummyXML").Data
  
  set inStream = ##class(%FileBinaryStream).%New()
  set inStream.Filename = "C:\data.xml"
  
  set outStream = ##class(%FileCharacterStream).%New()
  set outStream.TranslateTable = "UTF8"
  set outStream.Filename = "C:\report.doc"
    
  set sc = ##class(%XML.XSLT.Transformer).TransformStream(inStream, xslStream, .outStream)
  if $$$ISERR(sc) quit sc
  
  quit outStream.%Save()
}
...
Рейтинг: 0 / 0
Как при компиляции данного класса создать новый класс?
    #38868322
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
konstantin_11Отчеты формируются из XML, содержащего данные отчета, с помощью XSL-преобразования этих данных в выходной файл Word XML.
Как бы это тоже не объясняет необходимости использования XData. почему не использовать оригинальный файл XSL в виде файла а не XData?
...
Рейтинг: 0 / 0
Как при компиляции данного класса создать новый класс?
    #38868425
konstantin_11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DAiMorkonstantin_11Отчеты формируются из XML, содержащего данные отчета, с помощью XSL-преобразования этих данных в выходной файл Word XML.
Как бы это тоже не объясняет необходимости использования XData. почему не использовать оригинальный файл XSL в виде файла а не XData?
Не вижу необходимости выгружать XSL из XData в файл, чтобы затем с его помощью выполнять какие-либо преобразования.
...
Рейтинг: 0 / 0
Как при компиляции данного класса создать новый класс?
    #38868432
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
konstantin_11DAiMorпропущено...

Как бы это тоже не объясняет необходимости использования XData. почему не использовать оригинальный файл XSL в виде файла а не XData?
Не вижу необходимости выгружать XSL из XData в файл, чтобы затем с его помощью выполнять какие-либо преобразования.а я не вижу смысла загружать xsl из файла в xdata чтобы потом запускать xslt. Почему не сразу из файла это делать ?
...
Рейтинг: 0 / 0
Как при компиляции данного класса создать новый класс?
    #38868436
konstantin_11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2acidВроде как проблем с кодировкой не заметил
Проблемы возникают, если полученный на выходе XML использовать как XSL для повторного преобразования. Могу привести короткий пример, если требуется. Хотя я все же спрашивал не что я делаю не так, а как преобразовать бинарный поток в текстовый с указанием кодировки? И вообще возможно ли это?
...
Рейтинг: 0 / 0
Как при компиляции данного класса создать новый класс?
    #38868442
konstantin_11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да и сам TransformStream обрабатывает FileCharacterStream особым образом: // Special case for %FileCharacterStream
 If pOutput.%IsA("%FileCharacterStream") {
  Set tTranslateTable=pOutput.TranslateTable,pOutput.TranslateTable="RAW"
 }
...
Рейтинг: 0 / 0
Как при компиляции данного класса создать новый класс?
    #38868445
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
konstantin_112acidВроде как проблем с кодировкой не заметил
Проблемы возникают, если полученный на выходе XML использовать как XSL для повторного преобразования. Могу привести короткий пример, если требуется. Хотя я все же спрашивал не что я делаю не так, а как преобразовать бинарный поток в текстовый с указанием кодировки? И вообще возможно ли это?Сейчас точно не впомню, но вроде нужно просто создать новый CharacterStream, и выполнить CopyFrom из результата преобразования или для того что в XData был.
...
Рейтинг: 0 / 0
Как при компиляции данного класса создать новый класс?
    #38868446
konstantin_11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DAiMorkonstantin_11пропущено...
Не вижу необходимости выгружать XSL из XData в файл, чтобы затем с его помощью выполнять какие-либо преобразования.а я не вижу смысла загружать xsl из файла в xdata чтобы потом запускать xslt. Почему не сразу из файла это делать ?
А почему вы решили, что я загружаю xsl из файла в xdata, чтобы потом выполнить преобразование?
...
Рейтинг: 0 / 0
Как при компиляции данного класса создать новый класс?
    #38868447
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
konstantin_11,

И кстати если очень нужно иметь возможность видеть и редактировать XSL в студии, и не нужно ничего лишнего в виде класса. То можно создать свой тип программы с поддержкой XML. И тогда в студии его можно будет редактировать и даже загружать в студию простым стандартным импортом.
...
Рейтинг: 0 / 0
Как при компиляции данного класса создать новый класс?
    #38868448
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
konstantin_11DAiMorпропущено...
а я не вижу смысла загружать xsl из файла в xdata чтобы потом запускать xslt. Почему не сразу из файла это делать ?
А почему вы решили, что я загружаю xsl из файла в xdata, чтобы потом выполнить преобразование?
На основании того, что вы писали ранее 17191418
konstantin_11Я подгружаю XML из внешнего файла в класс (в XData). И я добился результата, спасибо за помощь. Привожу код на случай, если еще кому пригодится.
...
Рейтинг: 0 / 0
Как при компиляции данного класса создать новый класс?
    #38868648
konstantin_11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DAiMor,

Я подгружаю в класс шаблон отчета, XML. Просто потому что это Word документ. XSL для его преобразования ниоткуда не подгружается - он сразу написан в XData соответствующего класса.
...
Рейтинг: 0 / 0
Как при компиляции данного класса создать новый класс?
    #38868649
konstantin_11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DAiMor,

Да, и кстати, есть желание для каждого отчета иметь один класс, который его и генерирует, а не кучку файлов, хранящихся где-то на сервере.

А почему идея хранить XML данные в разделах XData классов вызывает у вас такое стойкое неприятие?
...
Рейтинг: 0 / 0
Как при компиляции данного класса создать новый класс?
    #38868654
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
konstantin_11,

Просто класс, это нечто большее чем просто одно поле с XData.
И в вашем случае, этот класс вроде ничего не генерирует а просто хранит в себе XML.
...
Рейтинг: 0 / 0
26 сообщений из 26, показаны все 2 страниц
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Как при компиляции данного класса создать новый класс?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]