环境:
vs2005+ActiveReportsNet2
本节代码下载:http://www.cnblogs.com/Files/batoosai/SimpleExample10.rar
学习了前面的一些基础,我们来实际开发一张帐票吧。
1,帐票式样
<!--[if !vml]-->
<!--[endif]-->
2,帐票说明:
1,抽出条件:
1-1班级:必選,多選
1-2科目:必選, 多選
2,用紙サイズ: A4 横
3,改頁条件:班级
4,印刷順序:行:生徒出席番号升排序
列:科目順位
4,如果某学生某subject没有成绩的话,也要显示该数据(只是把格子留空)
分析下帐票,我们应该用3个子模版(如下图,其中Sub3不需要取数,老师手动填)
<!--[if !vml]-->
<!--[endif]-->
3,好,我们项目一般的架构如下:
<!--[if !vml]-->
<!--[endif]-->
在我们的示例中,方便起见,就用简单的3层架构吧,当中的web service去掉。创建Project如图:
<!--[if !vml]-->
<!--[endif]-->
1)表示层:Form,ARTemplate
2)业务逻辑层:BR
3)数据层:DA
4,数据库如下:
<!--[if !vml]-->
<!--[endif]-->
具体数据表的数据:
1)Class
Class |
|||
ClassID |
ClassName |
TeacherName |
DisplayOrder |
1 |
A班 |
Tony Gong |
1 |
2 |
B班 |
Tony Wang |
2 |
3 |
C班 |
Tony Li |
3 |
2)Student
Student |
|||
StudentID |
ClassID |
No |
Name |
11 |
1 |
1 |
Tony |
12 |
1 |
2 |
Zhu |
13 |
1 |
3 |
Li |
14 |
1 |
4 |
Zhang |
15 |
1 |
5 |
Zha |
16 |
1 |
6 |
Sun |
21 |
2 |
1 |
Wang |
22 |
2 |
2 |
Gong |
23 |
2 |
3 |
Tian |
24 |
2 |
4 |
Su |
25 |
2 |
5 |
Xiao |
31 |
3 |
1 |
Xu |
32 |
3 |
2 |
Liu |
33 |
3 |
3 |
Tom |
34 |
3 |
4 |
Mary |
3)Subject
Subject |
||
SubjectID |
SubjectName |
DisplayOrder |
1 |
古典 |
1 |
2 |
現代文 |
2 |
3 |
語文 |
3 |
4)Score
Score |
||||
ScoreID |
StudentID |
SubjectID |
Score |
GradeOrder |
1 |
11 |
1 |
70 |
11 |
2 |
11 |
2 |
75 |
23 |
3 |
11 |
3 |
55 |
1 |
4 |
12 |
1 |
6 |
15 |
5 |
12 |
2 |
77 |
6 |
6 |
13 |
1 |
8 |
6 |
7 |
13 |
2 |
77 |
7 |
8 |
13 |
3 |
66 |
8 |
9 |
14 |
1 |
55 |
9 |
10 |
14 |
3 |
44 |
10 |
11 |
15 |
2 |
32 |
11 |
12 |
16 |
3 |
100 |
12 |
13 |
21 |
1 |
11 |
13 |
14 |
21 |
2 |
14 |
14 |
15 |
21 |
3 |
15 |
1 |
16 |
22 |
1 |
16 |
2 |
17 |
22 |
2 |
76 |
3 |
18 |
22 |
3 |
18 |
4 |
19 |
23 |
1 |
99 |
5 |
20 |
23 |
3 |
89 |
6 |
21 |
24 |
1 |
21 |
7 |
22 |
25 |
1 |
44 |
8 |
23 |
31 |
1 |
23 |
9 |
24 |
31 |
2 |
24 |
10 |
25 |
32 |
1 |
25 |
1 |
26 |
32 |
3 |
26 |
2 |
27 |
33 |
1 |
27 |
3 |
28 |
34 |
1 |
28 |
4 |
29 |
34 |
2 |
29 |
5 |
30 |
34 |
3 |
30 |
6 |
5,ok,开工,先add 如下文件
<!--[if !vml]-->
<!--[endif]-->
其中Form中
frmScore让用户选择抽出条件
frmShowAR用来显示report
6,在form上放2个多选的条件控件,Class和Subject。
实际项目中,这2个控件的内容应该取数据表里的值。我这里方便起见,直接把值写死在控件上。
<!--[if !vml]-->
<!--[endif]-->
btnPreview的click事件如下:
7,br层,由于业务太简单了,代码很简单。
8, DA层,根据参数执行sql语句,返回结果Dataset
DA的任务,是根据参数,作select语句,得出2张table,放到ds中return。
假设Class选了”B,C”,Subject选了”古典,现代文”
其中table1(用于Sub1和主模版)数据应该如下:(9条记录)
Query1 |
|||||||
Class.ClassID |
ClassName |
TeacherName |
DisplayOrder |
StudentID |
Student.ClassID |
No |
Name |
2 |
B班 |
Tony Wang |
2 |
21 |
2 |
1 |
Wang |
2 |
B班 |
Tony Wang |
2 |
22 |
2 |
2 |
Gong |
2 |
B班 |
Tony Wang |
2 |
23 |
2 |
3 |
Tian |
2 |
B班 |
Tony Wang |
2 |
24 |
2 |
4 |
Su |
2 |
B班 |
Tony Wang |
2 |
25 |
2 |
5 |
Xiao |
3 |
C班 |
Tony Li |
3 |
31 |
3 |
1 |
Xu |
3 |
C班 |
Tony Li |
3 |
32 |
3 |
2 |
Liu |
3 |
C班 |
Tony Li |
3 |
33 |
3 |
3 |
Tom |
3 |
C班 |
Tony Li |
3 |
34 |
3 |
4 |
Mary |
table2(用于Sub2)数据应该这样做:
9条生徒 * 2门科目,然后left join Score的内容,最终得到18条记录(假如某人某科没成绩的话,该字段也会显示出来,只是留空而已)。
<!--[if !vml]-->
<!--[endif]-->
PS:由于Access的Left join 俺实在是搞不懂,没法做left join,所以只能把Score的纪录填满,然后用普通查询。
再PS:Access的参数化查询我也搞不太清楚,所以代码中直接把”@classid”等替换成字符串了。
最后的PS:假如是mssql的话,sub2的查询语句大概如下:
Select * from student,class
cross join Subject
left join score
on score.subjectID=Subject.SubjectID
and score.StudentID=student.StudentID
Where s.ClassID=c.ClassID
And c.ClassID in (@ClassID)
<!--[if !vml]-->
<!--[endif]-->
Sub3就不需要查寻了。
9,frmShowAR接收到数据源,并显示帐票
10,主模版和子模版主要属性及代码(完整的请看下载的代码)
1),主模版
<!--[if !vml]-->
<!--[endif]-->
GroupHeader1:DataFied=”ClassID”
NewPage=”Before”
txtClassNo: DataField=”ClassName”
txtTeacher: DataField=”TeacherName”
代码:
Report_start中布局代码
Detail_Format里的生成子模版的代码:
2),Sub1
<!--[if !vml]-->
<!--[endif]-->
txtID:DataField=”No”
txtName:DataField=”Name”
3),Sub2
<!--[if !vml]-->
<!--[endif]-->
GroupHeader1:DataField=” SubjectID”
NewPage=”Before”
lblSubject:DataField=”SubjectName”
txtScore:Datafield=”Score”
txtOrder:Datafield=”gradeOrder”
4),Sub3
<!--[if !vml]-->
<!--[endif]-->
11,最终效果,比较粗糙,大家自己改进吧。
<!--[if !vml]-->
<!--[endif]-->