โดยส่วนตัวของผมแล้วก็ไม่ได้เขียนโปรแกรมเพื่อแสดงผลในรูปแบบกราฟมานานแสนนานแล้ว สาเหตุก็เนื่องจากว่า ผมจะใช้วิธีการ Export เข้าสู่ไฟล์ Excel ไปเลย เพื่อให้กลุ่ม Users ได้นำไปประยุกต์ใช้งานต่อไป ซึ่งมันจะเกิดความยืดหยุ่นกว่ามาก อีกทั้งเป็นการลดภาระในการทำงานของตัวเราเองด้วย แต่อย่าพึ่งนึกไปน่ะครับว่า นี่เป็นการผลักภาระไปให้กับผู้ใช้งานแทนเรา กลับหาได้เป็นเช่นนั้นไม่ครับ ... พี่น้อง ฟังก่อน ... ผมยังคงต้องใช้เวลาอีกส่วนหนึ่งไปกับการถ่ายทอดความรู้ให้กับผู้ใช้ เพื่อที่ผู้ใช้งานจะได้สามารถนำข้อมูลที่มีอยู่ เอามาสร้างกราฟ สร้างงานตามภาระความรับผิดชอบของเขา (หรือ เธอ) ได้ต่างหากล่ะ แน่นอนว่าเราต้องพัฒนาให้ Users เปลี่ยนสถานะจากระดับ Beginner ให้กลายมาเป็นระดับ Advanced ... ซึ่งในการถ่ายถอดความรู้ที่มีอยู่ออกไปนั้น หากใครไม่เคยลอง ก็ไม่รู้หรอกครับ เหนื่อยเหมือนกัน ... แต่มันสนุก (และสดชื่น เมื่อได้อยู่ใกล้สาวๆ ... 55555+)
- Project --> Components ... เพื่อเลือก Microsoft Chart Control 6.0
- การออกแบบ (Design Time)
- พี่น้องจะได้ภาพของ MS Chart ออกมาได้ไม่เหมือนผมหรอกครับ ให้คลิ๊กทางเมาส์ขวา และ เลือก Properties (คุณสมบัติ) เพื่อปรับแต่งในขณะการออกแบบ (Design Time)
- ก็ลองปรับแต่งเล่นดูเอาเองแล้วกันน่ะครับ ... แต่ว่าในการใช้งานสถานะการณ์จริงๆแล้ว เราควรใช้วิธีสั่งงานแบบ Run Time (ก็เขียนโค้ดขึ้นมาบังคับนั่นแหละครับ) มันจะเกิดความยืดหยุ่นกว่ากันเป็นไหนๆ
ไม่ว่าจะเป็น VB6/VB.NET โปรแกรมเมอร์รุ่นใหม่ๆ จึงติดกับดัก หลุมพราง ตามคำโฆษณาชวนเชื่อ เพียงเพราะคำกล่าวอ้างว่ามันใช้งานง่าย แค่จับลากๆ มาวาง ปรับแต่งแบบ Design Time ก็เป็นอันเสร็จพิธี ... เหอๆๆๆๆ
- Run Time
เริ่มต้นกระบวนการทำงาน
Private Sub Form_Load()
Me.Move (Screen.Width - Width) \ 2, (Screen.Height - Height) \ 2
' เปิดฐานข้อมูล ... กรุณาทำเพียงแค่ครั้งเดียวในฟอร์มหลักก็พอครับ
Call OpenDataBase
' ให้เริ่มต้นการแสดงผลด้วย Bar Graph
' ไปที่เหตุการณ์ในการเลือกว่าจะกราฟแบบแท่ง หรือ เส้น นั่นแหละครับ ... พี่น้อง
' 0 = แบบแท่ง, 1 = แบบเส้น
Call optGraph_Click(0)
End Sub
' โปรแกรมย่อยในการเลือกแสดงผลของกราฟ
Private Sub optGraph_Click(Index As Integer)
Dim sRow As Integer
' Option ในการแต่งแต้มสีสัน ... ลองเล่นๆดูน่ะครับ มันมีเยอะมาก เลยยกมาให้ดูพอประมาณ
chtGraph.Plot.SeriesCollection(1).DataPoints(-1).Brush.Style = VtBrushStyleSolid
chtGraph.Plot.SeriesCollection(1).DataPoints(-1).Brush.Index = VtBrushPatternBoldDownDiagonal
chtGraph.Plot.SeriesCollection(1).DataPoints(-1).Brush.FillColor.Set 255, 53, 153
' เลือกรูปแบบของการแสดงผล
With chtGraph
' กำหนดรูปแบบของ Chart ให้เป็นแบบผสม (Combination)
.chartType = VtChChartType2dCombination
'.chartType = VtChChartType2dBar
'.chartType = VtChChartType3dBar
Select Case Index
Case 0 ' แบบแท่ง
.SeriesType = VtChSeriesType2dBar
'.SeriesType = VtChSeriesType3dBar
Case 1 ' แบบเส้น
.SeriesType = VtChSeriesType2dLine
'.SeriesType = VtChSeriesType3dBar
End Select
End With
Set RS = New Recordset
Statement = "SELECT * FROM tbl_HR_Evaluate ORDER BY EmployeePK "
RS.CursorLocation = adUseClient
RS.Open Statement, ConnDB, adOpenForwardOnly, , adCmdText
With chtGraph
'
' กำหนดจำนวนข้อมูลในแนวแกน X (นั่นคือ รหัสพนักงานแต่ละคน)
.ColumnCount = 1
' กำหนดจำนวนข้อมูลในการแสดงผล หรือ ก็คือค่าคะแนนของพนักงานแต่ละคน เรียงกันไป
' ในฐานข้อมูลตัวอย่างจะมี 20 รายการ
.RowCount = RS.RecordCount
' วนลูปเพื่อแสดงผลกราฟ (คะแนนของพนักงานแต่ละคน)
For sRow = 1 To RS.RecordCount
' เริ่มแสดงจำนวนแต่ละรายการ (คะแนนของพนักงานแต่ละคน)
.Row = sRow
.RowLabel = RS("EmployeeCode")
.Data = RS("Point")
RS.MoveNext
Next
End With
'
RS.Close: Set RS = Nothing
End Sub
|
การทำกราฟออกรายงานด้วย Active Report 2.0 (Data Dynamics)
- จะเห็นได้ว่าสมรรถนะของ Active Report สามารถเพิ่มเติม ActiveX ของค่ายอื่นๆเข้าไปได้อย่างไม่ยากเย็น นี่แหละคือมนต์เสน่ห์ Product ของค่าย Data Dynamics ... ซึ่งสามารถตอบสนองต่อการใช้งานของผมได้เป็นอย่างดีทีเดียว ... ผมรัก AR จังเลย ... 55555+
ขอโม้อีกหน่อย ... โค้ดตัวอย่างที่พี่น้องได้เห็นต่อไปนี้ ... ไม่มีที่ใดในโลกน่ะครับ ผมต้องใช้เวลาลูบๆคลำๆตั้งนานกว่าจะเจอ ... แต่เอามาเปิดเผยให้พี่น้องได้ศึกษากันอย่างง่ายๆ และ ฟรีๆ ... ก็กรุณาคลิ๊กโฆษณาให้บ้างซิครับ ... หากผมน้อยใจเดี๋ยวหัวล้าน เอ๊ย เดี๋ยวไม่ให้โค้ดอีกต่อไปซ่ะหรอก ... แหง่มๆๆๆๆๆ ... แค่คำว่าขอบคุณนี่ยังหายากเลย ... คนเรา
กระบวนการทำงาน
' ===========================================
' โค้ดนี้จะอยู่ที่ฟอร์มหลัก frmGraphDB
' โดยการคลิ๊กเลือกจากเมนู ...
Private Sub mnuGraphReport_Click()
' เปิดฟอร์มรายงาน
frmGraphReport.Show vbModal
End Sub
' ===========================================
' ===========================================
' โค้ดนี้จะอยู่ที่ฟอร์มรอง frmGraphReport
Sub ReportGraph()
Set RS = New Recordset
Statement = "SELECT * FROM tbl_HR_Evaluate ORDER BY EmployeePK "
RS.CursorLocation = adUseClient
RS.Open Statement, ConnDB, adOpenForwardOnly, , adCmdText
' ส่งรายงานไปที่ Active Report
Set rptPrint = New arGraphReport
Set Me.ARViewerGraph.object = rptPrint
' ผูกตารางข้อมูลที่ได้จากการ Query ให้กับรายงาน
rptPrint.dcRptData.Recordset = RS
End Sub
' ===========================================
' ===========================================
' โค้ดนี้จะอยู่ที่ Active Report Designer
Private Sub ActiveReport_Initialize()
PageSettings.Orientation = ddOPortrait ' กำหนดแนวตั้ง
PageSettings.PaperSize = 9 ' กระดาษ A4
PageSettings.LeftMargin = 300
PageSettings.RightMargin = 300
PageSettings.BottomMargin = 100
PageSettings.TopMargin = 100
End Sub
' โค้ดนี้จะคล้ายๆกันกับฟอร์มหลัก (frmGraphDB)
' หลักการก็ง่ายๆ ... ผูกตาราง RS เข้ากับ ADO ที่อยู่ใน AR Designer (dcRptData)
' จากนั้นมันก็จุดเทียนเวียนวน จนหมดข้อมูล ... นั่นเอง ... อิอิอิอิอิ ง่ายจังวุ้ย ...
Private Sub Detail_Format()
Dim sRow As Integer
With chtGraph
' เลือกรูปแบบของการแสดงผล
' เราไม่ต้องส่งค่าตัวแปรแบบ Global ข้ามฟอร์มมาครับ
' แต่ให้อ้างถึงฟอร์ม ตามด้วย Object หรือ Control ที่ต้องการมาเลย ... อิอิอิอิอิ
' นั่นคือ frmGraphDB.optGraph(0).Value
If frmGraphDB.optGraph(0).Value Then
.SeriesType = VtChSeriesType2dBar
Else
.SeriesType = VtChSeriesType2dLine
End If
.chartType = VtChChartType2dCombination
.ColumnCount = 1
.RowCount = RS.RecordCount
' วนลูปเพื่อแสดงผลกราฟ
For sRow = 1 To RS.RecordCount
' เริ่มแสดงจำนวนแต่ละรายการ
.Row = sRow
.RowLabel = RS("EmployeeCode")
.Data = RS("Point")
RS.MoveNext
Next
End With
'
RS.Close: Set RS = Nothing
End Sub
' ===========================================
|
หลายต่อหลายคนสอบถามผมมาเยอะนักว่า ทำไมผมถึงไม่ยอมไปสอน หรือ ถ่ายทอดความรู้ให้กับน้องๆตามสถาบันการศึกษา เหตุผลดังนี้ คือ ... ผมมันคนไม่ค่อยจะได้ทำอะไรผิดๆมากนัก จึงเป็น "ครู" ไม่ได้ ... อ้าวววว ... ก็โบราณท่านว่าไว้ไงครับ ... ผิดเป็นครู ....ไงล่ะ ... ผมก็เลยเป็นครูไม่ได้ ... 55555+
|