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

หรือติดต่อเข้ามาทาง 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 1 2 8 4 4 7

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

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

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

Category »  VB 6/VB.Net
โดย : Webmaster เมื่อ 6/4/2551 17:17:00
(อ่าน : 25587) 
อย่างที่ได้กราบเรียนมิตรรักแฟนคลับสาวก VB6 ไปแล้วครับ ... การศึกษาพัฒนาโปรแกรมคอมพิวเตอร์นั้น มันเป็นทั้ง "ศาสตร์และศิลป์" คือ มันต้องมีไอเดีย หรือ เรื่องของจินตนาการ เข้ามามีส่วนเกี่ยวข้องด้วย เหมือนอย่างเรื่องของตารางกริดที่ผมเคยกล่าวมาก่อนหน้านี้ (กลับไปอ่านใหม่ ... ที่นี่) สำหรับ MS FlexGrid ท่านทั้งหลายก็ทราบกันดีอยู่แล้วว่า มันไม่สามารถป้อนข้อมูลเข้าไปใน Cell ของตารางกริดได้เลย มันทำได้ก็แค่นำข้อมูลเข้ามาแสดงผลเป็นหลักเท่านั้นเอง อนึ่ง แม้ว่าผมจะเป็นคนยึดถือหลักธรรมอยู่ในจิตใจ และไม่มีอะไรมาคล้องคอ ... แต่ผมก็มีมนต์วิเศษที่จะเสกให้ MS FlexGrid สามารถป้อนข้อมูลเข้าไปเก็บไว้ใน Cell ที่กำหนดเอาไว้ได้ ... โอมมมม สุรา โซดา น้ำแข็ง จงมาลงแก้ว ณ บัดเดี๋ยวนี้ ...โอมเพี้ยง ...
    ลองดูหน้้าตา หน้าจอ และ แนวคิดในการออกแบบ

    Design - Time


    แนวคิดในการออกแบบ


    เมื่อสั่ง Run-Time ให้แสดงผล เพื่อให้ทำการแก้ไข และบันทึกข้อมูลได้


    การเชื่อมความสัมพันธ์ของตาราง 2 ตาราง

ดาวน์โหลด Source Code สำหรับ MS Visual Basic 6.0 - Service Pack 6
 ดาวน์โหลด Visual Basic 6.0 SP5: Run-Time Redistribution Pack
 ดาวน์โหลด Microsoft Data Access Object (MDAC) และ Jet 4.0 Update
 ดาวน์โหลด Microsoft Visual Basic Service Pack 6

Private Sub cmdSave_Click()
Dim i As Integer
    If txtCurrency.Visible = True Then txtCurrency.Visible = False
    
    ' เริ่มจุดเทียนเวียนวนตามจำนวนแถวของ MS FlexGrid - 1 (ลบออก 1 แถว คือ Column Header)
    For i = 1 To fg.Rows - 1
        Set RS = New ADODB.Recordset
        ' โปรดสังเกตว่าเราจะทำการบันทึกข้อมูลเฉพาะราคาสินค้า (PriceUnit) เท่านั้นเองน่ะครับ
        ' และที่สำคัญ Primary Key (PK) ที่ถูกซ่อนเอาไว้ จะถูกนำออกมาใช้แล้ว ... แอ่นแอ้นนนนนน
        ' ทีนี้พ่อแม่พี่น้องที่เคารพ ... ได้มองเห็นภาพ Primary Key ที่แท้จริงกันแล้วหรือไม่ล่ะครับ
        Statement = "SELECT tblProduct.PK, tblProduct.PriceUnit FROM tblProduct " & _
                                " WHERE [PK] = " & Val(fg.TextMatrix(i, 0))
        ConnMyDB.CursorLocation = adUseClient
        RS.Open Statement, ConnMyDB, adOpenKeyset, adLockOptimistic, adCmdText
        ' ป้องกันค่าว่าง ... ต้องทำการตรวจสอบก่อน
        If Trim(fg.TextMatrix(i, 3) = "") Or Len(Trim(fg.TextMatrix(i, 3))) = 0 Then fg.TextMatrix(i, 3) = "0.00"
        
        RS("PriceUnit") = Format(fg.TextMatrix(i, 3), "#,##0.00")
        RS.Update
    Next
    MsgBox "บันทึกข้อมูลเรียบร้อย", vbOKOnly + vbInformation, "รายงานสถานะ"
End Sub

