Генератор отчетов позволяет использовать переменные в выражениях, запросах, фильтрах и других элементах отчета. Предусмотрена возможность предварительного просмотра и изменения значений переменных из кода перед построением отчета.

 

Значения переменных шаблона отчета

Генератор отчетов позволяет легко получить прямой доступ к переменным в шаблоне отчета через словарь данных. Для этого достаточно определить событие onBeforeRender у объекта отчета, в аргументах которого на стороне клиента будет передан JavaScript объект отчета. Подробное описание доступных значений аргументов находится в разделе События генератора отчетов..

 

Для доступа к переменной отчета, необходимо использовать JavaScript функцию getByName() у коллекции переменных в словаре данных отчета. Для изменения значения переменной, достаточно присвоить его в свойстве value, при этом нет необходимости проверять установленный тип переменной - преобразование типов будет выполнено автоматически. Например, требуется изменить строковое и целочисленное значение указанных переменных:

 

Пример изменения строкового и целочисленного значение выбранных переменных на стороне JavaScript клиента:

 

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>

 

 

 

Прямой доступ к переменным в шаблоне отчета на стороне Python сервера не предусмотрен.Прямой доступ к переменным в шаблоне отчета на стороне Python сервера не предусмотрен.

 

Информация

 

Значения переменных будут изменены в самом шаблоне отчета, и при его последующем сохранении будут сохранены в файле. Для изменения значений переменных без изменения шаблона, можно воспользоваться событием onPrepareVariables, которое вызывается при подготовке значений переменных отчета перед его построением.

 

 

 

Значения переменных при построении отчета

Генератор отчетов позволяет легко получить доступ к переменным перед построением отчета. Для этого достаточно определить событие onPrepareVariables у объекта отчета. В аргументах события будет передана коллекция переменных отчета с их типами и значениями. Если переменная инициализируется как выражение, то в коллекцию будет передано уже подсчитанное значение выражения. Подробное описание доступных значений свойств, передаваемых в аргументах события, находится в разделе События генератора отчетов.

 

В событии на стороне JavaScript клиента коллекция переменных представляет собой массив из объектов, содержащих имя переменной, ее тип и значение. Допустимо изменять значения переменных, при этом тип нового значения должен соответствовать типу изменяемой переменной.

 

report.html

 

<script>

function prepareVariables(args) {      

args.variables = [

{

name: "VariableString",

type: "String",

value: "Text value"

},

{

name: "VariableInt",

type: "Int32",

value: 20

}

];

</script>

 

 

 

Пример изменения значения переменной на стороне JavaScript клиента:

 

app.py

 

from stimulsoft_reports.report import StiReport

 

report = StiReport()

report.onPrepareVariables += 'prepareVariables'

report.loadFile(url_for('static', filename='reports/Variables.mrt'))

report.render()

 

 

 

В событии на стороне Python сервера коллекция переменных представляет собой словарь из объектов типа StiVariable, в каждом объекте хранится имя переменной, тип переменной и значение. Ключ словаря соответствует имени переменной отчета.

 

report.html

 

<script>

function prepareVariables(args) {

let variables = args.variables;

 

variables.find(item => item.name == "VariableString").value = "Text value";

variables.find(item => item.name == "VariableInt").value = 20;

}

</script>

 

 

 

На стороне Python сервера также допустимо изменять значения переменных, при этом тип нового значения должен соответствовать типу изменяемой переменной. Предусмотрена возможность создания новой переменной отчета, если это необходимо. На сторону клиента будет передана коллекция, содержащая только те переменные, значения которых были изменены, а также новые переменные.

 

Пример изменения значения переменной на стороне PHP сервера:

 

app.py

 

from stimulsoft_reports.report import StiReport

from stimulsoft_reports.events import StiVariablesEventArgs

 

def prepareVariables(args: StiVariablesEventArgs):

   args.variables['VariableString'].value = 'Text value'

   args.variables['VariableInt'].value = 20

 

report = StiReport()

report.onPrepareVariables += prepareVariables

report.loadFile(url_for('static', filename='reports/Variables.mrt'))

report.render()

 

 

 

Полный код примера доступен на GitHub.

 

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 передаются в виде строкового значения в формате "YYYY-MM-dd HH-mm-ss", либо в виде объекта типа datetime, например:

 

app.py

 

from datetime import datetime

from stimulsoft_reports.events import StiVariablesEventArgs

 

def prepareVariables(args: StiVariablesEventArgs):

   args.variables['VariableDateTime'].value = '2021-03-20 22:00:00'

   args.variables['VariableDateTime'].value = datetime.today()

 

 

 

Для изменения значения переменной типа Range, необходимо использовать вложенные значения value['from'] и value['to'] выбранной переменной в коллекции. Формат каждого из двух значений такой же, как и у простой переменной, например:

 

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, таким образом в этом событии можно дополнительно контролировать установленные значения, и при необходимости выполнять их корректировку.