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

 

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 сервера:

 

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.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 сервера. При добавлении функции к такому событию не будет ошибки, просто добавленная функция не будет вызвана. Все поддерживаемые варианты указаны в разделе Список событий генератора отчетов.