學習了前面的換頁和換列的方法,下面我們結合這2節知識實際打印一張分欄帳票。
分欄帳票在我們系統中是經常用到的,具體式樣如下:
Page 1:
Class: |
A |
|
|
|
|
Chinese |
Maths |
||||
ID |
Name |
Score |
ID |
Name |
Score |
1 |
Tony |
100 |
1 |
Tony |
99 |
2 |
Mary |
56 |
2 |
Mary |
76 |
3 |
Tom |
76 |
3 |
Tom |
54 |
4 |
John |
67 |
4 |
John |
86 |
5 |
Li |
54 |
5 |
Li |
34 |
Page 2:
Class: |
B |
|
|
|
|
Chinese |
Maths |
||||
ID |
Name |
Score |
ID |
Name |
Score |
6 |
Zhang |
3 |
6 |
Zhang |
0 |
7 |
Wang |
100 |
7 |
Wang |
2 |
8 |
Gong |
23 |
8 |
Gong |
56 |
9 |
Tian |
78 |
9 |
Tian |
99 |
10 |
Jack |
87 |
10 |
Jack |
88 |
該類型帳票有如下特點:
(1)、分欄帳票的特點是各欄的樣式基本相同,只是其中的數據會有所變化。
(2)、分欄帳票的各欄可以是銜接在一起的,即欄間距爲0,也可以是分開的。
(3)、Title和SubTitle通常是不分欄的,它們會跨越所有的欄。
(4)、帳票的默認欄數應該是固定的,比方說A4紙默認印刷8欄,如果超過8欄可以選擇換頁,也可以選擇超出邊界繼續印刷(紅線)。
這是由代碼來控制的。
有如下數據源
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->
Table1 |
||||
Class |
Subject |
ID |
Name |
Score |
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 |
A |
Maths |
1 |
Tony |
99 |
A |
Maths |
2 |
Mary |
76 |
A |
Maths |
3 |
Tom |
54 |
A |
Maths |
4 |
John |
86 |
A |
Maths |
5 |
Li |
34 |
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 |
最終希望打印成如下帳票:
(1)根據Class換行
(2)根據Subject換列
Page 1:
Class: |
A |
|
|
|
|
Chinese |
Maths |
||||
ID |
Name |
Score |
ID |
Name |
Score |
1 |
Tony |
100 |
1 |
Tony |
99 |
2 |
Mary |
56 |
2 |
Mary |
76 |
3 |
Tom |
76 |
3 |
Tom |
54 |
4 |
John |
67 |
4 |
John |
86 |
5 |
Li |
54 |
5 |
Li |
34 |
Page 2:
Class: |
B |
|
|
|
|
Chinese |
Maths |
||||
ID |
Name |
Score |
ID |
Name |
Score |
6 |
Zhang |
3 |
6 |
Zhang |
0 |
7 |
Wang |
100 |
7 |
Wang |
2 |
8 |
Gong |
23 |
8 |
Gong |
56 |
9 |
Tian |
78 |
9 |
Tian |
99 |
10 |
Jack |
87 |
10 |
Jack |
88 |
0,開始之前,先讓我們回想一下第3節的內容。
用第3節的方法,
(1),添加如下控件
〔2〕,把GroupHeader的DataField設置成Subject,NewColumn設置成Before
(3),把GroupHeader中的ClassNo控件DataField設爲Class
(4),Detail中3個控件的DataField 邦定到”ID”,”Name”,”Score”
(5),比較特殊的,GroupHeader1中Subject這個控件也要設置DataField,設爲Subject,這樣就可以從數據源中把Subject 的Name讀取出來了
(6),Detail的ColumnCount設爲2
<!--[endif]-->
ok,讓我們看看結果吧!
<!--[endif]-->
<!--[endif]-->
赫赫,大致要差不多了,主要問題有2個:
(1),2個Title “Class: A” ,由於放在GroupHeader1中,換列的時候重複了2次。
(2),還有個問題可能比較難發現。我們沒有設置分頁,但爲啥打印出來帳票分頁正常呢?
恩,我們設置的分列字段是Subject,ColumnCount是2,而數據源是這樣的:
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 |
A |
Maths |
1 |
Tony |
99 |
A |
Maths |
2 |
Mary |
76 |
A |
Maths |
3 |
Tom |
54 |
A |
Maths |
4 |
John |
86 |
A |
Maths |
5 |
Li |
34 |
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列共10條數據打印好之後,正好Subject改變了,又要換列,而該頁已經打滿了,所以系統自動換頁了。
讓我們看看,假如Class A不學maths的話會發生什麼情況?
數據源變成這樣:
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 |
結果由於沒有強制根據Class換頁,導致Class A和Class B的數據打印在一列上了:
<!--[endif]-->
要解決這2個問題,一般有2種方法:
(1)增加一個GroupHeader/GroupFooter用於放Title;同時用來控制換頁。這樣,就有1個group換頁,1個group換列了。
(2)用子報表
本節我們使用第一種方案。第二種方案下節討論。
1,先準備數據源:
數據源可以在後臺取數的時候就組織好,也可以到前臺再組織數據。
2,創建一個AR模版(rpt1.rpx):
GroupHeader1:
DataField=Class
NewPage=Before
ColumnLayout=False
ColumnLayout是分欄帳票中一個很重要的屬性,當ColumnLayout設置爲True的時候GroupHeader將與Detail一起換欄,當設置爲False時GroupHeader將跨越所有欄。
此處因爲該Group不需要換列,所以設置成False
GroupHeader2:
DataField=Subject
NewColumn=Before
其餘控件屬性不變。
<!--[endif]-->
3,在form的load事件中編寫如下代碼,把數據源傳給模版,並顯示模版:
4,ok!再御覽看看,搞定收工。
'Show the table1
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 Class,subject,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