Private Sub fg_EnterCell() ' พิจารณาจากเหตุการณ์ (Event) ในการ Focus ตรงตำแหน่งใน Cell
    Select Case fg.Col ' เลือก Column ที่ต้องการ
        Case 0, 1, 2, 4 ' เราไม่ได้ป้อนข้อมูลในหลักที่ 0, 1, 2  และ 4
            txtCurrency.Visible = False ' จึงต้องสั่งให้ปิดการมองเห็น txtCurrency
    
        Case 3: ' โอเค ถูกต้อง Cell ที่กำลัง Focus มาอยู่หลักที่ 3 ก็เริ่มต้นกระบวนการทำงานได้
            txtCurrency.Visible = True ' เปิดให้ txtCurrency มองเห็นได้
            txtCurrency.Text = fg.Text ' ค่าเดิมที่อยู่ใน Cell จะถูกส่งต่อไปให้ txtCurrency เพื่อทำการแก้ไขต่อไป
    
            ' ขั้นตอนนี้คือการเลื่อนตำแหน่งของ txtCurrency ให้ไปทับอยู่บนตำแหน่งของ Cell (หลักที่กำหนด) ตามที่เราต้องการ
            ' การเคลื่อนที่ โดย fg.Move ตำแหน่งทางซ้าย, ตำแหน่งบน, ความกว้างของเซลล์, ความสูงของเซลล์
            txtCurrency.Move (fg.Left + fg.CellLeft), (fg.Top + fg.CellTop), fg.CellWidth, fg.CellHeight
    
            ' เมื่อ txtCurrency เคลื่อนที่ไปทับตำแหน่ง Cell ที่เราต้องการแล้ว
            ' ให้ Focus ไปที่ txtCurrency เพื่อที่จะสามารถแก้ไขข้อมูลลงใน TextBox ได้
            txtCurrency.SetFocus
    End Select
End Sub

Private Sub Form_Load()
Dim sRow As Integer
    Me.Move (Screen.Width - Me.Width) \ 2, (Screen.Height - Me.Height) \ 2

    txtCurrency.Text = "" ' เคลียร์ค่าใน TextBox
    Call SetupGrid ' สั่งตั้งค่า FlexGrid
    Call OpenDataBase
    
    Set RS = New ADODB.Recordset
    ' ขอยกตัวอย่างการเชื่อมความสัมพันธ์ระหว่างตาราง tblProduct (สินค้า) เข้ากับ ตาราง tblUnit (หน่วยนับ)
    Statement = "SELECT tblProduct.PK, tblProduct.ProductCode, tblProduct.Description, " & _
                            " tblProduct.PriceUnit, tblUnit.UnitName " & _
                            " FROM tblUnit INNER JOIN tblProduct ON tblUnit.PK = tblProduct.UnitFK " & _
                            " ORDER BY tblProduct.PK "
    ConnMyDB.CursorLocation = adUseClient
    RS.Open Statement, ConnMyDB, adOpenKeyset, adLockOptimistic, adCmdText
    ' กำหนดจำนวนแถวของ MS FlexGrid ไว้ล่วงหน้า ตามจำนวนรายการ + 1
    fg.Rows = RS.RecordCount + 1
    sRow = 1
    RS.MoveFirst
    Do Until RS.EOF
        With fg
            .TextMatrix(sRow, 0) = RS("PK")
            .TextMatrix(sRow, 1) = "" & Trim(RS("ProductCode"))
            .TextMatrix(sRow, 2) = "" & Trim(RS("Description"))
            .TextMatrix(sRow, 3) = Format(RS("PriceUnit"), "#,##0.00")
            .TextMatrix(sRow, 4) = "" & Trim(RS("UnitName"))
        End With
        RS.MoveNext
        sRow = sRow + 1
    Loop
    RS.Close:   Set RS = Nothing
End Sub

Sub SetupGrid() ' ตั้งค่าต่างๆของ FlexGrid
With fg
    .Clear ' สั่ง Clear FlexGrid
    .Cols = 5 ' การกำหนดในรูปแบบของ Run Time ฮับผม
    ' ===============================================================
    ' หลักแรก หรือ หลัก 0 ต้องซ่อนค่า Primary Key เอาไว้ ไม่ให้ผู้ใช้งานเห็น ... เดี๋ยวผู้ใช้งานสับสน
    ' แต่ค่านี้แหละสำคัญ ... ซึ่งเราต้องนำไปอ้างอิงตอนทำการบันทึกข้อมูล
    ' ความลับมันไม่มีอยู่ในโลก ... ผมจึงเปิดเผยออกมา ... อิอิอิอิอิ ... โปรดให้อภัยผมด้วยน่ะครับพี่น้อง
    .TextMatrix(0, 0) = "PK"
    ' ===============================================================
    .TextMatrix(0, 1) = "รหัสสินค้า"
    .TextMatrix(0, 2) = "สินค้า"
    .TextMatrix(0, 3) = "ราคา"
    .TextMatrix(0, 4) = "หน่วย"
    .ColWidth(0) = 0
    .ColWidth(1) = .Width \ 4 - 600
    .ColWidth(2) = .Width \ 4 + 1600
    .ColWidth(3) = .Width \ 4 - 600
End With
End Sub

