动态指定存储过程的参数来可视化建立报表工程

来源:计算机等级考试    发布时间:2012-08-29    计算机等级考试视频    评论

  2009年下半年全国计算机等级考试你准备好了没?考计算机等级考试的朋友,2009年下半年全国计算机等级考试时间是2009年9月19日至23日。更多优质资料尽在考试大论坛 考试大在线题库
  由于项目需求变动,需要使用到了Rave进行报表设计,在使用中也查阅了很多资料,但是,网上的资料很多都是很浅显的入门文章,本文中主要介绍,如何使用带参存储过程作为数据源,实现可视化报表的设计。
  下面是界面设计,很简单,通过选择的日期和时间范围,以要打印数据的类别来生成打印报表。在界面中添加一个RvProject,几个RvDataSetConnection,几个ADOStoredProc,一个ADOConnection,当然,这只是为设计时为了方便应用,在完成可视化设计报表格式后,可以只使用一个存储过程的组件就可以了。
  /'800/')this.width=/'800/';if(this.height>/'600/')this.height=/'600/';/" border=0>  
  思想就是:当可视化建立报表时,需要提供数据源,使用带参数的存储过程在设计时,需要提供参数值,才能得到由存储过程返回的数据源; 而存储过程的参数值是由界面提供并由用户选择动态产生的,这就需要在设计时,屏蔽参数值的部分,可以采用两种方法:一是指定固定的参数值,另外就是修改存储过程,先去掉存储过程的参数部分,当然,要保证,去掉参数前后,存储过程返回的数据集是结构等同的。
  下面提供部分代码,以供参考:
  存储过程部分:(如何使用表名做参数,我以前写过一个总结)
  CREATE Procedure GetSteel @tableName nvarchar(20),@strDate nvarchar(20),@strBeginTime nvarchar(30),@strEndTime nvarchar(30)
  AS
  declare @sSql nvarchar(4000)
  set @sSql = /'selectAVG(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+ /' ANDTempTimeBETWEEN /' +@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等等。我就如此经历了几次,才摸清楚到底如何使用带参数的存储过程做数据源实现报表的可视化设计,希望对有需要者有些帮助!

  特别推荐:

  2009年9月全国计算机等级考试时间及科目预告

  2009年上半年全国计算机等级考试参考答案请进入计算机考试论坛

  2009年全国计算机等级考试报名信息汇总

  2009年NCRE考试有新变化

  2009年全国计算机等级考试大纲

  2009年上半年全国计算机二级考试试题及答案

  2009年上半年全国计算机等级考试试题答案汇总

视频学习

我考网版权与免责声明

① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;

② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。

最近更新

社区交流

考试问答