|
Вывод графиков в *.pdf отчет
|
|||
---|---|---|---|
#18+
Всем добрый день. Возникла необходимость делать отчет по графикам (сохранять дневной результат). Делал это вручную по итогам дня (обычный скриншот Windows). При анализе биржевой стратегии, когда нужно потоком обработать 60-120 дней это нереально. Требуется чтобы по итогам анализа одного торгового дня выводился отчет в pdf формате (самый простой способ сгенерировать отчет). Вот что нужно вывести в отчет: В обычном режиме, когда идет анализ одного торгового дня код следующий (составной). Состоит из 3-х блоков1 - Абстрактный класс (макет выводимых графиков) Class TestStrateg.FullDayAbstrakt Extends %ZEN.Component.abstractPage [ Abstract ] { /// Отображаемое имя для нового приложения. Parameter PAGENAME = "Основной"; /// Домен, используемый для локализации. Parameter DOMAIN; /// Этот блок Style содержит определение CSS стиля страницы. XData Style { <style type="text/css"> body,td,th { margin-left: 0px; font-size: 14px; color: #000000; background:#E2e4e2; } </style> } /// Этот XML блок описывает содержимое этой страницы. XData Contents [ XMLNamespace = " http://www.intersystems.com/zen" ] { <page xmlns=" http://www.intersystems.com/zen" title="Цена"> <spacer height="1px"/> <dataController id="CtrTcenam1" align="left" modelClass="ContrDohodAnaliz.zZERO" modelId="1" /> <svgFrame id="svgFrame" width="1510" height="1102" layout="horizontal" backgroundStyle="fill: #EEEEEE;"> <svgGroup layout="vertical"> <svgSpacer height="5" /> <svgGroup layout="horizontal"> <svgSpacer width="5" /> <comboChart id="Tcenam1" controllerId="CtrTcenam1" appearance="2D" title=" Цена 1 минута. " titleX="50" titleY="5" titleStyle="font-size: 13px; fill:#929292;" width="1500" height="340" legendVisible="false" borderOffset="0" backgroundStyle="fill:#BCBCBC;" plotAreaStyle="fill:#F9FAFB;" lineStyle="stroke-width: 1;" plotStyle="stroke-width: 0.25; fill-opacity: 1;" seriesCount="4" seriesColors="#FF0000,#22B14C,#262728,#D2D2D2" seriesTypes="line,line,line,area" markersVisible="true" markerScale="0.7" markerStyle="stroke-width: 4; fill-opacity: 1;" markerShapes="down,up,circle,circle" marginLeft="0" marginTop="0" marginRight="3" marginBottom="0" > <xAxis id="X30s1" labelAngle="5" labelStyle="font-size: 8px; " majorGridLines="true" majorGridStyle="stroke-width: 0.3; color: #E0FFFF;" labelUnits="60" majorUnits="60" minorGridLines="true" minorGridStyle="stroke-width: 0.2; color: #EEEEEE;" minorUnits="15" minValue="0" baseValue="0" maxValue="530" /> <yAxis id="Y30s1" labelAngle="45" labelStyle="font-size: 15px; font-family: Arial Narrow; fill:#222222;" majorGridLines="true" majorGridStyle="stroke-width: 0.3; color: #E0FFFF;" labelUnits="" majorUnits="" labelPosition="right" minorGridLines="false" minorUnits="" minorGridStyle="stroke-width: 4.0; color: #EEEEEE;" minValue="" baseValue="" maxValue="" /> </comboChart> </svgGroup> ..................... { Method %OnAddToPageAfter() As %Status { .... Set ..%page.%GetComponentById("Y30s1").labelUnits=Mashtab Set ..%page.%GetComponentById("Y30s1").majorUnits=Mashtab Set ..%page.%GetComponentById("Y30s1").minValue=min Set ..%page.%GetComponentById("Y30s1").maxValue=max Set ..%page.%GetComponentById("CtrTcenam1").modelClass="TestStrateg.CntrTcenam1" Quit $$$OK }} 3 - Контроллер, выборка данных из БД (TestStrateg.CntrTcenam1). Class TestStrateg.CntrTcenam1 Extends %ZEN.DataModel.ObjectDataModel { Property i1 As %Float; Property i2 As %Float; .... Property i521 As %Float; Method %OnLoadModel(pSource As %RegisteredObject) As %Status { Set ..%seriesCount=4 Set ..%seriesNames(1)="Моя Продажа. Первый (лицевой) слой" Set ..%seriesNames(2)="Индикатор покупки акций" Set ..%seriesNames(3)="Индикатор ВЫХОДА В НОЛЬ" Set ..%seriesNames(4)="Цена" #; Начинаем заполнение массива Set EmTcprodal="DTcprodal" Set EmTckupil="DTckupil" Set EmTcZero="DTcZero" Set EmTc="Dm1Tc" Set Nr=1 For aaa="i1","i2","i3","i4","i5",...,"i520","i521" { Set pNom=Nr Set Em=##class(TestStrateg.BDTestStrateg).%OpenId(pNom) if Em="" {Goto ddt} else { Set ..%data(1,aaa)=$ZOBJPROPERTY(Em,EmTcprodal) Set ..%data(2,aaa)=$ZOBJPROPERTY(Em,EmTckupil) Set ..%data(3,aaa)=$ZOBJPROPERTY(Em,EmTcZero) Set ..%data(4,aaa)=$ZOBJPROPERTY(Em,EmTc) } Set Nr=Nr+1 } ddt Quit $$$OK } }Это все работает, но при попытке вывести в отчет - отказывается. Главная причина - Отчет (Report) не может использовать dataController<dataController id="CtrTcenam1" align="left" modelClass="ContrDohodAnaliz.zZERO" modelId="1" />В то же время, вывод графиков в отчет представлен только в трех примерах, в которых используется работа с запросами SQL (в которых я полный ноль). Неужто нет варианта делать напрямую запрос для выборки данных к Глобалам в Cache, минуя выборки с помощью запросов SQL. Требуется то только выбрать данные по цене из соответсвующей БД. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2015, 08:58 |
|
Вывод графиков в *.pdf отчет
|
|||
---|---|---|---|
#18+
Если честно, давно не пользовался ZEN-Reports. Но уверен если там нужны данные на основе SQL запроса, то можно получить их без SQL есть такая штука как Class Query . Обычно используются для того чтобы описать некий SQL запрос, часто параметризованный. И дергать его из другого места, довольно просто, и он уже прекомпилированный, что лучше для производительности. Но также есть возможность написать свой вывод данных в таком запросе. Это как раз подойдет вам. Так вы можете описать получение ваших данных, и использовать их в ZEN Reports. Документация ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2015, 09:55 |
|
Вывод графиков в *.pdf отчет
|
|||
---|---|---|---|
#18+
Тогда вопрос немного переопределю. Можно ли выводить графики, не используя параметр <dataController> и в тоже время делать выборку из БД и не использовать SQL запросы. Тогда генерация отчета будет простой. То что предложил DAiMor буду смотреть, но для меня это все равно что арбуз для пингвина. Все новое и непонятное. Возможно, что существует альтернативный метод. Вообще не использовать %ZEN.Report.reportPage ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2015, 10:18 |
|
Вывод графиков в *.pdf отчет
|
|||
---|---|---|---|
#18+
Фактически мне нужен не запрос, а просто получить массив данных, причем однородных и всегда идентичных как по размеру полей, так и по их продолжительности. Цена с интервалом в 60 сек за 1 рабочий день. Это получается 520 точек в виде линейного графика. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2015, 10:24 |
|
Вывод графиков в *.pdf отчет
|
|||
---|---|---|---|
#18+
О-О-Оделать выборку из БД и не использовать SQL запросыЭто я и предложил. Использование таких запросов, помогает в этом. Не имея SQL таблиц получать выборку в SQL формате. кстати потом вы сможете даже SQL запрос выполнить по вашим данным. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2015, 10:36 |
|
Вывод графиков в *.pdf отчет
|
|||
---|---|---|---|
#18+
О-О-О ,
... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2015, 11:27 |
|
Вывод графиков в *.pdf отчет
|
|||
---|---|---|---|
#18+
Спасибо servit Код немного изменил,привожу для остальных немножко подкорректированный код и результат. Class RobotGrafiki4.ttt Extends %ZEN.Report.reportPage { /// This is the default display mode for this report. Parameter DEFAULTMODE = "pdf"; /// This XML defines the logical contents of this report. XData ReportDefinition [ XMLNamespace = " http://www.intersystems.com/zen/report/definition" ] { <report xmlns=" http://www.intersystems.com/zen/report/definition" name="test" runonce="true"> <!-- dummy ReportDefinition, all data is gotten from callback methods ongetXXX --> </report> } /// This XML defines the display for this report. /// This is used to generate the XSLT stylesheets for both HTML and XSL-FO. XData ReportDisplay [ XMLNamespace = " http://www.intersystems.com/zen/report/display" ] { <report xmlns=" http://www.intersystems.com/zen/report/display" name="test"> <document width="8.5in" height="11in" marginLeft="1.25in" marginRight="1.25in" marginTop="1.0in" marginBottom="1.0in" headerHeight="1in"/> <body> <ccomboChart id="chart" width="500" height="400" title="Zen Combo Chart" plotAreaStyle="fill: #eeeeee;" seriesColors="red,teal,blue,orange" seriesCount="4" seriesSize="260" seriesTypes="area,line,line,line" lineStyle="stroke-width:1px;" ongetData="getChartData" > <xAxis id="xAxis" /> <yAxis id="yAxis" baseValue="0" minValue="6100" maxValue="6400" majorUnits="" minorUnits="" minorGridLines="true"/> </ccomboChart> </body> </report> } /// Get chart data Method getChartData(ByRef data, chartObject) { // здесь получаем данные как угодно: хоть через sql, хоть через глобалы //f j=0:1:9 f i=1:1:10 s data(j,i-1) = $li($lb(j+i+1, j+i+2, j+i+3, j+i+4, j+i+5, j+i+6, j+i+7, j+i+8, j+i+9, j+i+10),i) - было For aaa=1:1:260 // сделал { Set Em=##class(TestStrateg.BDTestStrateg).%OpenId(aaa) Set data(0,aaa-1)=Em.Dm1Tc Set data(1,aaa-1)=Em.DTcprodal Set data(2,aaa-1)=Em.DTckupil Set data(3,aaa-1)=Em.DTcZero } } } Дальше дело техники - описать графики как были раньше и ввести точное ко-во точек в графиках. Если их по факту меньше, чем в запросе, то будет выдаваться ошибка. Ввести исполняемый код, активирующий генерацию отчета и вывод отчета в формате TIFF. Спасибо всем и особенно servit ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2015, 13:56 |
|
Вывод графиков в *.pdf отчет
|
|||
---|---|---|---|
#18+
О-О-ОТогда вопрос немного переопределю. Можно ли выводить графики, не используя параметр <dataController> и в тоже время делать выборку из БД и не использовать SQL запросы. Тогда генерация отчета будет простой. То что предложил DAiMor буду смотреть, но для меня это все равно что арбуз для пингвина. Все новое и непонятное. Возможно, что существует альтернативный метод. Вообще не использовать %ZEN.Report.reportPage O-O-O предлагаю провести техническую встречу с нашими консультантами и обсудить варианты решения ваших проблем. Напишите мне, если это интересно. Вадим ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2015, 16:24 |
|
|
start [/forum/topic.php?fid=39&msg=38873096&tid=1556728]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
47ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
others: | 271ms |
total: | 409ms |
0 / 0 |