本節目標:
承接上節,上節用2個group的方式打印了普通的分欄帳票。實現了換列換頁的三維表示。
本節用子報表的方式來實現該功能。
子報表的功能比上面那個方法來說,更強大,更靈活。複雜帳票一般都得用到子報表。
開始之前,先簡單介紹一下子報表的用法。
0,子報表的一般用法如下:
(1),先Add一個主模版(rpt1.rpx),若干子模版(這裏就建了一個,sub1.rpx)
<!--[if !vml]--><!--[endif]-->
(2),在主模版上放一個SubReport控件(該控件是一個佔位符,sub1.rpx的內容將在這裏顯示),可以放在PageHeaer/Footer,GroupHeader/footer和Detail上,這個要視用途來定。這裏放在GroupHeader1上。
<!--[if !vml]--><!--[endif]-->
(3),在主模版的GroupHeader1_Format事件(假如你的SubReport放在Detail中,就要用Detail_Format事件了)中,加入代碼,生成子報表,並且給子報表設置數據源(這裏爲簡單起見沒有設置數據源):
Dim rpt As New sub1()
Me.subReport1.Report = rpt
End Sub
(4),然後就可以設計你的子報表了,加控件,加代碼,和操作主模版一樣做法。需要說明的是,子模版中的PageHeader和PageFooter是不起作用的。
<!--[if !vml]--><!--[endif]-->
(5),然後御覽,你會看到每頁都包含的sub1.rpx的內容。假如你把SubReport控件放在Detail中的話,Detail中的每一行顯示,都會把sub1.rpx的內容一起顯示出來。
<!--[if !vml]--><!--[endif]-->
ok,正式開始了
1,先準備如下數據(把數據順序組織成如下形式):
A |
Chinese |
1 |
Tony |
100 |
A |
Chinese |
2 |
Mary |
56 |
A |
Chinese |
3 |
Tom |
76 |
A |
Chinese |
4 |
John |
67 |
A |
Chinese |
5 |
Li |
54 |
B |
Chinese |
6 |
Zhang |
3 |
B |
Chinese |
7 |
Wang |
100 |
B |
Chinese |
8 |
Gong |
23 |
B |
Chinese |
9 |
Tian |
78 |
B |
Chinese |
10 |
Jack |
87 |
B |
Maths |
6 |
Zhang |
0 |
B |
Maths |
7 |
Wang |
2 |
B |
Maths |
8 |
Gong |
56 |
B |
Maths |
9 |
Tian |
99 |
B |
Maths |
10 |
Jack |
88 |
2,創建一個AR主模版,1個子模版:
主模版(rpt1.rpx):
GroupHeader1中:
GroupHeader1:DataField=”Class”
NewPage=”before”
ClassNo: DataField=”Class”
SubReport控件:需要注意的是,該控件的Width必須設成和實際要打印的Sub1.rpx的width一樣大,否則sub1.rpx的內容將不能完全顯示出來。後面我會專門講解一下如何在代碼中控制各控件width.
<!--[if !vml]--><!--[endif]-->
子模版1(sub1.rpx)
GroupHeader1: DataField=”Subject”
NewColumn=”Before”
Subject: DataField=”subject”
Detail: ColumnCount=2
TextBox: Datafield=”ID”
TextBox2:Datafield=”Name”
TextBox3:DataField=”Score”
<!--[if !vml]--><!--[endif]-->
3,在form的load事件中編寫如下代碼,把數據源傳給模版,並顯示模版:
4,在rpt1.rpx的GroupHeader1_Format事件,編寫代碼,顯示子模版sub1.rpx.。
注意了我這裏傳給子模版的數據源。
當打印第一頁時,我傳給子模版的數據源是:
A |
Chinese |
1 |
Tony |
100 |
A |
Chinese |
2 |
Mary |
56 |
A |
Chinese |
3 |
Tom |
76 |
A |
Chinese |
4 |
John |
67 |
A |
Chinese |
5 |
Li |
54 |
當打印Class=B的第二頁時,我傳給子模版的數據源變成了:
B |
Chinese |
6 |
Zhang |
3 |
B |
Chinese |
7 |
Wang |
100 |
B |
Chinese |
8 |
Gong |
23 |
B |
Chinese |
9 |
Tian |
78 |
B |
Chinese |
10 |
Jack |
87 |
B |
Maths |
6 |
Zhang |
0 |
B |
Maths |
7 |
Wang |
2 |
B |
Maths |
8 |
Gong |
56 |
B |
Maths |
9 |
Tian |
99 |
B |
Maths |
10 |
Jack |
88 |
5,ok,御覽看看效果吧。搞定收工。
<!--[if !vml]--><!--[endif]-->
<!--[if !vml]--><!--[endif]-->
Dim sub1 As New sub1()
Me.subReport1.Report = sub1
'為子報表設置數據源
Dim dv As DataView = New DataView(CType(Me.DataSource, DataTable), "Class='" & Me.Fields("Class").Value.ToString & "'", "", DataViewRowState.CurrentRows)
Me.subReport1.Report.DataSource = dv
End Sub
Dim conn As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test.mdb;Persist Security Info=False"
Dim cmd As String = "Select * from table1 order by ID"
Dim adapter As New OleDbDataAdapter(cmd, conn)
Dim ds As New DataSet
adapter.Fill(ds)
Dim rpt As New rpt1
rpt.DataSource = ds.Tables(0)
rpt.Run()
Me.Viewer1.Document = rpt.Document
End Sub