Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?

Официальный форум Simple-Scada.

Автор Тема: ReportBuild  (Прочитано 4222 раз)

Виктория

  • Пользователь
  • **
  • Сообщений: 87
    • Просмотр профиля
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;
« Изменён: 18 Сентября 2019, 11:59:49 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3215
    • Просмотр профиля
    • Simple-Scada
Re: ReportBuild
« Ответ #1 : 18 Сентября 2019, 10:28:35 »
Здравствуйте.

В коде Вы используете перевод времени в строку через "TimeToStr" для имени файла. По умолчанию эта функция будет возвращать время в формате "09:44:00", т.е. с разделителем ":", который запрещён в Windows для использования в именах файлов и папок. Поэтому нужно избавиться от этих символов. Это можно сделать установив свой формат времени через процедуру SetTimeFormat. Лучше всего вместо функций конвертации даты времени в строку и использовать специальную функцию DateTimeToFileName которая всегда генерирует уникальной имя из 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, как описано в руководстве здесь.
Если после вышеописанных действий отчет не строится и не открывается для просмотра то напишите нам об этом, можно будет проверить другие пункты.
« Изменён: 18 Сентября 2019, 12:00:00 от Simple-Scada »

Виктория

  • Пользователь
  • **
  • Сообщений: 87
    • Просмотр профиля
Re: Report_build
« Ответ #2 : 18 Сентября 2019, 10:38:09 »
Формат даты и времени я выставляла:
SetDateFormat('dd.mm.yyyy');
SetTimeFormat('hh.nn.ss').
Папка для отчетов была создана ранее на диске С.
В пути прописала "\", но это не помогло.
В старой версии SCADA 2.3.4.0 отчеты генерировались, но там функция была ReportExportClient. В новой версии я уже использовала новый функционал Build, Save, View.
Отчет не открывается, как сформируется и нигде не сохраняется (даже в папке Projects/Report пусто). Хотя в журнале сервера пишет, что отчет построен и отправлен клиентам.

Виктория

  • Пользователь
  • **
  • Сообщений: 87
    • Просмотр профиля
Re: Report_build
« Ответ #3 : 18 Сентября 2019, 10:41:32 »
Вот скрин журнала сервера.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3215
    • Просмотр профиля
    • Simple-Scada
Re: Report_build
« Ответ #4 : 18 Сентября 2019, 11:40:51 »
А данный скрипт выполняется по нажатию на кнопку (событие OnClick) или по какому-то другому событию?

Виктория

  • Пользователь
  • **
  • Сообщений: 87
    • Просмотр профиля
Re: Report_build
« Ответ #5 : 18 Сентября 2019, 11:45:38 »
формирование отчета сделано в скрипте ежесекундном по условию IF.
на старой версии скада 2.3.4.0 тот же код и отчеты формируются.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3215
    • Просмотр профиля
    • Simple-Scada
Re: ReportBuild
« Ответ #6 : 18 Сентября 2019, 11:57:19 »
В этом и заключается ошибка. См. описание функции GetClientName. Секундные скрипты вызываются сервером скады и какой-либо клиент не причастен к вызову такого скрипта. Соответственно функция GetClientName в нём не сработает и вернёт пустую строку. В старых версиях скады была ошибка при которой если имя клиента пустое, то отчет будет отправлен всем клиентам.

В результате нужно через Options.exe на каждом клиентском ПК задать имя клиента, например "my_client", а затем строкить отчёт для этого клиента, указывая его имя напрямую:
Код: (delphi)
areport := ReportBuild('areport');
areport.View('my_client');

Второй вариант: если требуется открыть отчет для просмотра на всех клиентах сразу, то нужно использовать константу SS_ALL_CLIENTS, например:
Код: (delphi)
areport := ReportBuild('areport');
areport.View(SS_ALL_CLIENTS);
, аналогично для areport.Save.
« Изменён: 18 Сентября 2019, 12:01:37 от Simple-Scada »

Виктория

  • Пользователь
  • **
  • Сообщений: 87
    • Просмотр профиля
Re: ReportBuild
« Ответ #7 : 18 Сентября 2019, 12:05:05 »
спасибо, все работает :)