FastReport4 动态报表制作.docx
《FastReport4 动态报表制作.docx》由会员分享,可在线阅读,更多相关《FastReport4 动态报表制作.docx(9页珍藏版)》请在冰豆网上搜索。
FastReport4动态报表制作
FastReport4 动态报表制作
注:
1、窗体报表控件 FR:
TfrxReport;frDB:
TfrxDBDataset
2、调用自定义函数:
GetPrnFieldWidth(ADOQ_List);//取得查询结果中各字段宽度
3、全局变量:
Prn_FieldWidth:
Array of integer;//打印时各字段宽度数组
通过GetPrnFieldWidth修改其值
4、uses PRINTERS;
代码:
procedureTFrm_yppf_prn_pfd.ToolButton3Click(Sender:
TObject);
Var
//DataPage:
TfrxDataPage;
Page:
TfrxReportPage;
PageTitle:
TfrxReportTitle;
PageHeader:
TfrxPageHeader;
//Band:
TfrxBand;
MastData:
TfrxMasterData;
PageSummary:
TfrxReportSummary;
Memo:
TfrxMemoView;
i:
integer;
MLeft:
Real;//表头字段在mastdata中的左边距
PaperWidth:
Real;//纯报表(不含边距)宽度(毫米)
begin
//清除报表
FR.Clear;
//1====添加页
Page:
=TfrxReportPage.Create(FR);
Page.CreateUniqueName;//创建唯一名称
//Page.SetDefaults;//设置默认字段大小, 纸张
//自定义纸张大小
//Page.PaperWidth:
=210;//纸张宽
//Page.PaperHeight:
=297;//纸张高
Page.PaperSize:
=9;//a4纸
Page.Orientation:
=poPortrait;//纸张纵向
//Page.Orientation:
=poLandscape;//纸张横向
Page.TopMargin:
=25;//上边距
Page.BottomMargin:
=15;
Page.LeftMargin:
=15;
Page.RightMargin:
=15;
//2====添加一个报表标题栏
PageTitle:
=TfrxReportTitle.Create(Page);
PageTitle.CreateUniqueName;
PageTitle.Top:
=0;
PageTitle.Height:
=140; //留出空白行
//得到报表不含边距的宽度(毫米)转换为像素时需乘以3.77953
//SetBounds中用的是像素值
PaperWidth:
=(Page.PaperWidth-page.LeftMargin-page.RightMargin)*3.77953;
//添加标题memo
Memo:
=TfrxMemoView.Create(PageTitle);
Memo.CreateUniqueName;
Memo.HAlign:
=haCenter;//左右居中
Memo.VAlign:
=vaCenter;//上下居中
Memo.Font.Size:
=14;
Memo.Text:
='药品批发单';
Memo.Height:
=40;
Memo.Align:
=baWidth;//伸展坐标到标题栏的宽度
//摘要第一行
Memo:
=TfrxMemoView.Create(PageTitle);
Memo.CreateUniqueName;
Memo.HAlign:
=haLeft;//左右居中
Memo.VAlign:
=vaCenter;//上下居中
Memo.Text:
='单号:
'+LEdit_dh.Hint;
Memo.Height:
=20;
Memo.Frame.Typ:
=[ftLeft,ftRight,ftTop,ftBottom];//显示边线
Memo.SetBounds(0,60,PaperWidth/3,20);
//
Memo:
=TfrxMemoView.Create(PageTitle);
Memo.CreateUniqueName;
Memo.HAlign:
=haLeft;//左右居中
Memo.VAlign:
=vaCenter;//上下居中
Memo.Text:
='单位:
'+LEdit_dwmc.Text;
Memo.Height:
=20;
Memo.Frame.Typ:
=[ftLeft,ftRight,ftTop,ftBottom];//显示边线
Memo.SetBounds(PaperWidth/3,60,PaperWidth/3,20);
//
Memo:
=TfrxMemoView.Create(PageTitle);
Memo.CreateUniqueName;
Memo.HAlign:
=haLeft;//左右居中
Memo.VAlign:
=vaCenter;//上下居中
Memo.Text:
='批发金额:
'+LEdit_SumPfj.Text;
Memo.Height:
=20;
Memo.Frame.Typ:
=[ftLeft,ftRight,ftTop,ftBottom];//显示边线
Memo.SetBounds(PaperWidth/3*2,60,PaperWidth/3,20);
//摘要第二行
Memo:
=TfrxMemoView.Create(PageTitle);
Memo.CreateUniqueName;
Memo.HAlign:
=haLeft;//左右居中
Memo.VAlign:
=vaCenter;//上下居中
Memo.Text:
='结算方式:
'+LEdit_jsfsmc.Text;
Memo.Height:
=20;
Memo.Frame.Typ:
=[ftLeft,ftRight,ftTop,ftBottom];//显示边线
Memo.SetBounds(0,80,PaperWidth/3,20);
//
Memo:
=TfrxMemoView.Create(PageTitle);
Memo.CreateUniqueName;
Memo.HAlign:
=haLeft;//左右居中
Memo.VAlign:
=vaCenter;//上下居中
Memo.Text:
='制单人:
'+LEdit_zdr.Text;
Memo.Height:
=20;
Memo.Frame.Typ:
=[ftLeft,ftRight,ftTop,ftBottom];//显示边线
Memo.SetBounds(PaperWidth/3,80,PaperWidth/3,20);
//
Memo:
=TfrxMemoView.Create(PageTitle);
Memo.CreateUniqueName;
Memo.HAlign:
=haLeft;//左右居中
Memo.VAlign:
=vaCenter;//上下居中
Memo.Text:
='制单日期:
'+LEdit_zdrq.Text;
Memo.Height:
=20;
Memo.Frame.Typ:
=[ftLeft,ftRight,ftTop,ftBottom];//显示边线
Memo.SetBounds(PaperWidth/3*2,80,PaperWidth/3,20);
//摘要第三行
Memo:
=TfrxMemoView.Create(PageTitle);
Memo.CreateUniqueName;
Memo.HAlign:
=haLeft;//左右居中
Memo.VAlign:
=vaCenter;//上下居中
Memo.Text:
='操作员:
'+UserName;
Memo.Height:
=20;
Memo.Frame.Typ:
=[ftLeft,ftRight,ftTop,ftBottom];//显示边线
Memo.SetBounds(0,100,PaperWidth/3,20);
//
Memo:
=TfrxMemoView.Create(PageTitle);
Memo.CreateUniqueName;
Memo.HAlign:
=haLeft;//左右居中
Memo.VAlign:
=vaCenter;//上下居中
Memo.Text:
='打印日期:
'+DateToStr(Date)+'^^^'+TimeToStr(GetTime);
Memo.Height:
=20;
Memo.Frame.Typ:
=[ftLeft,ftRight,ftTop,ftBottom];//显示边线
Memo.SetBounds(PaperWidth/3,100,PaperWidth/3,20);
//
Memo:
=TfrxMemoView.Create(PageTitle);
Memo.CreateUniqueName;
Memo.HAlign:
=haLeft;//左右居中
Memo.VAlign:
=vaCenter;//上下居中
Memo.Text:
='';
Memo.Height:
=20;
Memo.Frame.Typ:
=[ftLeft,ftRight,ftTop,ftBottom];//显示边线
Memo.SetBounds(PaperWidth/3*2,100,PaperWidth/3,20);
//=3==添加Pageheader (表头)
PageHeader:
=TfrxPageHeader.Create(Page);
PageHeader.CreateUniqueName;
//PageHeader.Top:
=PageTitle.Height+120;//其总是紧随PageTitle之后
PageHeader.Height:
=20;
//添加表头memo
GetPrnFieldWidth(ADOQ_List);//取得查询结果中各字段宽度
MLeft:
=0;
fori:
=0toADOQ_List.FieldCount-1do
Begin
Memo:
=TfrxMemoView.Create(PageHeader);
Memo.CreateUniqueName;
Memo.HAlign:
=haCenter;
Memo.HAlign:
=haCenter;
Memo.VAlign:
=vaCenter; //上下对齐
Memo.Frame.TopLine.Style:
=fsSolid;
Memo.Frame.BottomLine.Style:
=fsSolid;
Memo.Frame.LeftLine.Style:
=fsSolid;
Memo.Frame.RightLine.Style:
=fsSolid;//边线格式
Memo.Frame.Typ:
=[ftLeft,ftRight,ftTop,ftBottom];//显示边线
Memo.Text:
=Trim(ADOQ_List.Fields[i].FieldName);
ifi Begin
Memo.SetBounds(MLeft,0,Prn_FieldWidth[i]*7.5,20);
End
Else
Begin//最后一列时 ,页面剩余宽度都给他
Memo.SetBounds(MLeft,0,PaperWidth-MLeft,20);
End;
MLeft:
=MLeft+Prn_FieldWidth[i]*7.5;//下一列左起位置
End;
//4=====主数据 (记录)
MastData:
=TfrxMasterData.Create(Page);
MastData.CreateUniqueName;
MastData.Top:
=PageTitle.Height+PageHeader.Height;
MastData.Height:
=20;
MastData.DataSet:
=frDB;
//添加 memo
MLeft:
=0;
fori:
=0toADOQ_List.FieldCount-1do
Begin
Memo:
=TfrxMemoView.Create(MastData);
Memo.CreateUniqueName;
//Memo.HAlign:
=haCenter;
Memo.HAlign:
=haLeft;
Memo.VAlign:
=vaCenter; //上下对齐
Memo.Font.Size:
=9;
Memo.Frame.TopLine.Style:
=fsSolid;
Memo.Frame.BottomLine.Style:
=fsSolid;
Memo.Frame.LeftLine.Style:
=fsSolid;
Memo.Frame.RightLine.Style:
=fsSolid;//边线格式
Memo.Frame.Typ:
=[ftLeft,ftRight,ftTop,ftBottom];//显示边线
Memo.DataSet:
=frDB;
Memo.DataField:
=Trim(ADOQ_List.Fields[i].FieldName);
ifi Begin
Memo.SetBounds(MLeft,0,Prn_FieldWidth[i]*7.5,20);
End
Else
Begin//最后一列时 ,页面剩余宽度都给他
Memo.SetBounds(MLeft,0,PaperWidth-MLeft,20);
End;
MLeft:
=MLeft+Prn_FieldWidth[i]*7.5;//下一列左起位置
End;
//5=====页尾
PageSummary:
=TfrxReportSummary.Create(page);
PageSummary.CreateUniqueName;
PageSummary.Height:
=20;
//添加summarymemo
Memo:
=TfrxMemoView.Create(PageSummary);
Memo.CreateUniqueName;
Memo.HAlign:
=haLeft;//左右居中
Memo.VAlign:
=vaCenter;//上下居中
Memo.Top:
=0;
Memo.Left:
=0;
Memo.Height:
=20;
Memo.Font.Size:
=10;
Memo.Text:
=MyCompany.Name;
Memo.Align:
=baWidth;//伸展坐标到标题栏的宽度
//
FR.DesignReport();
exit;
//显示报表
FR.ShowReport;
end;
自定义函数代码:
//===============================================================
//====得到欲打印的查询结果中各字段的最长值,结果保存在Prn_FieldWidth======
//================================================================
ProcedureGetPrnFieldWidth(MyADOQ:
TADOQuery);
Var
i:
integer;
FindSql:
String;
Begin
SetLength(Prn_FieldWidth,MyADOQ.FieldCount);
//先使表头字段宽度等于标题宽度
fori:
=0toMyADOQ.FieldCount-1do
Begin
//ADOQ_List.Fields[i].FieldName 默认为宽字符型 widestring,用length只能取得其字符长度
//用Pchar可将其转换为AnsiString类型,这样length可以取得其字节长度
Prn_FieldWidth[i]:
=Length(Pchar(Trim(MyADOQ.Fields[i].FieldName)));
MyADOQ.Next;
End;
//再用查询结果各字段结果长于标题着替换
fori:
=0toMyADOQ.FieldCount-1do
Begin
FindSql:
='SELECTMax(Datalength('+Trim(MyADOQ.Fields[i].FieldName)+'))as 字段最长值'
+'FROM('+MyADOQ.SQL[0]+')DERIVEDTBL';
DM.ADOQ_Find.Close;
DM.ADOQ_Find.SQL.Clear;
DM.ADOQ_Find.SQL.Add(FindSql);
DM.ADOQ_Find.Open;
ifDM.ADOQ_Find.RecordCount>0then
Begin
ifStrToInt(DM.ADOQ_Find.FieldByName('字段最长值').AsString)>Prn_FieldWidth[i]then
Prn_FieldWidth[i]:
=StrToInt(DM.ADOQ_Find.FieldByName('字段最长值').AsString);
End;
MyADOQ.Next;
End;
End;