можно ли LazReport использовать в службе?
Модератор: Модераторы
можно ли LazReport использовать в службе?
Здравстсвуйте.
Пытаюсь проекте типа демон-служба использовать 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 и после этого служба подвисает
Пытаюсь проекте типа демон-служба использовать 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 и после этого служба подвисает
- alexs
- долгожитель
- Сообщения: 4066
- Зарегистрирован: 15.05.2005 23:17:07
- Откуда: г.Ставрополь
- Контактная информация:
попробуй написать сначала логику в виде консольной программы - так отладить будет проще.
Скорее всего идёт вызов какой-то визуальной формы-вопроса.
Я несколько лет назад пытался с этим экспериментировать - но бросил тогда. Слишком там много зависимостей от GUI было. Недавно вроде уменьшили это. Но всё равно - очень много ограничений.
Скорее всего идёт вызов какой-то визуальной формы-вопроса.
Я несколько лет назад пытался с этим экспериментировать - но бросил тогда. Слишком там много зависимостей от GUI было. Недавно вроде уменьшили это. Но всё равно - очень много ограничений.
Надо будет попробовать.
А пока придется из службы вынести формирование пакета PDF и изображений в утилиту с интерфейсом и работой в ручную.
Пробовал еще сделать утилиту ( только формирование PDF) для запуска из службы. Она запускается, но ничего не делает, даже файл лога не создает. И самонезакрывается. Так что от этой идеи тоже отказался.
А пока придется из службы вынести формирование пакета PDF и изображений в утилиту с интерфейсом и работой в ручную.
Пробовал еще сделать утилиту ( только формирование PDF) для запуска из службы. Она запускается, но ничего не делает, даже файл лога не создает. И самонезакрывается. Так что от этой идеи тоже отказался.
Вроде как можно. Я делал но это было очень давно.
в винде GUI программа может спокойно работать в фоне, точнее из под другого пользователя.
у меня excel так работал переделывал xls в csv на сервере в фоне
Добавлено спустя 1 минуту 55 секунд:
по поводу прав юзер sysem может быть ограничен в правах на запись в папку
в винде GUI программа может спокойно работать в фоне, точнее из под другого пользователя.
у меня excel так работал переделывал xls в csv на сервере в фоне
вполне что прав нет либо хочет поговорить с пользователем в виде диалоговых окон.jsa писал(а):и после этого служба подвисает
Добавлено спустя 1 минуту 55 секунд:
по поводу прав юзер sysem может быть ограничен в правах на запись в папку
Да в службе.
Вот кусок кода
в нем такая часть
Тут я закомментировал экспорт, и сделал простой сброс отчета в файл, просто чтобы в блокноте проверить, что отчеты формируются.
да и тут
подгружается примитивный макет, на нем данные не выводятся, просто Memo1 со словом 'TEST'
Вот кусок кода
Код: Выделить всё
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'
- alexs
- долгожитель
- Сообщения: 4066
- Зарегистрирован: 15.05.2005 23:17:07
- Откуда: г.Ставрополь
- Контактная информация:
Там по ходе дела ошибка в самом экспорте
в модуле LR_Class попробуй вот этот вариант функции
в модуле 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;попробовал.
При пересборке IDE , ругается на второй и третий параметр в этой команде.
Вообще процедура выглядит сильно отлично от текущей.
При пересборке IDE , ругается на второй и третий параметр в этой команде.
Код: Выделить всё
result := ExportTo(FilterClass, exportStream, true);Вообще процедура выглядит сильно отлично от текущей.
К сожалению до конца года нет возможности обновлять версию Лазауса.
Поэтому проверить у меня не получится.
Поэтому проверить у меня не получится.
Мда полтора года пролетело.
Пришлось вернуться к задаче создания PDF из службы.
В этот раз завернул в try except
Файлы TestPDF2file1.pdf, TestPDF2file2.pdf так же создаются пустыми = 0байт
а в логах увидел интересное
Т.е. есть проблема работы с потоками, но не понятно почему так.
Процедура запускается по таймеру который устанавливается при запуске службы в onDataModuleStart
Добавлено спустя 16 часов 19 минут 22 секунды:
Костыли так костыли
Код перенес в консольное приложение (Программа - Консольная программа на FreePascal со включенными доп.возможностями) creator1pdf.exe
И запускаю ее из службы
Работает без ошибок.
Пришлось вернуться к задаче создания 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;
а в логах увидел интересное
Код: Выделить всё
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);
