程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> ActiveReports工作總結10——完整的一張成績一覽帳票

ActiveReports工作總結10——完整的一張成績一覽帳票

編輯:.NET實例教程

環境:

vs2005+ActiveReportsNet2

本節代碼下載:http://www.cnblogs.com/Files/batoosai/SimpleExample10.rar


學習了前面的一些基礎,我們來實際開發一張帳票吧。

1,帳票式樣

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

2,帳票說明:

    1,抽出條件:

      1-1班級:必選,多選

1-2科目:必選, 多選                                  

    2,用紙サイズ: A4 橫                            

    3,改頁條件:班級

    4,印刷順序:行:生徒出席番號升排序

                列:科目順位

    4,如果某學生某subject沒有成績的話,也要顯示該數據(只是把格子留空)

分析下帳票,我們應該用3個子模版(如下圖,其中Sub3不需要取數,老師手動填)

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

3,好,我們項目一般的架構如下:

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

在我們的示例中,方便起見,就用簡單的3層架構吧,當中的web service去掉。創建Project如圖:

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

1)表示層:Form,ARTemplate

2)業務邏輯層:BR

3)數據層:DA

 

4,數據庫如下:

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

具體數據表的數據:

1)Class

Class

ClassID

ClassNameTeacherName

DisplayOrder

1

A班

Tony Gong

1

2

B班

Tony Wang

2

3

C班

Tony Li

3

2)Student

Student

StudentID

ClassID

No

Name

11

1

1

Tony

12

1

2

Zhu

13

1

3

Li

14

1

4

Zhang

15

1

5

Zha

16

1

6

Sun

21

2

1

Wang

Gong

23

2

3

Tian

24

2

4

Su

25

2

5

Xiao

31

3

1

Xu

32

3

2

Liu

33

3

3

Tom

34

3

4

Mary

 

3)Subject

Subject

SubjectID

SubjectName

DisplayOrder

1

古典

1

2

現代文

2

3

語文

3

 

4)Score

Score

ScoreID

StudentID

SubjectID

Score

GradeOrder

1

11

1

70

11

2

11

2

75

23

3

11

3

55

1

4

12

1

6

15

5

12

2

77

6

6

13

1

8

6

7

13

2

77

7

8

13

3

66

8

9

14

1

55

9

10

14

44

10

11

15

2

32

11

12

16

3

100

12

13

21

1

11

13

14

21

2

14

14

15

21

3

15

1

16

22

1

16

2

17

22

2

76

3

18

22

3

18

4

19

23

1

99

5

20

23

3

6

21

24

1

21

7

22

25

1

44

8

23

31

1

23

9

24

31

2

24

10

25

32

1

25

1

26

32

3

26

2

27

33

1

27

3

28

34

1

28

4

29

34

2

29

5

30

34

3

30

6ok,開工,先add 如下文件

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

其中Form中

       frmScore讓用戶選擇抽出條件

       frmShowAR用來顯示report

 

6,在form上放2個多選的條件控件,Class和Subject。

實際項目中,這2個控件的內容應該取數據表裡的值。我這裡方便起見,直接把值寫死在控件上。

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

btnPrevIEw的click事件如下:


    Private Sub btnPreview_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrevIEw.Click

        If Me.listClass.SelectedIndex = -1 OrElse Me.listSubject.SelectedIndex = -1 Then

            Return

        End If

 

        ''Get the Parameter

        Dim classID As String = ""

        Dim subjectID As String = ""

        For index As Int32 = 0 To Me.listClass.SelectedIndices.Count - 1

            classID &= Me.listClass.SelectedIndices(index) + 1 & ","

        Next

        For index As Int32 = 0 To Me.listSubject.SelectedIndices.Count - 1

            subjectID &= Me.listSubject.SelectedIndices(index) + 1 & ","

        Next

        classID = classID.TrimEnd(Convert.ToChar(","))

        subjectID = subjectID.TrimEnd(Convert.ToChar(","))

 

 

        ''Send parameters to the BR and get the dataset.

        Dim br As New BR.brScore()

        Dim finalDS As DataSet = br.GetData(classID, subjectID)

 

        ''Send dataset to the form

        Dim frm As New frmShowAR(finalDS)

        frm.Show()

    End Sub

 

