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

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

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

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

การอ่านข้อมูลแบบ Text File เข้าสู่ MS Access ด้วย MS Visual Basic 6.0 ภาคแรก

Category »  VB 6/VB.Net
โดย : Webmaster เมื่อ 30/3/2551 5:05:00
(อ่าน : 20750) 
อันที่จริงแล้วเรื่องของ Text File ที่จัดเก็บข้อมูลคล้ายๆกับ DataBase นี่ ในปัจจุบันก็ยังใช้งานกันอย่างมากมายเหมือนกันน่ะครับ ... พี่น้อง ... โปรแกรมสำเร็จรูปหลายๆตัวก็ยังมักจะส่งออกไฟล์ (Export) ให้อยู่ในรูปแบบของ Text File เสมอ ปกติที่ผมพบน่ะ ก็มักจะมีตัวแยกข้อมูลในแต่ละฟิลด์ออกเป็นเครื่องหมาย Semi-Colon (;) Comma (,) Space (Chr(32)) หรือ ไม่งั้นก็ TAB ซ่ะเป็นส่วนใหญ่ ซึ่งเจตนาของเหล่าบรรดาผู้ผลิตก็มักจะให้นำข้อมูลเข้าไปที่ MS Excel ซ่ะมากกว่า เพื่อให้ผู้ใช้งาน (End User) ได้นำไปประมวลผลงานอื่นๆตามที่ต้องการต่อไป ... บทความนี้จึงใคร่ขอนำเสนอเป็นแนวทางให้กับเหล่าบรรดาโปรแกรมมั่วมั่ง เดามั่ง ลอกเพื่อนมั่ง ... 55555+ ... ได้ศึกษาเรียนรู้กันต่อจากตอนที่แล้วครับผม
Reference
Project --> References ... --> Microsoft ActiveX Data Objects 2.8 Library

Design Time
ข้อมูลจาก Text File จะมีการแยกฟิลด์ออกจากกันด้วยช่องว่าง (Space)

Run Time
ดังนั้นเราจึงต้องออกแบบฟิลด์ในตารางข้อมูลให้สัมพันธ์กัน
จากตัวอย่างผมจะเพิ่มฟิลด์ Primary Key (PK) เข้ามาด้วย และแน่นอนครับ ... ไม่ใช่ Autonumber
ผมจะมีฟังค์ชั่นที่ใช้ในการคำนวณหาค่า Primary Key เพื่อไม่ให้ซ้ำกันได้อยู่แล้วครับ ... พี่น้อง
ดาวน์โหลด 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

Option Explicit
Dim Conn As ADODB.Connection
Dim RS As ADODB.Recordset
Dim DS As ADODB.Recordset
Dim Statement As String
Dim SQLStmt As String

Private Sub cmdReadText_Click()
Dim CountRec As Long
Dim StrData As String
Dim iRow, i As Long
Dim iArr As Variant
Dim StrTemp As String
    
Set Conn = New ADODB.Connection
Set RS = New ADODB.Recordset
    
    ' รูปแบบการเชื่อมต่อแหล่งข้อมูล (Data Source) ของ Text File
    Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
           "Data Source=" & App.Path & ";" & _
           "Extended Properties=""text;HDR=NO;FMT=Delimited;"";"
    
    RS.Open "SELECT * FROM [Jan-2008#txt]", Conn, adOpenStatic, _
                        adLockReadOnly, adCmdText
    CountRec = RS.RecordCount
    ' ใช้งานมันเป็นที่เรียบร้อยแล้ว ก็ปิดการเชื่อมต่อมันซ่ะ
    RS.Close:    Set RS = Nothing
    Conn.Close: Set Conn = Nothing
    
    ' ตั้งค่าให้กับ MS Flex Grid
    With fgData
        .Clear
        ' จำนวน 4 หลัก
        .Cols = 4
        ' กำหนดจำนวนแถว (Rows) ตามจำนวนรายการข้อมูลที่มีอยู่ทั้งหมด
        ' ให้เพิ่มจำนวนแถวขึ้นอีก 1 เนื่องจากมี Column Header อยู่อีก 1 แถวแล้ว
        .Rows = CountRec + 1
        
        .ColWidth(0) = 1200
        
        ' กำหนดค่าให้กับแถวแรก หรือ Column Header
        .TextMatrix(0, 0) = "ลำดับที่"
        .TextMatrix(0, 1) = "รหัสพนักงาน"
        .TextMatrix(0, 2) = "วันที่เข้า/ออก"
        .TextMatrix(0, 3) = "เวลาเข้า/ออก"
    End With
    
    ' เปิดข้อมูล Text File
    Open App.Path & "\Jan-2008.txt" For Input As #1
    
    ' เริ่มเปิดการเชื่อมต่อไฟล์ฐานข้อมูลใหม่ ... ก็ดึงตัวแปร Object เดิมแหละมาใช้งาน
    Set Conn = New ADODB.Connection
    Conn.ConnectionString = _
        "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=" & App.Path & "\Attendance.mdb;" & _
        "Persist Security Info=False"
    Conn.Open
    
    iRow = 1    ' ให้เริ่มต้นแสดงผลข้อมูลจากแถวที่ 1 (แถวแรกน่ะคือ แถว 0 น่ะครับ ... พี่น้อง)
    
    ' ต้องเริ่มการวนรอบตามจำนวนของข้อมูล
    Do While iRow <= CountRec
        ' อ่านข้อมูลเข้ามาทีละบรรทัด
        Line Input #1, StrData
        StrTemp = Trim(StrData)
        ' แยกชุดตัวอักษรออกจากกันด้วยคำสั่ง Split
        ' โดยใช้เครื่องหมายช่องว่าง (Space) ในการจับแยกชุดตัวอักษร
        iArr = Split(StrTemp, " ")
        
        ' เริ่มต้นการบันทึกข้อมูล
        ' ผูกเข้ากับ RecordSet
        Set RS = New ADODB.Recordset
        Statement = "SELECT * FROM tblAttendance ORDER BY PK "
        RS.Open Statement, Conn, adOpenKeyset, adLockOptimistic, adCmdText
        ' ลองเปลี่ยนไปใช้ INSERT ดูเองน่ะ หากพี่น้องถนัด
        ' ส่วนผมชอบแบบนี้ ... มันอ่านโค้ดได้ง่ายกว่าครับ ...
        RS.AddNew
        ' ต้องตรวจสอบหาค่า Primary Key ก่อน โดยเรียกผ่านฟังค์ชั่น CheckPK
        ' จากนั้นต้องส่งค่าแบบ Long Integer กลับมาเป็นค่า Primary Key ด้วย
        RS("PK") = CheckPK("tblAttendance", "PK")
        RS("EmployeeID") = "" & iArr(0)
        RS("JobDate") = "" & FormatDateTime(iArr(1), vbShortDate)
        RS("JobTime") = "" & FormatDateTime(iArr(2), vbShortTime)
        RS.Update
        
        ' แสดงผลใน MS FlexGrid ไปด้วยเลย
        fgData.TextMatrix(iRow, 0) = iRow
        fgData.TextMatrix(iRow, 1) = iArr(0)
        fgData.TextMatrix(iRow, 2) = iArr(1)
        fgData.TextMatrix(iRow, 3) = iArr(2)
        
        iRow = iRow + 1
    Loop
    MsgBox "บันทึกข้อมูลเรียบร้อย."
    ' ปิด Text File
    Close #1
    
    ' ใช้งานมันเป็นที่เรียบร้อยแล้ว ก็ปิดการเชื่อมต่อมันซ่ะ
    RS.Close:    Set RS = Nothing
    Conn.Close: Set Conn = Nothing
    
