หากมีคำถาม ขอให้ไปโพสต์ลง เว็บบอร์ดจีทูจีเน็ตดอตคอม ตัวใหม่แทนน่ะครับ

หรือติดต่อเข้ามาทาง Inbox ที่ เฟซบุ๊ค ผมครับ

หน้าหลัก
ข่าวสาร - บทความ ทั้งหมด
VB 6/VB.Net
ASP/ASP.Net
จับฉ่ายคอมพิวเตอร์
เรียนรู้ผ่าน Flash Movie
บทความที่มีผู้ตอบล่าสุด  
 RSS Feeds
 ดาวน์โหลดโปรแกรม RSS Reader ได้ที่นี่ ...   Download โปรแกรม RSS Reader

Forum - www.g2gnet.com
Webmaster - www.g2gnet.com
Visitors - Session views
 5 5 3 5 9 1 0

7 ธันวาคม พ.ศ.2549
166 Users On-Line.
Visitors - Page views
 8 8 8 5 6 9 8
1 กุมภาพันธ์ พ.ศ.2551

Google   
เว็บ g2gnet.com
ขนาดตัวอักษร:  

เรียนรู้ Visual Basic 6.0 กับ ฐานข้อมูล MS Access ภาค 4

Category »  VB 6/VB.Net
โดย : Webmaster เมื่อ 9/11/2549 14:19:00
(อ่าน : 64533) 

 

สำหรับภาคนี้ ผมจะพาท่านไปพบกับการนำข้อมูลจากตารางข้อมูลมาแสดงผลใน MS FlexGrid Control 6.0

แบบว่าเบื่อๆ และ งงๆ ด้วยครับ ... ทำไมในตำราส่วนใหญ่ (จริงๆ) ไหงชื่นชอบเหลือเกิน(ไป) กับการให้เหล่าบรรดามือใหม่ (รวมทั้งผมด้วยเมื่อ 10 ปีที่แล้ว) มาหัดเรียนรู้ Visual Basic VS DataBase พอมาเปิดดูเล่มไหน และทีไร ก็มีแต่จะสอนให้เลื่อนตำแหน่งของข้อมูล (Record) แบบ First  Previous  Next  Last แบบว่าเป็นปุ่มให้เดินหน้า ถอยหลังน่ะครับ หรือจะบอกว่ามันเป็น "พื้นฐาน" แล้วค่อยไปพัฒนาต่อออกไป ไอ้ตัวกระผมก็งง (จริงๆ) เพราะมันนำไปใช้งานจริงไม่ได้เลย อ้าว ... งั้นลองมาดูสไตล์ของทองก้อนกันมั่ง ... แล้วค่อยมาต่อว่า (ด่า) กัน ... หุหุหุ


ผลลัพธ์ที่ได้จากภาคนี้

เป็นไงบ้างครับ เริ่มดูดีมีชาติตระกูลขึ้นมาอีกโขเลยมั้ย อิอิอิ ... จากภาคเสริมเกี่ยวกับเรื่อง ตารางกริด ธรรมดา ที่ไม่ธรรมดา หากยังไม่ได้อ่านก็ลองคลิ๊กเข้าไปอ่านดูก่อนน่ะครับกระผม เพราะภาคนี้ท่านต้องเลือกเอา Component มาเสริมเข้าไปอีก 1 ตัวครับ นั่นคือ Microsoft FlexGrid Control 6.0 จากนั้นก็ออกแบบตามภาพด้านล่างนี้แล้วกัน


หน้าตาการออกแบบ

 

' ปรับแต่ง และ ตั้งค่าที่จำเป็นให้กับ MS FlexGrid ก่อน
Sub SetupFgCustomer()
' แบบว่าสไตล์ Run-Time ครับ สำหรับมือใหม่ท่านต้องลองเข้าไปปรับคุณสมบัติ (Properties) แบบ Design-Time ดูเล่นกันก่อนน่ะครับ
' พอทำความเข้าใจกับมันบ้างสักเล็กน้อย แล้วก็ลองหันมาเล่นแบบ Run-Time ดูน่ะครับ เพราะในลักษณะนี้มันยืดหยุ่นกว่า (จริงๆ) ครับพี่น้อง
With fgCustomer
    .Clear ' เคลียร์ค่าต่างๆใน MS FlexGrid
    .FixedRows = 1 ' กำหนดให้มี Header (เช่น ชื่อ นามสกุล) อยู่ 1 แถว
    .FixedCols = 0 ' ด้านซ้ายมือสุด ไม่ต้องการให้มีคำอธิบาย เหมือนส่วนหัวครับ
    .SelectionMode = flexSelectionByRow ' เลือกให้แสดงแถบแสงบนแถวยาวไปทั้งหมดเลย

    .Cols = 5 ' คำนวณไว้แล้วล่วงหน้าครับว่า ต้องการให้มีจำนวน 5 หลัก
    .Rows = 1 ' จำนวนแถวให้มีแค่ 1 ก็พอ มีเพียงตรง Header นั่นไงครับ
    ' ใส่ Header ให้มันหน่อย เราจะได้รู้ว่าในแต่ละหลักมันคืออะไร
    .TextMatrix(0, 0) = "CustomerID" ' รหัสลูกค้า
    .TextMatrix(0, 1) = "ลำดับที่" ' ไว้แสดงลำดับที่
    .TextMatrix(0, 2) = "รหัสลูกค้า"
    .TextMatrix(0, 3) = "ชื่อลูกค้า"
    .TextMatrix(0, 4) = "นามสกุล"

    .ColAlignment(2) = vbLeftJustify ' แบบว่าปรับให้แสดงผลชิดด้านซ้ายครับ

' สำหรับ Col(0) นี่มันเป็นเทคนิคอย่างหนึ่งครับ ซึ่งผมกำหนดความกว้างของ Column นี้เป็น 0 (คือไม่ให้แสดงผล) เอาไว้ซ่อนค่า Primary Key ในที่นี้ก็คือ CustomerID ซึ่งตัวนี้แหละจะเป็นกลไกสำคัญที่เราจะนำมันไปแสดงผลครับ
    .ColWidth(0) = 0 
    .ColWidth(1) = 600
    .ColWidth(2) = 1400
    .ColWidth(3) = 2200
    .ColWidth(4) = 2200
End With
End Sub

' ส่วนนี้คือการนำข้อมูลจากตารางที่ต้องการ มาแสดงผลลงใน MS FlexGrid
Sub DisplayFgCustomer()
Dim CountRec As Long, item As Long ' ประกาศตัวแปร
Set RS = New ADODB.Recordset

' เราไม่จำเป็นต้องไปเรียกตาราง tblProvince ออกมาด้วย เพราะไม่ได้นำเอารายชื่อจังหวัดมาแสดงผลนี่ครับผม (อีกอย่าง ... ง่ายดี อิอิอิ)
Statement = "SELECT * FROM tblCustomer ORDER BY CustomerID"
RS.CursorLocation = adUseClient
RS.Open Statement, ConnMyDB, adOpenForwardOnly, adLockReadOnly, adCmdText
CountRec = RS.RecordCount ' นับจำนวน Record ทั้งหมด แล้วนำไปฝากไว้ที่ตัวแปร CountRec
If CountRec <= 0 Then ' ทดสอบว่ามีข้อมูลอยู่สักกะตัวหรือไม่ ?
    ' ส่งข้อความบอกผู้ใช้งานหน่อยแล้วกัน
    MsgBox "ยังไม่มีข้อมูลอยู่ในระบบน่ะจ๊ะ.", vbOKOnly + vbExclamation, "รายงานสถานะ"
    ' ปิดการเชื่อมต่อกับตารางข้อมูลซ่ะ และก็ให้ออกจากโปรแกรมย่อยนี้ไปโลด ...
    RS.Close
    Set RS = Nothing
    Exit Sub
End If

' กรณีมีข้อมูลอยู่แล้ว ก็ให้บวกค่า CountRec เพิ่มขึ้นอีก 1 เพราะว่ามันมี Header อยู่ด้วยอีก 1 แถวซิจ๊ะ ... พี่น้อง โปรดอย่าลืม
fgCustomer.Rows = CountRec + 1
RS.MoveFirst ' อ้าว ... ไปตั้งหลักที่จุดเริ่มต้นของฐานข้อมูล ... เพื่อความแน่ใจว่ามันไม่เลื่อนตำแหน่งไปที่อื่น
item = 1 ' กำหนดให้เป็นตัวนับแถว และ ลำดับที่
Do Until RS.EOF ' ทำไปจนกระทั่งมันหมดข้อมูล อย่าลืม ... กรณีของ Until มันจะวนลูปไปเรื่อยๆ ตราบใดที่ค่าทดสอบเป็น "เท็จ" เมื่อเป็น "จริง" เมื่อไรมันจะออกจากลูป จะตรงกันข้ามกับ Do While น่ะครับ
    With fgCustomer
        .TextMatrix(item, 0) = RS("CustomerID") เริ่มต้น: แถวที่ 1 และ หลักที่ 0 (ไอ้ตัวนี้แหละ ที่ผมเอาไปซ่อน)
        .TextMatrix(item, 1) = item ' ลำดับที่ครับผม ไว้ Show Step เฉยๆนี่แหละ

        ' นี่ก็ไว้ Show Step อีกน้านแหละ ก็ให้มันดูดีมีชาติตระกูลกันสักกะหน่อยน่ะ
        .TextMatrix(item, 2) = Right$("0000000" & RS("CustomerID"), 7)
        .TextMatrix(item, 3) = "" & RS("Firstname")
        .TextMatrix(item, 4) = "" & RS("Lastname")
        End With
    item = item + 1 ' เพิ่มค่าขึ้นอีก 1 ครับผม
    RS.MoveNext
Loop

' ปิดการเชื่อมต่อกับตารางข้อมูล
RS.Close
Set RS = Nothing
End Sub

' โปรแกรมย่อยตัวนี้ก็เหมือนกับในภาคที่ 3 ครับ แต่ต้องปรับแต่งนิดหน่อยคือต้องมีการส่งค่า Argument (CustomerID) มาให้โปรแกรมย่อยตัวนี้
Sub RecordToScreen(ID As Long) ' ID จะเป็นตัวแปรเพื่อรับค่า CustomerID เข้ามา
Set RS = New Recordset
' อย่าแปลกใจครับ สำหรับโปรแกรมย่อยตัวนี้ที่ผมไม่มีการ Trap Error ไว้เลย ก็เพราะมันต้องมีค่าจริงๆของ CustomerID จากตาราง MS FlexGrid ส่งมาให้แน่นอนอยู่แล้วครับ
Statement = "SELECT tblCustomer.*, tblProvince.ProvinceName " & _
    " FROM tblCustomer INNER JOIN tblProvince ON tblCustomer.ProvinceID = tblProvince.ProvinceID " & _
    " WHERE [CustomerID] = "
& ID ' ค่านี้ก็คือค่า CustomerID นั่นเอง


' ให้มันแสดงผลเฉยๆนี่ เราสั่งให้มันอ่านอย่างเดียว (Read Only) มันจะทำงานได้เร็วกว่าครับ (Optimized)
RS.Open Statement, ConnMyDB, adOpenForwardOnly, , adCmdText

' นี่ก็ไว้ Show Step อีกน้านแหละ ...
txtCustomerID.Text = Right$("0000000" & RS("CustomerID"), 7)
' นำข้อมูลจากฟิลด์ที่ต้องการมาแสดงผลครับผม
txtFirstname.Text = "" & RS("Firstname")
txtLastname.Text = "" & RS("Lastname")
txtAddress.Text = "" & RS("Address")
txtAmphur.Text = "" & RS("Amphur")
cmbProvince.Text = RS("ProvinceName")
txtAmphur.Text = "" & RS("Amphur")
txtPostCode.Text = "" & RS("PostCode")

' อย่าลืม ... ต้องปิดการเชื่อมต่อกะตารางข้อมูลเสมอ เมื่อใช้งานเรียบร้อยแล้ว พร้อมกับคืนค่าให้กับหน่วยความจำหลักไปซ่ะ
RS.Close
Set RS = Nothing
End Sub

' เรื่องของ Events/Driven

' เหตุการณ์ (Event) สำมะคัญครับ มันคือเกิดการกดดับเบิ้ลคลิ๊กเมาส์ แล้วเราจะให้มันไปทำอะไร (Driven)
Private Sub fgCustomer_DblClick()
    ' มันจะชี้ที่หลัก 0 เราก็รู้นี่ว่ามันคือค่า CustomerID เพื่อส่งค่าไปให้โปรแกรมย่อย RecordToScreen ส่วนแถวนั้นก็คือส่วนที่มัน Focus อยู่แล้วครับ
    Call RecordToScreen(Val(fgCustomer.Text))
End Sub

' นอกจากจากกดดับเบิ้ลคลิ๊กเมาส์แล้ว ก็ต้องมีเหตุการณ์ (พื้นฐาน) นั่นคือการกดแป้นพิมพ์ด้วย
Private Sub fgCustomer_KeyPress(KeyAscii As Integer)
    ' ทดสอบว่ากด Enter (vbKeyReturn) หรือไม่ ถ้าใช่ก็ให้ส่งค่าไปให้โปรแกรมย่อย RecordToScreen เหมือนกัน
    If KeyAscii = vbKeyReturn Then Call RecordToScreen(Val(fgCustomer.Text))
End Sub

' สำหรับฟอร์มหลัก ก็ต้องปรับกันใหม่อีกสักหน่อยน่ะครับ
Private Sub Form_Load()
    OpenDataBase

    Call SetupScreen ' Clear การแสดงผลให้แสดงข้อความว่างเปล่า
    Call DisplayProvince ' โหลดรายชื่อจังหวัดเข้าไปใน ComboBox
    Call SetupFgCustomer ' ตั้งค่าใน MS FlexGrid
    Call DisplayFgCustomer ' นำข้อมูลจากตารางมาแสดงผลลงใน MS FlexGrid
End Sub

' ส่วนของปุ่มปิดโปรแกรม
Private Sub cmdExit_Click()
    CloseDataBase' ตัดการติดต่อ (Connection) กับไฟล์ข้อมูล โปรแกรมย่อยตัวนี้จะเก็บไว้ใน Module ที่มีนามสกุล BAS หากไม่ทราบก็ กลับไปอ่านภาค 3 ด้วยน่ะครับ
    End
End Sub

 

บทสรุป

ผมคิดว่าท่านที่ได้เข้ามาอ่าน และ มีความสนใจใน Visual Basic เป็นทุนเดิมอยู่แล้ว คงพอที่จะมองภาพการออกแบบงานในลักษณะนี้ได้บ้างน่ะครับ อันที่จริงเหล่าบรรดาสาวก ลูกศิษย์ ของผม แทบจะทั้งนั้น คือ อึ้ง ทึ่ง เสียว เอ๊ย คนละเรื่อง อิอิอิ ... ไหงมันง่ายจัง อันที่จริงแล้ว สิ่งที่ผมนำมาถ่ายทอดให้ได้รับรู้กันนี้ เป็นเพราะว่าตลอด 10 กว่าปีมานี้ มันมาจาก "Learning BY Doing" ขอรับกระผม ... ดังนั้นเวลาถ่ายทอดสิ่งที่รู้ออกมา มันก็เลยเป็นไปตามธรรมชาติ เพราะเอา "ของจริง" นั่นแหละออกมาเล่าสู่กันฟัง ...

 


จี ทู จี เน็ต ดอต คอม - g2gNet Dot Com
เลขทะเบียนพาณิชย์อิเล็กทรอนิกส์ 0407314800231
CopyLeft © 2004 - 2099 g2gNet.Com All rights reserved.
Email: [email protected] หรือ โทร. 08-6862-6560