7,br層,由於業務太簡單了,代碼很簡單。


    Public Function GetData(ByVal classID As String, ByVal subjectID As String) As DataSet

        Try

 

            '' 創建DA

            Dim objDA As New DA.daScore()

 

            Dim ds As DataSet = objDA.GetData(classID, subjectID)

 

            '' 返回値

            Return ds

 

        Catch ex As Exception

 

            '' 拋出異常

            Throw ex

 

        End Try

    End Function

 

8, DA層,根據參數執行sql語句,返回結果Dataset

       DA的任務,是根據參數,作select語句,得出2張table,放到ds中return。

假設Class選了”B,C”,Subject選了”古典,

其中table1(用於Sub1和主模版)數據應該如下:(9條記錄)

Query1

Class.ClassID

ClassName

TeacherName

DisplayOrder

StudentID

Student.ClassID

No

Name

2

B班

Tony Wang

2

21

2

1

Wang

2

B班

Tony Wang

2

22

2

2

Gong

2

B班

Tony Wang

2

23

2

3

Tian

2

B班

Tony Wang

2

24

2

4

Su

2

B班

Tony Wang 

Xiao

3

C班

Tony Li

3

31

3

1

Xu

3

C班

Tony Li

3

32

3

2

Liu

3

C班

Tony Li

3

33

3

3

Tom

3

C班

Tony Li

3

34

3

4

Mary

 

table2(用於Sub2)數據應該這樣做:

9條生徒 * 2門科目,然後left join Score的內容,最終得到18條記錄(假如某人某科沒成績的話,該字段也會顯示出來,只是留空而已)。

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

PS:由於Access的Left join 俺實在是搞不懂,沒法做left join,所以只能把Score的紀錄填滿,然後用普通查詢。

再PS:Access的參數化查詢我也搞不太清楚,所以代碼中直接把”@classid”等替換成字符串了。

最後的PS:假如是mssql的話,sub2的查詢語句大概如下:

Select * from student,class

    cross join Subject

    left join score

           on score.subjectID=Subject.SubjectID

           and score.StudentID=student.StudentID

Where s.ClassID=c.ClassID

And c.ClassID in (@ClassID)

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

Sub3就不需要查尋了。

 

9,frmShowAR接收到數據源,並顯示帳票


PublicClass frmShowAR

    Sub New(ByVal ds As DataSet)

 

        Me.finalDS = ds

 

        '' 此調用是 Windows 窗體設計器所必需的。

        InitializeComponent()

 

        '' 在 InitializeComponent() 調用之後添加任何初始化。

    End Sub

 

    Private finalDS As DataSet

 

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

        Dim rpt As New ARTemplate.rptScore

        rpt.DataSource = finalDS

        rpt.DataMember = finalDS.Tables(0).TableName

 

        ''A4 Landscape

        rpt.PageSettings.PaperKind = Printing.PaperKind.A4

        rpt.PageSettings.Orientation = DataDynamics.ActiveReports.Document.PageOrIEntation.Landscape

 

        rpt.Run()

        Me.VIEwer1.Document = rpt.Document

    End Sub

End Class

 

 

10,主模版和子模版主要屬性及代碼(完整的請看下載的代碼)

1),主模版

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

       GroupHeader1:DataFIEd=”ClassID”

                              NewPage=”Before”

       txtClassNo:  DataFIEld=”ClassName”

       txtTeacher:   DataFIEld=”TeacherName”

代碼:

Report_start中布局代碼

 

 

Detail_Format裡的生成子模版的代碼:

 

 

 

2),Sub1

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

       txtID:DataFIEld=”No”

       txtName:DataFIEld=”Name”

 

3),Sub2

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

       GroupHeader1:DataFIEld=” SubjectID”

                              NewPage=”Before”

       lblSubject:DataFIEld=”SubjectName”

       txtScore:DatafIEld=”Score”

       txtOrder:DatafIEld=”gradeOrder”

 

4),Sub3

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

 

11,最終效果,比較粗糙,大家自己改進吧。

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

