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

หรือติดต่อเข้ามาทาง 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 3 5 7 7 3 9

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

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

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

Category »  VB 6/VB.Net
โดย : Webmaster เมื่อ 2/2/2550 13:56:00
(อ่าน : 26161) 

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

ข้อแนะนำ: กรุณาอ่านบทความของผมอย่างมีสติ แล้วคุณจะรู้ด้วยตัวของคุณเองว่า "มันไม่ได้ยากเย็นอย่างที่คิด" เพียงแต่ "คนที่เคยนำทางให้คุณ เขาพาคุณเดินไปผิดทาง" ...

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

ผลที่ได้จากภาคนี้

ก่อนอื่นนั้น ในภาคนี้จะมีการเพิ่มตารางฐานข้อมูลใหม่ขึ้นมา เพื่อที่ท่านจะได้ทำการศึกษา การสร้างความสัมพันธ์ของตารางข้อมูล และ เปรียบเทียบผลการทำงานผ่าน Combo Box ไปพร้อมๆกัน

การสร้างความสัมพันธ์ของตารางข้อมูล

การสร้างความสัมพันธ์ของตารางข้อมูล
ดาวน์โหลด Source Code สำหรับ MS Visual Basic 6.0 - Service Pack 6

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

การออกแบบฟอร์มหลัก - Design Time

ภาคนี้เป็นการนำข้อมูลเพื่อนำมาแสดงผลในตารางกริด (MS FlexGrid) พร้อมกับทำการค้นหาข้อมูลด้วยน่ะครับ

' Module (แบบหากินครับพี่น้อง) จะถูกบันทึกไว้เป็นนามสกุล .BAS
Option Explicit

Global ConnMyDB As New ADODB.Connection
Global RS As New ADODB.Recordset
Global DS As New ADODB.Recordset
Global Statement As String
'
' ใช้ตรวจสอบว่าเป็นการเพิ่มข้อมูล หรือ แก้ไขข้อมูล
Global blnNewData As Boolean
' หากมีการปรับปรุง (Update) ข้อมูล ให้ส่งมาบอกฟอร์มหลัก (ตารางกริด) เพื่อที่จะได้ทำการปรับปรุงการแสดงผลข้อมูลด้วย
Global FormUpdate As Boolean
' การหาตำแหน่งไฟล์ข้อมูลให้มันถูกต้อง ... อ่านเพิ่มเติม ... ที่นี่
Public Sub OpenDataBase()
On Error GoTo Err_Handler
Dim DB_File As String
    DB_File = App.Path
    If Right$(DB_File, 1) <> "\" Then DB_File = DB_File & "\"
    DB_File = DB_File & "MyDB.MDB"
    ' Open a connection.
    Set ConnMyDB = New ADODB.Connection
    ConnMyDB.ConnectionString = _
        "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=" & DB_File & ";" & _
        "Persist Security Info=False"
    ConnMyDB.Open
    Exit Sub
Err_Handler:
    MsgBox "Error : " & Err.Number & " " & Err.Description
    End
End Sub

Public Sub CloseDataBase()
    ' ตรวจสอบว่ามีการเปิดใช้งานไฟล์ฐานข้อมูลหรือไม่
    If ConnMyDB.State = adStateOpen Then
        ConnMyDB.Close
        Set ConnMyDB = Nothing
    End If
End Sub

' ฟังค์ชั่นที่ใช้ตรวจสอบการกดคีย์ เพื่อรับค่าเฉพาะตัวเลขอย่างเดียว ... นำไปดัดแปลงการรับค่าตัวอื่นๆได้อีกน่ะครับผม
Function CheckDigitOnly(Index As Integer) As Integer
    Select Case Index
        Case 48 To 57 ' เลข 0 - 9
        Case 8            ' Back Space
        Case 13         ' Enter
        Case Else
            Index = 0
    End Select
    CheckDigitOnly = Index
End Function
				

ทีนี้ก็มาดูฟอร์มหลักกันบ้างล่ะครับ อนึ่งอย่าพึ่งไปให้ความสนใจกับเรื่องของฟอร์ม MDI เลยครับ เรามาว่ากันเนื้อๆหลักๆในการเรียนรู้เบื้องต้นนี้กันก่อนจะดีกว่า จากนั้นก็ค่อยๆไปลองปรับเปลี่ยนแก้ไขกันต่อไปครับ ... พี่น้อง

Option Explicit

Private Sub Form_Load()
    lblDescription.Caption = "โปรแกรมตัวอย่างการพัฒนาระบบฐานข้อมูลด้วย MS Visual Basic 6.0 - www.g2gnet.com"
    Me.Move (Screen.Width - Width) \ 2, (Screen.Height - Height) \ 2 ' ให้ฟอร์มแสดงผลตรงกึ่งกลาง
    OpenDataBase
    txtSearch.Text = ""
    '
    Call SetupFgCustomer  ' เรียกใช้งานโปรแกรมย่อย เพื่อเคลียร์ค่าต่างๆใน MS FlexGrid
    Call DisplayFgCustomer  ' นำข้อมูลลูกค้ามาแสดงผลลงในตารางกริด (MS FlexGrid)
End Sub

Sub SetupFgCustomer()
    With fgCustomer
        .Clear
        .FixedRows = 1
        .FixedCols = 0
        .SelectionMode = flexSelectionByRow
        
        .Cols = 5
        .Rows = 1
        .TextMatrix(0, 0) = "CustomerID"
        .TextMatrix(0, 1) = "ลำดับที่"
        .TextMatrix(0, 2) = "รหัสลูกค้า"
        .TextMatrix(0, 3) = "ชื่อ"
        .TextMatrix(0, 4) = "นามสกุล"
        
        .ColAlignment(2) = vbLeftJustify
        
        .ColWidth(0) = 0
        .ColWidth(1) = 600
        .ColWidth(2) = 1400
        .ColWidth(3) = 2200
        .ColWidth(4) = 2200
    End With
