分享

Delphi7中使用RAVE报表

 佚名2016 2016-10-19
                 最近刚刚做完一个项目,使用到了RAVE进行报表设计,在使用中也查阅了很多资料,但总觉得网上的资料过于分散,而且都不是很全面,所以决定将如何在Delphi 7中使用RAVE报表写成几篇文章,由于本人从小语文学得不好,不是写作高手,这次也是第一次写这样的文章。希望看到这篇文章的网友能多提意见,欢迎大家指教。可以给我留言。
  
  言归正传,在我们要给用户编写的软件中往往需要生成各种各样的报表,报表是数据库中数据的最终表现形式,在Delphi 6以前,编写报表都在使用Qusoft公司的Quick report,而且在Delphi中集成了Quick report。 在Borland Delphi? 7 Studio 集成开发环境(IDE)的控件面板中取消了Quick report项,取而代之以Nevrona公司Rave Reports项,且在Tools中有Rave Designer 5.0 。
  
  打开Rave Designer 5.0,我们可以如图所示的一个报表设计界面,开发人员可以开发出符合用户要求的报表来,而且这个报表的设计、使用与Delphi集成开发环境几乎是完全的一样,这可能是Rave与其它的报表组件最大的外观上的不同。
  
  我在使用中下载了Rave Reports v5.1.3,你可以在或者下载,在写这篇文章时,上已经发布了Rave Reports 6.0,不过文章还是以Rave Reports v5.1.3为准。打开Delphi,可以控件面板看到如图:
  
 

  Delphi7下的Rave
  
  打开Tools中的Rave,看到的报表设计界面如图:
  
 

  Rave5的报表设计界面
  
  首先,介绍一下Rave的报表设计器的各组件和相关的属性。Rave Designer集成开发环境的界面包括标题栏、菜单栏、快捷工具栏、组件栏和一些窗口:
  
  ·标题栏显示了当前的工程名,位于最上部。
  
  ·菜单栏,一些功能可通过菜单栏的菜单命令实现。
  
  ·快捷工具栏为位图按钮,一些常用的菜单命令用这些按钮实现。
  
 

  ·报表组件栏分页显示各种组件(Standard、Report、Zoom、Colors、Lines、Fills、Fonts、Drawing、Bar Code、Alignment),在利用Rave开发应用程序的过程中,正确、合理地使用组件非常重要。用它可设计基于数据库和文本的复杂报表。
  
 

  ·左边半部分像Delphi的object inspector工具,可设置报表元件的属性,它的下部分有对应属性的简短提示。
  
  ·正中部分为设计区域,开发者可在上面添加各种设计元件,如Drawing的横线、直线、矩形、椭圆,Barcode中各种常用的条码,Standand 中的Text、Memo、Section、Bitmap、Metafile等等。
  
  ·右边为设计导航区,可查看报表的各元件的更多信息,如报表库和数据显示目录,设计时也可快速定位元件位置。
  
  Rave的报表设计器,组件栏的各组件:
  
  Drawing (绘图) 组件页:
  
 

  Line component :画线组件,所画的线较灵活 。可以看到其属性入图,有颜色、线宽、线行等属性,设计者根据需要更改属性。改变线的长短位置,选中线条后,选择一个端点则光标会变为十子型,拖动即可。
  
 

  Hline component :画水平线组件 。
  
  Vline component :画垂直线组件 。
  
  Rectangle component :画长方形组件,可以使用fill组件填充。
  
  Square component :画正方形组件,可以使用fill组件填充。
  
  Ellipse component :画椭圆组件,可以使用fill组件填充。
  
  Circle component :画圆形组件,可以使用fill组件填充。
  
  Bar Code(条形码)组件页:
  
 

  PostNetBarCode :打印邮件标签上包括 POSTNET 条码 。
  
  I2of5BarCode :打印 Interleaved 2 of 5条码。
  
  Code39BarCode :打印standard and extended Code 39条码。
  
  Code128BarCode :打印 A, B and C Code 128条码。
  
  UPCBarCode :打印 UPC-12条码。
  
  EANBarCode :打印 EAN-13条码。
  
  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,则报表的初始页为5,页码从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(求累加和)。
  
  DataMirror Section:和Section组件相似。
  
  Region:如果要进行报表的打印,Region组件规定了打印区域,可以设置Columns来分栏。
  
  Band:这个组件算是一个容器组件,包括text、Memo组件等,包括的是非数据库库信息,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了,这次主要介绍Delphi7下的Rave组件。打开Delphi7,看到的rave页如下:
  
  Delphi7下的Rave
  
  包括有RvProject、RvSystem、RvNDRWriter、RvCustomConnection、RvDataSetConnection、RvTableConnection、RvQueryConnection、RvRenderPreview、RvRenderPrinter、RvRenderPDF、RvRenderHTML、RvRenderRTF、RvRenderText这几个组件。
  
  lRvProject组件
  在使用rave报表中,这个组件是最为重要的一个,是使用频率最高的一个组件,开发人员可以通过这个报表完成报表的打印、文件的生成、输出,土过此事可以使用设计状态,也可以通过它来点用相应的报表设计器。
  
  属性:
  
  DLLFile:发行报表时需要的dll文件,在5.0以后用户不需要单独发行相应的动态链库文件了。
  
  Engine: 指定相应报表生成的目的地,一般的情况下,是RvSystem,也就是说它可以打印、打印预览、生成打印文件。当然也可以选择RvNDRWriter组件,那么报表输出的结果是RTF、HTML、PDF、TXT其中的一种。
  
  LoadDesigner: 允许用户调用报表设计器,如果它的值为true,那么最终用户就可以调用报表设计器;如果它的值为False,那么最终用户就没有权力调用报表设计器。
  
  ProjectFile:相应报表项目文件,指定详细目录路径。
  
  StoreRAV:要将报表文件嵌入到exe文件中,在这里就要填入相应的报表项目文件。
  
  主要方法:
  
  SelectReport方法:
  
  Function SelectReport(ReportName:String; FullName:Boolean):Boolean;
  
  ReportName是相应的报表名称,FullName则表示是否以报表的全程作为报表的名称。
  
  Execute方法:
  
  打印选择的相应报表文件,报表时被SelectReport选择的。
  
  RvProject1.Execute;
  
  ExecuteReport方法:
  
  RvProject1.ExecuteReport(ReportName:String);
  
  ReportName是相应的报表的名称。
  
  Open方法:
  
  RvProject1.Open; 打开相应的报表以共操作。
  
  Close方法:
  
  RvProject1.Close; 关闭一个报表的操作。
  
  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组件
  
  报表生成相应文件的组件,可让报表生成相应的pdf、html、rtf、text文件。但生成文件对中文不支持,会出现乱码。

  前面两篇,向大家介绍了RAVE的组件,从今天开始向大家介绍如何建立报表。首先要感谢li jack等各位朋友给我发的电子邮件,鼓励我继续写下去。今天也查了一下RAVE一词的意思。
  
  RAVE在辞典上的翻译为“咆哮”。 rave-up喧闹的宴会, 狂欢聚会,我们经常也听到锐舞派对,也就是RAVE PARTY。
  
  要对Rave文化追根溯源其实不太容易,并非是因为其无从追溯,恰恰相反,正因为它涵盖的面太广,根基太深,所以反而让人有些无从入手。从远的来说,Rave与各块大陆上土著部落的祭典仪式有着相当的渊源,因为这些祭典通常也是通过音乐与紧密的鼓点而使人进入某种超验状态;从近的来说,Rave又与60年 代的嬉皮文化与迷幻实验有着密不可分的关系,两代年轻人除了装扮不同,许多心理状态与行为方式其实都有值得注意的相似之处。
  真正当代的将新式音乐与舞曲相结合的Rave运动起源于英国。10多年前,Rave首先出现在曼彻斯特和伊比沙岛(英国著名度假胜地)。1987年末及1988年初,两个并无关系的团体--Schoom和Genesis P开始在英国组织彻夜的舞会,前者是以house音乐为主,而后者以hardcore为主。与此同时,Rave在德国登陆,在柏林等大城市很受欢迎。很快,Rave在英德两地吸引了数以万计的青少年,更吸引了许多来自美国的DJ。
  
  现在Rave已经是欧、美、日,甚至港台最时兴、最UNDERGROUND的一种青少年娱乐形式,Rave文化从一开始便被打上了高科技的烙印,从急速疯狂的前卫电子舞曲,新奇剌激的影像视觉,到Sharp得眼花缭乱的装束,Rave与E-Life,已经成为科技对青年文化影响的见证。
  
  当然我也不知道为什么Nevrona公司把这个报表组件叫做rave,也许和锐舞有着一定的关系吧,就像java咖啡。
  
  言归正传,我们开始建立一张简单的报表,打开Delphi7, 新建一个工程,打开Tools下的Rave Designer,在Rave 设计器的page1中,拖放Text,我们在text属性中写入文字内容,例如,“我的第一张报表” ,通过Font属性更改字体和字的大小,颜色等。拖放Memo组件,在text属性中输入文字可以看到一个多行的文本。拖放Bitmap组件,在FileLink属性中选取插入图片的位置,就可以看到在报表中显示了一张图片。
  
  点击[Execute Report]或者F9,则查看到运行后报表。

  上一篇向大家介绍了建立一张简单报表的过程。这篇文章向大家介绍rave报表代码编程实例。窗体上放置组件:RvSystem, Button即可。
  
  具体代码如下:
  ##################################################################################
  
  unit Unit1;
  
  interface
  
  uses
  
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  
  Dialogs, StdCtrls, RpDefine, RpBase, RpSystem;
  
  type
  
  TForm1 = class(TForm)
  
  RvSystem1: TRvSystem;
  
  Button1: TButton;
  
  procedure RvSystem1Print(Sender: TObject);
  
  procedure Button1Click(Sender: TObject);
  
  private
  
  { Private declarations }
  
  public
  
  { Public declarations }
  
  end;
  
  var
  
  Form1: TForm1;
  
  implementation
  
  {$R *.dfm}
  
  procedure TForm1.RvSystem1Print(Sender: TObject);
  
  var
  
  I1: integer;
  
  S1: string[20];
  
  S2: string[20];
  
  Bitmap: TBitmap;
  
  PolyLineArr: array[1..6] of TPoint;
  
  begin
  
  with Sender as TBaseReport do begin
  
  { 打印表头和表尾 }
  
  SectionTop := 0.75; //顶端
  
  SetFont('黑体',26); //设置字体
  
  Underline := true; //下划线
  
  Home;
  
  YPos := 1.0;
  
  FontRotation :=20;//旋转角度
  
  PrintCenter('我的报表',PageWidth / 2);
  
  SetFont('宋体',10);
  
  SectionBottom := 10.75;
  
  PrintFooter(' 第' + IntToStr(CurrentPage) + '页',pjLeft); //页码
  
  PrintFooter('日期: '+DateToStr(Date)+' ',pjRight); //日期
  
  SectionBottom := 10.5;
  
  YPos := 1.5;
  
  SetFont('宋体',12);
  
  SetTopOfPage;
  
  Home;
  
  { 打印列标题 }
  
  ClearTabs;
  
  SetPen(clBlack,psSolid,1,pmCopy); { 设置画笔为一个点宽 }
  
  SetTab(0.5,pjCenter,3.5,0,BOXLINEALL,0);
  
  SetTab(NA,pjCenter,1.0,0,BOXLINEALL,0);
  
  SetTab(NA,pjCenter,1.5,0,BOXLINEALL,0);
  
  SetTab(NA,pjCenter,1.5,0,BOXLINEALL,0);
  
  Bold := true;
  
  Tab(-2,NA,-2,-2,NA); { 画出具有粗边框的表格 }
  
  Print('Name');
  
  Tab(NA,NA,-2,-2,NA);
  
  Print('Number');
  
  Tab(NA,NA,-2,-2,NA);
  
  Print('Amount 1');
  
  Tab(NA,-2,-2,-2,NA);
  
  Println('Amount 2');
  
  Bold := false;
  
  { 打印具有边框的数据 }
  
  ClearTabs;
  
  SetTab(0.5,pjLeft,3.5,2,BOXLINEALL,0);
  
  SetTab(NA,pjCenter,1.0,2,BOXLINEALL,0);
  
  SetTab(NA,pjRight,1.5,2,BOXLINEALL,10);
  
  SetTab(NA,pjRight,1.5,2,BOXLINEALL,0);
  
  for I1 := 1 to 10 do begin
  
  Str(I1 * 1.23:2:2,S1);
  
  Str(I1 * 98.76:2:2,S2);
  
  Print(#9'LastName' + IntToStr(I1) + ', ');
  
  SetFont('Times New Roman',8);
  
  Print('FirstName M.');
  
  SetFont('Times New Roman',12);
  
  Println(#9 + IntToStr(I1) + #9'$' + S1 + #9'$' + S2);
  
  end; { for }
  
  { 打印具有阴影的数据 }
  
  ClearTabs;
  
  SetTab(0.5,pjLeft,3.5,2,BOXLINENONE,0);
  
  SetTab(NA,pjCenter,1.0,2,BOXLINENONE,0);
  
  SetTab(NA,pjRight,1.5,2,BOXLINENONE,0);
  
  SetTab(NA,pjRight,1.5,2,BOXLINENONE,0);
  
  for I1 := 11 to 20 do begin
  
  If Odd(I1) then begin
  
  TabShade := 0;
  
  end else begin
  
  TabShade := 15;
  
  end; { else }
  
  Str(I1 * 1.23:2:2,S1);
  
  Str(I1 * 98.76:2:2,S2);
  
  Print(#9'LastName' + IntToStr(I1) + ', ');
  
  SetFont('Times New Roman',8);
  
  Print('FirstName M.');
  
  SetFont('Times New Roman',12);
  
  Println(#9 + IntToStr(I1) + #9'$' + S1 + #9'$' + S2);
  
  end; { for }
  
  ClearTabs;
  
  { 分栏报表 }
  
  ClearTabs;
  
  SetTopOfPage;
  
  SectionBottom := 8.0;
  
  Home;
  
  SetFont('宋体',12);
  
  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(4,0.5); { Create 4 columns with 0.5" between each }
  
  while ColumnLinesLeft > 0 do begin
  
  Println(IntToStr(LinesLeft) + '/' + IntToStr(ColumnLinesLeft) + '/' +
  
  IntToStr(LineNum) + '/' + IntToStr(ColumnNum));
  
  end; { while }
  
  { 具有边框的分栏报表 }
  
  ClearTabs;
  
  SetTopOfPage;
  
  SectionBottom := 10.5;
  
  Home;
  
  SetFont('Times New Roman',12);
  
  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(clBlack,psSolid,1,pmCopy);
  
  SetTab(0.5,pjCenter,0.375,0,BOXLINEALL,0);
  
  SetTab(NA,pjCenter,0.375,0,BOXLINEALL,0);
  
  SetTab(NA,pjCenter,0.375,0,BOXLINEALL,0);
  
  SetTab(NA,pjCenter,0.375,0,BOXLINEALL,0);
  
  SetColumns(4,0.5); { Create 4 columns with 0.5" between each }
  
  while ColumnLinesLeft > 0 do begin
  
  if LineNum = 1 then begin
  
  TabShade := 15;
  
  Println(#9'LL'#9'CLL'#9'L#'#9'C#'); { 打印标题栏 }
  
  end else begin
  
  TabShade := 0;
  
  Println(#9 + IntToStr(LinesLeft) + #9 + IntToStr(ColumnLinesLeft) +
  
  #9 + IntToStr(LineNum) + #9 + IntToStr(ColumnNum));
  
  end; { else }
  
  end; { while }
  
  SetColumns(1,0);
  
  { 在指定位置绘出文本 }
  
  NewPage;
  
  OriginX := 0.0; { Set origin to normal }
  
  OriginY := 0.0;
  
  GotoXY(1.0,1.5);
  
  Print('Text @ 1.0,1.5');
  
  GotoXY(6.0,1.5);
  
  Println('Text @ 6.0,1.5');
  
  GotoXY(2.0,2.0);
  
  Println('Text @ 2.0,2.0');
  
  GotoXY(3.0,2.5);
  
  Println('Text @ 3.0,2.5');
  
  {*** 图形 图片***}
  
  NewPage;
  
  ResetSection;
  
  SetFont('Arial',24);
  
  Underline := true;
  
  Home;
  
  PrintCenter('Graphics Page Demo',PageWidth / 2);
  
  SetFont('Times New Roman',8);
  
  SectionBottom := 10.75; { Temporarily move the section bottom down }
  
  PrintFooter('Page ' + IntToStr(CurrentPage),pjLeft);
  
  PrintFooter('Date 01/20/95',pjRight);
  
  SectionBottom := 10.5; { Reset section bottom }
  
  OriginX := 0.0;
  
  OriginY := 0.5;
  
  SetFont('Arial',10);
  
  { 半圆 弧线}
  
  SetPen(clBlack,psSolid,-2,pmCopy); { Set pen to black 2/100ths" wide }
  
  YPos := 0.95;
  
  PrintCenter('Arc() and Chord()',2.125);
  
  Arc(1.125,1.0,3.125,3.0,3.125,2.0,0.0,0.0);
  
  SetBrush(clBlack,bsClear,nil);
  
  Chord(1.125,1.0,3.125,3.0,0.0,0.8,3.125,2.25);
  
  { 饼图 }
  
  YPos := 0.95;
  
  PrintCenter('Pie()',4.25);

  以access数据库为例,先新建一个数据库,建立一张表包括的字段为:{[name]、[sex]、[age]、[province]},添加数据,当然不要太少了。
  首先,我们不考虑Delphi程序的调用,打开rave新建一个report;
  
  1.[File]àNew Data Objectà选择Use Connection String。选择[Microsoft Jet 4.0 OLE DB Provider],选择保存的数据库的位置并测试连接成功。[ok]后,看到报表设计导航区的Data View Dictionary增加了Database1;
  2.[File]àNew Data Object Driver Data View 选择Database1 [Finish] 弹出Query Advenced Designr,将Query Advenced Designr的Tables栏的数据表拖放到layout中à[ok]à看到报表设计导航区的Data View Dictionary增加了DriveDataView1,扩展后可以看到数据字段;
  3.选[Tools]àReport WizardsàSingle Table 选DriveDataView1,选择数据库字段Report Title改为“个人情况报表”。好了之后,可以看到在page中生成了报表。
  4.按[F9]或者快捷按钮[Execute Report],你就可以看到连接到数据库的报表了,rave报表根据数据量的多少自动分页。根据需要更改格式,再预览,直到是你所想要的报表格式。
  
 

  这时候就很简单的完成了一张报表,当然有些人也许很看到这样设计出来的报表的标题在报表的第一页显示了后,在其他页并没有显示。
  怎么样让标题在每一页显示呢?
  选到TitleBand,在设置BandStyle在Print Occurrence把New page打勾选中,这样在预览你就会发现,这时生成的报表每一页都会有标题。
  
  当然,我们的报表时用程序调用的,那么我们在delphi中来设计连接数据库的报表。
  1.新建工程,在窗体上放置以下组件:RvProject,RvSystem,RvDataSetConnection,ADOConnection,ADOTable,DataSource,Button,DBGrid。设置相应的数据库连接可以看到在DBGrid中显示了数据,具体的设置在这里不进行讲解了,请参考相应的数据库书。RvSystem1的Engine为RvSystem1,RvProjectFile选择保存了的为*.Rav文件。RvDataSetConnection1的DataSet属性设置为:ADOTable1。
  

  2.打开Rave设计器打开*.Rav文件。
  3.[File]àNew Data ObjectàDirect Data Viewà选择RvDataSetConnection1,[Finish]看到报表设计导航区的Data View Dictionary增加了DataView1,扩展后可以看到数据字段;
  4.利用前例步骤3,同样的方法,进行报表的可视化设计。在可视化设计时,注意看生成的简单数据库代码的组成部分,注意TitleBand,DataBand, Band的属性设置。当然我们也可以不用Report Wizards自动生成也可以自己来根据需要直接做报表。步骤是:
  1)添加组件页的Region组件,来描述报表的范围。
  2)添加Band,Band, DataBand组件,设置相应的BandStyle 和Dataview属性。
  3)在DataBand中添加,DataText选择其Dataview属性和DataFile属性。
  4)预览即可,如果不能正常显示,注意查看属性的设置,尤其是Dataview属性,同时可以与Report Wizards自动生成的报表进行对比。
  5.添加如下代码:
  procedure TForm1.Button1Click(Sender: TObject);
  begin
  RvProject1.Open ;
  RvProject1.ExecuteReport('Report1');
  RvProject1.Close ;
  end;
  6.运行后,点击[确定]按钮,既显示报表设置窗体,确定后可以看到你想要得窗体。
  
  关于和数据库连接报表的一些问题:
  
  1)上面的例子是直接从数据库输出的报表,如果要输出的报表是根据用户的条件输出,怎么办?
  如果是要根据用户的条件输出相应的报表,使用Query组件,当然要是涉及到存储过程的操作,也是一样的阿。选择相应的数据库访问组件,将RvDataSetConnection的Dataset属性连接到数据库访问组件即可。
  2)我在数据库表中的字段是中文的,在Rave中连接数据库,DataView不能显示我的字段,并且提示“DataView1已经存在!” ,怎么办?
  出现这样的问题主要是DataView1的name属性不支持中文名,而不能根据数据段名来命名,你将DataView1更改为相应的英文名,更改Fieldname为响应的字段中文,刷新DataView,还会有提示,同样更改name和Fieldname属性,直到你要的字段都更改好为止。
  3)默认的报表时竖排的,怎么样才能将页面设置为横向的?
  
  关于页面的设置请注意熟悉RvSystem的属性。
  RvSystem1.SystemPrinter.Orientation :=poLandScape; //页面为横向的
  RvSystem1.SystemPreview.FormState := wsMaximized; //预览窗体最大化
  RvSystem1.SystemPreview.MarginPercent :=3; //报表页面据预览窗体的边距。
  当然还有很多的设置TitleSetup,TitleStatus,TitlePreview属性可以将你的报表设置,报表预览的窗体的标题改为你想要的。当然我们最基本的是要改为中文的阿。关于怎么让你的报表预览,报表设置窗体为中文的我在后面会专门介绍。

  在Delphi 7 中使用RAVE报表(五)中讲解了和数据库连接的报表,有朋友提出了问题,所以在用一篇文章讲解使用Query动态查询和存储过程连接数据库的报表。
  因为要使用到存储过程,我们使用SQL_Server2000数据库,建立数据库Infotest,建立数据表InfoTable 字段为: {[name]、[sex]、[age]、[province]} ,添加数据。
  数据库的部分不进行过多地讲解。在窗体上放置Database,Query,DataSource,RvQueryConnection,DBGrid组件,连接到数据库,{查询所有[陕西]的}按钮的事件为:
  procedure TForm1.Button1Click(Sender: TObject);
  begin
  Query1.SQL.Clear ;
  Query1.SQL.Add('SELECT * FROM InfoTable WHERE (province =:pro) ');
  Query1.ParamByName('pro').AsString :='陕西';
  Query1.ExecSQL ;
  Query1.Active :=True;
  end;
  
 

  运行点击后,可以查看到DBGrid显示了查看的结果,这样完成了第一步------动态查询的过程。
  将程序运行,[查询],然后打开Rave,记住不要关掉查询的程序。
  [File]=〉New Data Object=〉Direct Data View=〉选择RvQueryConnection1=〉 [Finish]=〉看到报表设计导航区的Data View Dictionary增加了DataView1,扩展后可以看到数据字段;
  选[Tools]=〉Report Wizards=〉Single Table=〉选DataView1,选择数据库字段=〉Report Title改为“个人情况报表”。好了之后,可以看到在page中生成了报表。
  

  然后,保存*.rav文件关闭程序,添加[报表预览]按钮事件。以及RvQueryConnection1的GetCols和GetRow事件。
  procedure TForm1.Button2Click(Sender: TObject);
  begin
  With RvProject1.ProjMan do
  begin
  RvProject1.Open ;
  RvQueryConnection1.ExecGetCols ; //得到列名
  RvQueryConnection1.ExecGetRow ; //得到记录
  RvProject1.ExecuteReport('Report2');
  Close ;
  end;
  end;
  
  procedure TForm1.RvQueryConnection1GetCols(
  Connection: TRvCustomConnection);
  begin
  Connection.WriteField('name',dtString,10,'','');
  Connection.WriteField('sex',dtString,6,'','');
  Connection.WriteField('age',dtInteger,6,'','');
  Connection.WriteField('province',dtString,10,'','');
  end;
  
  procedure TForm1.RvQueryConnection1GetRow(Connection: TRvCustomConnection);
  begin
  Connection.WriteStrdata('',DBGrid1.Fields[0].value);
  Connection.WriteStrdata('',DBGrid1.Fields[1].value);
  Connection.WriteIntdata('',DBGrid1.Fields[2].value);
  Connection.WriteStrdata('',DBGrid1.Fields[3].value);
  end;
  在运行程序,这样就完成了一个根据动态查询生成的报表。
  使用存储过程的报表方法如下:
  首先你要建立你的存储过程,建立存储如下,虽然这样的简单的查询用存储过程没有必要,这里也只是简单的示例:
  ALTER procedure pr_test
  as
  DECLARE  @chrnSQL nvarchar(1000)
  SELECT @chrnSQL='select * FROM InfoTable where age>21'
  EXEC sp_ExecuteSql @chrnSQL
  在上例的程序中,增加DBGrid2, StoredProc1,DataSource2,RvDataSetConnection1,[运行存储过程]按钮,和[报表预览]按钮。DataSource2的dataset属性设置为StoredProc1,DBGrid2的DataSource设置为DataSource2。StoredProc1连接数据库,StoredProcName := 'pr_test'; RvDataSetConnection1的dataset属性设置为StoredProc1, [运行存储过程]按钮的click事件为:
  with StoredProc1 do begin
  prepare;
  StoredProc1.Active :=True;
  end;
  运行程序,看到DBGrid2显示了存储过程查询的结果。
  将程序运行,[运行存储过程],然后打开Rave,记住不要关掉查询的程序。
  然后,用和上例相同的方法,添加如下代码:
  [File]=〉New Data Object=〉Direct Data View=〉选择RvDataSetConnection1=〉 [Finish]=〉看到报表设计导航区的Data View Dictionary增加了DataView2,扩展后可以看到数据字段;
  选[Tools]àReport WizardsàSingle Tableà 选DataView2,选择数据库字段àReport Title改为“个人情况报表”。好了之后,可以看到在page中生成了报表。
  保存文件,关闭程序,添加[报表预览]按钮事件。以及RvDataSetConnection1的GetCols和GetRow事件。
  procedure TForm1.Button4Click(Sender: TObject);
  begin
  With RvProject1.ProjMan do
  begin
  RvProject1.Open ;
  RvDataSetConnection1.ExecGetCols ; //得到列名
  RvDataSetConnection1.ExecGetRow ; //得到记录
  RvProject1.ExecuteReport('Report3');
  Close ;
  end;
  end;
  
  procedure TForm1.RvDataSetConnection1GetCols(
  Connection: TRvCustomConnection);
  begin
  Connection.WriteField('name',dtString,10,'',''); {列名}
  Connection.WriteField('sex',dtString,6,'','');
  Connection.WriteField('age',dtInteger,6,'','');
  Connection.WriteField('province',dtString,10,'','');
  end;
  procedure TForm1.RvDataSetConnection1GetRow(
  Connection: TRvCustomConnection);
  begin
  Connection.WriteStrdata('',DBGrid2.Fields[0].value);
  Connection.WriteStrdata('',DBGrid2.Fields[1].value);
  Connection.WriteIntdata('',DBGrid2.Fields[2].value);
  Connection.WriteStrdata('',DBGrid2.Fields[3].value);
  end;
  好了,这篇的讲解应该大家都明白和数据库有关的报表怎么设计了,总结一下:通过DBGrid数据感应组件得到查询的结果,通过和rave的连接组件(RvDataSetConnection、RvQueryConnection等)的GetCols和GetRow事件往报表当中添加数据。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多