можно ли LazReport использовать в службе?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

можно ли LazReport использовать в службе?

Сообщение jsa » 29.10.2020 10:25:39

Здравстсвуйте.
Пытаюсь проекте типа демон-служба использовать LazReport для формирования файлов pdf для рассылки.

frReport.LoadFromFile( file_maket );
frReport.PrepareReport();
frReport.ExportTo(TlrPDFExportFilter, filename );

работа прерывается на PrepareRepor

Поэтому вопрос. А LazReport вообще можно в службе использовать?

Добавлено спустя 3 часа 29 минут 40 секунд:
Отключение frReport.ShowProgress:=false; позволяет проскочить frReport.PrepareReport();
теперь проблема с формированием pdf
frReport.ExportTo(TlrPDFExportFilter, filename ); создает файл, но он размера 0 и после этого служба подвисает
jsa
постоялец
 
Сообщения: 261
Зарегистрирован: 28.11.2017 13:46:04

Re: можно ли LazReport использовать в службе?

Сообщение alexs » 30.10.2020 10:26:17

попробуй написать сначала логику в виде консольной программы - так отладить будет проще.
Скорее всего идёт вызов какой-то визуальной формы-вопроса.

Я несколько лет назад пытался с этим экспериментировать - но бросил тогда. Слишком там много зависимостей от GUI было. Недавно вроде уменьшили это. Но всё равно - очень много ограничений.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4053
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: можно ли LazReport использовать в службе?

Сообщение jsa » 30.10.2020 12:06:09

Надо будет попробовать.
А пока придется из службы вынести формирование пакета PDF и изображений в утилиту с интерфейсом и работой в ручную.
Пробовал еще сделать утилиту ( только формирование PDF) для запуска из службы. Она запускается, но ничего не делает, даже файл лога не создает. И самонезакрывается. Так что от этой идеи тоже отказался.
jsa
постоялец
 
Сообщения: 261
Зарегистрирован: 28.11.2017 13:46:04

Re: можно ли LazReport использовать в службе?

Сообщение olegy123 » 30.10.2020 12:36:56

Вроде как можно. Я делал но это было очень давно.
в винде GUI программа может спокойно работать в фоне, точнее из под другого пользователя.
у меня excel так работал переделывал xls в csv на сервере в фоне :D
jsa писал(а):и после этого служба подвисает
вполне что прав нет либо хочет поговорить с пользователем в виде диалоговых окон.

Добавлено спустя 1 минуту 55 секунд:
по поводу прав юзер sysem может быть ограничен в правах на запись в папку
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: можно ли LazReport использовать в службе?

Сообщение alexs » 30.10.2020 13:24:52

Посмотрел код экспорта в PDF - вроде ничего криминального на первый взгляд не увидел.
Должно по идее из под службы работать. Сам отчёт формируется из службы точно?
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4053
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: можно ли LazReport использовать в службе?

Сообщение jsa » 30.10.2020 15:37:34

Да в службе.
Вот кусок кода

