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   Object ByVal  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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值