บทที่ 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
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
ตำแหน่งไฟล์และไฟล์ Crystal Report ที่สร้างโดย VB.NET
บรรทัดที่ 5 ส่งเงื่อนไขในการค้นหาซึ่งมีลักษณะคล้ายเงื่อนไขหลัง
Where ของภาษา SQL โปรดสังเกตชื่อของ
ฟิลด์จะอยู่ภายใต้เครื่องหมายปีกกา โดยจะระบุชื่อของตารางตามด้วยชื่อฟิลด์ เช่น
{Student.std_fname} คำสั่ง Like คือคำสั่งให้ค้นหาข้อมูลโดยมีเงื่อนไข
ฟิลด์จะอยู่ภายใต้เครื่องหมายปีกกา โดยจะระบุชื่อของตารางตามด้วยชื่อฟิลด์ เช่น
{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) obj.query = "{student.std_fname} like'*" & TextBox1.Text & "*'"
3. ค้นหาจากสีที่นักเรียนชอบ
ทดลองส่งค่าใน TextBox “แดง” “ฟ้า” “ดำ” “ขาว”
(1) obj.query = "{Color.color_name} ='" &
TextBox1.Text & "'"
4. ค้นหาเฉพาะเพศ ทดลองส่งค่าใน
TextBox “0” คือเพศชาย “1” คือเพศหญิง
(1) obj.query = "{Bname.bname_sex} ='" &
TextBox1.Text & "'"
5. ค้นหานักเรียนที่มีอายุมากกว่าหรือเท่ากับค่า
ทดลองส่งค่าใน TextBox “18” ปีเข้าไป
(1) obj.query = "{student.std_age} >=" &
TextBox1.Text
6. ค้นหาวันที่
ทดลองส่งค่าใน TextBox1 “5/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 & "#"
ความคิดเห็น
แสดงความคิดเห็น