Код: Выделить всё
     if unit_sql.SQLQuery_list4pdf.RecordCount>0 then
        begin                                                                                                           //writelog.WrLog(file_maket);
        frReport_restests:=TfrReport.Create(nil);
        frReport_restests.ShowProgress:=false;     //writelog.WrLog('ShowProgress');
        //frReport_restests.ModalPreview:=false;
        frDBDataSet_restests:=TfrDBDataSet.Create(nil);
        frDBDataSet_restests.DataSet:=unit_sql.SQLQuery_restest2pdf;   //writelog.WrLog('DataSet');
        frReport_restests.Dataset:=frDBDataSet_restests;
        frReport_restests.LoadFromFile( file_maket );        //writelog.WrLog('LoadFromFile');
        lrPDFExport_restests:= TlrPDFExport.Create(nil);
        frImageExport_restests:= TfrImageExport.Create(nil);

        while not unit_sql.SQLQuery_list4pdf.EOF do
              begin
              { формирование файла pdf }
              m_id := IsNull(unit_sql.SQLQuery_list4pdf.FieldValues['m_id'],0);
              d_id := IsNull(unit_sql.SQLQuery_list4pdf.FieldValues['d_id'],0);
              filename    := IsNull(unit_sql.SQLQuery_list4pdf.FieldValues['file_name_PDF'],'');
              unit_sql.SQLQuery_restest2pdf.Close;                                                                      //writelog.WrLog('SQLQuery_restest2pdf.Close');
              unit_sql.SQLQuery_restest2pdf.ParamByName('m_id').AsInteger := m_id ;
              unit_sql.SQLQuery_restest2pdf.ParamByName('d_id').AsInteger := d_id ;
              unit_sql.SQLQuery_restest2pdf.Open;                                                                       //writelog.WrLog('SQLQuery_restest2pdf.Open');
              if unit_sql.SQLQuery_restest2pdf.RecordCount>0 then
                 begin
                 if frReport_restests.PrepareReport() then
                    begin
                    //writelog.WrLog('frReport_restests.PrepareReport');
                    {if daemon_unit_main.typeFile='pdf'
                       then frReport_restests.ExportTo(lr_e_fclpdf.TlrPDFExportFilter, filename )
                       else frReport_restests.ExportTo(LR_e_img.TfrImageExportFilter, filename);  }
                    frReport_restests.SavePreparedReport(filename+'.txt');

                    end; // if dm.frReport_restests.PrepareReport()
                 end; // if unit_sql.SQLQuery_restest2pdf.RecordCount>0
              unit_sql.SQLQuery_restest2pdf.Close;                                                                      //writelog.WrLog('SQLQuery_restest2pdf.Close');
              unit_sql.SQLQuery_list4pdf.Next;
              end;  //while not unit_sql.SQLQuery_list4pdf.EOF do
        frReport_restests.Free;
        frDBDataSet_restests.Free;
        lrPDFExport_restests.Free;
        frImageExport_restests.Free;
        end; //                                                                     


в нем такая часть

Код: Выделить всё
                    {if daemon_unit_main.typeFile='pdf'
                       then frReport_restests.ExportTo(lr_e_fclpdf.TlrPDFExportFilter, filename )
                       else frReport_restests.ExportTo(LR_e_img.TfrImageExportFilter, filename);  }
                    frReport_restests.SavePreparedReport(filename+'.txt');

Тут я закомментировал экспорт, и сделал простой сброс отчета в файл, просто чтобы в блокноте проверить, что отчеты формируются.

да и тут
Код: Выделить всё
        frReport_restests.LoadFromFile( file_maket );

подгружается примитивный макет, на нем данные не выводятся, просто Memo1 со словом 'TEST'
jsa
постоялец
 
Сообщения: 261
Зарегистрирован: 28.11.2017 13:46:04

Re: можно ли LazReport использовать в службе?

Сообщение alexs » 01.11.2020 20:12:16

Там по ходе дела ошибка в самом экспорте
в модуле LR_Class попробуй вот этот вариант функции

Код: Выделить всё
function TfrReport.ExportTo(FilterClass: TfrExportFilterClass; aFileName: String
  ): Boolean;
begin

  if (aFileName='') and (fDefExportFileName<>'') then
    aFileName := fDefExportFileName;

  if Trim(aFilename) = '' then
    raise Exception.create(sNoValidExportFilenameWasSupplied);

  ExportStream := TFileStreamUtf8.Create(aFileName, fmCreate);
  result := ExportTo(FilterClass, exportStream, true);
  if result and Assigned(FCurrentFilter) then
  begin
    fDefExportFilterClass := FCurrentFilter.ClassName;
    fDefExportFileName := aFileName;
  end;

end;
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4053
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: можно ли LazReport использовать в службе?

