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

 

 

Вызов JavaScript события на стороне клиента

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

 

Пример вывода сообщения с количеством страниц полученного документа после построения отчета:

 

app.py

 

from stimulsoft_reports.report import StiReport

 

report = StiReport()

report.onAfterRender += 'afterRender'

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

report.render()

 

 

report.html

 

<script>

function afterRender(args) {

let pagesCount = args.report.renderedPages.count;

alert("The report is rendered, pages: " + pagesCount);

}

</script>

 

 

 

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

 

Информация

 

Более подробно про доступные функции и параметры JavaScript генератора отчетов можно прочитать в документации Stimulsoft Reports.JS и Stimulsoft Dashboards.JS продуктов.

 

 

 

Вызов JavaScript события на стороне Node.js сервера

При использовании Node.js платформы для работы с отчетами нет возможности вызвать JavaScript функцию по имени, т.к. HTML шаблон не используется. В таком случае, для вызова JavaScript события необходимо добавить к обработчику саму функцию в виде строки или строк кода. Аргументы события будут находиться в предварительно заданной переменной args, которую можно использовать в коде события.

 

Пример очистки словаря данных в шаблоне перед построением отчета:

 

app.py

 

from stimulsoft_reports.report import StiReport

from stimulsoft_reports.report.enums import StiEngineType

 

report = StiReport()

report.engine = StiEngineType.SERVER_NODE_JS

report.onBeforeRender += 'args.report.dictionary.clear();'

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

report.render()

 

 

Информация

 

Точно такой же способ для JavaScript событий можно использовать при отображении вьювера либо дизайнера без HTML шаблона, когда нет возможности заранее определить необходимую JavaScript функцию.

 

 

 

Вызов Python события на стороне сервера

Для вызова Python события, необходимо добавить к обработчику имя функции в виде переменной. В аргументах события будут переданы все необходимые данные, необходимые для работы определённого события. Список доступных аргументов можно посмотреть в разделе Список событий генератора отчетов.

 

Пример корректировки пароля в строке подключения перед запросом данных:

 

app.py

 

from stimulsoft_reports.events import StiDataEventArgs

 

def beginProcessData(args: StiDataEventArgs):

   args.connectionString = args.connectionString.replace('Pwd=;', 'Pwd=******;')

 

report = StiReport()

report.onBeginProcessData += beginProcessData

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

report.render()

 

 

 

В данном примере, из аргументов события можно получить и изменить все параметры подключения к базе данных.

 

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

 

Наименование

Описание

StiResult.getError('Error message')

Отображает окно с пиктограммой красного цвета с восклицательным знаком и указанным сообщением об ошибке.

StiResult.getSuccess('Info message')

Отображает окно с пиктограммой голубого цвета с иконкой «i» и указанным информационным сообщением.

False

Отображает окно с пиктограммой красного цвета с восклицательным знаком и стандартным сообщением об ошибке, с указанием названия события.

'Info message'

Работает аналогично вызову метода StiResult.getSuccess('Info message')

None

Обычная работа события без вывода сообщений. При возникновении внутренней ошибки обработчика событий, будет выведено соответствующее сообщение о возникшей ошибке.

 

 

Пример вывода различных сообщений результата работы события:

 

app.py

 

from stimulsoft_reports import StiResult

from stimulsoft_reports.designer import StiDesigner

from stimulsoft_reports.events import StiReportEventArgs

from stimulsoft_reports.report import StiReport

 

def saveReport(args: StiReportEventArgs):

   #StiResult.getError('An error occurred while saving.')

   #StiResult.getSuccess('The report was successfully saved.')

   return 'The report was successfully saved.'

 

designer = StiDesigner()

designer.onSaveReport += saveReport

 

 

Информация

 

При возникновении ошибки в самом обработчике событий, например неудача при подключении к базе данных, ошибка обработки файла и т.п. - будет выведено внутреннее сообщение в любом случае, даже если определено сообщение в событии компонента.

 

 

Информация

 

Диалоговое окно с сообщением будет показано только при использовании компонентов StiViewer либо StiDesigner. Сам генератор отчетов не содержит визуальных форм, поэтому сообщение обработки события будет выведено в консоли браузера.

 

 

 

Вызов нескольких одинаковый событий

Предусмотрена возможность добавления к обработчику событий неограниченного количества функций, они все будут сгруппированы по типу события, и вызваны последовательно в порядке добавления. Например, требуется изменить SQL запрос на стороне JavaScript клиента, а строку подключения на стороне Python сервера:

 

Пример изменения SQL запроса на стороне JavaScript клиента, и строки подключения на стороне PHP сервера:

 

app.py

 

from stimulsoft_reports.events import StiDataEventArgs

from stimulsoft_reports.report import StiReport

 

def beginProcessData(args: StiDataEventArgs):

   args.connectionString = args.connectionString.replace('Pwd=;', 'Pwd=;')

 

report = StiReport()

report.onBeginProcessData += beginProcessData

report.onBeginProcessData += 'beginProcessData'

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

report.render()

 

 

viewer.html

 

<script>

function beginProcessData(args) {

args.queryString = args.queryString.replace('TableName', 'Products')

}

</script>

 

 

Информация

 

Некоторые события могут быть вызваны только на стороне JavaScript клиента и не имеют возможности вызова события на стороне Python сервера. При добавлении функции к такому событию не будет ошибки, просто добавленная функция не будет вызвана. Все поддерживаемые варианты указаны в разделе Список событий генератора отчетов.

 

 

 

Шифрование данных, передаваемых на сторону Python сервера

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

 

Однако, если этого не требуется, либо если нужно отобразить исходные данные запроса для отладки приложения, предусмотрена возможность отключения шифрования. Для этого достаточно установить свойство encryptData в значение False у обработчика событий, после этого все данные будут передаваться в JSON формате.

 

app.py

 

from stimulsoft_reports.report import StiReport

 

report = StiReport()

report.handler.encryptData = False