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

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

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

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

การนำข้อมูลแสดงผลลงในตารางกริด ด้วยวิธีการเข้าถึงคุณสมบัติของตารางข้อมูล (ADO)

Category »  VB 6/VB.Net
โดย : Webmaster เมื่อ 8/3/2551 10:30:00
(อ่าน : 14598) 
หลายปีดีดัก ... ที่ผมได้รู้จักกับผู้ที่เริ่มต้นเรียนรู้ในการพัฒนาโปรแกรม ไม่ว่าจะมาจากการเรียนรู้ในระบบ ตามหลักสูตร ตามสถาบันสอนคอมพิวเตอร์ต่างๆ หรือ แม้แต่คนที่ฝึกฝนด้วยตัวเองก็ตามที สิ่งหนึ่งที่ผมสังเกตเห็นเลยก็คือว่า ชอบความง่ายๆ (แม้แต่เอกสาร ตำราของ .Net ในปัจจุบันนี้ ก็ยังออกมาอยู่ในรูปแบบเดิมๆ) ชอบจับโน่น ลากนี่มาใส่ ปรับแต่งคุณสมบัติแค่นั้นเป็นพอ ... แบบนี้มันเป็นการศึกษาเพื่อ ... "เรียนรู้ในการใช้งานโปรแกรม" หรือ "เรียนรู้เพื่อที่จะเขียนโปรแกรม" ... กันแน่ ผู้ที่พึ่งเริ่มต้นศึกษา ... รายไหนก็รายนั้นที่ไม่เคยใช้ Data Control มาก่อน ต่างก็ชื่นชอบกับวิธีจับลากๆมาใส่แค่นี้ก็เห็นข้อมูลได้แล้ว โอ้วววว ... Amazing VB จริงๆ แต่หารู้ไม่ว่า ... ไม่นานนักหรอกที่คุณจะพบกับทางตัน ... คือหากใช้หลักการนี้ไปพัฒนางานที่สลับซับซ้อนขึ้นน่ะ ... "ยากจริงๆ" ขอบอกครับขอบอก
บทความนี้ ... ผมจะนำเสนอการเรียกใช้งาน ADO โดยเข้าไปถึงยังคุณสมบัติของ Table โดยตรง เช่น Name หรือก็คือชื่อฟิลด์ (Field) และ Value มันก็คือ ค่าที่อยู่ในฟิลด์ที่เราระบุ นอกจากนี้ผมยังแทรกวิธีการคิด เอาไว้ให้เป็นระยะๆ หากพี่น้องเข้าใจในการทำงานของโค้ดแล้ว ก็ลองเขียนเป็นผังงาน หรือ Flow Chart ออกมาดูซิครับ ... จะได้เข้าใจในระบบกระบวนงาน Event/Driven ของ MS Visual Basic 6.0 ได้ดียิ่งขึ้น ... และขออนุญาตบอกกล่าวกับพี่น้องทั้งหลายได้เลยว่า ... นี่แหละคือจุดเริ่มต้นในงาน Visual Basic + DataBase ของผมเอง

การเลือกใช้งาน ADO 2.8 และ MS FlexGrid Component


Design Time


การเรียกใช้งานคุณสมบัติของตารางข้อมูลผ่านทาง ADO


การทำ Query เพื่อเชื่อมความสัมพันธ์ของตาราง และเลือกเฉพาะฟิลด์ข้อมูลที่เราต้องการเท่านั้น


การจัดลำดับเรียงกันไปสำหรับฟิลด์ข้อมูล


Run Time Program


ดาวน์โหลด 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

โค้ดอย่างง่าย

Option Explicit

Private Sub Form_Load()
' *****************************************************************************************
' ตัวแปรเชื่อมต่อกับแหล่งข้อมูล (Data Source)
Dim Conn As New ADODB.Connection

' เบื่อประกาศ Object ของค่าย RS แล้ว ... ลองเปลี่ยนเป็น GMM Grammy หน่อยล่ะกัน 55555
Dim GMM As New ADODB.Recordset

' ทำ Query เพื่อเชื่อมตารางข้อมูล
Dim SQLStmt As String
' กำหนดตำแหน่งของฐานข้อมูล (ให้มันถูกต้องหน่อย ... ไม่ใช่พอนำไปรันอีกเครื่องกลับรันไม่ออก เหอๆๆๆๆ)
Dim ApplicationDir As String

