Simple-Scada forum

Simple-Scada 2 => Ваши вопросы => Тема начата: Виктория от 18 Сентября 2019, 07:31:04

Название: ReportBuild
Отправлено: Виктория от 18 Сентября 2019, 07:31:04
Здравствуйте. Отчеты не сохраняются на новой версии SCADA, причем в журнале на сервере пишется, что отчет построен и отправлен клиентам, также заходя в report.exe и обновив данные и затем открыв предварительный просмотр - все отображается как должно быть в отчете, но отчет не сохраняется и не открывается. Прилагаю участок кода. Сам отчет имеет название в Report.exe - areport.
Код: (delphi)
var
  f: string;
  areport: TM_Report;
begin
  f := 'Отчет о работе комбайна '+ IntToStr(serial_number.Value) + ' c '+
    DateToStr(time_begin_2.Value) + ' ' + TimeToStr(time_begin_2.Value) + ' по ' +
    DateToStr(time_end_2.Value) + ' '+ TimeToStr(time_end_2.Value);

  areport := ReportBuild('areport');
  areport.View(GetClientName);
  areport.Save(GetClientName, f, 'C:\Отчеты_КП21', rfPDF);               
end;
Название: Re: ReportBuild
Отправлено: Simple-Scada от 18 Сентября 2019, 10:28:35
Здравствуйте.

В коде Вы используете перевод времени в строку через "TimeToStr" для имени файла. По умолчанию эта функция будет возвращать время в формате "09:44:00", т.е. с разделителем ":", который запрещён в Windows для использования в именах файлов и папок. Поэтому нужно избавиться от этих символов. Это можно сделать установив свой формат времени через процедуру SetTimeFormat. Лучше всего вместо функций конвертации даты времени в строку и использовать специальную функцию DateTimeToFileName (https://simple-scada.com/help/script/datetimetofilename.html) которая всегда генерирует уникальной имя из DateTime переменной исключая любые недопустимые символы.
Также при сохранении отчёта Вы указали путь 'C:\Отчеты_КП21'. Но путь обязательно должен заканчиваться символом "\". В результате правильный вариант скрипта должен быть таким:
Код: (delphi)
var
  f: string;
  areport: TM_Report;
begin
  SetTimeFormat('hh_nn_ss'); // устанавливаем допустимый для имён файлов формат времени
  f := 'Отчет о работе комбайна '+ IntToStr(serial_number.Value) + ' c '+
    DateToStr(time_begin_2.Value) + ' ' + TimeToStr(time_begin_2.Value) + ' по ' +
    DateToStr(time_end_2.Value) + ' '+ TimeToStr(time_end_2.Value);
 
  areport := ReportBuild('areport');
  areport.View(GetClientName);
  areport.Save(GetClientName, f, 'C:\Отчеты_КП21\', rfPDF);               
end;
Также папка "Отчеты_КП21" обязательно должна существовать на момент сохранения отчёта, иначе отчёт не будет сохранён.

Далее, если Вы подключаетесь к серверу с удалённого клиента (через внешний IP-адрес, например через интернет), то для передачи файлов от сервера к клиенту нужно пробросить порт 8757, как описано в руководстве здесь (https://simple-scada.com/help/manual/client.html).
Если после вышеописанных действий отчет не строится и не открывается для просмотра то напишите нам об этом, можно будет проверить другие пункты.
Название: Re: Report_build
Отправлено: Виктория от 18 Сентября 2019, 10:38:09
Формат даты и времени я выставляла:
SetDateFormat('dd.mm.yyyy');
SetTimeFormat('hh.nn.ss').
Папка для отчетов была создана ранее на диске С.
В пути прописала "\", но это не помогло.
В старой версии SCADA 2.3.4.0 отчеты генерировались, но там функция была ReportExportClient. В новой версии я уже использовала новый функционал Build, Save, View.
Отчет не открывается, как сформируется и нигде не сохраняется (даже в папке Projects/Report пусто). Хотя в журнале сервера пишет, что отчет построен и отправлен клиентам.
Название: Re: Report_build
Отправлено: Виктория от 18 Сентября 2019, 10:41:32
Вот скрин журнала сервера.
Название: Re: Report_build
Отправлено: Simple-Scada от 18 Сентября 2019, 11:40:51
А данный скрипт выполняется по нажатию на кнопку (событие OnClick) или по какому-то другому событию?
Название: Re: Report_build
Отправлено: Виктория от 18 Сентября 2019, 11:45:38
формирование отчета сделано в скрипте ежесекундном по условию IF.
на старой версии скада 2.3.4.0 тот же код и отчеты формируются.
Название: Re: ReportBuild
Отправлено: Simple-Scada от 18 Сентября 2019, 11:57:19
В этом и заключается ошибка. См. описание функции GetClientName (https://simple-scada.com/help/script/getclientname.html). Секундные скрипты вызываются сервером скады и какой-либо клиент не причастен к вызову такого скрипта. Соответственно функция GetClientName в нём не сработает и вернёт пустую строку. В старых версиях скады была ошибка при которой если имя клиента пустое, то отчет будет отправлен всем клиентам.

В результате нужно через Options.exe на каждом клиентском ПК задать имя клиента (https://simple-scada.com/help/manual/index.html?settings-simple-client.html#servset), например "my_client", а затем строкить отчёт для этого клиента, указывая его имя напрямую:
Код: (delphi)
areport := ReportBuild('areport');
areport.View('my_client');

Второй вариант: если требуется открыть отчет для просмотра на всех клиентах сразу, то нужно использовать константу SS_ALL_CLIENTS, например:
Код: (delphi)
areport := ReportBuild('areport');
areport.View(SS_ALL_CLIENTS);
, аналогично для areport.Save.
Название: Re: ReportBuild
Отправлено: Виктория от 18 Сентября 2019, 12:05:05
спасибо, все работает :)