前面引用了2篇基础介绍RAVE报表组件的文章,目的就是为了让大家方便地能认识一些基础的知识,方便这篇文章的阅读和使用。
      最近由于项目需求变动,需要使用到了Rave进行报表设计,在使用中也查阅了很多资料,但是,网上的资料很多都是很浅显的入门文章,本文中主要介绍,如何使用带参存储过程作为数据源,实现可视化报表的设计。
      下面是界面设计,很简单,通过选择的日期和时间范围,以要打印数据的类别来生成打印报表。在界面中添加一个RvProject,几个RvDataSetConnection,几个ADOStoredProc,一个ADOConnection,当然,这只是为设计时为了方便应用,在完成可视化设计报表格式后,可以只使用一个存储过程的组件就可以了。  
10_689_dd073726ebf42bf.gif
      思想就是:当可视化建立报表时,需要提供数据源,使用带参数的存储过程在设计时,需要提供参数值,才能得到由存储过程返回的数据源; 而存储过程的参数值是由界面提供并由用户选择动态产生的,这就需要在设计时,屏蔽参数值的部分,可以采用两种方法:一是指定固定的参数值,另外就是修改存储过程,先去掉存储过程的参数部分,当然,要保证,去掉参数前后,存储过程返回的数据集是结构等同的。
      下面提供部分代码,以供参考:
存储过程部分:(如何使用表名做参数,我以前写过一个总结)
CREATE Procedure GetSteel @tableName nvarchar(20),@strDate nvarchar(20),@strBeginTime nvarchar(30),@strEndTime nvarchar(30)
AS
declare @sSql nvarchar(4000)
set @sSql = 'select  AVG(CASE WHEN P24 = 999 THEN NULL ELSE P24 END) as A1L,AVG(CASE WHEN P23 = 999 THEN NULL ELSE P23 END) as A1R,AVG(CASE WHEN P18 = 999 THEN NULL ELSE P18 END) as A2L,AVG(CASE WHEN P17 = 999 THEN NULL ELSE P17 END) as A2R,'
set @sSql = @sSql + ' AVG(CASE WHEN P138 = 999 THEN NULL ELSE P138 END) as B15L,AVG(CASE WHEN P137 = 999 THEN NULL ELSE P137 END) as B15R,AVG(CASE WHEN P144 = 999 THEN NULL ELSE P144 END) as B16L,AVG(CASE WHEN P143 = 999 THEN NULL ELSE P143 END) as B16R from  '
set @sSql = @sSql + @tableName
set @sSql = @sSql + '  Where TempDate = ' + @strDate  + ' AND  TempTime  BETWEEN ' +  @strBeginTime  + '  AND ' + @strEndTime
EXECUTE sp_executesql @sSql
GO
      在设计时,将参数部分注释掉,同时,将存储过程的名称指定为GetSteel,将Active 属性设为True。然后在Rave工程中建立一个DataView,就可以看到相应的数据字段列表,可以进行报表的设计了。
      在设计完报表后,可以按F9预览,数据源的Active属性为True,可以看到已经有数据显示在报表中。
     下一步就是修改存储过程的属性,将active设为False,去掉ProcedureName 属性,然后在程序中指定存储过程的参数值。
     下面是部分代码,已经整理过界面元素,并将连接数据库的控件整理到一个DataMConn单元中。
        With DataMConn.ADOSPPrintSteel do
          begin
            Close;
            ProcedureName := 'GetSteel';
            Parameters.Clear;
            Parameters.CreateParameter('@tableName',ftString,pdinput,20,0);
            Parameters.CreateParameter('@strDate',ftString,pdinput,20,0);
            Parameters.CreateParameter('@strBeginTime',ftString,pdinput,20,0);
            Parameters.CreateParameter('@strEndTime',ftString,pdinput,20,0);
            Parameters.ParamByName('@tableName').Value := tableName;
            Parameters.ParamByName('@strDate').Value := strDate;
            Parameters.ParamByName('@strBeginTime').Value :=strBeginTime ;
            Parameters.ParamByName('@strEndTime').Value := strEndTime;
            try
              Open;
              rvDataSetConnection1.DataSet := DataMConn.ADOSPPrintSteel;
            except
              begin
                ShowMessage('打开存储过程出现错误!请联系开发人员');
                Exit;
              end;
            end;
          end;
      RvProject.ProjectFile:=GetCurrentDir()+'\Project.rav'; //得到工程路径
      RvProject.Open;//打开报表工程
      if cmbKind.ItemIndex = 0 then   //全部数据
        begin
         With RvProject.ProjMan do //找到要打印的报表页的日期时间等控件,并赋值
          begin
           MyPage:=FindRaveComponent('Report4.Page1',nil) as TRavePage;
           MyText:=FindRaveComponent('txtDate',MyPage) as TRaveText;
           MyText.Text:= printDate;
            MyText:=FindRaveComponent('txtBeginTime',MyPage) as TRaveText;
           MyText.Text:= printBeginTime;
            MyText:=FindRaveComponent('txtEndTime',MyPage) as TRaveText;
           MyText.Text:= printEndTime;
         end;
          RvProject.ExecuteReport('report4');//执行打印
          RvProject.Close;
        end;
注意:在存储过程写好后,不要轻易变更各个字段名称,因为这样将导致Rave 中的DataView不可用;在设计时也要十分小心,否则很可能要推倒重来,重新将存储过程设为无参,注释掉赋参的代码,重新添加DataView等等。我就如此经历了几次,才摸清楚到底如何使用带参数的存储过程做数据源实现报表的可视化设计,希望对有需要者有些帮助!