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

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

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

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

Возможно, что существует альтернативный метод. Вообще не использовать %ZEN.Report.reportPage
...
Рейтинг: 0 / 0
Вывод графиков в *.pdf отчет
    #38873077
О-О-О
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Фактически мне нужен не запрос, а просто получить массив данных, причем однородных и всегда идентичных как по размеру полей, так и по их продолжительности.
Цена с интервалом в 60 сек за 1 рабочий день. Это получается 520 точек в виде линейного графика.
...
Рейтинг: 0 / 0
Вывод графиков в *.pdf отчет
    #38873096
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О-О-Оделать выборку из БД и не использовать SQL запросыЭто я и предложил. Использование таких запросов, помогает в этом. Не имея SQL таблиц получать выборку в SQL формате.
кстати потом вы сможете даже SQL запрос выполнить по вашим данным.
...
Рейтинг: 0 / 0
Вывод графиков в *.pdf отчет
    #38873168
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О-О-О ,
  • 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
Вывод графиков в *.pdf отчет
    #38873354
О-О-О
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо 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
Вывод графиков в *.pdf отчет
    #38873548
VadimF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О-О-ОТогда вопрос немного переопределю.

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

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

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

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

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


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