以下代码在D7+SQL 2000+FastReport 3.15版中测试通过.
之前为客户写的报表都是保存在本地,一个人修改了必须得拷贝到其它人那才能实现共享,比较麻烦,现在考虑将报表格式保存在数据库中,一个地方编辑了其它地方加载实现共享!1.将报表格式存入数据库中(用于初始化系统的时候预先存入一些报表):
procedure Ttestrp_f.Button4Click(Sender: TObject); //rptdata表字段:id、rptname、rptmemo、rptlastdate var template:TStream; begin insert_rep.SQL.Text:='select top 1 * from rptdata'; insert_rep.Open; template:=TMemoryStream.Create; template.Position:=0; if OpenDialog1.Execute then OpenDialog1.Files.SaveToStream(template); frxReport1.SaveToStream(template); insert_rep.Append; try Insert_rep.Edit; Insert_rep.FieldByName('rptname').AsString:=ExtractFileName(OpenDialog1.FileName); (Insert_rep.FieldByName('rptmemo') as TBlobField).LoadFromStream(template); Insert_rep.FieldByName('rptlastdate').AsDateTime:=Now; Insert_rep.Post; finally template.Free; end; end;
2.将报表从数据库中读出来并修改:
procedure Ttestrp_f.Button2Click(Sender: TObject); var template:TStream; begin try fr_report.SQL.Text:='select * from rptdata where id='+ADOQuery2.fieldbyname('id').AsString; fr_report.Open; try template:=fr_report.CreateBlobStream(fr_report.FieldByName('rptmemo'),bmRead); template.Position:=0; frxReport1.LoadFromStream(template); frxReport1.DesignReport; finally template.Free; end; except end; end;
3.修改报表,并写入数据库.
在frxDesigner1控件的OnSaveReport事件中,加入下面代码:
function Ttestrp_f.frxDesigner1SaveReport(Report: TfrxReport; SaveAs: Boolean): Boolean;
var template:TStream;
begin
template:=TMemoryStream.Create;
template.Position:= 0;
frxReport1.SaveToStream(template);
fr_report.Edit;
try
(fr_report.FieldByName('rptmemo') as TBlobField).LoadFromStream(template);
fr_report.FieldByName('rptlastdate').AsDateTime:=Now;
fr_report.Post;
finally
template.Free;
end;
end;