' ป้องกันปัญหาเรื่องของ Path ที่ไม่ใช่ Root Directory ... ควรนำออกมาใช้เสมอน่ะครับพี่น้อง
' 1. หากเป็น Root Directory เช่น C:\ ... สังเกตว่ามันจะมี Backslash ติดมาด้วย
' 2. หากไม่ใช่ Root Directory เช่น C:\ProjectVB ... มันก็จะไม่มี Backslash
' ดังนั้นในกรณีที่ 2 เราจึงต้องใส่เครื่องหมาย \ ต่อท้ายด้วยครับ ... พี่น้อง
If Not Right$(App.Path, 1) = "\" Then ApplicationDir = App.Path & "\"

Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ApplicationDir & "DataBase.mdb"
' เลือกจากตารางโดยตรงแบบไม่ต้องเชื่อมความสัมพันธ์ใดๆ
'SQLStmt = "SELECT * FROM tblEmployee "

' หรือทำ Query Statement เพื่อเชื่อมต่อความสัมพันธ์ของตาราง
SQLStmt = "SELECT tblEmployee.EmployeePK, tblEmployee.EmployeeID, tblEmployee.EmployeeName, " & _
                    " tblPosition.PositionName, tblDepartment.DepartmentName, tblEmployee.DateStart " & _
                    " FROM tblDepartment INNER JOIN (tblPosition INNER JOIN tblEmployee ON " & _
                    " tblPosition.PositionPK = tblEmployee.PositionFK) ON " & _
                    " tblDepartment.DepartmentPK = tblEmployee.DepartmentFK "
GMM.Open SQLStmt, Conn, adOpenKeyset, adLockOptimistic, adCmdText
' *****************************************************************************************

