Подключение файлов данных
Как правило, параметры подключения к источникам данных хранятся в самом шаблоне отчета. Для работы с файловыми источниками данных, такими как XML, JSON, CSV не требуется никаких дополнительных действий, все алгоритмы находятся в скрипте генератора отчетов.
Для просмотра и изменения параметров подключения файловых данных перед их загрузкой, необходимо определить событие onBeginProcessData у компонента. В аргументах события будет передана информация о подключении к файловому источнику данных - имя и тип подключения в шаблоне отчета, а также путь к файлу данных. Подробное описание доступных значений свойств, передаваемых в аргументах события, находится в разделе События генератора отчетов.
Допускается изменить путь к файлу данных. В этом случае после завершения события, генератор отчетов будет запрашивать файл по новому пути, заданному в аргументах. Например, требуется для указанного соединения изменить путь к JSON файлу данных:
app.py |
from stimulsoft_reports.report import StiReport from stimulsoft_reports.events import StiDataEventArgs
def beginProcessData(args: StiDataEventArgs): if args.connection == 'MyJsonConnection': args->pathData = 'Data/Demo.json'
report = StiReport() report.onBeginProcessData += beginProcessData report.loadFile(url_for('static', filename='reports/SimpleList.mrt')) report.render()
|
При необходимости, те же самые действия можно выполнить в событии на стороне JavaScript клиента:
report.html |
<script> function beginProcessData(args) { if (args.connection == "MyJsonConnection") args.pathData = "Data/Demo.json"; } </script>
|
Информация |
Для XML источника данных событие onBeginProcessData будет вызвано дважды: первый раз для чтения XSD схемы, второй раз для чтения самого XML файла данных.
|
Для просмотра либо корректировки загруженных данных перед их подключением и построением отчета, необходимо определить событие onEndProcessData у компонента. В аргументах события будет передана информация о подключении к файловому источнику данных - имя и тип подключения, сохраненные в шаблоне отчета, а также результат загрузки данных, содержащий загруженные данные в виде строки. Подробное описание доступных значений свойств, передаваемых в аргументах события, доступно в разделе События генератора отчетов.
app.py |
from stimulsoft_reports.report import StiReport from stimulsoft_reports.events import StiDataEventArgs
def endProcessData(args: StiDataEventArgs): data = args.result.data
report = StiReport() report.onEndProcessData += endProcessData report.loadFile(url_for('static', filename='reports/SimpleList.mrt')) report.render()
|
При необходимости, просмотр либо корректировку загруженных данных можно выполнить в событии на стороне JavaScript клиента. В аргументах события будет передана информация о подключении к файловому источнику данных - имя и тип подключения, сохраненные в шаблоне отчета, а также подготовленный объект DataSet, содержащий таблицы и строки данных, полученных из файлового источника. Подробное описание доступных значений аргументов находится в разделе События генератора отчетов.
app.py |
from stimulsoft_reports.report import StiReport
report = StiReport() report.onEndProcessData += 'endProcessData' report.loadFile(url_for('static', filename='reports/SimpleList.mrt')) report.render()
|
report.html |
<script> function endProcessData(args) { let dataSet = args.dataSet; } </script>
|
Информация |
Компоненты вьювер отчетов и дизайнер отчетов также имеют свойство указанные выше события, при помощи которых можно управлять загрузкой данных указанным выше способом.
|
Отключение обработки файловых адаптеров данных на стороне сервера
По умолчанию, загрузка файловых данных осуществляется на стороне сервера. Это необходимо, если требуется контролировать параметры подключения и сами данные в событиях на стороне сервера. Если в этом нет необходимости, обработку файловых данных на стороне сервера можно отключить. В этом случае загрузка данных будет осуществляться при помощи JavaScript, это немного упростит цепочку событий и ускорит загрузку данных.
Для отключения файловых адаптеров данных на стороне сервера, достаточно установить свойство allowFileDataAdapters у обработчика событий в значение False, например:
index.php |
from stimulsoft_reports.report import StiReport
report = StiReport() report.handler.allowFileDataAdapters = False
|
Использование переменных в файловых данных
Предусмотрена возможность использовать переменные в виде выражений (а также использовать выражения) при указании пути к файловому источнику данных. Переменная или выражение задаются в фигурных скобках. Допустимо использовать несколько выражений в любом месте пути к файлу данных, например:
File Data Source |
https://localhost/data/{VariableJsonFileName}.json https://localhost/data/json?id={VariableId} https://localhost/{VariableCategory}/{VariableId}
|
Таким образом, один источник данных может быть преобразован к REST синтаксису, это избавит от необходимости создавать несколько схожих источников данных для получения однотипных данных. А в совокупности с серверной Python логикой и событиями генератора отчетов, сделать источник данных еще более гибким.
Также можно использовать данные для создания отчетов, полученные из хранилищ OData. В этом случае необходимо выполнить авторизацию, используя имя пользователя, пароль пользователя или токен. Параметры авторизации указываются в строке подключения к хранилищу OData с помощью символа ";" разделитель.
report.html |
<script> function beginProcessData(args) { let report = args.report;
// Authorization using a user account let oDataDatabase = new Stimulsoft.Report.Dictionary.StiODataDatabase("OData", "OData", "https://services.odata.org/V4/Northwind/Northwind.svc;AddressBearer=adress;UserName=UserName;Password=Password;Client_Id=Your Client ID", false, null);
// Authorization using a user token let oDataDatabase = new Stimulsoft.Report.Dictionary.StiODataDatabase("OData", "OData", "https://services.odata.org/V4/Northwind/Northwind.svc;Token=Enter your token", false, null);
report.dictionary.databases.add(oDataDatabase); report.dictionary.synchronize();
// Query with data filter var productsDataSource = report.dictionary.dataSources.getByName("Products"); if (productsDataSource != null) productsDataSource.sqlCommand = "Products?filter=ProductID eq 2"; } </script>
|