Private Sub txtCurrency_Change()
    ' เมื่อ txtCurrency เกิดการเปลี่ยนแปลง ก็จะส่งค่าให้กับ Cell ที่เราต้องการด้วย
    ' แต่ ณ ขณะนี้เรายังมองไม่เห็นหรอกครับ เพราะ txtCurrency มันทับ Cell ไว้อยู่
    fg.Text = Format(txtCurrency.Text, "#,##0.00")
End Sub

Private Sub txtCurrency_GotFocus()
    ' ผมไม่ต้องการให้มีเครื่องหมายคอมม่า (,) มาปรากฏ ซึ่งมันจะยากต่อการควบคุมโปรแกรม
    ' ดังนั้นเมื่อ txtCurrency รับการ Focus จึงต้องแก้ไขรูปแบบการแสดงผลใหม่
    txtCurrency.Text = Format(txtCurrency.Text, "0.00")
End Sub

Private Sub txtCurrency_KeyDown(KeyCode As Integer, Shift As Integer)
    If KeyCode = vbKeyDown Or KeyCode = vbKeyUp Then
        txtCurrency.Visible = False
        fg.SetFocus
    End If
End Sub

Private Sub txtCurrency_KeyPress(KeyAscii As Integer)
    If KeyAscii = vbKeyReturn Then
        Select Case fg.Col
            Case 3
                KeyAscii = 0 ' ปิดเสียง
                txtCurrency.Visible = False
                ' ป้องกันค่าว่าง ... ต้องทำการตรวจสอบก่อน
                If Trim(txtCurrency.Text) = "" Or Len(Trim(txtCurrency.Text)) = 0 Then txtCurrency.Text = "0.00"
                fg.SetFocus
        End Select
    Else
        ' ต้องส่งค่าไปทดสอบในฟังค์ชั่น CheckCurrency ก่อนว่ามีการกดปุ่มจุด . แล้วหรือยัง
        KeyAscii = CheckCurrency(KeyAscii, txtCurrency)
    End If
End Sub

Private Sub cmdExit_Click()
    Call CloseDataBase
    Set frmFlexGridCustom = Nothing
    End
End Sub

' ฟังค์ชั่นที่ใช้ในการตรวจสอบการกดเครื่องหมายจุด . 
Function CheckCurrency(Index As Integer, Ctrl As TextBox) As Integer
    Select Case Index
        Case 48 To 57
            ' 0 - 9 and Return index = KeyAscii
        Case 8
            ' Back Space and Return index = KeyAscii
        Case 13
            ' Enter and Return index = KeyAscii
        Case 46 ' รหัส Ascii Code  ของเครื่องหมายจุดครับพี่น้อง
            If InStr(Ctrl, ".") Then Index = 0 ' ใช้ฟังค์ชั่น InStr (In String) เพื่อหาเครื่องหมายจุดใน TextBox
        Case Else
            Index = 0
    End Select
    CheckCurrency = Index ' Return ค่ากลับตามที่ได้ตรวจสอบ
End Function
Conclusion:
แต่ช้าก่อนเถิดญาติโยมทั้งหลาย ... บางคนอาจจะมองว่าเป็นเรื่องไร้สาระ เสียเวลาเปล่าๆ ... แต่พี่น้องครับ หากคิดคำนึงกันให้ดีๆ นี่แหละคือ "พื้นฐาน" ที่ท่านจะสามารถนำไป "ต่อ-ยอด" กับเหล่าบรรดา ActiveX ของ Third Party ที่ผลิตตารางกริดออกมาให้พวกเราได้ใช้งานกัน เช่น VSFlexGrid (ค่าย ComponentOne), GridEX, CiaTheCo หรือ SharpGrid (ตัวสุดจ๊าบที่ผมใช้งานในปัจจุบัน) ซึ่งหากพี่น้องกะว่าจะใช้งานเอาแบบง่ายๆ คือ จับมาลากใส่ๆ แค่นั้นก็จบ ... คิดผิดคิดใหม่กันได้เลยครับ การควบคุม ActiveX เหล่านี้ (ในปัจจุบัน) พี่น้องจำเป็นจะต้องใช้การสั่งแบบ Run-Time เท่านั้นแหละ โปรแกรมมันถึงจะทำงานได้อย่างมีประสิทธิภาพพอ ผมจึงได้นำเอา Control ง่ายๆ ที่ติดมาพร้อมกับ Visual Basic 6.0 มาให้พี่น้องได้พิจารณากัน เพราะว่าพวก Properties, Method หรือ Events ต่างๆ มันค่อนข้างจะง่ายๆ บ้านๆ ตามฟอร์มอีกแล้ว ... 55555+
จี ทู จี เน็ต ดอต คอม - g2gNet Dot Com
เลขทะเบียนพาณิชย์อิเล็กทรอนิกส์ 0407314800231
CopyLeft © 2004 - 2099 g2gNet.Com All rights reserved.
Email: [email protected] หรือ โทร. 08-6862-6560