复杂水晶报表示例.docx
- 文档编号:10943789
- 上传时间:2023-02-23
- 格式:DOCX
- 页数:24
- 大小:820.73KB
复杂水晶报表示例.docx
《复杂水晶报表示例.docx》由会员分享,可在线阅读,更多相关《复杂水晶报表示例.docx(24页珍藏版)》请在冰豆网上搜索。
复杂水晶报表示例
某高校学生成绩单案例
◆本节内容包括:
⏹打印某高校学生成绩单案例简介
⏹打印某高校学生成绩单实验步骤
⏹打印某高校学生成绩单(动态数据)案例
6-1-1案例学习:
打印某高校学生成绩单案例
某高校标准的学生成绩单的纸质报表样式如图6-1所示。
该纸质报表是一种典型的汇总统计型报表,具有典型的报表页眉,页脚及详细资料显示区域,同时在页脚必须实现对学生成绩的综合成绩统计工作。
因此,掌握该类型报表的设计工作,对一般复杂类型的水晶报表就可以完全设计出来了。
图6-1学生成绩单纸质报表样式
◆实验步骤1:
建立一个空的rpt文件,首先进行整个报表的纸张大小设置,这一点对于后期打印报表和报表布局非常重要。
根据办公室人员介绍,该报表的打印纸张必须是B5型打印纸。
向有关人员要来成绩单电子文档,通过Word软件打开文件后,查看该Word文档的页面设置如图6-2所示。
图6-2电子Word文档的页面设置参数配置
从Word文档的页面设置参数信息可以得出,纸质大小为16开,上下边距2.54厘米,左右边距3.17厘米。
这些参数将为水晶报表的格式化定制提供标准的设计参数。
◆实验步骤2:
回到新建立的rpt文件,用鼠标右键单击报表界面,在弹出的对话框中选择当前报表的打印机设置选项,将纸张大小设置成为B5纸,纵向。
如图6-3所示。
图6-3水晶报表的打印设置
◆∙实验步骤3:
再用鼠标右键单击报表界面,在弹出的对话框中选择当前报表的页面设置选项,按照WORD文档页边距参数进行配置。
如图6-4所示。
图6-4水晶报表的页边距设置
◆∙实验步骤4:
设置报表页眉,该处文本仅仅在第一页头部出现。
从报表的工具箱中选择文本对象,拖到报表页眉处,在报表页眉处键入字样后,点击右键选择设置对象格式。
依次将报表页眉文字进行与纸质报表对应文字字体格式的设置,最终形成的样式如图6-5所示。
图6-5设置水晶报表的报表页眉文字格式
◆实验步骤5:
设计页眉部分,该部分文本将在每页的头部处出现。
此次页眉部分为表格的表头部分,包括的内容有:
学生学号,姓名,平时成绩,设计成绩,考试成绩,总评成绩,共6项内容。
由于报表左侧第一单元格线段是斜线,无法通过工具箱的控件实现,故需要通过绘图软件做成图片后填充该区域。
通过右键点击页眉处,选择图片,将制作好的图片插入左侧页眉处。
而后,以该图片的高设定为页眉行高,宽度为第一单元格宽度。
从工具箱之中拖拽框对象,此处需要注意的是,绘制边框时候,页眉和详细资料全部一起框住,这样产生的报表样式可以统一美观。
最终形成的样式如图6-6所示。
图6-6水晶报表的表头页眉设置过程
◆∙实验步骤6:
选择工具箱之中的线条对象,在页眉处绘制出四个单元格,准备添加相关的文字信息。
如图6-7所示。
图6-7水晶报表的表头页眉绘制分割线
◆∙实验步骤7:
配置水晶报表数据源,该类型水晶报表的设计开发必须采用Push模式进行设计。
用右键点击报表界面,在弹出的菜单中选择数据库->数据库专家,在弹出的OLEDB(ADO)界面中选择OLEDBProviderSQLServer,并配置数据库服务器连接信息。
此次选择的数据库为示例数据库Grade_Sys(成绩管理数据库),以sa用户身份登录,无密码。
选择完成后,打开菜单中的水晶报表项里面的字段资源管理器,准备将展开的数据库字段拖拽到报表界面上面。
如图6-8所示。
图6-8水晶报表的数据源信息配置流程
◆∙实验步骤8:
将页眉处文字按照图6-29写入,并配置字体大小,同时用线条对象勾勒出表格的基本数据分布区域。
以页眉表格为基准,在详细资料处同样绘制相应的表格单元。
将详细资料各个单元格需要的数据从字段管理器的数据库字段拖拽过来(此次应用的单表为sc表,该表为学生成绩表,具体格式请读者恢复Grade_Sys数据库后,自行查看),把属性字段删除分布在页眉的部分后,将实际字段分别排列在详细资料的空格内。
图6-9水晶报表的详细资料部分设计和表头文字设计
◆∙实验步骤9:
配置报表页脚部分,该部分仅仅在水晶报表最后一页尾部出现。
从工具箱中拖拽文本,线条和框对象共同组成下图在页脚部分的样式。
图6-10水晶报表页脚部分设计
◆∙实验步骤10:
右键点击报表页面,选择报表->节专家,在打开的节专家设计器里面,勾选在页面底部打印功能。
此功能可以使得报表页脚仅仅在最后一页的底部显示。
如图6-11所示。
图6-11设置水晶报表报表页脚仅仅在最后一页的底部显示
◆∙实验步骤11:
整体设计完成后的报表如下图所示,点击主报表预览,可以预览报表基本样子。
如图6-12所示为最终设计效果。
图6-12水晶报表最终设计效果
◆实验步骤12:
回到form1界面,从水晶报表中拖出一个crystalReportViewer对象,并配置该crystalReportViewer对象的reportsource属性为刚才设计的rpt文件。
运行form1,程序一切正常,主要问题是:
Ø报表头非动态变化的数据;
Ø显示的学生成绩内容并非一个班的,而是所有的学生成绩。
Ø每门课程的百分比非动态变化的,毕竟每个教师给出的百分比都不尽相同。
Ø报表页脚的信息是静态不变的。
很显然,离真实的动态报表还是相距甚远,我们将在下一节详细介绍动态水晶报表技术,其中的水晶报表文件仍然是我们设计的这个rpt文件。
如图6-13为水晶报表属性配置图,6-14为最终运行效果图。
图6-13水晶报表数据源配置
图6-14水晶报表运行效果图
6-1-2案例学习:
打印某高校学生成绩单(动态数据)案例
要想获取图6-14中某门课程某个班级的成绩表,除了必须获取课程号和班级号这两个主键以外,还必须获取的信息包括:
某门课程某个班级教师阅卷时候设定的考试成绩百分比值,以及参加该门课程考试的学生各个考试类型具体的成绩,同时也必须获取相应的学期信息、课程名、专业名、班级名,而且在系统运行最后应当将考试成绩的统计资料信息一并显示出来。
因此,完成此案例涉及知识面广,设计程序代码比较复杂。
◆实验步骤1:
由于该项目设计数据库复杂操作,故而提前建立两个类文件:
BuessinessLayer.cs和databaselayer.cs,分别代表业务逻辑部分代码和数据库部分代码。
有关databaselayer.cs的封装方法,在ADO.NET章节已经有所论述,此处不再展开;对于BuessinessLayer.cs中用到的方法,随着案例的推进将注意讲解分析。
图6-15建立业务逻辑类和数据库类文件
◆实验步骤2:
将上一节建立的rpt文件拷贝到当前WinForm项目的执行目录内(即当前项目的\bin\Debug\目录下面)。
同时再建立一个新的Form窗体,该窗体主要实现通过选择班级和课程显示课程水晶报表的功能,其界面如图6-16所示。
图6-16通过选择班级和课程显示课程水晶报表
在当前窗体的Load事件中键入如下代码:
///
///窗体加载事件
///
///
///
privatevoidForm4_Load(objectsender,EventArgse)
{
//班级信息加载
stringsql1="selectbno,bnamefromclass";
DataSetds1=DB.GetDataSet(sql1);
comboBox1.DataSource=ds1.Tables[0].DefaultView;
comboBox1.DisplayMember="bname";
comboBox1.ValueMember="bno";
//课程信息加载
stringsql2="selectcno,cnamefromcourse";
DataSetds2=DB.GetDataSet(sql2);
comboBox2.DataSource=ds2.Tables[0].DefaultView;
comboBox2.DisplayMember="cname";
comboBox2.ValueMember="cno";
}
双击窗体的”显示水晶报表”按钮,进入按钮单击事件:
///
///准备打开水晶报表文件
///
///
///
privatevoidbutton1_Click(objectsender,EventArgse)
{
objectbno=boBox1.SelectedValue;
objectcno=boBox2.SelectedValue;
strings="selectscnofromscwherecno="+cno.ToString()+"andbno="+bno.ToString();
//查询是否选择的课程编号和班级编号有成绩信息
if(DB.GetdataRow("selectscnofromscwherecno="+cno.ToString()+"andbno="+bno.ToString())>0)
{
Form1f=newForm1(cno,bno);
//重载Show方法,打开form1时候,传递cno课程号和bno班级号参数过去
f.Show();
}
else
{
MessageBox.Show("该班级该课程无成绩信息!
");
}
}
◆实验步骤3:
打开Form1窗体,该窗体仅仅有一个crystalReportViewer控件,用来显示来自水晶报表的数据信息。
图6-17Form1窗体
进入Form1窗体的代码编辑文件,键入如下代码:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Text;
usingSystem.Windows.Forms;
usingCrystalDecisions.Shared;
usingCrystalDecisions.CrystalReports.Engine;
//注意:
必须增加水晶报表的这两个命名空间才可以在编程状态下操作水晶报表对象。
namespaceWindowsApplication1
{
publicpartialclassForm1:
Form
{
Buessinessbusiness=newBuessiness();//实例化业务逻辑层,具体方法在下面分述介绍
Mydatabasedb=newMydatabase();//实例数据库层,具体方法在ADO.NET已有介绍
//此处的重载,接收来自外部的系统参数,课程号cno和班级号bno
publicForm1(objectcno,objectbno)
{
InitializeComponent();
//初始化界面各个参数
intpercent_qm,percent_sj,percent_ps,ctime;
//获取表头三项成绩百分比。
business.GetCoursecheck(Convert.ToInt32(cno),Convert.ToInt32(bno),outpercent_qm,outpercent_sj,outpercent_ps);
//第一个业务逻辑层的方法,请见下面的介绍。
stringxqmess,cname,zy,nj,bname,tname,year1,month1,day1,clx_string;
Int16clx_num;
//获取表头标题各项信息
business.GetPaperMessage(Convert.ToInt32(cno),Convert.ToInt32(bno),2,outxqmess,outcname,outzy,outnj,outbname,outtname,outyear1,outmonth1,outday1,outclx_num,outclx_string,outctime);
//第二个业务逻辑层的方法,请见下面的介绍。
//获取表尾统计信息
intfirst,second,third,forth,fifth,total1;
business.GetPjStatistics(Convert.ToInt32(cno),Convert.ToInt32(bno),outfirst,outsecond,outthird,outforth,outfifth,outtotal1);
//第三个业务逻辑层的方法,请见下面的介绍。
//注意学习如何获取磁盘内的水晶报表的rpt文件
stringpath=Environment.CurrentDirectory+"\\CrystalReport1.rpt";
ReportDocumentreport=newReportDocument();
report.Load(path);//加载报表
((TextObject)report.ReportDefinition.ReportObjects["Text_title1"]).Text=xqmess;
((TextObject)report.ReportDefinition.ReportObjects["Text_cname"]).Text=cname;
((TextObject)report.ReportDefinition.ReportObjects["Text3"]).Text=zy;
((TextObject)report.ReportDefinition.ReportObjects["Text5"]).Text=bname;
//下面是表尾部分:
((TextObject)report.ReportDefinition.ReportObjects["Text_yx"]).Text=first.ToString();
((TextObject)report.ReportDefinition.ReportObjects["Text_lh"]).Text=second.ToString();
((TextObject)report.ReportDefinition.ReportObjects["Text_zd"]).Text=third.ToString();
((TextObject)report.ReportDefinition.ReportObjects["Text_jg"]).Text=forth.ToString();
((TextObject)report.ReportDefinition.ReportObjects["Text_nojg"]).Text=fifth.ToString();
((TextObject)report.ReportDefinition.ReportObjects["Text_totalnum"]).Text=total1.ToString();
//下面是显示标头各个分值的百分比
((TextObject)report.ReportDefinition.ReportObjects["Text19"]).Text=percent_ps.ToString();
((TextObject)report.ReportDefinition.ReportObjects["Text21"]).Text=percent_sj.ToString();
((TextObject)report.ReportDefinition.ReportObjects["Text25"]).Text=percent_qm.ToString();
//下面是写年月日信息
((TextObject)report.ReportDefinition.ReportObjects["Text38"]).Text=year1.ToString();
((TextObject)report.ReportDefinition.ReportObjects["Text39"]).Text=month1.ToString();
((TextObject)report.ReportDefinition.ReportObjects["Text40"]).Text=day1.ToString();
((TextObject)report.ReportDefinition.ReportObjects["Text43"]).Text=year1.ToString();
((TextObject)report.ReportDefinition.ReportObjects["Text42"]).Text=month1.ToString();
((TextObject)report.ReportDefinition.ReportObjects["Text41"]).Text=day1.ToString();
//下面开始动态加载SQL脚本,此次是通过dataset加载水晶报表
DataSetDs=db.GetDataSet("selectsnumber,sname,Grade,Grade_ps,Grade_end,Grade_designfromscwherecno="+Convert.ToString(cno)+"andbno="+Convert.ToString(bno));
report.SetDataSource(Ds.Tables[0]);
//最后绑定数据源,不写无法显示哦^o^
this.crystalReportViewer1.ReportSource=report;
}
}
}
◆实验步骤4:
下面分别介绍上面主程序部分设计的业务逻辑层方法的具体代码,由于这些方法都是引用了数据库存储过程部分,故而同时将展示存储过程开发的代码部分。
1、业务逻辑层方法business.GetCoursecheck的设计
/*******************************************************
**方法名:
GetCoursecheck
**输入参数:
cno课程编号bno班级编号
**输出参数:
**返回值:
**创建人:
钱哨
**创建日期:
08-7-9
**描述:
通过存储过程输入cno课程编号和bno班级编号,判别该班该门课程是否有判卷,如果没有则需要进行考试表的初始化工作。
*******************************************************/
publicvoidGetCoursecheck(intcno,intbno,outintpercent_qm,outintpercent_sj,outintpercent_ps)
{
///下面,开始实例化另一个命名空间的一个类
MydatabaseDB=newMydatabase();
stringsql=String.Format("execproc_GetCoursecheck"+cno+","+bno+",@percent_qmoutput,@percent_psoutput,@percent_sjoutput");
//执行的T-SQL串
SqlCommandMyCommand=DB.GetProcCommand(sql);
MyCommand.Parameters.Add(newSqlParameter("@percent_qm",SqlDbType.Int));
MyCommand.Parameters.Add(newSqlParameter("@percent_ps",SqlDbType.Int));
MyCommand.Parameters.Add(newSqlParameter("@percent_sj",SqlDbType.Int));
MyCommand.Parameters["@percent_qm"].Direction=ParameterDirection.Output;
MyCommand.Parameters["@percent_ps"].Direction=ParameterDirection.Output;
MyCommand.Parameters["@percent_sj"].Direction=ParameterDirection.Output;
MyCommand.ExecuteNonQuery();
percent_qm=Convert.ToInt16(MyCommand.Parameters["@percent_qm"].Value);
//接收输出的参数
percent_ps=Convert.ToInt16(MyCommand.Parameters["@percent_ps"].Value);
percent_sj=Convert.ToInt16(MyCommand.Parameters["@percent_sj"].Value);
DB.close();
}
该方法中引用的存储过程proc_GetCoursecheck代码如下:
createprocproc_GetCoursecheck
--通过存储过程输入cno课程编号和bno班级编号,判别该班该门课程是否有判卷,如果没有则需要进行考试表的初始化工作。
@cnoint,
@bnoint,
@percent_qmintoutput,
@percent_psintoutput,
@percent_sjintoutput
as
ifexists(selectsnofromscwherecno=@cnoandbno=@bno)
begin
selecttop1@percent_ps=Grade_ps_percent,@percent_qm=Grade_end_percent,@percent_sj=Grade_design_percent
fromsc
wherecno=@cnoandbno=@bno
end
else
begin
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 复杂 水晶 报表 示例
![提示](https://static.bdocx.com/images/bang_tan.gif)