End Sub

' ====================================================================================
Function CheckPK(tblName As String, tblPK As String) As Long
' เมื่อ tblName คือ ชื่อของตารางข้อมูล
' และ tblPK คือ ชื่อฟิลด์ของ Primary Key ในตารางข้อมูล
' ====================================================================================
Dim Rec As Long
' สังเกตน่ะครับว่าผมใช้ RecordSet ตัวสำรอง ไม่ใช่ตัวหลัก ... ต้องระวังให้ดีด้วย
' เพราะตัวหลัก (RS) กำลังจะทำการบันทึกข้อมูลอยู่ ณ ขณะนี้
Set DS = New Recordset
    ' นำข้อมูลจากตารางมาคำนวณหาจำนวนทั้งหมด
    SQLStmt = "SELECT * FROM " & tblName & " ORDER BY " & tblPK
    DS.Open SQLStmt, Conn, adOpenForwardOnly, adLockOptimistic, adCmdText
    Rec = 0
    
    If DS.BOF Or DS.EOF Then    ' แสดงว่าไม่มีข้อมูลอยู่เลย
        Rec = 0
    Else
        ' การใช้ MoveLast ต้องระวังไว้อยู่อย่าง คือ ต้องจัดเรียงข้อมูลให้ดีน่ะครับ
        DS.MoveLast
        Rec = DS(tblPK)
    End If
    Rec = Rec + 1   ' เพิ่มจำนวน Primary Key ขึ้นอีก 1 เพื่อไม่ให้ซ้ำกัน
    
    ' ส่งค่ากลับไปเลยครับผม
    CheckPK = Rec
    DS.Close: Set DS = Nothing
End Function

Private Sub Form_Load()
    Me.Move (Screen.Width - Me.Width) \ 2, (Screen.Height - Me.Height) \ 2
End Sub

Private Sub cmdExit_Click()
    Set frmReadText2MDB = Nothing
    End
End Sub
Conclusion:
จากตอนนี้ปัญหาที่เราจะพบก็คือ ขาดการทดสอบว่ามีข้อมูลเดิมอยู่ในตารางข้อมูลแล้วหรือไม่ ... เพราะลักษณะแบบนี้ มันไม่สนใจเลย จะทำการบันทึกผลลงตารางข้อมูลเข้าไปอย่างเดียวเท่านั้น ดังนั้นแล้ว ... พี่น้อง ... เอาไว้รอบหน้าครับ ผมจะนำเสนอทั้งการเปิดไฟล์ไม่ว่าจะอยู่ตำแหน่งใดๆก็ตามที และ การตรวจสอบข้อมูลดังที่ได้กล่าวเอาไว้
จี ทู จี เน็ต ดอต คอม - g2gNet Dot Com
เลขทะเบียนพาณิชย์อิเล็กทรอนิกส์ 0407314800231
CopyLeft © 2004 - 2099 g2gNet.Com All rights reserved.
Email: [email protected] หรือ โทร. 08-6862-6560