環境:
vs2005+ActiveReportsNet2
本節代碼下載:http://www.cnblogs.com/Files/batoosai/SimpleExample10.rar
學習了前面的一些基礎,我們來實際開發一張帳票吧。
1,帳票式樣
<!--[endif]-->
2,帳票說明:
1,抽出條件:
1-1班級:必選,多選
1-2科目:必選, 多選
2,用紙サイズ: A4 橫
3,改頁條件:班級
4,印刷順序:行:生徒出席番號升排序
列:科目順位
4,如果某學生某subject沒有成績的話,也要顯示該數據(只是把格子留空)
分析下帳票,我們應該用3個子模版(如下圖,其中Sub3不需要取數,老師手動填)
<!--[endif]-->
3,好,我們項目一般的架構如下:
<!--[endif]-->
在我們的示例中,方便起見,就用簡單的3層架構吧,當中的web service去掉。創建Project如圖:
<!--[endif]-->
1)表示層:Form,ARTemplate
2)業務邏輯層:BR
3)數據層:DA
4,數據庫如下:
<!--[endif]-->
具體數據表的數據:
1)Class
Class
ClassID
ClassNameTeacherName
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
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
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
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
6ok,開工,先add 如下文件
<!--[endif]-->
其中Form中
frmScore讓用戶選擇抽出條件
frmShowAR用來顯示report
6,在form上放2個多選的條件控件,Class和Subject。
實際項目中,這2個控件的內容應該取數據表裡的值。我這裡方便起見,直接把值寫死在控件上。
<!--[endif]-->
btnPrevIEw的click事件如下:
Private Sub btnPreview_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrevIEw.Click
If Me.listClass.SelectedIndex = -1 OrElse Me.listSubject.SelectedIndex = -1 Then
Return
End If
''Get the Parameter
Dim classID As String = ""
Dim subjectID As String = ""
For index As Int32 = 0 To Me.listClass.SelectedIndices.Count - 1
classID &= Me.listClass.SelectedIndices(index) + 1 & ","
Next
For index As Int32 = 0 To Me.listSubject.SelectedIndices.Count - 1
subjectID &= Me.listSubject.SelectedIndices(index) + 1 & ","
Next
classID = classID.TrimEnd(Convert.ToChar(","))
subjectID = subjectID.TrimEnd(Convert.ToChar(","))
''Send parameters to the BR and get the dataset.
Dim br As New BR.brScore()
Dim finalDS As DataSet = br.GetData(classID, subjectID)
''Send dataset to the form
Dim frm As New frmShowAR(finalDS)
frm.Show()
End Sub
7,br層,由於業務太簡單了,代碼很簡單。
Public Function GetData(ByVal classID As String, ByVal subjectID As String) As DataSet
Try
'' 創建DA
Dim objDA As New DA.daScore()
Dim ds As DataSet = objDA.GetData(classID, subjectID)
'' 返回値
Return ds
Catch ex As Exception
'' 拋出異常
Throw ex
End Try
End Function
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
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條記錄(假如某人某科沒成績的話,該字段也會顯示出來,只是留空而已)。
<!--[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)
<!--[endif]-->
Sub3就不需要查尋了。
9,frmShowAR接收到數據源,並顯示帳票
PublicClass frmShowAR
Sub New(ByVal ds As DataSet)
Me.finalDS = ds
'' 此調用是 Windows 窗體設計器所必需的。
InitializeComponent()
'' 在 InitializeComponent() 調用之後添加任何初始化。
End Sub
Private finalDS As DataSet
Private Sub frmShowAR_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim rpt As New ARTemplate.rptScore
rpt.DataSource = finalDS
rpt.DataMember = finalDS.Tables(0).TableName
''A4 Landscape
rpt.PageSettings.PaperKind = Printing.PaperKind.A4
rpt.PageSettings.Orientation = DataDynamics.ActiveReports.Document.PageOrIEntation.Landscape
rpt.Run()
Me.VIEwer1.Document = rpt.Document
End Sub
End Class
10,主模版和子模版主要屬性及代碼(完整的請看下載的代碼)
1),主模版
<!--[endif]-->
GroupHeader1:DataFIEd=”ClassID”
NewPage=”Before”
txtClassNo: DataFIEld=”ClassName”
txtTeacher: DataFIEld=”TeacherName”
代碼:
Report_start中布局代碼
Detail_Format裡的生成子模版的代碼:
2),Sub1
<!--[endif]-->
txtID:DataFIEld=”No”
txtName:DataFIEld=”Name”
3),Sub2
<!--[endif]-->
GroupHeader1:DataFIEld=” SubjectID”
NewPage=”Before”
lblSubject:DataFIEld=”SubjectName”
txtScore:DatafIEld=”Score”
txtOrder:DatafIEld=”gradeOrder”
4),Sub3
<!--[endif]-->
11,最終效果,比較粗糙,大家自己改進吧。
<!--[endif]-->