Подключение SQL адаптеров данных
Для построения отчетов, генератор отчетов позволяет использовать данные из различных SQL источников. Поскольку чистый JavaScript не имеет встроенных методов для работы с удаленными базами данных, эта функциональность реализуется с помощью серверного Python кода.
Изменение параметров подключения и запроса данных
Для работы с SQL источниками данных не требуется никаких дополнительных действий, все адаптеры данных уже подключены и настроены для работы. При необходимости обработки параметров, используемых для подключения к данным, предусмотрено событие onBeginProcessData у объекта отчета. Данное событие может быть вызвано как на стороне клиента, так и на стороне сервера. В аргументах события будут переданы все необходимые параметры подключения к SQL источнику данных, а также параметры SQL запроса. Подробное описание доступных значений аргументов находится в разделе События генератора отчетов.
Все параметры подключения к источнику данных могут быть изменены как на стороне клиента, так и на стороне сервера. Например, требуется изменить SQL запрос на стороне клиента, а строку подключения на стороне сервера:
app.py |
from stimulsoft_reports.events import StiDataEventArgs from stimulsoft_reports.report import StiReport
def beginProcessData(args: StiDataEventArgs): if args.connection == 'MyConnectionName': args.connectionString = 'Server=localhost;Database=test;uid=root;password=******;'
report = StiReport() report.onBeginProcessData += beginProcessData report.onBeginProcessData += 'beginProcessData' report.loadFile(url_for('static', filename='reports/SimpleList.mrt')) report.render()
|
report.html |
<script> function beginProcessData(args) { if (args.dataSource == "MyDataSource") args.queryString = "SELECT * FROM ProductsTable"; } </script>
|
Для каждого SQL источника данных можно задать параметры SQL запроса, которые хранятся в самом источнике данных в виде коллекции. Эта коллекция также передается в аргументах события. Она представляет собой массив из объектов, содержащих имя параметра, его тип и значение, например:
app.py |
from stimulsoft_reports.events import StiDataEventArgs
def beginProcessData(args: StiDataEventArgs): args.parameters = [ { name: 'ParameterString', type: 752, typeName: 'Text', value: 'Text value' }, { name: 'ParameterInt', type: 3, typeName: 'Int32', value: 20 } ]
|
Допустимо изменять значения параметров запроса, при этом тип нового значения должен соответствовать типу изменяемого параметра, например:
app.py |
from stimulsoft_reports.events import StiDataEventArgs
def beginProcessData(args: StiDataEventArgs): if args.parameters != None: args.parameters['Parameter1'].value = 'TableName'
|
Информация |
Все типы параметров SQL запроса будут соответствовать доступным типам таблиц базы данных, к которой осуществляется подключение. Подробнее о параметрах SQL запроса рассмотрено в этом разделе в главе Использование параметров в SQL запросе.
|
Таким образом, в событии onBeginProcessData можно узнать тип базы данных, имя подключения и имя источника данных, а также узнать и при необходимости скорректировать строку подключения и SQL запрос на получение данных, установить значения параметров запроса. При изменении значений аргументов на стороне сервера, измененные значения не будут переданы на сторону клиента, поэтому здесь можно использовать конфиденциальные данные, такие как логин и пароль в строке подключения, имена и префиксы таблиц и т.п.
Для просмотра либо корректировки загруженных данные перед их подключением и построением отчета, предусмотрено событие onEndProcessData у объекта отчета. В аргументах события будут переданы все необходимые параметры подключения к SQL источнику данных, а также результат выполнения запроса, содержащий названия колонок, типы колонок и строки данных, полученные из SQL источника. Подробное описание доступных значений аргументов находится в разделе События генератора отчетов.
Объект данных выполненного SQL запроса имеет следующую структуру:
app.py |
from stimulsoft_reports.events import StiDataEventArgs from stimulsoft_reports.report import StiReport
def endProcessData(args: StiDataEventArgs): args.result = { columns: ['id', 'username', 'phone'], types: ['int', 'string', 'string'], rows: [ [1, 'Mario Pontes', '555-6874'], [2, 'Helen Bennett', '555-2376'] ] }
report = StiReport() report.onEndProcessData += endProcessData report.onEndProcessData += 'endProcessData' report.loadFile(url_for('static', filename='reports/SimpleList.mrt')) report.render()
|
report.html |
<script> function endProcessData(args) { args.result = { columns: ["id", "username", "phone"], types: ["int", "string", "string"], rows: [ [1, "Mario Pontes", "555-6874"], [2, "Helen Bennett", "555-2376"] ] }; } </script>
|
Доступные свойства объекта данных указаны в таблице:
Наименование |
Описание |
columns |
Имена колонок таблицы SQL источника данных. |
types |
Типы колонок таблицы SQL источника данных, приведенные к известным типам для генератора отчетов. |
rows |
Строки данных SQL источника данных, представляет собой массив из массивов всех строк таблицы. |
Все данные результата выполнения SQL запроса можно скорректировать, в этом случае после завершения события, построение отчета будет выполнено с уже измененными данными.
Использование параметров в SQL запросе
При необходимости, можно использовать параметры в SQL запросе. Для этого, в источнике данных необходимо добавить параметры в специальную коллекцию, для каждого параметра установить необходимый тип и значение по умолчанию. После этого, параметры можно использовать в SQL запросе следующим образом:
SQL Data Source |
SELECT * FROM @Parameter1 WHERE UserID = @Parameter2
|
Все значения параметров будут переданы на сторону сервера в виде отдельной коллекции, и могут быть проверены и изменены перед выполнением SQL запроса. Для доступа к значением параметров, необходимо воспользоваться коллекцией args.parameters в событии onBeginProcessData, например:
app.py |
from stimulsoft_reports.events import StiDataEventArgs
def beginProcessData(args: StiDataEventArgs): if args.dataSource == 'DataSourceWithParams': args.parameters['Parameter1'].value = 'TableName' args.parameters['Parameter2'].value = 10
|
Информация |
Новые значения параметров в данной коллекции не будут переданы на сторону клиента, поэтому допустимо на стороне Python сервера присваивать конфиденциальные данные в качестве значений.
|
Использование переменной отчета в качестве SQL параметра
Предусмотрена возможность использования переменной в качестве SQL параметра. Для этого в редакторе переменной отчета достаточно установить свойство Allow using as SQL parameter, после чего ее можно использовать в любом SQL запросе. Синтаксис будет точно таким же, как и при использовании параметров в источнике данных.
Информация |
Такая переменная будет передана в коллекции параметров только в том случае, если она используется в запросе. Параметры из коллекции источника данных передаются всегда, даже если в запросе они не использованы.
|
Экранирование значений параметров
Все значения параметров будут автоматически экранированы для исключения возможности SQL инъекций и нарушения безопасности выполнения запросов. Если вам не требуется экранирование, и вы сами контролируете безопасность значений параметров, автоматическое экранирование можно отключить. Для этого достаточно установить свойство escapeQueryParameters в значение False у обработчика событий:
app.py |
from stimulsoft_reports.report import StiReport
@app.route('/report', methods = ['GET', 'POST']) def report(): report = StiReport() report.handler.escapeQueryParameters = False if report.processRequest(request): return report.getFrameworkResponse()
|
После установки указанного свойства использование параметров является небезопасным, вам нужно строго контролировать значения перед выполнением SQL запросов.
Информация |
Экранирование применяется только для параметров SQL запросов, а также для переменных, используемых как параметры. Если переменная используется в виде выражения, т.е. в фигурных скобках, например {VariableName}, то экранирование применяться не будет в любом случае. Подробное описание работы переменных находится в разделе Работа с переменными отчета.
|