成绩填报模块里面可以查询学生成绩也是可以打印成绩报表的,在打印前我们需要先按照水晶报表,安装完成之后就在所在的区域里面建一个新的文件夹用了来放水晶报表文件,因为打印水晶报表,需要两个文件,设计数据源和设计水晶报表模板。在新建的文件夹右键添加新建项,首先建数据源文件,在已安装下面找到数据,在数据里面还有一个数据集命名(ReportDB)后点击添加,再建水晶报表模板,同样右键添加新建项,在已安装下找到Reporting,只有在已安装了水晶报表软件的情况下才能找到这一项,点击Reporting命名(AchievementReport)然后点击添加。
进入到设计数据源文件:添加数据源有两种方式,第一种是通过与数据库连接把需要的表连接进来,因为现在需要打印的这些数据是多表连接查询出来的,我们是建了实体类来存放的,所以这一张表在数据库里面是没有的。这时可以选择第二种,添加DataTable数据表(如下图),直接设计数据表里面的字段,接着要设计属性,这一步很重要,设计数据表属性里的数据类型跟数据库里的一致,数据类型不一致会导致数据无法导入。
水晶报表模板的设计:在添加完成之后,在弹出来的窗口选择 作为空白报表 这一项。下面就是一张空白报表,需要我们去画格式,显示的格式就是按照画出来的格式进行显示。当创建好空白报表后,在左侧的字段资源管理器下面的数据库字段点击右键,选择数据库专家找到设计好的表,选中它作为数据源引进来。添加完成后点击打开数据库字段就可以看到数据源的表以及它的字段。接下来就可以画表的格式了,在画表的过程中如果想看到画了之后的效果的时候就可以点击底部的主报表预览,这可以看到你画了之后在页面显示的模板。你想设计的任何格式点击右键就会显示出来提供你选择,像在设计表的文字的时候,可以在插入列中选择一个文本框在里面输入文字,再调整需要的字体样式。这里需要注意的是,页眉(表头)和详细资料(传进来的数据)是相互对应的,为了保证数据对应,我们要在数据库字段里选到数据表,然后移动鼠标到需要显示的字段,按下鼠标把字段拖动到详细资料这一栏标题的时候再放开鼠标,这样就可以使页眉和详细资料一一对应了。还有需要画一个框把这两栏包裹住,在分割这个框的时候要记得在详细资料栏的下面画,而不是在页眉的底部画,因为在详细资料里画的线,当数据有多行要显示的时候,这条线才能继续划分出更多的行来显示数据。画好的报表如下:
表格跟数据源都设计好了,接着就是对打印当前表格的数据进行处理,打印报表跟导出一样要先经过条件筛选使当前表格得到所需要的数据,传递三个参数AcademeID,GradeID,ClassID,这可作为条件筛选。打印报表的步骤基本是固定的,第一步:经过查询和筛选得出的数据在打印前还要对数据进行处理,在这里写了一个名为LINQToDataTable的方法将查询出来的打印数据转化为DataTable的格式,再实例化数据集。第二步:将数据放到数据集中。第三步:实例化创建的水晶数据报表。第四步:用Server.MapPath这个方法去获取报表的物理文件路径。第五步:将画好的报表加载到报表模板中。第六步:设计报表的数据源。第七步:最后将报表转化为文件流输出。
这个报表打印的是考试成绩,在查询数据的时候要对成绩进行处理,一个学生会有多个成绩,这里需要获取每个学生的最高成绩,所以linq使用group by对UserID用户ID进行排序。
查询成绩:
from tbAchievement in myModels.PW_Achievement
group tbAchievement by tbAchievement.UserID into tbStudent
从自定义的表名tbAchievement中,这个表数据来自myModels.PW_Achievement,下一步就是使用group by对成绩进行处理,tbAchievement表中的数据根据tbAchievement.UserID用户ID进行排序,into是命名为tbStudent,这里命名为tbStudent之后上面自定义的tbAchievement作用就会失效,在下面查询字段用的时候用到的就是tbStudent这个表名了。
查询列表:
因为在tbAchievement表中所有的成绩数据都是凌乱分布的,假设用户ID为1的用户,他拥有78,83,90这三个成绩,这时候成绩是顺序没有规律的分布,所以要对上面排分组好的成绩表查询出的成绩结果进行排序。orderby tbAchievement.Achievement descending
对tbAchievement.Achievement成绩表里面的成绩进行降序的排序,排序好的结果就会是从大到小:90,83,78这样的顺序符合我们的需求,在获取成绩的时候直接可以用到第一条成绩最高的数据。
打印水晶报表
最新推荐文章于 2020-11-30 21:53:31 发布