|
Как при компиляции данного класса создать новый класс?
|
|||
---|---|---|---|
#18+
Я уже знаю как создать новый класс программно ( пример ) Подскажите, пожалуйста: как запустить метод создания нового класса во время компиляции другого класса, т.е. как сделать класс, при компиляции которого бы автоматом создавался новый класс? как при этом сделать так, чтобы сообщения компилятора попадали в окно вывод студии? или это автоматом получится? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2015, 17:39 |
|
Как при компиляции данного класса создать новый класс?
|
|||
---|---|---|---|
#18+
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 А вы какую задачу решаете? Зачем вам это нужно? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2015, 17:48 |
|
Как при компиляции данного класса создать новый класс?
|
|||
---|---|---|---|
#18+
konstantin_11Я уже знаю как создать новый класс программно ( пример ) Подскажите, пожалуйста: как запустить метод создания нового класса во время компиляции другого класса, т.е. как сделать класс, при компиляции которого бы автоматом создавался новый класс? как при этом сделать так, чтобы сообщения компилятора попадали в окно вывод студии? или это автоматом получится? В любом методе вставьте директиву препроцессора #execute commands например #execute w !,$zv,! При компиляции класса будет работать генератор соответствующих ему рутин, потом компиляция этих рутин, и эти команды выполнятся. Все что выводится через write, это все будет попадать в окно вывода студии. В этом контесте и делайте класс. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2015, 17:59 |
|
Как при компиляции данного класса создать новый класс?
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2015, 18:02 |
|
Как при компиляции данного класса создать новый класс?
|
|||
---|---|---|---|
#18+
konstantin_11как при этом сделать так, чтобы сообщения компилятора попадали в окно вывод студии? или это автоматом получится? Compiler Qualifiers :Пример Код: plaintext 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2015, 18:11 |
|
Как при компиляции данного класса создать новый класс?
|
|||
---|---|---|---|
#18+
Я подгружаю 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) } } ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2015, 18:28 |
|
Как при компиляции данного класса создать новый класс?
|
|||
---|---|---|---|
#18+
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) } } продублируйте еще вот сюда пожалуйста? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2015, 19:00 |
|
Как при компиляции данного класса создать новый класс?
|
|||
---|---|---|---|
#18+
konstantin_11Я подгружаю XML из внешнего файла в класс (в XData). И я добился результата, спасибо за помощь. Привожу код на случай, если еще кому пригодится.Это не объясняет того, зачем вы это делаете ? Может вы что-то делаете не так, раз вы такое делаете ? Можете написать, зачем вам класс из одного XData ? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2015, 20:50 |
|
Как при компиляции данного класса создать новый класс?
|
|||
---|---|---|---|
#18+
DAiMorkonstantin_11Я подгружаю XML из внешнего файла в класс (в XData). Это не объясняет того, зачем вы это делаете ? Может вы что-то делаете не так, раз вы такое делаете ? Можете написать, зачем вам класс из одного XData ? Для формирования отчетов (печатных форм) в формате Word 2003 XML, в XData хранится XSL-шаблон отчета. Отдельный класс, ибо шаблон этот большой - в зависимости от отчетов - 200-500 кб -, и плохо читаемый. "Засорять" им класс генерации отчета я не хочу. Впрочем, это полезный вопрос - как сделать XData генерируемой? Я имею ввиду не в отдельном классе, а в этом же. Пока я в этом не разбирался, но и XData со свойством generated нигде в исходниках не встречал. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.01.2015, 03:34 |
|
Как при компиляции данного класса создать новый класс?
|
|||
---|---|---|---|
#18+
konstantin_11, а формируете отчеты с помощью ZEN, или чего то еще, вам обязательно нужно хранить XSL в XData ? а кто генерирует XSL и почему он генерируемый ? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.01.2015, 12:57 |
|
Как при компиляции данного класса создать новый класс?
|
|||
---|---|---|---|
#18+
konstantin_11, и остаются вопросы отладки и обработки ошибок, (тестирования?) при компиляции-генерации... Соглашусь с DAiMor, похоже вы решаете обычную задачу своеобразным способом. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.01.2015, 14:54 |
|
Как при компиляции данного класса создать новый класс?
|
|||
---|---|---|---|
#18+
DAiMorkonstantin_11, а формируете отчеты с помощью ZEN, или чего то еще, вам обязательно нужно хранить XSL в XData? а кто генерирует XSL и почему он генерируемый? Отчеты формируются из XML, содержащего данные отчета, с помощью XSL-преобразования этих данных в выходной файл Word XML. doublefintkonstantin_11, и остаются вопросы отладки и обработки ошибок, (тестирования?) при компиляции-генерации... Соглашусь с DAiMor, похоже вы решаете обычную задачу своеобразным способом. Ошибки при компиляции отображаются там же, где и обычно, не вижу тут никакой проблемы. И я не знаю готовое решение, позволяющее формировать отчеты в формате Word. К тому же я практически всё сделал. Осталась единственная проблема с кодировкой, которую мне никак не удается побороть. Суть вот в чем: XSL-преобразование с помощью %XML.XSLT.Transformer методов возвращает двоичный поток, который мне никак не удается преобразовать в текстовый с правильной кодировкой =( Код: sql 1. 2. 3. 4.
Кодировка всех потоков UTF-8 (двоичного тоже UTF-8 - сохранял в файл, проверял). Проблема в том, что при сохранении XSL результата преобразования в XData выполняется какое-то перекодирование, и результат получается неверный. Собственно, выполняется оно в этот момент Код: sql 1.
Тип у xdata.Data - %Stream.TmpCharacter, и как ему сообщить, что всё уже перекодировано и ничего перекодировать не надо - я не знаю. Попытки подсунуть в качестве dstXML поток другого типа успехом не увенчались. Наверняка ведь есть какой-то простой способ создать текстовый поток из двоичного, указав при этом кодировку? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.01.2015, 20:12 |
|
Как при компиляции данного класса создать новый класс?
|
|||
---|---|---|---|
#18+
Да, если чем-то поможет - при выводе двоичного потока на экран, или при преобразовании его в TmpCharacter и затем выводе на экран, он перекодируется в CP-1251, при сохранении в XData класса - в ISO-8859-1. По крайней мере так говорит декодер . Похоже, что кодировка потоку просто не сопоставлена (что, вобщем-то, и логично), и разные средства транслируют его как хотят. Где-то дефолтная кодировка CP-1251, где-то ISO-8859-1... ... |
|||
:
Нравится:
Не нравится:
|
|||
30.01.2015, 20:38 |
|
Как при компиляции данного класса создать новый класс?
|
|||
---|---|---|---|
#18+
Вроде как проблем с кодировкой не заметил, кусок кода ...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() } ... |
|||
:
Нравится:
Не нравится:
|
|||
30.01.2015, 22:25 |
|
Как при компиляции данного класса создать новый класс?
|
|||
---|---|---|---|
#18+
konstantin_11Отчеты формируются из XML, содержащего данные отчета, с помощью XSL-преобразования этих данных в выходной файл Word XML. Как бы это тоже не объясняет необходимости использования XData. почему не использовать оригинальный файл XSL в виде файла а не XData? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2015, 09:04 |
|
Как при компиляции данного класса создать новый класс?
|
|||
---|---|---|---|
#18+
DAiMorkonstantin_11Отчеты формируются из XML, содержащего данные отчета, с помощью XSL-преобразования этих данных в выходной файл Word XML. Как бы это тоже не объясняет необходимости использования XData. почему не использовать оригинальный файл XSL в виде файла а не XData? Не вижу необходимости выгружать XSL из XData в файл, чтобы затем с его помощью выполнять какие-либо преобразования. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2015, 15:29 |
|
Как при компиляции данного класса создать новый класс?
|
|||
---|---|---|---|
#18+
konstantin_11DAiMorпропущено... Как бы это тоже не объясняет необходимости использования XData. почему не использовать оригинальный файл XSL в виде файла а не XData? Не вижу необходимости выгружать XSL из XData в файл, чтобы затем с его помощью выполнять какие-либо преобразования.а я не вижу смысла загружать xsl из файла в xdata чтобы потом запускать xslt. Почему не сразу из файла это делать ? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2015, 15:39 |
|
Как при компиляции данного класса создать новый класс?
|
|||
---|---|---|---|
#18+
2acidВроде как проблем с кодировкой не заметил Проблемы возникают, если полученный на выходе XML использовать как XSL для повторного преобразования. Могу привести короткий пример, если требуется. Хотя я все же спрашивал не что я делаю не так, а как преобразовать бинарный поток в текстовый с указанием кодировки? И вообще возможно ли это? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2015, 15:42 |
|
Как при компиляции данного класса создать новый класс?
|
|||
---|---|---|---|
#18+
Да и сам TransformStream обрабатывает FileCharacterStream особым образом: // Special case for %FileCharacterStream If pOutput.%IsA("%FileCharacterStream") { Set tTranslateTable=pOutput.TranslateTable,pOutput.TranslateTable="RAW" } ... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2015, 15:46 |
|
Как при компиляции данного класса создать новый класс?
|
|||
---|---|---|---|
#18+
konstantin_112acidВроде как проблем с кодировкой не заметил Проблемы возникают, если полученный на выходе XML использовать как XSL для повторного преобразования. Могу привести короткий пример, если требуется. Хотя я все же спрашивал не что я делаю не так, а как преобразовать бинарный поток в текстовый с указанием кодировки? И вообще возможно ли это?Сейчас точно не впомню, но вроде нужно просто создать новый CharacterStream, и выполнить CopyFrom из результата преобразования или для того что в XData был. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2015, 15:47 |
|
Как при компиляции данного класса создать новый класс?
|
|||
---|---|---|---|
#18+
DAiMorkonstantin_11пропущено... Не вижу необходимости выгружать XSL из XData в файл, чтобы затем с его помощью выполнять какие-либо преобразования.а я не вижу смысла загружать xsl из файла в xdata чтобы потом запускать xslt. Почему не сразу из файла это делать ? А почему вы решили, что я загружаю xsl из файла в xdata, чтобы потом выполнить преобразование? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2015, 15:48 |
|
Как при компиляции данного класса создать новый класс?
|
|||
---|---|---|---|
#18+
konstantin_11, И кстати если очень нужно иметь возможность видеть и редактировать XSL в студии, и не нужно ничего лишнего в виде класса. То можно создать свой тип программы с поддержкой XML. И тогда в студии его можно будет редактировать и даже загружать в студию простым стандартным импортом. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2015, 15:50 |
|
Как при компиляции данного класса создать новый класс?
|
|||
---|---|---|---|
#18+
konstantin_11DAiMorпропущено... а я не вижу смысла загружать xsl из файла в xdata чтобы потом запускать xslt. Почему не сразу из файла это делать ? А почему вы решили, что я загружаю xsl из файла в xdata, чтобы потом выполнить преобразование? На основании того, что вы писали ранее 17191418 konstantin_11Я подгружаю XML из внешнего файла в класс (в XData). И я добился результата, спасибо за помощь. Привожу код на случай, если еще кому пригодится. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2015, 15:51 |
|
Как при компиляции данного класса создать новый класс?
|
|||
---|---|---|---|
#18+
DAiMor, Я подгружаю в класс шаблон отчета, XML. Просто потому что это Word документ. XSL для его преобразования ниоткуда не подгружается - он сразу написан в XData соответствующего класса. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2015, 09:08 |
|
Как при компиляции данного класса создать новый класс?
|
|||
---|---|---|---|
#18+
DAiMor, Да, и кстати, есть желание для каждого отчета иметь один класс, который его и генерирует, а не кучку файлов, хранящихся где-то на сервере. А почему идея хранить XML данные в разделах XData классов вызывает у вас такое стойкое неприятие? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2015, 09:14 |
|
|
start [/forum/topic.php?fid=39&msg=38867140&tid=1556730]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
32ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
67ms |
get tp. blocked users: |
1ms |
others: | 18ms |
total: | 160ms |
0 / 0 |