Сообщение jsa » 02.11.2020 09:36:55

попробовал.
При пересборке IDE , ругается на второй и третий параметр в этой команде.
Код: Выделить всё
  result := ExportTo(FilterClass, exportStream, true);


Вообще процедура выглядит сильно отлично от текущей.
jsa
постоялец
 
Сообщения: 261
Зарегистрирован: 28.11.2017 13:46:04

Re: можно ли LazReport использовать в службе?

Сообщение alexs » 02.11.2020 10:08:03

Я транковую версию лазаря имел ввиду.
Там недавно изменяли этот метод. Всё никак не отправлю исправления.
В более ранних версиях - пока нет идей.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4053
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: можно ли LazReport использовать в службе?

Сообщение jsa » 02.11.2020 15:17:06

К сожалению до конца года нет возможности обновлять версию Лазауса.
Поэтому проверить у меня не получится.
jsa
постоялец
 
Сообщения: 261
Зарегистрирован: 28.11.2017 13:46:04

Re: можно ли LazReport использовать в службе?

Сообщение jsa » 22.06.2023 18:18:52

Мда полтора года пролетело.
Пришлось вернуться к задаче создания PDF из службы.
В этот раз завернул в try except
Код: Выделить всё
procedure GoTestPDF();
var file_tmp, filename, msg:string;   fffl:boolean; frReport1: TfrReport;
begin
     CrSection.Enter;

     file_tmp:='T:TESTmaketsTestPDF2file.lrf';
     filename:='T:TESTmaketsTestPDF2file';
     msg:='';

     frReport1:= TfrReport.Create(nil); 
     frReport1.LoadFromFile( file_tmp );
     try
     frReport1.ShowProgress:=false;
     fffl:=frReport1.PrepareReport();
     except
           on E: Exception do begin msg:=msg+' / Exception Prepare --- '+E.ToString; end;
     end;

     try
     if fffl then frReport1.ExportTo(TlrPDFExportFilter, filename+'1.pdf');
     except
           on E: Exception do begin msg:=msg+' / Exception Export1 --- '+E.ToString;   end;
     end;

     try
     if fffl then frReport1.ExportTo(TfrTNPDFExportFilter, filename+'2.pdf');
     except
           on E: Exception do begin msg:=msg+' / Exception Export2 --- '+E.ToString;  end;
     end;

    writelog(msg);

     CrSection.Leave;
end; 


Файлы TestPDF2file1.pdf, TestPDF2file2.pdf так же создаются пустыми = 0байт
а в логах увидел интересное
Код: Выделить всё
2023-06-22_21:05:47.925 - 
/ Exception Export1 --- EThread: CheckSynchronize called from non-main thread "$1198"
/ Exception Export2 --- EThread: CheckSynchronize called from non-main thread "$1198"


Т.е. есть проблема работы с потоками, но не понятно почему так.
Процедура запускается по таймеру который устанавливается при запуске службы в onDataModuleStart

Добавлено спустя 16 часов 19 минут 22 секунды:
Костыли так костыли
Код перенес в консольное приложение (Программа - Консольная программа на FreePascal со включенными доп.возможностями) creator1pdf.exe
И запускаю ее из службы
Код: Выделить всё
     procedure GoCreatePDF();
     var str:string;  AProcess: TProcess;
     begin
           AProcess := TProcess.Create(nil);
          Try
          AProcess.Options := AProcess.Options + [poWaitOnExit];
          AProcess.Executable := 'creator1PDF.exe';
          AProcess.Execute;
          Except
                on E: Exception do begin str:= 'Exception --- '+E.ToString;   end;
          end;
          AProcess.Free;
     end;   
writelog(msg);


Работает без ошибок.
jsa
постоялец
 
Сообщения: 261
Зарегистрирован: 28.11.2017 13:46:04


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot], Yandex [Bot] и гости: 20

Рейтинг@Mail.ru