----笔者在前一段使用Delphi开发数据库的工作中,用户提出了这样一个需求:要根据自己的的查询结果动态生成报表然后进行打印。几经摸索,笔者使用动态生成QuickReport控件的方法满足了用户的需求。现将此方法说明如下,希望能为有类似工作要做的朋友们提供一点有益的提示。
一、基本思路
----先将查询的一些参数(如SQL命令,字段名称,字段宽度等)按照一定格式写入一个临时文件中。在生成报表时,根据临时文件中所记录的参数动态生成各种QuickReport控件即可。
二、程序实现
2.1临时文件格式
----临时文件的格式可以根据需要自定义,笔者采用了INI的文件格式。Delphi提供了一个TInifile类,使得在Delphi中操作INI格式文件,非常方便。关于INI文件的格式和具体操作相关的文章有不少,我这里不再赘述。临时文件格式如下:
Report.ini
:报表细节
[rep_detail]
Title=XXXXX表
:打印纸设置,1为A4纸,2为B5纸,3为16K
Page=1
:打印方式,1为横打,0为竖打
Orientation=1
:报表包含的字段数目
columns=8
:TQurey组件信息
[QureyData]
:QuickReport组件中Tqurey组件的SQL命令的内容
Sql_command=select V_XM,V_JGZW,V_BMMC,V_DWMC,V_DWZW,V_ZY,V_ZC,V_BGDH from Hvzzjg where V_XM LIKE ''''李%''''
[col_0]
Caption=姓 名
DataFiled=V_XM
Width=60
……
……
2.2动态生成QuickReport报表
--- 报表的主要控件及其主要属性设置如下
控件名称
类名
属性
属性值
Form_rep
TForm
caption
动态报表
QuickRep
TQuickRep
DataSet
REP_QUERY
DetailBand1
TQRBand
BandType
rbDetail
ColumnHeaderBand1
TQRBand
BandType
rbColumnHeader
REP_DataSource
TDataSource
DataSet
Rep_Query
Rep_Query
TQuery
DatabaseName
REPDATABASE
Rep_Database
TDatabase
Connected
True
Params.Strings
''''SERVER NAME=XXX
''''USER MAME=XXX''''
''''PASSWORD=XXX''''
DatabaseName
REPDATABASE
上表所示控件是在程序中手工创建的。其他的控件则要在程序中动态创建。
2.2.2主要程序
unit f_rep;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, QuickRpt, QRCtrls, DB, DBTables,PRINTERS,QRPrntr,inifiles,
TeeProcs, TeEngine, DbChart, QRTEE;
type
TForm_rep = class(TForm)
QuickRep: TQuickRep;
DetailBand1: TQRBand;
ColumnHeaderBand1: TQRBand;
REP_DataSource: TDataSource;
REP_QUERY: TQuery;
rep_Database: TDatabase;
procedure TForm_rep.QuickRepAfterPreview(Sender: TObject);//浏览完毕,释放所有创建的组件
private
{ Private declarations }
public
{ Public declarations }
end;
var Form_rep:TForm_Rep;
type //报表的摘要信息
C_rep_Summary=record
Title:string;//报表的标题
Page:TQRPaperSize;//报表的页面设置,采用何种型号的纸
Orientation:TPrinterOrientation;//报表的页面设置,是横打还是竖打
Columns:integer;//报表包含的列数
end;
type
C_Rep_Col_Summary=record//报表列的摘要信息
Caption:string;//报表的列名
DataFiled:string;//报表的列所对应的数据库中的字段名
Width:integer;//报表的列宽
end;
type
C_Rep_Col_Sum_store=record //存储报表列的摘要信息
Caption_array:array of string;
DataFiled_array:array of string;
Width_array:array of integer;
end;
var
rep_Summary:C_rep_Summary;
Rep_Col_Summary:C_Rep_Col_Summary;
Rep_Col_Sum_store:C_Rep_Col_Sum_store;
Colum_Name:array of tQRRichText;
Colum_Data:array of TQRDBRichText;
C_Query:TQuery;
procedure Form_rep_init();
procedure DynCreat_TQRDBText(Colum_Num:integer;Colum_Height:integer;DataSet_Name:TQuery);//动态创建TQRDBText控件
procedure DynCreat_TQRRichtext(Colum_Num:integer);//动态创建TQRRichtext控件
procedure DynCreat_TQuery(Inifile_Name:Tinifile);//动态创建TQuery控件的SQL语句
procedure Get_PageCount();//取得打印总页数
function Open_IniFile():Tinifile;//打开临时文件
procedure Read_Col_Summary(Inifile_Name:Tinifile);//读取报表列的摘要信息
procedure Read_Rep_Summary(Inifile_Name:Tinifile);//读取报表的摘要信息
function rep_chanslateOrientation(var Rep_Orientation:integer):TPrinterOrientation;//将打印方式设置进行转换
function rep_chanslatepage(var Rep_Page:integer):TQRPaperSize;//将打印页尺寸设置进行转换
implementation
{$R *.dfm}
function rep_chanslatepage(var Rep_Page:integer):TQRPaperSize;//将打印页类型设置进行转换
begin
case Rep_Page of
1:begin
result:=A4;
Form_rep.QuickRep.PrinterSettings.PaperSize:=A4;
end;
2:begin
result:=B5;
Form_rep.QuickRep.PrinterSettings.PaperSize:=B5
end;
3:begin
result:=Executive;
Form_rep.QuickRep.PrinterSettings.PaperSize:=Executive;
end;
end;
end;
function rep_chanslateOrientation(var Rep_Orientation:integer):TPrinterOrientation;//将打印方式设置进行转换
begin
case Rep_Orientation of
0:begi [1] [2] [3] 下一页 [Delphi程序]QUICKREPORT SAVE AS [Web开发]在asp.net中动态生成web控件
|