End Sub

Sub DisplayFgCustomer()
Dim CountRec As Long, item As Long
Set RS = New ADODB.Recordset
' สร้างความสัมพันธ์ระหว่างตาราง tblCustomer (ลูกค้า) กับ tblTitle (คำนำหน้า)
' คุณสามารถใช้งานจาก MS Access ได้เลยครับ จากนั้นให้คัดลอก SQL Statement มา ไม่ต้องเสียเวลาไปจดจำคำสั่งให้เมื่อยตุ้ม ...
Statement = "SELECT tblCustomer.*, tblTitle.TitleName " & _
                        " FROM tblCustomer INNER JOIN tblTitle ON tblCustomer.TitleID = tblTitle.TitleID " & _
                        " ORDER BY CustomerID"
RS.CursorLocation = adUseClient
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

fgCustomer.Rows = CountRec + 1
RS.MoveFirst
item = 1
Do Until RS.EOF
    With fgCustomer
        .TextMatrix(item, 0) = RS("CustomerID")
        .TextMatrix(item, 1) = item
        .TextMatrix(item, 2) = Right$("0000000" & RS("CustomerID"), 7)
        If RS("TitleName") <> "-" Then
            .TextMatrix(item, 3) = "" & RS("TitleName") & RS("Firstname")
        Else
            .TextMatrix(item, 3) = "" & RS("Firstname")
        End If
        .TextMatrix(item, 4) = "" & RS("Lastname")
    End With
    item = item + 1
    RS.MoveNext
Loop

RS.Close
Set RS = Nothing
End Sub
				

ต่อไปก็เป็นโมดูลของการค้นหา (Search)

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

การค้นหาข้อมูล
Private Sub txtSearch_KeyDown(KeyCode As Integer, Shift As Integer)    
    If KeyCode = vbKeyDown Then SendKeys "{TAB}"
    If KeyCode = vbKeyUp Then SendKeys "+{TAB}"
End Sub

Private Sub txtSearch_KeyPress(KeyAscii As Integer)
    If KeyAscii = vbKeyReturn Then
        KeyAscii = 0  ' ปิดเสียงการกดปุ่ม Enter ไม่ให้รำคาญหูผู้ใช้งานขอรับ
        Call cmdSearch_Click  ' หากป้อนข้อมูลที่ต้องการค้นหาแล้วกด Enter ในช่อง TextBox ก็ให้ทำการค้นหาได้เลย
    End If
End Sub

Private Sub cmdSearch_Click()
' ทดสอบว่ามีการป้อนข้อมูลที่ต้องการค้นหาหรือไม่ หากไม่ให้ออกจากโปรแกรมย่อยไปซ่ะ ... ไม่เสียเวลา
If txtSearch.Text = "" Or Len(Trim(txtSearch.Text)) = 0 Then
    txtSearch.SetFocus
    Exit Sub
End If

Dim CountRec As Long, item As Long
Set RS = New ADODB.Recordset
Statement = "SELECT tblCustomer.*, tblTitle.TitleName " & _
                        " FROM tblCustomer INNER JOIN tblTitle ON tblCustomer.TitleID = tblTitle.TitleID " & _
                        " WHERE " & _
                            " [FirstName] " & " Like '%" & Trim(txtSearch.Text) & "%'" & " OR " & _
                            " [LastName] " & " Like '%" & Trim(txtSearch.Text) & "%'" & " OR " & _
                            " [TitleName] " & " Like '%" & Trim(txtSearch.Text) & "%'" & _
                            " ORDER BY CustomerID "

' โมดูลนี้ซ้ำกันกับที่ใช้ในการแสดงผล (DisplsyfgCustomer) ... 
' กรุณาคิดเป็นการบ้าน โดยแก้ไขให้เป็นโปรแกรมย่อย หรือ ฟังค์ชั่น (จะดีกว่า) ด้วยน่ะครับ
RS.CursorLocation = adUseClient
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

fgCustomer.Rows = CountRec + 1
RS.MoveFirst
item = 1
Do Until RS.EOF
    With fgCustomer
        .TextMatrix(item, 0) = RS("CustomerID")
        .TextMatrix(item, 1) = item
        .TextMatrix(item, 2) = Right$("0000000" & RS("CustomerID"), 7)
        If RS("TitleName") <> "-" Then
            .TextMatrix(item, 3) = "" & RS("TitleName") & RS("Firstname")
        Else
            .TextMatrix(item, 3) = "" & RS("Firstname")
        End If
        .TextMatrix(item, 4) = "" & RS("Lastname")
    End With
    item = item + 1
    RS.MoveNext
Loop

RS.Close
Set RS = Nothing
End Sub
		

เมื่อทำการค้นหาเรียบร้อยแล้ว หากต้องการแสดงผลในตารางกริดใหม่ทั้งหมด ก็เพียงแค่กดปุ่ม Refresh นั่นก็คือการเรียกโปรแกรมย่อยมาทำงานซ้ำเฉยๆ แค่เนี้ยเองแหละครับ ... พี่น้อง

Private Sub cmdRefresh_Click()
    txtSearch.Text = ""
    Call SetupFgCustomer
    Call DisplayFgCustomer
End Sub
		

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