บทที่ 12 การเขียนโปรแกรมด้วย VB.NET เพื่อควบคุม Crystal Report

การเขียนโปรแกรมเพื่อควบคุมการทำงานของ Crystal Report เป็นอีกส่วนที่สำคัญในการสร้างรายงาน (Report) โดยที่จะต้องอาศัยความเข้าใจกับชุดคำสั่งต่างๆ ดังนั้นจึงขอยกตัวอย่างการควบคุมรายงานด้วยการสร้างออบเจ็กต์จากคลาส clsReport ซึ่งเป็นคลาสที่ผู้สอนได้สร้างขึ้นมา ดังนั้นควรศึกษาหลักการของการเขียนโปรแกรมเพื่อควบคุมการทำงานของ Crystal Report จากแหล่งความรู้ต่างๆ เพิ่มเติมเพื่อการพัฒนาในขั้นสูงต่อไป
และเพื่อให้เกิดความเข้าใจและไม่สับสนในการศึกษาในครั้งนี้ โดยจะต้องสร้างโปรเจ็คขึ้นมาใหม่ ในความจริงในทางปฏิบัติแล้ว การสร้างฟอร์มส่วนที่เรียกใช้รายงานจากภายในโปรเจ็กต์ที่ทำได้เลย ซึ่งในส่วนนี้ก็แล้วแต่ความเหมาะสมในการออกแบบ Application
                การเตรียมการก่อนการสร้าง
1) ดาว์นโหลดไฟล์ฐานข้อมูลได้จาก  student.accdb  จากนั้นนำไปไว้ในตำแหน่งที่จะเรียกใช้ ในครั้งในให้นำไปไว้ที่ C:\database\ student.accdb
2) ดาว์นโหลดไฟล์ไฟล์คลาส clsReport.vb จาก clsReport.vb
3) ดาว์นโหลดไฟล์ไฟล์รายงานจาก rptStudent.rpt   

ส่วนของคลาส clsReport.vb
                ในคลาสนี้ส่วนที่จะติดต่อกับออบเจ็กต์จะมีแค่คุณสมบัติเท่านั้นส่วนเมธอดต่างๆ จะใช้ในการทำงานภายในคลาส
|1|  Imports CrystalDecisions.CrystalReports.Engine
|2|  Imports CrystalDecisions.Shared
|3|  Public Class clsReport
|4|      Private _rpt As New ReportDocument
|5|      Private _parafields As New ParameterFields
|6|      Private _FileName As String
|7|'---------------Constructor class---------------------
|8|      Public Sub New()
|9|      End Sub
|10|'-------------------------------------------
|11|     Public Sub New(prmfilePath As String)
|12|         _rpt.FileName = prmfilePath
|13|     End Sub
|14|'-------------------------------------------
|15|     Public Sub New(prmfileName As ReportDocument)
|16|         _rpt = prmfileName
|17|     End Sub
|18|'---------------Property------------------
|19|     Public WriteOnly Property filePath() As String
|20|         Set(value As String)
|21|             _rpt.FileName = value
|22|         End Set
|23|     End Property
|24|'-------------------------------------------
|25|     Public WriteOnly Property fileName() As ReportDocument
|26|         Set(value As ReportDocument)
|27|             _rpt = value
|28|         End Set
|29|     End Property
|30|'-------------------------------------------
|31|     Public WriteOnly Property query() As String
|32|         Set(value As String)
|33|             _rpt.RecordSelectionFormula = value
|34|         End Set
|35|     End Property
|36|'-------------------------------------------
|37|     Public WriteOnly Property parameters() As String
|38|         Set(value As String)
|39|             addParameter(value)
|40|         End Set
|41|     End Property
|42|'-------------------------------------------
|43|     Public WriteOnly Property setAction() As Object
|44|         Set(value As Object)
|45|             setReportViewer(value)
|46|         End Set
|47|     End Property
|48|'--------------Method----------------------
|49|     Private Sub addParameter(prmValue As String)
|50|         Dim filed As String = Mid(prmValue, 1, InStr(prmValue, "=") - 1)
|51|         Dim value As String = Mid(prmValue, InStr(prmValue, "=") + 1, Len(prmValue))
|52|         _parafields.Add(setParameterField(filed, value))
|53|     End Sub
|54|'-------------------------------------------
|55|     Private Sub setReportViewer(prmRptViewer As Object)
|56|         prmRptViewer.ParameterFieldInfo = _parafields
|57|         prmRptViewer.ReportSource = _rpt
|58|         prmRptViewer.Refresh()
|59|     End Sub
|60|'-------------------------------------------
|61|     Private Function setParameterField(prmFiled As String, prmValue As String) As ParameterField
|62|         Dim paraValue As New ParameterDiscreteValue
|63|         paraValue.Value = prmValue
|64|
|65|         Dim parafld As New ParameterField
|66|         parafld.ParameterFieldName = prmFiled
|67|         parafld.CurrentValues.Add(paraValue)
|68|
|69|         Return parafld
|70|     End Function
|71| End Class