Dim sRow As Integer, sCol As Integer
    ' กำหนดแบบ Run Time
    ' กำหนด Colume Header เพื่อแสดงชื่อฟิลด์
    fg.FixedRows = 1
    ' ไม่ต้องมี Row Header ที่อยู่ทางด้านซ้าย
    fg.FixedCols = 0
    fg.SelectionMode = flexSelectionByRow   ' แสดงผลแบบแถบแสงตามแถว
    fg.AllowUserResizing = flexResizeColumns ' ให้ขยายความกว้างของแต่ละหลัก (Column) ได้
    ' และอื่นๆอีก ... ก็ลองเล่นดูครับ
    
    ' ตรวจสอบก่อนว่ามีข้อมูลอยู่หรือไม่ ...
    ' เงื่อนไขคือ GMM.EOF = False นั่นคือมีข้อมูลอยู่ครับ ... (หรือยังไม่หมดข้อมูล)
    ' เมื่อเจอเงื่อนไขกลับ Not False = True เมื่อเงื่อนไขเป็นจริง ก็ทำกระบวนการคำสั่งตามหลัง IF ... Then ได้
    If Not GMM.EOF Then
        ' ให้กำหนดจำนวนของแถวจากข้อมูลทั้งหมด (GMM.RecordCount) เพิ่มขึ้นอีก 1
        ' เพราะแถวแรกมันคือ Column Header ไงล่ะครับ
        fg.Rows = GMM.RecordCount + 1
        ' ส่วนหลักก็นับตามจำนวนของ Field ที่มีอยู่ ... เรากำหนดมาจาก SQLStmt หรือ Query Statement
        fg.Cols = GMM.Fields.Count
        
        ' เริ่มต้นการนำข้อมูลเข้าไปยัง MS FlexGrid
        ' แถวแรก (Column Header) คือ การนำชื่อฟิลด์มาแสดงผล
        ' GMM.Fields(sRow).Name ... Name ก็คือชื่อฟิลด์ ... มันจะถูกจัดเรียงตาม Table หรือ
        ' ฟิลด์ต่างๆที่กำหนดผ่านจาก Query
        For sRow = 0 To GMM.Fields.Count - 1
            fg.TextMatrix(0, sRow) = GMM.Fields(sRow).Name
        Next
        
        ' ให้ sRow เริ่มต้นที่ 1 ... เพราะเราจะเริ่มนำข้อมูลทั้งหมดที่มีอยู่ในตารางข้อมูลมาแสดงผล
        ' แถวถัดไปจาก Column Header
        sRow = 1
        
        ' ========================== เงื่อนไขการทำซ้ำ (Loop) =============================
        ' หรือ DO Until GMM.EOF ก็ได้น่ะครับพี่น้อง
        ' กรณีของ Do Until จะทำซ้ำ (Repeat) ก็ต่อเมื่อเงื่อนไขเป็น "เท็จ"
        ' กรณีของ Do While จะทำซ้ำ (Repeat) ก็ต่อเมื่อเงื่อนไขเป็น "จริง" ... แล้วทำไมมันกลับมี Not ?????
        ' พี่น้องทั้งหลายก็อย่าพึ่งไปรีบตีความหมายของ "Not แปลว่า ไม่อย่างเดียว" ซิครับ ... 55555
        ' เช่น ไม่เท็จ นั่นแหละ คือ "จริง"
        ' สมมุติว่า GMM.EOF = False ...นั่นก็แสดงว่ามันยังมีข้อมูลอยู่ในตาราง
        ' หากใช้ Do While ... บอกแล้วว่ามันทำซ้ำได้ก็ต่อเมื่อเงื่อนไขมันเป็นจริงเท่านั้น
        ' ดังนั้นเราจึงต้องใส่ Not ไว้ข้างหน้า เพื่อทำให้ Not GMM.EOF = True ไงล่ะครับ ... พี่น้อง
        Do While Not GMM.EOF
        
            ' Tips: การที่ผมใช้ For เพราะว่างานนี้มันมีค่าเริ่มต้น (Initialize) และ การเพิ่มค่าที่แน่นอนตายตัว (Increment)
            ' ข้อมูลที่แสดงผลจะเริ่มจาก แถวที่ 1 หลักที่ 0 ... sRow = 1, sCol = 0
            For sCol = 0 To GMM.Fields.Count - 1
                
                ' GMM.Fields(sCol).Value ... Value ก็คือ ข้อมูลที่อยู่ตามฟิลด์นั้นๆ
                ' Not IsNull หากมีค่าว่างเปล่า (ไม่ใช่ Space หรือ Chr(32) น่ะครับ) ก็เพื่อป้องกันการเกิดข้อผิดพลาดในกรณีที่ไม่มีข้อมูลใดๆ
                If Not IsNull(GMM.Fields(sCol).Value) Then
                    ' ตัวอย่าง ... ทดสอบว่ามีข้อมูลเป็นชนิดวันที่ (IsDate) หรือไม่
                    ' ดังนั้นในกรณีข้อมูลอื่นๆเราก็สามารถใช้เงื่อนไขทดสอบ แล้วนำมาแสดงผลตามรูปแบบที่เราต้องการได้
                    ' มันเหนือชั้นกว่าวิธีการลาก Control มาผูกติดไว้เป็นไหนๆล่ะครับ ... พี่น้อง
                    If IsDate(GMM.Fields(sCol).Value) Then
                        fg.TextMatrix(sRow, sCol) = Format(CDate(GMM.Fields(sCol).Value), "dd-mm-yyyy")
                    Else
                        fg.TextMatrix(sRow, sCol) = GMM.Fields(sCol).Value
                    End If
                End If
            
            Next
        ' เลื่อนแถวของ FlexGrid ขึ้นอีก 1
        sRow = sRow + 1
        ' เลื่อนตัวชี้ตำแหน่งข้อมูลขึ้นอีก ... รายการต่อไป
        GMM.MoveNext
        
        ' วนรอบจนกว่าจะหมดข้อมูล
        Loop
    End If
    
    ' ปิดการเชื่อมต่อแหล่งข้อมูลให้หมด
    GMM.Close:  Set GMM = Nothing
    Conn.Close:   Set Conn = Nothing
End Sub
Conclusion:
ผมไม่ยอมเสียเวลาไปศึกษาจากหนังสือ ที่จะต้องมาใช้กลวิธีในการเดินหน้า ถอยหลัง รายการแรก หรือ รายการสุดท้าย ให้ User ได้หงุดหงิดใจเป็นแน่แท้ ... ด้วยลักษณะของการออกแบบ และ ควบคุมโปรแกรมตามที่ได้แสดงมานี้ หากพี่น้องได้ไปดูบทความแรกๆของผม จะพบว่านี่แหละคือจุดเริ่มต้นในการพัฒนาการเขียนโปรแกรมด้วย MS Visual Basic ของผม ...
จี ทู จี เน็ต ดอต คอม - g2gNet Dot Com
เลขทะเบียนพาณิชย์อิเล็กทรอนิกส์ 0407314800231
CopyLeft © 2004 - 2099 g2gNet.Com All rights reserved.
Email: [email protected] หรือ โทร. 08-6862-6560