Работа с переменными отчета
Генератор отчетов позволяет использовать переменные в выражениях, запросах, фильтрах и других элементах отчета. Предусмотрена возможность предварительного просмотра и изменения значений переменных из кода перед построением отчета.
Значения переменных шаблона отчета
Генератор отчетов позволяет легко получить прямой доступ к переменным в шаблоне отчета через словарь данных. Для этого достаточно определить событие onBeforeRender у объекта отчета, в аргументах которого на стороне клиента будет передан JavaScript объект отчета. Подробное описание доступных значений аргументов находится в разделе События генератора отчетов..
Для доступа к переменной отчета, необходимо использовать JavaScript функцию getByName() у коллекции переменных в словаре данных отчета. Для изменения значения переменной, достаточно присвоить его в свойстве value, при этом нет необходимости проверять установленный тип переменной - преобразование типов будет выполнено автоматически. Например, требуется изменить строковое и целочисленное значение указанных переменных:
app.py |
from stimulsoft_reports.report import StiReport
report = StiReport() report.onBeforeRender += 'beforeRender' report.loadFile(url_for('static', filename='reports/SimpleList.mrt')) report.render()
|
report.html |
<script> function beforeRender(args) { let report = args.report;
let variableString = report.dictionary.variables.getByName("VariableString"); variableString.value = "Text value";
let variableInt = report.dictionary.variables.getByName("VariableInt"); variableInt.value = "20"; } </script>
|
Информация |
Значения переменных будут изменены в самом шаблоне отчета, и при его последующем сохранении будут сохранены в файле. Для изменения значений переменных без изменения шаблона, можно воспользоваться событием onPrepareVariables, которое вызывается при подготовке значений переменных отчета перед его построением.
|
Прямой доступ к переменным в шаблоне отчета на стороне Python сервера не предусмотрен.
Значения переменных при построении отчета
Генератор отчетов позволяет легко получить доступ к переменным перед построением отчета. Для этого достаточно определить событие onPrepareVariables у объекта отчета. В аргументах события будет передана коллекция переменных отчета с их типами и значениями. Если переменная инициализируется как выражение, то в коллекцию будет передано уже подсчитанное значение выражения. Подробное описание доступных значений аргументов находится в разделе События генератора отчетов.
В событии на стороне JavaScript клиента коллекция переменных представляет собой массив из объектов, содержащих имя переменной, ее тип и значение. Допустимо изменять значения переменных, при этом тип нового значения должен соответствовать типу изменяемой переменной.
app.py |
from stimulsoft_reports.report import StiReport
report = StiReport() report.onPrepareVariables += 'prepareVariables' report.loadFile(url_for('static', filename='reports/SimpleList.mrt')) report.render()
|
report.html |
<script> function prepareVariables(args) { args.variables = [ { name: "VariableString", type: "String", value: "Text value" }, { name: "VariableInt", type: "Int32", value: 20 } ]; </script>
|
В событии на стороне Python сервера коллекция переменных представляет собой словарь из объектов типа StiVariable, в каждом объекте хранится имя переменной, тип переменной и значение. Ключ словаря соответствует имени переменной отчета.
app.py |
from stimulsoft_reports.report import StiReport from stimulsoft_reports.events import StiVariablesEventArgs
def prepareVariables(args: StiVariablesEventArgs): variableName = args.variables['Variable1'].name variableType = args.variables['Variable1'].type variableValue = args.variables['Variable1'].value
report = StiReport() report.onPrepareVariables += prepareVariables report.loadFile(url_for('static', filename='reports/SimpleList.mrt')) report.render()
|
Допустимо изменять значения переменных, при этом тип нового значения должен соответствовать типу изменяемой переменной. Для изменения значения достаточно присвоить новое значение для свойства переменной value, например:
app.py |
from stimulsoft_reports.events import StiVariablesEventArgs
def prepareVariables(args: StiVariablesEventArgs): args.variables['VariableString'].value = 'Value from Server-Side' args.variables['VariableInt'].value = 123 args.variables['VariableDecimal'].value = 123.456
|
Переменные типа DateTime передаются в виде объекта типа datetime, для изменения его значения достаточно присвоить новый объект datetime, например:
app.py |
from datetime import datetime from stimulsoft_reports.events import StiVariablesEventArgs
def prepareVariables(args: StiVariablesEventArgs): args.variables['VariableDateTime'].value = datetime.today()
|
Переменные типа Range передаются в виде словаря, который имеет два ключа: from и to. Для доступа и изменения значений переменной Range, необходимо использовать указанные ключи. Формат каждого из двух значений такой же, как и у простой переменной. Например, требуется изменить значения переменной типа StringRange:
app.py |
from stimulsoft_reports.events import StiVariablesEventArgs
def prepareVariables(args: StiVariablesEventArgs): args.variables['VariableStringRange'].value['from'] = 'Aaa' args.variables['VariableStringRange'].value['to'] = 'Zzz'
|
Для изменения значения переменной типа List, необходимо обратиться к значению списка по его индексу. Допускается установка значений сразу всего списка в виде подготовленного массива, например:
app.py |
from stimulsoft_reports.events import StiVariablesEventArgs
def prepareVariables(args: StiVariablesEventArgs): args.variables['VariableStringList'].value[0] = 'Test' args.variables['VariableIntList'].value = [1, 22, 333]
|
Также, допускается создание новой переменной отчета, если это необходимо. Для создания новой переменной, не определенной в отчете, необходимо добавить в словарь переменных новый объект типа StiVariable, используя новое имя переменной. После этого переменную можно использовать для построения отчета, то есть в шаблоне отчета переменная сохранена не будет.
app.py |
from stimulsoft_reports.report import StiVariable from stimulsoft_reports.report.enums import StiVariableType
def prepareVariables(args: StiVariablesEventArgs): args.variables['NewVarInt'] = StiVariable('NewVarInt', StiVariableType.INT, 10)
|
После обработки события onPrepareVariables, на сторону клиента будет передана новая коллекция, содержащая только те переменные, значения которых были изменены, а также новые переменные.
Информация |
Если переменная используется в SQL запросе в виде выражения, т.е. записана в фигурных скобках, например {VariableName}, то ее значение не будет автоматически экранировано. Вам необходимо самим следить за безопасностью значений, либо использовать переменную как параметр запроса, например @VariableName. Подробное описание работы параметров находится в разделе Подключение SQL адаптеров данных.
|
Переменные отчета, передаваемые в URL запросе
Генератор отчетов имеет возможность автоматически присваивать значения переменных, переданных в URL запросе. Для этого необходимо установить свойство passQueryParametersToReport в значение True у обработчика событий:
app.py |
@app.route('/report', methods = ['GET', 'POST']) def report(): report = StiReport() report.handler.passQueryParametersToReport = True if report.processRequest(request): return report.getFrameworkResponse()
|
Все остальные действия генератор отчетов сделает автоматически. Если переменная присутствует в отчете, то ее значение будет изменено на значение из URL запроса. Если такой переменной в отчете нет - она будет создана для построения отчета, то есть в шаблоне отчета новая переменная сохранена не будет. Имена переменных, передаваемых в URL запросе, не чувствительны к регистру.
Информация |
Все значения переменных будут присвоены до вызова события onPrepareVariables, таким образом в этом событии можно дополнительно контролировать установленные значения, и при необходимости выполнять их корректировку.
|