การเขียนโปรแกรม VB.NET เพื่อเรียกรายงาน Crystal Report

                1.  สร้างโปรเจ็กต์ใหม่ชื่อว่า proReport  จากนั้นกดปุ่ม OK




            2.  ในส่วนของ Reporting ให้เลือกตัวควบคุม CrystalReportViewer มาวางบนฟอร์มซึ่งจะเห็นว่าขณะวางนั้นตัวควบคุมนี้จะขยายอัตโนมัติแบบเต็มจอ ซึ่งเราจะปรับขนาดต่อไป


                3.  จากนั้นเราจะยกเลิกคุณสมบัติการแสดงผลเต็มจออัตโนมัตินี้ด้วยการคลิกที่ปุ่มสามเหลี่ยมมุมบนด้านขวามือของตัวควบคุม แล้วเลือกคำสั่ง Undock in parent container



 
4.  จากนั้นปรับขนาดและจัดวางตำแหน่ง ดังภาพ

               
5.  กำหนดคุณสมบัติ Anchor ของตัวควบคุม CrystalReportViewer ให้มีสถานะเป็น Top, Bottom, Left, Right ดังนี้







               
6.  กำหนดคุณสมบัติ Window State ให้มีค่า Maximized คือเมื่อมีการโหลดฟอร์มก็ให้ขยายฟอร์มแบบเต็มหน้าจอ







7.  จากนั้นนำตัวควบคุมคือ Label TextBox  Button มาวางบนฟอร์ม ดังภาพ



8.  นำเข้าคลาส clsReport.vb จากการที่ได้ดาวน์โหลดในตำแหน่งที่ได้กล่าวมา หรืออาจจะสร้างขึ้นใหม่ก็ได้ วิธีการนำเข้าคลาสมายังโปรเจ็ค มีดังนี้
(1) เลือกที่เมนู Project คลิกคำสั่ง Add Exiting Item
 



(2)  เลือกไปยังตำแหน่งที่เก็บไฟล์ clsReport.vb อยู่ในที่นี้สำหรับของเครื่องที่ทำเอกสารนี้จะอยู่ที่  C:\database  จากนั้นทำการเลือกไฟล์ที่ต้องการนำเข้าแล้วก็คลิกที่ปุ่ม Add







(3)  เมื่อสังเกตที่แถบ Solution Explorer จะมีรายการไฟล์คือ clsReport.vb ปรากฏขึ้นมา


9.  จากนั้นเขียนคำสั่งในเหตุการณ์เมื่อมีการคลิกปุ่ม ตกลง ดังนี้

|1|  Public Class Form1
|2|      Private Sub Button1_Click(....) Handles Button1.Click
|3
|4|          Dim obj As New clsReport("C:\database\rptStudent.rpt")
|5|          obj.query = "{student.std_fname} like'" & TextBox1.Text & "*'"
|6|          obj.parameters = "title=ค้นหาโดย " & TextBox1.Text
|7
|8|          obj.setAction = CrystalReportViewer1
|9
|10|     End Sub
|11| End Class

บรรทัดที่ 4 สร้างตัวแปรออบเจ็กต์ พร้อมส่งค่าเริ่มต้นเข้าไปที่คลาส (คอนสตรัคเตอร์คลาส)ซึ่งสามารถส่งได้ทั้ง
               ตำแหน่งไฟล์และไฟล์
