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

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

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


как при этом сделать так, чтобы сообщения компилятора попадали в окно вывод студии? или это автоматом получится?
...
Рейтинг: 0 / 0
29.01.2015, 17:48
    #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
29.01.2015, 17:59
    #38867045
ну я
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как при компиляции данного класса создать новый класс?
konstantin_11Я уже знаю как создать новый класс программно ( пример )

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

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


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

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

Или директивы препроцессора: #Execute , ##Expression, ##Function
...
Рейтинг: 0 / 0
29.01.2015, 18:11
    #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
29.01.2015, 18:28
    #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
29.01.2015, 19:00
    #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
29.01.2015, 20:50
    #38867221
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как при компиляции данного класса создать новый класс?
konstantin_11Я подгружаю XML из внешнего файла в класс (в XData). И я добился результата, спасибо за помощь. Привожу код на случай, если еще кому пригодится.Это не объясняет того, зачем вы это делаете ?
Может вы что-то делаете не так, раз вы такое делаете ?
Можете написать, зачем вам класс из одного XData ?
...
Рейтинг: 0 / 0
30.01.2015, 03:34
    #38867337
konstantin_11
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как при компиляции данного класса создать новый класс?
DAiMorkonstantin_11Я подгружаю XML из внешнего файла в класс (в XData). Это не объясняет того, зачем вы это делаете ?
Может вы что-то делаете не так, раз вы такое делаете ?
Можете написать, зачем вам класс из одного XData ?
Для формирования отчетов (печатных форм) в формате Word 2003 XML, в XData хранится XSL-шаблон отчета. Отдельный класс, ибо шаблон этот большой - в зависимости от отчетов - 200-500 кб -, и плохо читаемый. "Засорять" им класс генерации отчета я не хочу. Впрочем, это полезный вопрос - как сделать XData генерируемой? Я имею ввиду не в отдельном классе, а в этом же. Пока я в этом не разбирался, но и XData со свойством generated нигде в исходниках не встречал.
...
Рейтинг: 0 / 0
30.01.2015, 12:57
    #38867666
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как при компиляции данного класса создать новый класс?
konstantin_11,

а формируете отчеты с помощью ZEN, или чего то еще, вам обязательно нужно хранить XSL в XData ?
а кто генерирует XSL и почему он генерируемый ?
...
Рейтинг: 0 / 0
30.01.2015, 14:54
    #38867833
doublefint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как при компиляции данного класса создать новый класс?
konstantin_11, и остаются вопросы отладки и обработки ошибок, (тестирования?) при компиляции-генерации...
Соглашусь с DAiMor, похоже вы решаете обычную задачу своеобразным способом.
...
Рейтинг: 0 / 0
30.01.2015, 20:12
    #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
30.01.2015, 20:38
    #38868205
konstantin_11
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как при компиляции данного класса создать новый класс?
Да, если чем-то поможет - при выводе двоичного потока на экран, или при преобразовании его в TmpCharacter и затем выводе на экран, он перекодируется в CP-1251, при сохранении в XData класса - в ISO-8859-1. По крайней мере так говорит декодер . Похоже, что кодировка потоку просто не сопоставлена (что, вобщем-то, и логично), и разные средства транслируют его как хотят. Где-то дефолтная кодировка CP-1251, где-то ISO-8859-1...
...
Рейтинг: 0 / 0
30.01.2015, 22:25
    #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
31.01.2015, 09:04
    #38868322
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как при компиляции данного класса создать новый класс?
konstantin_11Отчеты формируются из XML, содержащего данные отчета, с помощью XSL-преобразования этих данных в выходной файл Word XML.
Как бы это тоже не объясняет необходимости использования XData. почему не использовать оригинальный файл XSL в виде файла а не XData?
...
Рейтинг: 0 / 0
31.01.2015, 15:29
    #38868425
konstantin_11
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как при компиляции данного класса создать новый класс?
DAiMorkonstantin_11Отчеты формируются из XML, содержащего данные отчета, с помощью XSL-преобразования этих данных в выходной файл Word XML.
Как бы это тоже не объясняет необходимости использования XData. почему не использовать оригинальный файл XSL в виде файла а не XData?
Не вижу необходимости выгружать XSL из XData в файл, чтобы затем с его помощью выполнять какие-либо преобразования.
...
Рейтинг: 0 / 0
31.01.2015, 15:39
    #38868432
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как при компиляции данного класса создать новый класс?
konstantin_11DAiMorпропущено...

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

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

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

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

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


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