您的位置:首页 > 其它

ActiveReports工作总结6——使用子报表

2007-11-21 00:43 495 查看
本节目标:
承接上节,上节用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事件了)中,加入代码,生成子报表,并且给子报表设置数据源(这里为简单起见没有设置数据源):
Private Sub GroupHeader1_Format(ByVal sender As Object, ByVal e As System.EventArgs) Handles GroupHeader1.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,先准备如下数据(把数据顺序组织成如下形式):

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
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.。

注意了我这里传给子模版的数据源。

当打印第一页时,我传给子模版的数据源是:

Chinese
1
Tony
100

Chinese
2
Mary
56

Chinese
3
Tom
76

Chinese
4
John
67

Chinese
5
Li
54
当打印Class=B的第二页时,我传给子模版的数据源变成了:

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
5,ok,御览看看效果吧。搞定收工。
<!--[if !vml]-->

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

<!--[endif]-->

Dim dv As DataView = New DataView(CType(Me.DataSource, DataTable), "Class='" & Me.Fields("Class").Value.ToString & "'", "", DataViewRowState.CurrentRows)

Private Sub GroupHeader1_Format(ByVal sender As Object, ByVal e As System.EventArgs) Handles GroupHeader1.Format

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

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

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: