最近刚刚做完一个项目
使用到了RAVE进行报表设计
在使用中也查阅了很多资料
但总觉得网上的资料过于分散
而且都不是很全面
所以决定将如何在Delphi
中使用RAVE报表写成几篇文章
由于本人从小语文学得不好
不是写作高手
这次也是第一次写这样的文章
希望看到这篇文章的网友能多提意见
欢迎大家指教
可以给我留言
言归正传在我们要给用户编写的软件中往往需要生成各种各样的报表报表是数据库中数据的最终表现形式在Delphi 以前编写报表都在使用Qusoft公司的Quick report而且在Delphi中集成了Quick report 在Borland Delphi? Studio 集成开发环境(IDE)的控件面板中取消了Quick report项取而代之以Nevrona公司Rave Reports项且在Tools中有Rave Designer
打开Rave Designer 我们可以如图所示的一个报表设计界面开发人员可以开发出符合用户要求的报表来而且这个报表的设计使用与Delphi集成开发环境几乎是完全的一样这可能是Rave与其它的报表组件最大的外观上的不同
我在使用中下载了Rave Reports v你可以在或者下载在写这篇文章时上已经发布了Rave Reports 不过文章还是以Rave Reports v为准打开Delphi可以控件面板看到如图
Delphi下的Rave
打开Tools中的Rave看到的报表设计界面如图
Rave的报表设计界面
首先介绍一下Rave的报表设计器的各组件和相关的属性Rave Designer集成开发环境的界面包括标题栏菜单栏快捷工具栏组件栏和一些窗口
·标题栏显示了当前的工程名位于最上部
·菜单栏一些功能可通过菜单栏的菜单命令实现
·快捷工具栏为位图按钮一些常用的菜单命令用这些按钮实现
·报表组件栏分页显示各种组件(StandardReportZoomColorsLinesFillsFontsDrawingBar CodeAlignment)在利用Rave开发应用程序的过程中正确合理地使用组件非常重要用它可设计基于数据库和文本的复杂报表
·左边半部分像Delphi的object inspector工具可设置报表元件的属性它的下部分有对应属性的简短提示
·正中部分为设计区域开发者可在上面添加各种设计元件如Drawing的横线直线矩形椭圆Barcode中各种常用的条码Standand 中的TextMemoSectionBitmapMetafile等等
·右边为设计导航区可查看报表的各元件的更多信息如报表库和数据显示目录设计时也可快速定位元件位置
Rave的报表设计器组件栏的各组件
Drawing (绘图) 组件页
Line component 画线组件所画的线较灵活 可以看到其属性入图有颜色线宽线行等属性设计者根据需要更改属性改变线的长短位置选中线条后选择一个端点则光标会变为十子型拖动即可
Hline component 画水平线组件
Vline component 画垂直线组件
Rectangle component 画长方形组件可以使用fill组件填充
Square component 画正方形组件可以使用fill组件填充
Ellipse component 画椭圆组件可以使用fill组件填充
Circle component 画圆形组件可以使用fill组件填充
Bar Code(条形码)组件页
PostNetBarCode打印邮件标签上包括 POSTNET 条码
IofBarCode打印 Interleaved of 条码
CodeBarCode打印standard and extended Code 条码
CodeBarCode 打印 A B and C Code 条码
UPCBarCode打印 UPC条码
EANBarCode 打印 EAN条码
Standard(标准)组件页
Text 这个组件是在报表上固定的文字例如报表的标题等可以设置字体的大小颜色Rotation属性可以使要显示的字为任意角度
Memo Memo组件提供了多行文本的文字与delphi中的相似属性很多但我们应用的不多可以使用text属性添加文本
Section 这个组件是其他组件的容器将其他组件固定在此组件中
Bitmap 这个组件是在报表中放置bmp文件 (*bmp) FileLink属性连接bmp文件
MetaFile 这个组件在报表中放置meta文件 (*wmf)FileLink属性连接meta文件
FontMaster 这个组件控制报表中的任何的text字的属性在要使用该字体的text组件或memo组件的fontmirrot属性选择FontMaster
PageNumInit:报表显示页码的初始页码如图的InitValue的值为则报表的初始页为页码从5开始
Report(报表)组件页
如果报表需要的是数据库的数据则这个组件页中的组件使用比较频繁
DataText用来显示数据库中内容比较短的信息要用它显示相应的数据库字段信息则要使用到DataField 和DataView两个属性用来连接数据库和字段DataText用来设计主从报表时LookupDataView是相应的数据连接LookupDisplay是显示内容LookupField是主报表相应的数字段进行关联的字段的内容也就是主数据字段进行连接的字段LookupInvalid是控制相应错误产生后的情况
DataMemo在Memo的基础上支持了数据库的字段显示 使用DataField 和DataView两个属性用来连接数据库和字段除了输出相应的文本内容外还可以输出RTF格式显示RTF格式需要设置ContainsRTF属性为True
CalcTex这个组件用来统计报表字段的最大值最小值总和统计值等内容直接使用只需要通过CalcType属性来设置CalcType属性包括了ctAverage(求平均值)
CtCount(求个数)ctMax(求最大值)ctMin(求最小值)ctSum(求累加和)
DataMirrorSection和Section组件相似
Region如果要进行报表的打印Region组件规定了打印区域可以设置Columns来分栏
Band这个组件算是一个容器组件包括textMemo组件等包括的是非数据库库信息Band组件要放置在Region中选择BandStyle属性后出现如下图的属性对话框左边为报表中Band的列表右面的PrintLocation包括Body Header(页眉)Group Header(组眉) Row Header(行眉)Detail(表体)Row Footer(行脚)Group Footer(组脚) 和Body Footer(页脚)BandStyle属性可以多选Print Occurrence属性包括 First(首页打印)New Page(打印新一页)New Column(新分栏)选择First(首页打印)也就是Band包括的内容只在第一页打印选择New Page(打印新一页)
Band包括的内容必须在新的一页打印选择New Column(新分栏)Band包括的内容必须在新的分栏中打印
DesignerHide属性当一个报表有多个Band时选择查找Band变得比较麻烦设置DesignerHide属性为True时没有选择到的Band内容被隐藏
GroupDataView 和GroupKey属性如果想要以相应的数据结果作为报表分组的依据那么就必须设置这两个属性GroupDataView是相应的数据源GroupKey是数据源的索引分组是靠GroupKey中的值进行分组的
DataBand是直接作用于数据库且可以在其中摆放相应数据库报表组件这样通过它就可以让相应的报表具有数据库书库打印功能其中DataView属性是设置相应的数据源GroupDataView是相应的报表中的分组数据源
DataCycle与DataBand相似的地方在于循环的显示数据DataBand是数据库内容的循环打印而DataCycle不需要使用Region它打印的区域为页面每页只能打印一个组件设计好的内容使用DataBand是根据Region的范围来分页而DataCycle则是每一页只现实一条信息根据数据的多少分页
CalcOp该组件提供了报表相应的计算功能具体的使用会在以后讲解
CalcTotal与CalcOp结合使用来完成日常报表的统计功能
隔了好长时间终于有时间继续向大家介绍RAVE了这次主要介绍Delphi下的Rave组件打开Delphi看到的rave页如下
Delphi下的Rave
包括有RvProjectRvSystemRvNDRWriterRvCustomConnectionRvDataSetConnectionRvTableConnectionRvQueryConnectionRvRenderPreviewRvRenderPrinterRvRenderPDFRvRenderHTMLRvRenderRTFRvRenderText这几个组件
lRvProject组件
在使用rave报表中这个组件是最为重要的一个是使用频率最高的一个组件开发人员可以通过这个报表完成报表的打印文件的生成输出土过此事可以使用设计状态也可以通过它来点用相应的报表设计器
属性
DLLFile:发行报表时需要的dll文件在以后用户不需要单独发行相应的动态链库文件了
Engine: 指定相应报表生成的目的地一般的情况下是RvSystem也就是说它可以打印打印预览生成打印文件当然也可以选择RvNDRWriter组件那么报表输出的结果是RTFHTMLPDFTXT其中的一种
LoadDesigner: 允许用户调用报表设计器如果它的值为true那么最终用户就可以调用报表设计器如果它的值为False那么最终用户就没有权力调用报表设计器
ProjectFile:相应报表项目文件指定详细目录路径
StoreRAV:要将报表文件嵌入到exe文件中在这里就要填入相应的报表项目文件
主要方法
SelectReport方法:
Function SelectReport(ReportName:String; FullName:Boolean):Boolean;
ReportName是相应的报表名称FullName则表示是否以报表的全程作为报表的名称
Execute方法
打印选择的相应报表文件报表时被SelectReport选择的
RvProjectExecute;
ExecuteReport方法
RvProjectExecuteReport(ReportName:String);
ReportName是相应的报表的名称
Open方法
RvProjectOpen; 打开相应的报表以共操作
Close方法
RvProjectClose; 关闭一个报表的操作
l RvSystem组件
打印或者预览报表时进行打印参数设置的使用时与RvProject结合
属性
DefaultDest:指定打印的方式
rdPreview:预览
rdFile:文件
rdPrinter:打印机
RulerType:相应的标尺单位
rtNone:没有标尺
rtHorizCm:横向标尺单位为厘米
rtVertCm:纵向标尺单位为厘米
rtBothCm:先是所有的标尺单位为厘米
rtHorizIn: 横向标尺单位为英寸
rtVertIn: 纵向标尺单位为英寸
rtBothIn:所有标尺单位为英寸
SystemFiler:报表打印文件参数的设置如果DefaultDest属性为rbFile则需要设置这里的属性值
SystemOptions:所有报表输出设置属性
SystemPreview:报表预览参数的设置如果DefaultDest属性为rdPreview则需要设置这里的属性值
SystemPrinter:报表打印参数的设置如果DefaultDest属性为rdPrinter 则需要设置这里的属性值
SystemSetup:是对是否允许打印是否允许打印机设置等参数的设置
TitlePreview:更改报表预览的窗体的名称例如可以将Report Preview改为报表预览
TitleSetup:更改报表输出窗体的名称例如可以将Output Options改为输出设置
TitleStatus:报表状态窗体名称例如可以将Report Status改为报表状态
主要方法
OverridePreview方法OverrideSetup方法OverrideStatus方法
这三个方法可以对报表设置打印设置报表预览窗体进行覆盖在后面会介绍如何通过这几个方法是窗体为中文
l NDRWriter组件
使用该组件实现自定义报表预览
l RvDataSetConnection组件RvTableConnection组件 RvQueryConnection组件
使用这三个组件实现数据库的连接
l RvRenderPDF组件 RvRenderHTML组件 RvRenderRTF组件RvRenderText组件
报表生成相应文件的组件可让报表生成相应的pdfhtmlrtftext文件但生成文件对中文不支持会出现乱码
前面两篇向大家介绍了RAVE的组件从今天开始向大家介绍如何建立报表首先要感谢li jack等各位朋友给我发的电子邮件鼓励我继续写下去今天也查了一下RAVE一词的意思
RAVE在辞典上的翻译为咆哮 raveup喧闹的宴会 狂欢聚会我们经常也听到锐舞派对也就是RAVE PARTY
要对Rave文化追根溯源其实不太容易并非是因为其无从追溯恰恰相反正因为它涵盖的面太广根基太深所以反而让人有些无从入手从远的来说Rave与各块大陆上土着部落的祭典仪式有着相当的渊源因为这些祭典通常也是通过音乐与紧密的鼓点而使人进入某种超验状态从近的来说Rave又与年 代的嬉皮文化与迷幻实验有着密不可分的关系两代年轻人除了装扮不同许多心理状态与行为方式其实都有值得注意的相似之处
真正当代的将新式音乐与舞曲相结合的Rave运动起源于英国多年前Rave首先出现在曼彻斯特和伊比沙岛(英国着名度假胜地)年末及年初两个并无关系的团体Schoom和Genesis P开始在英国组织彻夜的舞会前者是以house音乐为主而后者以hardcore为主与此同时Rave在德国登陆在柏林等大城市很受欢迎很快Rave在英德两地吸引了数以万计的青少年更吸引了许多来自美国的DJ
现在Rave已经是欧美日甚至港台最时兴最UNDERGROUND的一种青少年娱乐形式Rave文化从一开始便被打上了高科技的烙印从急速疯狂的前卫电子舞曲新奇剌激的影像视觉到Sharp得眼花缭乱的装束Rave与ELife已经成为科技对青年文化影响的见证
当然我也不知道为什么Nevrona公司把这个报表组件叫做rave也许和锐舞有着一定的关系吧就像java咖啡
言归正传我们开始建立一张简单的报表打开Delphi 新建一个工程打开Tools下的Rave Designer在Rave 设计器的page中拖放Text我们在text属性中写入文字内容例如我的第一张报表 通过Font属性更改字体和字的大小颜色等拖放Memo组件在text属性中输入文字可以看到一个多行的文本拖放Bitmap组件在FileLink属性中选取插入图片的位置就可以看到在报表中显示了一张图片
点击[Execute Report]或者F则查看到运行后报表
上一篇向大家介绍了建立一张简单报表的过程这篇文章向大家介绍rave报表代码编程实例窗体上放置组件RvSystem Button即可
具体代码如下
##################################################################################
unit Unit;
interface
uses
Windows Messages SysUtils Variants Classes Graphics Controls Forms
Dialogs StdCtrls RpDefine RpBase RpSystem;
type
TForm = class(TForm)
RvSystem: TRvSystem;
Button: TButton;
procedure RvSystemPrint(Sender: TObject);
procedure ButtonClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form: TForm;
implementation
{$R *dfm}
procedure TFormRvSystemPrint(Sender: TObject);
var
I: integer;
S: string[];
S: string[];
Bitmap: TBitmap;
PolyLineArr: array[] of TPoint;
begin
with Sender as TBaseReport do begin
{ 打印表头和表尾 }
SectionTop := ;//顶端
SetFont(黑体);//设置字体
Underline := true;//下划线
Home;
YPos := ;
FontRotation :=;//旋转角度
PrintCenter(我的报表PageWidth / );
SetFont(宋体);
SectionBottom := ;
PrintFooter(第 + IntToStr(CurrentPage) + 页pjLeft);//页码
PrintFooter(日期: +DateToStr(Date)+ pjRight);//日期
SectionBottom := ;
YPos := ;
SetFont(宋体);
SetTopOfPage;
Home;
{ 打印列标题 }
ClearTabs;
SetPen(clBlackpsSolidpmCopy); { 设置画笔为一个点宽 }
SetTab(pjCenterBOXLINEALL);
SetTab(NApjCenterBOXLINEALL);
SetTab(NApjCenterBOXLINEALL);
SetTab(NApjCenterBOXLINEALL);
Bold := true;
Tab(NANA); { 画出具有粗边框的表格 }
Print(Name);
Tab(NANANA);
Print(Number);
Tab(NANANA);
Print(Amount );
Tab(NANA);
Println(Amount );
Bold := false;
{ 打印具有边框的数据 }
ClearTabs;
SetTab(pjLeftBOXLINEALL);
SetTab(NApjCenterBOXLINEALL);
SetTab(NApjRightBOXLINEALL);
SetTab(NApjRightBOXLINEALL);
for I := to do begin
Str(I * ::S);
Str(I * ::S);
Print(#LastName + IntToStr(I) + );
SetFont(Times New Roman);
Print(FirstName M);
SetFont(Times New Roman);
Println(# + IntToStr(I) + #$ + S + #$ + S);
end; { for }
{ 打印具有阴影的数据 }
ClearTabs;
SetTab(pjLeftBOXLINENONE);
SetTab(NApjCenterBOXLINENONE);
SetTab(NApjRightBOXLINENONE);
SetTab(NApjRightBOXLINENONE);
for I := to do begin
If Odd(I) then begin
TabShade := ;
end else begin
TabShade := ;
end; { else }
Str(I * ::S);
Str(I * ::S);
Print(#LastName + IntToStr(I) + );
SetFont(Times New Roman);
Print(FirstName M);
SetFont(Times New Roman);
Println(# + IntToStr(I) + #$ + S + #$ + S);
end; { for }
ClearTabs;
{ 分栏报表 }
ClearTabs;
SetTopOfPage;
SectionBottom := ;
Home;
SetFont(宋体);
Bold := true;
Underline := true;
Print( 分栏报表 (LinesLeft/ColumnLinesLeft/LineNum/ColumnNum));
SetTopOfPage; { Set top of page to current YPos }
Bold := false;
Underline := false;
Italic := false;
Home; { Goto home position }
SetColumns(); { Create columns with between each }
while ColumnLinesLeft > do begin
Println(IntToStr(LinesLeft) + / + IntToStr(ColumnLinesLeft) + / +
IntToStr(LineNum) + / + IntToStr(ColumnNum));
end; { while }
{ 具有边框的分栏报表 }
ClearTabs;
SetTopOfPage;
SectionBottom := ;
Home;
SetFont(Times New Roman);
Bold := true;
Italic := true;
Print(Boxed Columns);
SetTopOfPage; { Set top of page to current YPos }
Bold := false;
Italic := false;
Home; { Goto home position }
ClearTabs;
SetPen(clBlackpsSolidpmCopy);
SetTab(pjCenterBOXLINEALL);
SetTab(NApjCenterBOXLINEALL);
SetTab(NApjCenterBOXLINEALL);
SetTab(NApjCenterBOXLINEALL);
SetColumns(); { Create columns with between each }
while ColumnLinesLeft > do begin
if LineNum = then begin
TabShade := ;
Println(#LL#CLL#L##C#); { 打印标题栏 }
end else begin
TabShade := ;
Println(# + IntToStr(LinesLeft) + # + IntToStr(ColumnLinesLeft) +
# + IntToStr(LineNum) + # + IntToStr(ColumnNum));
end; { else }
end; { while }
SetColumns();
{ 在指定位置绘出文本 }
NewPage;
OriginX := ; { Set origin to normal }
OriginY := ;
GotoXY();
Print(Text @ );
GotoXY();
Println(Text @ );
GotoXY();
Println(Text @ );
GotoXY();
Println(Text @ );
{*** 图形图片***}
NewPage;
ResetSection;
SetFont(Arial);
Underline := true;
Home;
PrintCenter(Graphics Page DemoPageWidth / );
SetFont(Times New Roman);
SectionBottom := ; { Temporarily move the section bottom down }
PrintFooter(Page + IntToStr(CurrentPage)pjLeft);
PrintFooter(Date //pjRight);
SectionBottom := ; { Reset section bottom }
OriginX := ;
OriginY := ;
SetFont(Arial);
{ 半圆弧线}
SetPen(clBlackpsSolidpmCopy); { Set pen to black /ths wide }
YPos := ;
PrintCenter(Arc() and Chord());
Arc();
SetBrush(clBlackbsClearnil);
Chord();
{ 饼图 }
YPos := ;
PrintCenter(Pie());
以access数据库为例
先新建一个数据库
建立一张表包括的字段为
{[name]
[sex]
[age]
[province]}
添加数据
当然不要太少了
首先我们不考虑Delphi程序的调用打开rave新建一个report
.[File]àNew Data Objectà选择Use Connection String选择[Microsoft Jet OLE DB Provider]选择保存的数据库的位置并测试连接成功[ok]后看到报表设计导航区的Data View Dictionary增加了Database
.[File]àNew Data Object Driver Data View 选择Database [Finish] 弹出Query Advenced Designr将Query Advenced Designr的Tables栏的数据表拖放到layout中à[ok]à看到报表设计导航区的Data View Dictionary增加了DriveDataView扩展后可以看到数据字段
.选[Tools]àReport WizardsàSingle Table 选DriveDataView选择数据库字段Report Title改为个人情况报表好了之后可以看到在page中生成了报表
.按[F]或者快捷按钮[Execute Report]你就可以看到连接到数据库的报表了rave报表根据数据量的多少自动分页根据需要更改格式再预览直到是你所想要的报表格式
这时候就很简单的完成了一张报表当然有些人也许很看到这样设计出来的报表的标题在报表的第一页显示了后在其他页并没有显示
怎么样让标题在每一页显示呢?
选到TitleBand在设置BandStyle在Print Occurrence把New page打勾选中这样在预览你就会发现这时生成的报表每一页都会有标题
当然我们的报表时用程序调用的那么我们在delphi中来设计连接数据库的报表
新建工程在窗体上放置以下组件RvProjectRvSystemRvDataSetConnectionADOConnectionADOTableDataSourceButtonDBGrid设置相应的数据库连接可以看到在DBGrid中显示了数据具体的设置在这里不进行讲解了请参考相应的数据库书RvSystem的Engine为RvSystemRvProjectFile选择保存了的为*Rav文件RvDataSetConnection的DataSet属性设置为ADOTable
打开Rave设计器打开*Rav文件
[File]àNew Data ObjectàDirect Data Viewà选择RvDataSetConnection[Finish]看到报表设计导航区的Data View Dictionary增加了DataView扩展后可以看到数据字段
利用前例步骤同样的方法进行报表的可视化设计在可视化设计时注意看生成的简单数据库代码的组成部分注意TitleBandDataBand Band的属性设置当然我们也可以不用Report Wizards自动生成也可以自己来根据需要直接做报表步骤是
)添加组件页的Region组件来描述报表的范围
)添加BandBand DataBand组件设置相应的BandStyle 和Dataview属性
)在DataBand中添加DataText选择其Dataview属性和DataFile属性
)预览即可如果不能正常显示注意查看属性的设置尤其是Dataview属性同时可以与Report Wizards自动生成的报表进行对比
添加如下代码
procedure TFormButtonClick(Sender: TObject);
begin
RvProjectOpen ;
RvProjectExecuteReport(Report);
RvProjectClose ;
end;
运行后点击[确定]按钮既显示报表设置窗体确定后可以看到你想要得窗体
关于和数据库连接报表的一些问题
)上面的例子是直接从数据库输出的报表如果要输出的报表是根据用户的条件输出怎么办?
如果是要根据用户的条件输出相应的报表使用Query组件当然要是涉及到存储过程的操作也是一样的阿选择相应的数据库访问组件将RvDataSetConnection的Dataset属性连接到数据库访问组件即可
)我在数据库表中的字段是中文的在Rave中连接数据库DataView不能显示我的字段并且提示DataView已经存在! 怎么办?
出现这样的问题主要是DataView的name属性不支持中文名而不能根据数据段名来命名你将DataView更改为相应的英文名更改Fieldname为响应的字段中文刷新DataView还会有提示同样更改name和Fieldname属性直到你要的字段都更改好为止
)默认的报表时竖排的怎么样才能将页面设置为横向的?
关于页面的设置请注意熟悉RvSystem的属性
RvSystemSystemPrinterOrientation :=poLandScape; //页面为横向的
RvSystemSystemPreviewFormState := wsMaximized; //预览窗体最大化
RvSystemSystemPreviewMarginPercent :=; //报表页面据预览窗体的边距
当然还有很多的设置TitleSetupTitleStatusTitlePreview属性可以将你的报表设置报表预览的窗体的标题改为你想要的当然我们最基本的是要改为中文的阿关于怎么让你的报表预览报表设置窗体为中文的我在后面会专门介绍
在Delphi
中使用RAVE报表(五)中讲解了和数据库连接的报表
有朋友提出了问题
所以在用一篇文章讲解使用Query动态查询和存储过程连接数据库的报表
因为要使用到存储过程我们使用SQL_Server数据库建立数据库Infotest建立数据表InfoTable 字段为: {[name][sex][age][province]} 添加数据
数据库的部分不进行过多地讲解在窗体上放置DatabaseQueryDataSourceRvQueryConnectionDBGrid组件连接到数据库{查询所有[陕西]的}按钮的事件为
procedure TFormButtonClick(Sender: TObject);
begin
QuerySQLClear ;
QuerySQLAdd(SELECT * FROM InfoTable WHERE (province =:pro) );
QueryParamByName(pro)AsString :=陕西;
QueryExecSQL ;
QueryActive :=True;
end;
运行点击后可以查看到DBGrid显示了查看的结果这样完成了第一步动态查询的过程
将程序运行[查询]然后打开Rave记住不要关掉查询的程序
[File]=〉New Data Object=〉Direct Data View=〉选择RvQueryConnection=〉 [Finish]=〉看到报表设计导航区的Data View Dictionary增加了DataView扩展后可以看到数据字段
选[Tools]=〉Report Wizards=〉Single Table=〉选DataView选择数据库字段=〉Report Title改为个人情况报表好了之后可以看到在page中生成了报表
然后保存*rav文件关闭程序添加[报表预览]按钮事件以及RvQueryConnection的GetCols和GetRow事件
procedure TFormButtonClick(Sender: TObject);
begin
With RvProjectProjMan do
begin
RvProjectOpen ;
RvQueryConnectionExecGetCols ; //得到列名
RvQueryConnectionExecGetRow ;//得到记录
RvProjectExecuteReport(Report);
Close ;
end;
end;
procedure TFormRvQueryConnectionGetCols(
Connection: TRvCustomConnection);
begin
ConnectionWriteField(namedtString);
ConnectionWriteField(sexdtString);
ConnectionWriteField(agedtInteger);
ConnectionWriteField(provincedtString);
end;
procedure TFormRvQueryConnectionGetRow(Connection: TRvCustomConnection);
begin
ConnectionWriteStrdata(DBGridFields[]value);
ConnectionWriteStrdata(DBGridFields[]value);
ConnectionWriteIntdata(DBGridFields[]value);
ConnectionWriteStrdata(DBGridFields[]value);
end;
在运行程序这样就完成了一个根据动态查询生成的报表
使用存储过程的报表方法如下:
首先你要建立你的存储过程建立存储如下虽然这样的简单的查询用存储过程没有必要这里也只是简单的示例:
ALTERprocedure pr_test
as
DECLARE @chrnSQL nvarchar()
SELECT @chrnSQL=select * FROM InfoTable where age>
EXEC sp_ExecuteSql @chrnSQL
在上例的程序中增加DBGrid StoredProcDataSourceRvDataSetConnection[运行存储过程]按钮和[报表预览]按钮DataSource的dataset属性设置为StoredProcDBGrid的DataSource设置为DataSourceStoredProc连接数据库StoredProcName := pr_test; RvDataSetConnection的dataset属性设置为StoredProc [运行存储过程]按钮的click事件为
with StoredProc do begin
prepare;
StoredProcActive :=True;
end;
运行程序看到DBGrid显示了存储过程查询的结果
将程序运行[运行存储过程]然后打开Rave记住不要关掉查询的程序
然后用和上例相同的方法添加如下代码
[File]=〉New Data Object=〉Direct Data View=〉选择RvDataSetConnection=〉 [Finish]=〉看到报表设计导航区的Data View Dictionary增加了DataView扩展后可以看到数据字段
选[Tools]àReport WizardsàSingle Tableà 选DataView选择数据库字段àReport Title改为个人情况报表好了之后可以看到在page中生成了报表
保存文件关闭程序添加[报表预览]按钮事件以及RvDataSetConnection的GetCols和GetRow事件
procedure TFormButtonClick(Sender: TObject);
begin
With RvProjectProjMan do
begin
RvProjectOpen ;
RvDataSetConnectionExecGetCols ; //得到列名
RvDataSetConnectionExecGetRow ;//得到记录
RvProjectExecuteReport(Report);
Close ;
end;
end;
procedure TFormRvDataSetConnectionGetCols(
Connection: TRvCustomConnection);
begin
ConnectionWriteField(namedtString); {列名}
ConnectionWriteField(sexdtString);
ConnectionWriteField(agedtInteger);
ConnectionWriteField(provincedtString);
end;
procedure TFormRvDataSetConnectionGetRow(
Connection: TRvCustomConnection);
begin
ConnectionWriteStrdata(DBGridFields[]value);
ConnectionWriteStrdata(DBGridFields[]value);
ConnectionWriteIntdata(DBGridFields[]value);
ConnectionWriteStrdata(DBGridFields[]value);
end;
好了这篇的讲解应该大家都明白和数据库有关的报表怎么设计了总结一下通过DBGrid数据感应组件得到查询的结果通过和rave的连接组件(RvDataSetConnectionRvQueryConnection等)的GetCols和GetRow事件往报表当中添加数据