Гость
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Вывод графиков в *.pdf отчет / 8 сообщений из 8, страница 1 из 1
06.02.2015, 08:58
    #38872999
О-О-О
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод графиков в *.pdf отчет
Всем добрый день.

Возникла необходимость делать отчет по графикам (сохранять дневной результат).
Делал это вручную по итогам дня (обычный скриншот 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>
.....................
2 - Вывод непосредственно страницы, где наполняются данными страница. Class TestStrateg.FullDaySBERm1m8 Extends TestStrateg.FullDayAbstrakt
{
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.
Требуется то только выбрать данные по цене из соответсвующей БД.
...
Рейтинг: 0 / 0
06.02.2015, 09:55
    #38873030
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод графиков в *.pdf отчет
Если честно, давно не пользовался ZEN-Reports.
Но уверен если там нужны данные на основе SQL запроса, то можно получить их без SQL
есть такая штука как Class Query . Обычно используются для того чтобы описать некий SQL запрос, часто параметризованный. И дергать его из другого места, довольно просто, и он уже прекомпилированный, что лучше для производительности.
Но также есть возможность написать свой вывод данных в таком запросе. Это как раз подойдет вам. Так вы можете описать получение ваших данных, и использовать их в ZEN Reports. Документация
...
Рейтинг: 0 / 0
06.02.2015, 10:18
    #38873066
О-О-О
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод графиков в *.pdf отчет
Тогда вопрос немного переопределю.

Можно ли выводить графики, не используя параметр <dataController>
и в тоже время делать выборку из БД и не использовать SQL запросы. Тогда генерация отчета будет простой.

То что предложил DAiMor буду смотреть, но для меня это все равно что арбуз для пингвина.
Все новое и непонятное.

Возможно, что существует альтернативный метод. Вообще не использовать %ZEN.Report.reportPage
...
Рейтинг: 0 / 0
06.02.2015, 10:24
    #38873077
О-О-О
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод графиков в *.pdf отчет
Фактически мне нужен не запрос, а просто получить массив данных, причем однородных и всегда идентичных как по размеру полей, так и по их продолжительности.
Цена с интервалом в 60 сек за 1 рабочий день. Это получается 520 точек в виде линейного графика.
...
Рейтинг: 0 / 0
06.02.2015, 10:36
    #38873096
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод графиков в *.pdf отчет
О-О-Оделать выборку из БД и не использовать SQL запросыЭто я и предложил. Использование таких запросов, помогает в этом. Не имея SQL таблиц получать выборку в SQL формате.
кстати потом вы сможете даже SQL запрос выполнить по вашим данным.
...
Рейтинг: 0 / 0
06.02.2015, 11:27
    #38873168
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод графиков в *.pdf отчет
О-О-О ,
  • SQL-доступ к NoSQL-данным: реализация SQL-процедуры в Caché с динамическим определением возвращаемых метаданных
  • 6527027
    ПримерClass demo.test [ Abstract ] { Query test(N As %Integer = 4) As %Query(ROWSPEC = "ID:%String,Name:%String") [ SqlProc ] { } ClassMethod testExecute(   ByRef qHandle As %Binary,   N As %Integer = 4) As %Status {   // здесь получаем данные как угодно: хоть через sql, хоть через глобалы   f i=1:1:N s qHandle(i)=$lb(i,"Name"_i)   s qHandle=1   s qHandle("max")=N   q $$$OK } ClassMethod testFetch(   ByRef qHandle As %Binary,   ByRef Row As %List,   ByRef AtEnd As %Integer = 0) As %Status [ PlaceAfter = testExecute ] {   if (qHandle>qHandle("max")) {     s Row=""     s AtEnd=1   }else{     s Row=qHandle(qHandle)     s qHandle=qHandle+1   }   q $$$OK } ClassMethod testClose(ByRef qHandle As %Binary) As %Status [ PlaceAfter = testExecute ] {   q $$$OK } }
    Результат:
    Код: plaintext
    call demo.test_test(3) IDName1Name12Name23Name3 select * from demo.test_test() IDName1Name12Name23Name34Name4 Using Callback Charts in Zen Reports
    ПримерClass demo.report 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="10" seriesTypes="area,bar,line,line" lineStyle="stroke-width:1px;" ongetData="getChartData" > <xAxis id="xAxis" /> <yAxis id="yAxis"    baseValue="0"    minValue=""     maxValue=""     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) } }
...
Рейтинг: 0 / 0
06.02.2015, 13:56
    #38873354
О-О-О
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод графиков в *.pdf отчет
Спасибо 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
...
Рейтинг: 0 / 0
06.02.2015, 16:24
    #38873548
VadimF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод графиков в *.pdf отчет
О-О-ОТогда вопрос немного переопределю.

Можно ли выводить графики, не используя параметр <dataController>
и в тоже время делать выборку из БД и не использовать SQL запросы. Тогда генерация отчета будет простой.

То что предложил DAiMor буду смотреть, но для меня это все равно что арбуз для пингвина.
Все новое и непонятное.

Возможно, что существует альтернативный метод. Вообще не использовать %ZEN.Report.reportPage

O-O-O предлагаю провести техническую встречу с нашими консультантами и обсудить варианты решения ваших проблем.
Напишите мне, если это интересно.

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


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