Crystal Report ที่สร้างโดย VB.NET
บรรทัดที่ 5 ส่งเงื่อนไขในการค้นหาซึ่งมีลักษณะคล้ายเงื่อนไขหลัง Where ของภาษา SQL โปรดสังเกตชื่อของ
               ฟิลด์จะอยู่ภายใต้เครื่องหมายปีกกา โดยจะระบุชื่อของตารางตามด้วยชื่อฟิลด์  เช่น

               {Student.std_fname} คำสั่ง Like คือคำสั่งให้ค้นหาข้อมูลโดยมีเงื่อนไข
บรรทัดที่ 6 ส่งค่าพารามิเตอร์ไปโดยมีรูปแบบ String โดยระบุชื่อพารามิเตอร์ที่อยู่ในรายงานในที่นี้คือ title ตาม
               ด้วยเครื่องหมายเท่ากับ ตามด้วยข้อความที่ต้องการส่งไป
บรรทัดที่ 7 ส่งค่า CrystalReportViewer เพื่อให้แสดงผลรายงานซึ่งเป็นขั้นตอนสุดท้ายของการใช้ออบเจ็กต์นี้

10.  จากนั้นทำการรันโปรแกรมและใส่ค่าเงื่อนไขคำว่า “ดา” ลงไปในช่อง TextBox จากนั้นกดปุ่มตกลง
จะพบข้อมูลจำนวน 3 ระเบียน ทดลองเปลี่ยนเงื่อนไขอื่น





จากนั้นทดลองเปลี่ยนเงื่อนไขในบรรทัดที่ 5 ดังนี้ เพื่อให้เกิดความเข้าใจและสามารถนำไปประยุกต์ใช้ในการส่งค่าไปที่ Crystal ได้ ดังนี้

1. ค้นหาจากคำนำหน้าชื่อ  ทดลองส่งค่าใน TextBox “เด็กหญิง” “เด็กชาย” “นาย” นางสาว
(1) obj.query = "{Bname.bname_name} ='" & TextBox1.Text & "'"

2. ค้นหาจากชื่อนักเรียน
(1) obj.query = "{student.std_fname} like'" & TextBox1.Text & "*'" 
(2) obj.query = "{student.std_fname} like'*" & TextBox1.Text & "'"
(3) obj.query = "{student.std_fname} like'*" & TextBox1.Text & "*'"

3. ค้นหาจากสีที่นักเรียนชอบ ทดลองส่งค่าใน TextBox “แดง” “ฟ้า” “ดำ” ขาว
(1) obj.query = "{Color.color_name} ='" & TextBox1.Text & "'"

4. ค้นหาเฉพาะเพศ ทดลองส่งค่าใน TextBox0” คือเพศชาย “1” คือเพศหญิง
(1) obj.query = "{Bname.bname_sex} ='" & TextBox1.Text & "'"

5. ค้นหานักเรียนที่มีอายุมากกว่าหรือเท่ากับค่า ทดลองส่งค่าใน TextBox18”  ปีเข้าไป
(1) obj.query = "{student.std_age} >=" & TextBox1.Text

6. ค้นหาวันที่ ทดลองส่งค่าใน TextBox15/5/1995
(1) obj.query = "datevalue({student.std_Bday}) = #" & TextBox1.Text & "#"

7. ค้นหาช่วงวันที่ นักศึกษาต้องมี TextBox จำนวน 2 ตัว หรือเป็น DateTimePicker 2 ตัวก็ได้จึงทดลองได้  
ทดลองส่งค่าใน TextBox1 “17/4/1992” และ TextBox1 “30/4/1992”
(1) obj.query = "datevalue({student.std_Bday}) >= #" & TextBox1.Text & "# and datevalue({student.std_Bday}) <= #" & TextBox2.Text & "#"

ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

บทที่ 11 ตอน 3 การออกแบบรายงานด้วย Crystal Report

บทที่ 6 กระบวนการพอลิมอร์ฟิซึม (Polymorphism)

บทที่ 11 ตอน 3 การออกแบบรายงานด้วย Crystal Report Ex2