Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Хранение формы FastReport в базе данных


Автор: Siplex 27.12.2004, 14:04
Имеется SQL-Server 2000 на котором хранится некая база данных. В этой базе данных имеется таблица, которая состоит из двух полей:

1 - № - Автоинкрементное

2 – Report_body – Binary - вот в этом-то поле и все дело.



Я использую FastReport для создания и генерации отчетов в программе. Формы отчетов можно хранить как в отдельном файле, как в потоке и как в таблице базы данных.



Форму отчета я храню (точнее пытаюсь хранить) в таблице базы данных. Открываю Дизайнер отчетов и размещаю на 1 странице компонент «Форма» на 2 странице сам лист отчета. На форме (в дизайнере отчетов) у меня располагается компонент TfrADOQuery с описанным SQL и Parametr. Все создал сохранил в файл все работает.

Теперь пытаюсь сохранить этот файл в бинарное поле таблицы на сервере при помощи процедуры FastReport’a SaveToBlobField – сохраняет, но только бланк отчета, а то, что у меня было на первой странице не сохраняет. А проверил я это попытавшись загрузить с сервера сохраненную форму при помощи команды LoadFromBlobField.

Автор: Alex 2.1.2005, 23:50
Код

procedure SaveReport(report_id:Integer);
var
 Stream:TMemoryStream;
begin
 Stream:=TMemoryStream.Create;
 try
   frReport.SaveToStream(Stream);
   Query.SQL.Clear;
   Query.SQL.Add('insert into REPORTS (report_id,report_body) values (:report_id,:report_body)');
   Query.ParamByName('report_id').AsInteger:=report_id;
   Query.ParamByName('report_body').LoadFromStream(Stream,ftBlob);
   Query.ExecSQL;
 finally
   Stream.Free;
 end;
end;

procedure LoadReport(report_id:Integer);
var
 Stream:TMemoryStream;
begin
 Stream:=TMemoryStream.Create;
 try
   Query.SQL.Clear;
   Query.SQL.Add('select * from REPORTS where report_id=:report_id');
   Query.ParamByName('report_id').AsInteger:=report_id;
   Query.Open;
   TBlobField(Query.FieldByName('report_body')).SaveToStream(Stream);
   frReport.LoadFromStream(Stream);
 finally
   Query.Close;
   Stream.Free;
 end;
end;

Автор: rOOxus 13.5.2009, 12:40
у меня похожая штука только я храню готовые отчеты в базе. FastReport 4, СУБД FireBird 2
с сохранением проблем нет, а в то с отображением...
процедура сохранения:
Код
procedure TPreviewForm.SaveReport( ReportName : String );
var
   Stream : TMemoryStream;
begin
   if IBTran.InTransaction then
      IBTran.Rollback;

   IBTran.StartTransaction;      

   Stream := TMemoryStream.Create;

   frxPreview.PreviewPages.SaveToStream( Stream );

   IBQ.SQL.Clear;
   IBQ.SQL.Add('insert into DAT_PREPORTS ( name, report ) values ( :name, :report )');
   IBQ.ParamByName('name').AsString:= ReportName;
   IBQ.ParamByName('report').LoadFromStream( Stream, ftBlob );
   IBQ.ExecSQL;

   IBTran.Commit;

   Stream.Free;
end;

процедура загрузки:
Код
procedure TPreviewForm.LoadReport( Id: Integer );
var
 Stream : TMemoryStream;
begin
   if IBTran.InTransaction then
      IBTran.Rollback;

   IBTran.StartTransaction;


   Stream := TMemoryStream.Create;

   IBQ.SQL.Clear;
   IBQ.SQL.Add('select * from DAT_PREPORTS where id = :id');
   IBQ.ParamByName('id').AsInteger := Id;
   IBQ.Open;

   if not IBQ.FieldByName('report').IsNull then
      TBlobField( IBQ.FieldByName('report') ).SaveToStream(Stream);

   frxPreview.PreviewPages.LoadFromStream( Stream );

   IBQ.Close;

   IBTran.Commit;   

   Stream.Free;
end;
вот тут и вылетае ошибка [color=red]Invalid file format[/color]

однако если сделать вот так:
Код
procedure TPreviewForm.LoadReport( Id: Integer );
var
 Stream : TMemoryStream;
begin
   if IBTran.InTransaction then
      IBTran.Rollback;

   IBTran.StartTransaction;


   Stream := TMemoryStream.Create;

   IBQ.SQL.Clear;
   IBQ.SQL.Add('select * from DAT_PREPORTS where id = :id');
   IBQ.ParamByName('id').AsInteger := Id;
   IBQ.Open;

   if not IBQ.FieldByName('report').IsNull then
      TBlobField( IBQ.FieldByName('report') ).SaveToStream(Stream);

//   frxPreview.PreviewPages.LoadFromStream( Stream );

   Stream.SaveToFile( ExtractFilePath( Application.ExeName ) + 'tmp.fp3' );

   if FileExists( ExtractFilePath( Application.ExeName ) + 'tmp.fp3' ) then
   begin
      frxPreview.LoadFromFile( ExtractFilePath( Application.ExeName ) + 'tmp.fp3' );
      DeleteFile( ExtractFilePath( Application.ExeName ) + 'tmp.fp3' );
   end;

   IBQ.Close;

   IBTran.Commit;   

   Stream.Free;
end;

то ошибки нет все ОК. как обойтись без выгрузки во временный файл?



Автор: rOOxus 10.6.2009, 16:31
что неужто никто не знает?

Автор: HeliX 10.6.2009, 23:38
Цитата(rOOxus @ 10.6.2009,  16:31)
что неужто никто не знает?

Нужно добавить 
Код

Stream.Position := 0;


перед
Код

 frxPreview.PreviewPages.LoadFromStream( Stream );

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)