RDLC报表分组.docx_第1页
RDLC报表分组.docx_第2页
RDLC报表分组.docx_第3页
RDLC报表分组.docx_第4页
RDLC报表分组.docx_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

原创 RDLC 报表系列(三) 参数、常量及常用表达式的使用 本文只代表作者在一定阶段的认识与理解一 写作前提前两篇我们讲到了如何在RDLC中如何插入和使用图片,除了图片以外,在报表中我们往往需要使用一些特定格式或在特定的条件下使用特定的数据,或对数据做下些处理,并且可能存在一些数据是要我们从ASP.NET程序提供的,所以这篇我们主要讲RDLC报表中如何使用参数、表达式及常用常量。由于最近项目比较紧,没有时间写过多复杂的东西,而群里的兄弟又比较想知道页首页尾及合并表头的设计,所以我把一个完事的设计模板放在ReportTemplate文件夹中,提供给大家参考。本篇讲的基础是(原创 RDLC 报表系列(一) 创建一个报表)的基础上来讲的,如果没有看过,这里就不在叙述前面的内容。二 本文内容1. 怎样通过ASP.NET 程序为RDLC报表提供参数2. 怎样使用RDLC提供的变量及常用常量3. 常用表达式的使用4. 总结5. 代码下载(下载)三 ASP.NET 程序为RDLC报表提供参数在我们的报表中,往往需要从ASP.NET程序提供一些参数显示在报表的指定位置,第一篇中我们已经讲过怎样传递一个数据集,但是我们只需要一个值,总不能把这个值放到DataSet中来传输吧(因为DataSet本其实是由XML结成,在传递过程中需要比data本身更多的资源),所以这个时候我们就需要知道如何传递一个参数到RDLC报表。下面我们就来讲一讲。不知道大家还记不记得我在第一篇中的Default.aspx.cs中写的一个Button事件,如下。1protectedvoidButtonReportGenerate_Click(objectsender,EventArgse)23ListreportDataSource=newList();4RportDataSetds=newRportDataSet();5stringtemplatePath=string.Empty;6stringtotalRecords=string.Empty;78SqlConnectionconn=newSqlConnection(ConfigurationManager.ConnectionStringsLoggingConnectionString.ConnectionString);9SqlCommandcommand=conn.CreateCommand();10command.CommandType=CommandType.Text;11command.CommandText=SELECT*FROMT_BC_LOGS;12SqlDataAdapterda=newSqlDataAdapter(command);13da.Fill(ds.T_BC_LOGS);14reportDataSource.Add(newReportDataSource(RportDataSet_T_BC_LOGS,ds.T_BC_LOGS);1516/TemplateFiles17templatePath=ReportTemplate/LogReport.rdlc;18ListparameterList=newList();19/GenerateReport20GetReportMultipleDataSourceFile(reportDataSource,templatePath,parameterList,pdf);21 其中我定义了一个泛型变量,如下:List parameterList = new List();但是我并没有给这个变量赋任何值,我要告诉大家的就是这里变量就是为我们传递参数提供的。好,下面我们就来讲一下怎么传递这个参数。1. 首先我们打开ReportTemplate文件夹中的RDLC报表模板,点击报表的编辑区,然后打开Report菜单下的Report Parameters,在Report Parameters窗口中,我们点击Add 按钮,接着我们输入这个参数的名称与类型(这个名称你要记住,因为下面的编程中要用到),如果这个参数提供的时候不一定每次都有值,那么我们则要选中All null value的复选框,如下图所示,如果你有多个参数则以此方法添加即可。2. 我们从Visual Studio IDE左边的ToolBox中拖一个TextBox到这个报表模板的页首(在我的报表中,复杂的表头大部分都是通过TextBox来实现的,可以设计TextBox的边框及字体等属性来设计,所以后面的内容中我不会再提如何设计复杂的报表页首),右击这个TextBox,选择Expression,在Expression窗口中,我们选择Category中的Parameters,然后双击最右边你刚刚加的那个参数,点击确定即可。至此,对报表的设计完成了。3. 修改Default.aspx页面中的程序如下所示:1protectedvoidButtonReportGenerate_Click(objectsender,EventArgse)23ListreportDataSource=newList();4RportDataSetds=newRportDataSet();5stringtemplatePath=string.Empty;6stringtotalRecords=string.Empty;78SqlConnectionconn=newSqlConnection(ConfigurationManager.ConnectionStringsLoggingConnectionString.ConnectionString);9SqlCommandcommand=conn.CreateCommand();10command.CommandType=CommandType.Text;11command.CommandText=SELECT*FROMT_BC_LOGS;12SqlDataAdapterda=newSqlDataAdapter(command);13da.Fill(ds.T_BC_LOGS);14reportDataSource.Add(newReportDataSource(RportDataSet_T_BC_LOGS,ds.T_BC_LOGS);1516/TemplateFiles17templatePath=ReportTemplate/LogReport.rdlc;18ListparameterList=newList();19/为参数Parameter1传递Thisisaparameter20parameterList.Add(newReportParameter(Parameter1,Thisisaparameter);21/GenerateReport22GetReportMultipleDataSourceFile(reportDataSource,templatePath,parameterList,pdf);23 运行结果如图所示:四 使用RDLC提供的变量及常用常量在RDLC报表中,有些你想得到的功能是用ASP.NET代码完成不了的,比如说这个报表总共有多少页,当前在第几页等等,这些功能我们就要借助RDLC表达式中自带的一些常量了,下面就让我们来谈谈这此常量。1. 显示总共页数及当前页a) 从Visual Studio IDE左边的ToolBox中拖两个TextBox到报表的页首。b) 右击第一个TextBox,选择Expression,在Expression窗口的Category中选择Globals,然后在Item中双击选择TotalPages,这个变量就是总共多少页,为了方便我们查看,我们把在上面显示的表达式进行修改如下:=Total of +Globals!TotalPages.ToString() c) 按上面的加入总页的方式,右击第二个TextBox选择Expression,然后在选择Globals,接着选择PageNumber,这就是当前的页数,同样为了方便查看,修改如下:= Total of +Globals!PageNumber.ToString() 注意: 刚才我们选择总页数和当前页数的时候,是不是发现除了这两个还有好几个常量,现在解释如下: ExecutionTime生成报表的时间PageNumber当前的页号ReportFolder包含报表的文件路径ReportName报表的名称ReportServerUrl执行报表Server的路径(这里没有用Server,所以没有,如果用ReportService那就就存在了)TotalPages总行数UserID当前执行报表的人Language执行报表Server的系统语言2. 为RDLC报表中数据行增加自动编号a) 为了完成这个功能,我们完成这个功能,现在我们为报表中已经存在的Talbe在最左边加一个字段叫S/N(这篇中没有讲表从哪里来,请参阅原创 RDLC 报表系列(一) 创建一个报表)。b) 还记得我当时给这个表绑定了一个数据集吗?选点右击表,选择Properties,从里面拷出那个数据集的名称。c) 右击S/N的数据字段,选择Expression,在Expression的Category中选择Common FunctionsMiscellaneous,然后双击右边Item中的RowNumber,在其参数中输入数据集的名称,如下所示:=RowNumber(RportDataSet_T_BC_LOGS)五 常用表达式的使用1. 连接字符=Fields!FirstName.Value + Fields!LastName.Value 连接两个字段在一个单元格中,并一行显示=Fields!FirstName.Value & vbCrLf & Fields!LastName.Value连接两个字段在一个单元格中显示,但是换行显示更新(6 April 2010): 我今天做项目的时候遇到下面的问题,下面的这行代码编译不过。 =First(Fields!SingaporeAddress.Value, SP_STUDENT_DETAILSResult) & vbCrLf & First(Fields!SingaporeAddress2.Value, SP_STUDENT_DETAILSResult) 原因是因为:First(Fields!SingaporeAddress.Value, SP_STUDENT_DETAILSResult) 生成的是一个Ojbect,而& vbCrLf &是连接一个字符串的,所以我们需要把他们进行转换,如下=First(Fields!SingaporeAddress.Value, SP_STUDENT_DETAILSResult).ToString() & vbCrLf & First(Fields!SingaporeAddress2.Value, SP_STUDENT_DETAILSResult).ToString() 2. If表达式使用=IIF(Fields!LineTotal.Value 100, True, False) 如果成立执行True的表达式,否则执行False表达式,我可也可以写其它的表达式代替代码里的东西3. Count表达式使用=Count(Fields!DAILYCOUNT.Value,WeldingReportDataSet_T_WelderDaily) 计算WeldingReportDataSet_T_WelderDaily数据集中DAILYCOUNT有多少行3. Sum表达式使用=Sum(Fields!DAILYCOUNT.Value,WeldingReportDataSet_T_WelderDaily) 计算WeldingReportDataSet_T_WelderDaily数据集中DAILYCOUNT的总和4. Format表达式使用=CDate(Fields!TOPAINTDATE.Value).ToString(dd MMM yyyy) 对date的格式进行应用(转)原创 RDLC 报表系列(五) RDLC报表分组 原文地址:/jack86514/archive/2011/05/04/2036039.html本文只代表作者在一定阶段的认识与理解。一、写作前提在我的博客园中我写了关于一些RDLC报表的使用,请参考这里。因为没有时间,所以没有导入到我的个人博客中。在博客园中相关文章如下: 原创 RDLC 报表系列(一) 创建一个报表 原创 RDLC 报表系列(二) 报表中插入图片 原创 RDLC 报表系列(三) 参数、常量及常用表达式的使用 原创 RDLC 报表系列(四) 子报表的使用 二、本文内容1. 加载RDLC报表数据 2. 实现数据分组 3. 总结 4. 代码下载(下载) 三、加载RDLC报表数据我们的示例是要从学生表中,取出200条学生信息,然后加载到RDLC报表中。?1234567891011121314151617181920212223242526272829303using System; using System.Collections; using System.Configuration; using System.Data; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Data.SqlClient; using System.Collections.Generic; using System.Xml.Linq; using Microsoft.Reporting.WinForms; using RCLC.DataEntity; namespace RCLC public partial class _Default : CustomPageBase protected void Page_Load(object sender, EventArgs e) protected void ButtonReportGenerate_Click(object sender, EventArgs e) List reportDataSource = new List(); RportDataSet ds = new RportDataSet(); string templatePath = string.Empty; string totalRecords = string.Empty; /获得数据 SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStringsLoggingConnectionString.ConnectionString); SqlCommand command = conn.CreateCommand(); command.CommandType = CommandType.Text; command.CommandText = SELECT TOP 200 * FROM T_STUDENT; SqlDataAdapter da = new SqlDataAdapter(command); da.Fill(ds.T_STUDENT); /指定报表模板 templatePath = ReportTemplate/StudentReport.rdlc; /把获取的数据集合提供给在报表中名为RportDataSet_T_STUDENT数据集 reportDataSource.Add(new ReportDataSource(RportDataSet_T_STUDENT, ds.T_STUDENT); List parameterList = new List(); /Generate Report, 报表可以生成PDF,EXCEL及以其它形式,根据需求去设置 GetReportMultipleDataSourceFile(reportDataSource, templatePath, parameterList, pdf); 上面的代码已经获取到200条学生的信息,然后把数据从数据库中取出然后加载到StudentReport.rdlc报表中,下面要做的事情就是对数据进行分组了。四、实现分组下面我们根据学生的性别进行分组,步骤如下: 打开RDLC模板文件,点击报表的行标签,然后点击“插入分组(Insert Group)” 在插入分组的窗口中,我们选择需要分组字段(这里的学生的性别),如下图所示 插入分组后,我们可以为分组加一标题,标题就是性别 这样我们就已经分组结束了,下面我们要做的就是看看如果如何。】你也可以从这里下载PDF结果(下载)。五、总结通过上面的示例我们学会了如何使用RDLC分组功能实现功能,通过上面的示例我们插入了一个性别的分组,当然也可以分组中再插入子分组,以实现二级、三级或者N级分组。当然可以对分组进行统计等一系列功能。原创 RDLC 报表系列(四) 子报表的使用 <p>Your browser does not support iframes.</p> 本文只代表作者在一定阶段的认识与理解一写作前提前面几篇中我讲了如何去实现一个RDLC报表、插入图片、参数传递及常用表达式的使用。这一节我们将focus on子报表的使用。假设有一天,你的老板和你说,公司需要做所有员工的出出差记录,这时子报表的应用是一个不错的选择。关于怎样创建一个RDLC报表等相关内容,前查看我之前的文章,这里就不在阐述了。原创 RDLC 报表系列(一) 创建一个报表 原创 RDLC 报表系列(二) 报表中插入图片原创 RDLC 报表系列(三) 参数、常量及常用表达式的使用二本文内容1. RDLC报表模板的设计2. Base的修改3.调用生成报表4. 总结5. 代码下载(下载)三RDLC报表模板设计本篇要做的是一个含有子报表的报表,所以,最少我们需要两个报表模板,一个是Master.rdlc,另外一个是Sub.rdlc。Ok,下面我们就来啰嗦一下怎么设计模板文件吧。1. 在VS(本人用的是2008的Version,自从小2003之后都支持.rdlc报表)中创建一个新的web application项目。2. 新增两个新的报表文件,一个名叫master.rdlc,一个名叫sub.rdlc(在选择的时候要注意选择如下)。 3. 现在我们已经有报表模板文件了,再创建主报表和子报表所需要使用的数据类型(所需要的DataSet类型,具体可参阅原创 RDLC 报表系列(一) 创建一个报表),这里并不多做解释了。4. 打开 style=mso-bidi-font-weight:boldmaster.rdlc文件,从工具箱中拖入一表格控件,设计你所需要的格式,选择所需要的数据源类型,然后在你需要使用子报表的地方从工具臬中插入一上SubReport控件,如下图所示。 5. 然后右击这个SubReport控件,在属性中选择这个子报表指向哪个文件,我们可以选择刚才创建的那个sub.rdlc文件。其次是们还需要为主报表和子报表之关建立关连关系,在属性的Parameters(参数)选择卡中新加我们需要传递给子报表的参数。在我的报表中用了一个参数如下,当然你也可以根据自己的的需要创建多个你需要传递给子报表的参数。 6. 上面我们讲解完了主报表的设计,他制定了子报表以及子报表准获得的参数。现在打开Sub.rdlc文件,增加子报表所需要的数据源类型,并且创建参数,比如说我上面使用了一个isoOid,所以在子报表中一定有一个参数名称和这个是相同的,他用来接收从主报表传来的筛选数据条件,即用这个参数从子报表中选择符合本记录的所有子记录集。7. 现在从工具箱中插入一个表格到你的子报表中(当然也可以不需要表格,根据需求定义的),然后右击属性选择所需要的数据源类型,并且根据从Master.rdlc传过来的参数进行筛选,可以在属性窗口的Filters(筛选)选项卡中加入筛选条件即可。8. 至此我们讲完了报表设计部分,下面我们就去看看,C#中是如何实现的。四Base的修改 因为是要用到报表,所以我们需要对子报表的生成事件进行订阅,因此我们把CustomPageBase写成如下。1publicclassCustomPageBase:Page23ListsubDataSource=newList();4publicvoidGetReportMultipleDataSourceFile(ListreportDateSource,stringTemplatePath,ListparameterList,stringFileType,ListsubDataList)56stringreportFormat=FileType;7stringoutputfile=Report.;/报表名称8ReportViewerrview=newReportViewer();9rview.ProcessingMode=ProcessingMode.Local;10rview.LocalReport.ReportPath=Server.MapPath(TemplatePath);11rview.LocalReport.DataSources.Clear();1213/为主报表加数据源14foreach(ReportDataSourcereinreportDateSource)1516if(subDataList.Contains(re.Name)1718subDataSource.Add(re);19continue;2021rview.LocalReport.DataSources.Add(re);222324/设置ReportViewer进行事件订阅25rview.LocalReport.SubreportProcessing+=26newSubreportProcessingEventHandler(SubreportProcessingEventHandler);2728if(parameterList.Count0)29rview.LocalReport.SetParameters(parameterList);30stringmimeType,encoding,extension,deviceInfo;31stringstreamids;32Warningwarnings;33deviceInfo=+True+;3435bytebytes=rview.LocalReport.Render(reportFormat,deviceInfo,outmimeType,outencoding,outextension,outstreamids,outwarnings);36HttpContext.Current.Response.Buffer=true;37HttpContext.Current.Response.Clear();38HttpContext.Current.Response.ContentType=mimeType;39HttpContext.Current.Response.AddHeader(Content-Disposition,attachment;filename=+outputfile+extension+;);40HttpContext.Current.Response.BinaryWrite(bytes);41HttpContext.Current.Response.End();424344/45/为子报表加数据源46/47/48/49voidSubreportProcessingEventHandler(objectsender,SubreportProcessingEventArgse)5051foreach(varReportDataSourceinsubDataSource)5253e.DataSources.Add(ReportDataSource);545556和这前的相关,GetReportMultipleDataSourceFile这个文件多提供一了一个新的参数subDataList他是用来指定哪些数据源是给子报表的。五调用生成报表1publicpartialclass_Default:CustomPageBase23protectedvoidPage_Load(objectsender,EventArgse)45678/9/Generatethereport10/11/12/13protectedvoidButtonGenerate_Click(objectsender,EventArgse)1415ListreportDataSource=newList();16ListsubDataSource=newList();17ReportDataSetds=newReportDataSet();18stringtemplatePath=string.Empty;1920SqlConnectionconn=newSqlConnection(ConfigurationManager.ConnectionStringsPQMSConnectionString.ConnectionString);21SqlCommandcomm=conn.CreateCommand();22comm.CommandText=selecttop200Oid,DrawingNumber,CWPNo,PaintCode,MasterRevisionfromISO_DRAWING;23SqlDataAdapterda=newSqlDataAdapter(comm);24da.Fill(ds,ISO_DRAWING);/获得主表的内容(Getmastertabledata)2526comm.CommandText=SELECTS.Oid,S.ISOOid,S.SPOOLNo,S.Location,S.IssueNo,S.CP2FROMSPOOLASSINNERJOIN(SELECTTOP200OIDFROMISO_DRAWING)ASTONS.ISOOID=T.OID;27da=newSqlDataAdapter(comm);28da.Fill(ds,SPOOL);2930reportDataSource.Add(newReportDataSource(ReportDataSet_ISO_DRAWING,ds.ISO_DRAWING);31reportDataSource.Add(newReportDataSource(ReportDataSet_SPOOL,ds.SPOOL);32subDataSource.Add(ReportDataSet_SPOOL);33ListparameterList=newList();3435templatePath=Master.rdlc;3637GetReportMultipleDataSourceFile(reportDataSource,templatePath,parameterList,PDF,subDataSource);3839六总结通过上面的学习,我们了解如下内容:1. Sub Report Design2.Filter的应用我现在有一组数据A,把他们在RDLC上按照年龄分组, 1-20岁是一组,20-40岁是一组,40-60岁是一组,60岁以后是一组。报表表达式如下:=IIF(First(Fields!年龄.Value)=1,少年,(IIF(First(Fields!年龄.Value)=21 AND First(Fields!年龄.Value)=41 AND First(Fields!年龄.Value)=60,中年,老年)现在在报表分组中我想去掉最后一个“老年”分组,请问应该怎么办?求牛人。RDLC使用手册_RDLC常用控件介绍 2009-04-09 09:53 6533人阅读 评论(3) 收藏 举报 RDLC设计工具箱上总共有9种控件:文本框(TextBox)、折线(Line)、表(Table)、矩阵(Matrix)、矩形(Rectangle)、列表(List)、子报表(SubReport)、图表控件(Chart)、图像控件(Image)。下图ctlsDemo.rdlc设计器所示为所有控件的设计演示。1) 由于表格控件、矩阵控件、列表控件和图表控件必须填充数据集,因此把所有控件布局完毕之后,创建一个数据集。解决方案资源管理器中,选中RDLCDev工程,右击添加新建项,在新建项类型模板里选择“数据集”,取名“ctlsDemo.xsd”,单击“添加”。ctlsDemo.xsd添加完毕之后,在解决方案资源管理器中会增加一个ctlsDemo.xsd文件,并前VS IDE会自动打开ctlsDemo.xsd设计页面。在设计页面中右击,添加Datatable,将其命名为vSales,为vSales表添加列,列信息如下: ProdCatSystem.String SubCatSystem.String OrderYearSystem.Int32 OrderQtrSystem.StringSalesSystem.Double2) 文本框控件、折线控件、矩形控件使用相对简单,这里不细说;3) Image控件,现在RDLC设计器模式下,选择“报表”菜单,“嵌入图像”,在“嵌入图像”对话框中,载入一个本地图像文件即可。然后设置Image控件的Source属性为Embedded,设置Value属性为刚才处理的嵌入图像即可。当然还有别的方式可以显示图像,大家可以Google一下,关键字为RDLC、嵌入图像;4) 图表控件,使用图表控件的一个关键是要设置好图表属性页面中的数据TAB页相关内容。主要有值、类别组和序列组定义,大家可以参考Demo;5) 表格控件、矩阵控件和子报表控件,在后续内容中会详细介绍;4.1 表格控件使用介绍1) Table控件是RDLC报表显示数据的一个核心控件,关于Table控件,在微软提供的RDLC规范里有详细的介绍,其大致内容可以用下述的一张类UML图来表示;2) 新建报表文件,命名为ctlTableDemo.rdl

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论