ActiveReports工作總結5——常用分欄帳票印刷

學習了前面的換頁和換列的方法,下面我們結合這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)TitleSubTitle通常是不分欄的,它們會跨越所有的欄。

(4)、帳票的默認欄數應該是固定的,比方說A4紙默認印刷8欄,如果超過8欄可以選擇換頁,也可以選擇超出邊界繼續印刷(紅線)

   這是由代碼來控制的。

 

本節目標:

有如下數據源
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->

Table1

Class

Subject

ID

Name

Score

Chinese

1

Tony

100

Chinese

2

Mary

56

Chinese

3

Tom

76

Chinese

4

John

67

Chinese

5

Li

54

Maths

1

Tony

99

Maths

2

Mary

76

Maths

3

Tom

54

Maths

4

John

86

Maths

5

Li

34

Chinese

6

Zhang

3

Chinese

7

Wang

100

Chinese

8

Gong

23

Chinese

9

Tian

78

Chinese

10

Jack

87

Maths

6

Zhang

0

Maths

7

Wang

2

Maths

8

Gong

56

Maths

9

Tian

99

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〕,把GroupHeaderDataField設置成SubjectNewColumn設置成Before

3),把GroupHeader中的ClassNo控件DataField設爲Class

4),Detail3個控件的DataField 邦定到”ID”,”Name”,”Score”

5),比較特殊的,GroupHeader1Subject這個控件也要設置DataField,設爲Subject,這樣就可以從數據源中把Subject Name讀取出來了

6),DetailColumnCount設爲2

<!--[if !vml]--><!--[endif]-->

ok,讓我們看看結果吧!

<!--[if !vml]--><!--[endif]-->

<!--[if !vml]--><!--[endif]-->

赫赫,大致要差不多了,主要問題有2個:

1),2Title “Class A” ,由於放在GroupHeader1中,換列的時候重複了2次。

2),還有個問題可能比較難發現。我們沒有設置分頁,但爲啥打印出來帳票分頁正常呢?

       恩,我們設置的分列字段是SubjectColumnCount2,而數據源是這樣的:

Chinese

1

Tony

100

Chinese

2

Mary

56

Chinese

3

Tom

76

Chinese

4

John

67

Chinese

5

Li

54

Maths

1

Tony

99

Maths

2

Mary

76

Maths

3

Tom

54

Maths

4

John

86

Maths

5

Li

34

Chinese

6

Zhang

3

Chinese

7

Wang

100

Chinese

8

Gong

23

Chinese

9

Tian

78

Chinese

10

Jack

87

Maths

6

Zhang

0

Maths

7

Wang

2

Maths

8

Gong

56

Maths

9

Tian

99

Maths

10

Jack

88

第一頁2列共10條數據打印好之後,正好Subject改變了,又要換列,而該頁已經打滿了,所以系統自動換頁了。

 

讓我們看看,假如Class A不學maths的話會發生什麼情況?

數據源變成這樣:

Chinese

1

Tony

100

Chinese

2

Mary

56

Chinese

3

Tom

76

Chinese

4

John

67

Chinese

5

Li

54

Chinese

6

Zhang

3

Chinese

7

Wang

100

Chinese

8

Gong

23

Chinese

9

Tian

78

Chinese

10

Jack

87

Maths

6

Zhang

0

Maths

7

Wang

2

Maths

8

Gong

56

Maths

9

Tian

99

Maths

10

Jack

88

 

結果由於沒有強制根據Class換頁,導致Class AClass B的數據打印在一列上了:

<!--[if !vml]--><!--[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一起換欄,當設置爲FalseGroupHeader將跨越所有欄。

              此處因爲該Group不需要換列,所以設置成False

GroupHeader2:

       DataField=Subject

       NewColumn=Before

其餘控件屬性不變。

<!--[if !vml]--><!--[endif]-->

 

 

3,在formload事件中編寫如下代碼,把數據源傳給模版,並顯示模版:

 

 

4ok!再御覽看看,搞定收工。


<!--[if !vml]-->


 

 

Private Sub Form1_Load(ByVal sender As ObjectByVal e As System.EventArgs) Handles Me.Load

        
'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

 
發佈了4 篇原創文章 · 獲贊 0 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章