Highlighter.com/

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

        ''subReport1

        Dim sub1 As New sub1

        Me.subReport1.Report = sub1

        ''為子報表設置數據源

        Dim dvStudent As DataView = New DataView(CType(Me.DataSource, DataSet).Tables(0), "ClassID=''" & Me.Fields("ClassID").Value.ToString & "''", "", DataVIEwRowState.CurrentRows)

        Me.subReport1.Report.DataSource = dvStudent

 

        ''subReport2

        Dim sub2 As New sub2

        Me.subReport2.Report = sub2

        ''為子報表設置數據源

        Dim dvScore As DataView = New DataView(CType(Me.DataSource, DataSet).Tables(1), "ClassID=''" & Me.Fields("ClassID").Value.ToString & "''", "", DataVIEwRowState.CurrentRows)

 

        With CType(Me.subReport2.Report, sub2)

            .DataSource = dvScore

            ''Set subReport''s ColumnCount

            .RealColumnCount = CInt(dvScore.Count / dvStudent.Count)

        End With

 

        ''subReport3

        Dim sub3 As New sub3

        Me.subReport3.Report = sub3

        Me.subReport3.Report.DataSource = dvStudent

End Sub

 


   Private Sub rpt1_ReportStart(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.ReportStart

        ''<--------Step (1)---------->

        ''Set contols'' width

        ''me.lblClass.Width=xxx

        ''

        ''

        ''<--------Step (1)---------->

 

 

        ''<--------Step (2)---------->

        ''Arrange Controls.

        Me.lblYear.Left = 0.5

        Me.lblYear.Top = 0.5

        Me.txtClassNo.Left = Me.lblYear.Left

        Me.txtClassNo.Top = Me.lblYear.Top + Me.lblYear.Height

        Me.Label3.Left = Me.txtClassNo.Left + Me.txtClassNo.Width * 2

        Me.Label3.Top = Me.txtClassNo.Top

        Me.txtTeacher.Left = Me.Label3.Left + Me.Label3.Width

        Me.txtTeacher.Top = Me.Label3.Top

 

        ''<--------Step (2)---------->

 

 

        ''<--------Step (3)---------->

        Dim sub1 As New sub1

        Me.subReport1.Width = sub1.ReportWidth

 

        Dim sub2 As New sub2

        With CType(Me.DataSource, DataSet)

            Me.subReport2.Width = sub2.ReportWidth * CInt(.Tables(1).Rows.Count / .Tables(0).Rows.Count)

        End With

 

        Dim sub3 As New sub3

      &nbsp; Me.subReport3.Width = sub3.reportWidth

        ''<--------Step (3)---------->

 

 

        ''<--------Step (4)---------->

        Me.subReport1.Left = Me.txtClassNo.Left

        Me.subReport1.Top = Me.txtClassNo.Top + Me.txtClassNo.Height

 

        Me.subReport2.Left = Me.subReport1.Left + Me.subReport1.Width

        Me.subReport2.Top = Me.subReport1.Top

 

        Me.subReport3.Left = Me.subReport2.Left + Me.subReport2.Width

        Me.subReport3.Top = Me.subReport1.Top

        ''<--------Step (4)---------->

 

 

        ''<--------Step (5)---------->

        ''Set all sections & PrintWidth

        Me.PageHeader.Height = Me.TextBox2.Height

        Me.Detail.Height = 0

        ''<--------Step (5)---------->

 

 

        ''<--------Step (6)---------->

        ''Set PrintWidth

        Dim realWidth As Single = Me.subReport3.Left + Me.subReport3.Width

 

        Dim defaultWidth As Single

        If PageSettings.Orientation = PageOrIEntation.Portrait Then

            defaultWidth = PageSettings.PaperWidth - PageSettings.Margins.Left - PageSettings.Margins.Right

        Else

            defaultWidth = PageSettings.PaperHeight - PageSettings.Margins.Left - PageSettings.Margins.Right

        End If

 

        If realWidth > defaultWidth Then

            Me.PrintWidth = realWidth

        Else

 

            Me.PrintWidth = defaultWidth

        End If

        ''<--------Step (6)---------->

End Sub
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved