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

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

 

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

เป็นอย่างไรกันบ้างครับพี่น้อง จาก 3 ภาคหลัก และ 1 ภาคเสริม คงจะเห็นแล้วว่า Visual Basic & DataBase นั้น มันไม่ได้ยากเย็นเกินไปนักใช่มั้ยครับ ... พี่น้อง โดยปกติแล้วงานทางด้านนี้
    จะมีงานหลักๆ ดังต่อไปนี้
  1. เพิ่มข้อมูล
  2. แก้ไขข้อมูล
  3. ลบข้อมูล
  4. ค้นหาข้อมูล เพื่อนำมาแสดงผล ทำรายงาน และ แก้ไขต่อไป
และ
    Component ที่ผมนำใช้งานนั้น มันเป็นเพียงส่วนประกอบขั้นพื้นฐาน คือ
  1. Label - ป้ายชื่อ หรือ ป้ายประกาศ
  2. TextBox - ช่องกรอกข้อมูล
  3. Command Button - ปุ่มควบคุม
  4. ComboBox - รายการเลือก
  5. Frame - เฟรมเพื่อจัดกลุ่ม (ไม่จำเป็น)

และ เรียกมาใช้งานเสริมเพิ่มอีก 1 ตัว คือ MS FlexGrid Control เท่านั้นเอง

การค้นหาข้อมูล

เอาล่ะครับ ... จากภาค 4 นั้น หากเรามีข้อมูลที่มีปริมาณมากๆแล้ว ปัญหาใหญ่หลวงต่อมาก็คือความล่าช้าในการเข้าถึงข้อมูล ขืนมานั่งเลื่อนข้อมูลไปๆมาๆแล้วล่ะก็ ผู้ใช้งาน (End User) ที่ไหนเขาอยากจะใช้โปรแกรมที่เราเขียนขึ้นมาล่ะครับ ดังนั้นแล้ว "การค้นหาข้อมูล" จึงเป็นเรื่องที่สำคัญอีกประการหนึ่ง ในการนำข้อมูลเดิมมาทำการแก้ไข หรือ ตรวจสอบว่ามีรายชื่อลูกค้านี้แล้วหรือยัง ...



ภาพการค้นหาข้อมูล

เริ่มต้นด้วยการออกแบบ และ เพิ่ม Component เข้ามาใหม่

    Properties หรือ คุณสมบัติที่สำคัญแต่ละตัว มีดังนี้คือ (Design Time)
      ช่องกรอกข้อมูลที่ต้องการค้นหา - TextBox
    1. Name: txtSearch
    2. Text: txtSearch

      ปุ่มค้นหา - CommandButton
    1. Name: cmdSearch
    2. Style: 1 - Graphical (แสดงปุ่มแบบกราฟิค)

      ปุ่มแสดงข้อมูลทั้งหมด - CommandButton
    1. Name: cmdRefresh
    2. Style: 1 - Graphical (แสดงปุ่มแบบกราฟิค)
    3. Caption: แสดงข้อมูลทั้งหมด


การออกแบบ - Design Time

เริ่มต้นการโค้ดโปรแกรม

' Clear หน้าจอเพื่อทำการแสดงผล
Sub SetupScreen()
    txtCustomerID.Text = ""
    txtFirstname.Text = ""
    txtLastname.Text = ""
    txtAddress.Text = ""
    txtAmphur.Text = ""
    cmbProvince.Clear
    txtPostCode.Text = ""
    txtSearch.Text = "" ' เราเพิ่มเข้ามาใหม่ครับ
End Sub

' โปรแกรมย่อยตัวนี้ เพื่อแสดงรายการข้อมูลทั้งหมดเข้าสู่ MS FlexGrid
Private Sub cmdRefresh_Click()
    txtSearch.Text = "" ' Clear ค่าใน TextBox
    Call SetupFgCustomer ' ตั้งค่าต่างๆใน MS FlexGrid
    Call DisplayFgCustomer ' นำข้อมูลจากตาราง tblCustomer มาแสดงผล
End Sub

Events/Driven

' นี่ก็คือเหตุการณ์สำคัญ เมื่อป้อนข้อความที่ต้องการค้นหาแล้วกดปุ่ม CommandButton ที่ชื่อ cmdSearch เพื่อสั่งให้มันทำการค้นหาข้อมูล
' หากยังไม่เข้าใจ กรุณากลับไปอ่านดูในภาค 4 ด้วยครับ
Private Sub cmdSearch_Click()
If txtSearch.Text = "" Or Len(Trim(txtSearch.Text)) = 0 Then ' ไม่มีการป้อนอะไร ก็สั่งให้ออกจากโปรแกรมย่อยไปเลย
    txtSearch.SetFocus ' และให้ Focus ไปที่ช่องกรอกข้อความที่ต้องการจะค้นหาด้วย
    Exit Sub
End If

Dim CountRec As Long, item As Long ' ประกาศตัวแปร
Set RS = New ADODB.Recordset
' การค้นหาคำที่คล้าย - Like กับ ชื่อ (Firstname) หรือ นามสกุล (Lastname) ส่วนใหญ่ผู้ใช้งานเขา (หรือ เธอ) ก็จะค้นหาด้วยคีย์เหล่านี้ซ่ะเป็นส่วนใหญ่ครับพี่น้อง
Statement = "SELECT * FROM tblCustomer WHERE " & _
        " [FirstName] " & " Like '%" & Trim(txtSearch.Text) & "%'" & " OR " & _
        " [LastName] " & " Like '%" & Trim(txtSearch.Text) & "%'" & _
        " ORDER BY CustomerID "

RS.CursorLocation = adUseClient
' Read Only จะทำให้เข้าถึงข้อมูลได้เร็วกว่า
RS.Open Statement, ConnMyDB, adOpenForwardOnly, adLockReadOnly, adCmdText
CountRec = RS.RecordCount
' แสดงว่าการค้นหาไม่พบข้อมูล ก็แจ้งให้ผู้ใช้งานเขาทราบด้วยแล้วกัน
If CountRec <= 0 Then
    MsgBox "ไม่พบข้อมูลที่คุณต้องการค้นหา.", vbOKOnly + vbExclamation, "รายงานการค้นหา"
    ' ปิดการเชื่อมต่อตารางข้อมูล
    RS.Close
    Set RS = Nothing
    Exit Sub
End If

' จำนวนข้อมูลที่นับได้ให้เพิ่มจำนวนแถวทั้งหมดขึ้นไปอีก 1 เพราะเรามี Column Header อยู่อีก 1 แถวครับ
fgCustomer.Rows = CountRec + 1
RS.MoveFirst
item = 1
' นำข้อมูลมาแสดงผลลงในตาราง MS FlexGrid
Do Until RS.EOF
    With fgCustomer
        .TextMatrix(item, 0) = RS("CustomerID")
        .TextMatrix(item, 1) = item
        .TextMatrix(item, 2) = Right$("0000000" & RS("CustomerID"), 7)
        .TextMatrix(item, 3) = "" & RS("Firstname")
        .TextMatrix(item, 4) = "" & RS("Lastname")
    End With
    item = item + 1
    RS.MoveNext
Loop

RS.Close
Set RS = Nothing
End Sub

' Event นี้ เมื่อผู้ใช้งานกรอกข้อความที่จะค้นหา แล้วกดคีย์ Enter ทันที เพื่อความสะดวกเราจึงสั่งให้มันไปทำการค้นหาทันที
Private Sub txtSearch_KeyPress(KeyAscii As Integer)
    ' ไปโปรแกรมย่อยของปุ่ม CommandButton (cmdSearch_Click)
    If KeyAscii = vbKeyReturn Then Call cmdSearch_Click
End Sub
*** ส่วนการแสดงผล (RecordToScreen) หรือ อื่นๆ ก็จะเหมือนกับตอนที่แล้วน่ะครับผม กรุณากลับไปดูด้วยหากท่านยังไม่ได้เข้าไปอ่าน ***

 

เราจะเห็นได้ว่าโปรแกรมย่อย cmdSearch_Click() จะทำงานคล้ายๆกันกับ DisplayFgCustomer() ดังนี้นผมจึงใคร่อยากให้ท่านทั้งหลายลองแก้ไข โดยการทำให้เป็นโปรแกรมย่อย (Sub Program) ดูเอาเองแล้วกันครับ ก็ขอฝากเป็นการบ้านให้ลองคิดดูล่ะกันครับ ... พี่น้อง ในภาคต่อไปก็จะเป็นการบันทึกข้อมูล จากการสร้างใหม่ (AddNew) และ การแก้ไข (Edit) พร้อมๆกันทีเดียวเลยครับ