• Thứ Ba, 22/07/2008 10:20 (GMT+7)

    Lập trình ghép dữ liệu 3 bảng trong MS Access 2000

    Câu hỏi :
    Có 3 bảng cùng cấu trúc, cùng tên là HOSO nhưng nằm ở 3 File khác nhau: data1.mdb, data2.mdb, data3.mdb (MSAccess2000), xin hướng dẫn viết code cho 1 nút lệnh trong form để ghép dữ liệu của 3 bảng đó vào 1 bảng chung là HOSOCHUNG nằm ở file datachung.mdb.
     

    Trả lời :

    Nếu bạn biết lập trình bằng ngôn ngữ VBA và biết dùng các đối tượng ADO để truy xuất database thì việc viết code để ghép dữ liệu từ 3 table trong 3 file database khác nhau thành 1 table chung là không khó. Sau đây chúng tôi xin trình bày qui trình điển hình để giải quyết bài toán của bạn:

     1. Giả sử bạn đã có 3 file data1.mdb, data2.mdb, data3.mdb, mỗi file chứa table Hoso có cùng cấu trúc nhưng dữ liệu khác nhau. Chạy Access, tạo 1 file database trống tên là datachung.mdb (chọn menu File.New.Blank database, đặt tên là datachung.mdb).

     2. Đóng project datachung.mdb lại, mở file data1.mdb sẵn có.

     3. Chọn mục Form trong cửa sổ Objects, ấn kép chuột vào mục “Create Form in Design View” để mở cửa sổ thiết kế 1 form ứng dụng mới. Sau đó thiết kế Form có 1 button tên là btnGhep.

     4. Nhấn phải chuột vào button "Ghep du lieu" rồi chọn option "Build Event" để hiển thị cửa sổ "Choose Builder", chọn mục Code Builder và button OK để mở cửa sổ soạn code. Tạo thủ tục xử lý sự kiện click chuột cho button này có tên là btnGhep_Click(). Khi cửa sổ soạn code của Form hiển thị, bạn hãy nhập đoạn lệnh VB 6.0 sau đây vào:
     
     Option Compare Database
     Private Sub btnGhep_Click()
     'khai báo các biến cần dùng
     Dim Connection1 As New ADODB.Connection
     Dim RecordSet1 As New ADODB.RecordSet
     Dim Connection2 As New ADODB.Connection
     Dim Command2 As New ADODB.Command
     Dim RecordSet2 As New ADODB.RecordSet
     Dim strSQL As String
     Dim dbPath As String
     Dim fstart As Integer
     dbPath = "c:\YourDatabase\"
     'Tạo connection tới database data1.mdb
     Connection1.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
     "Data Source=" & dbPath & "data1.mdb;"
     'Tạo recordset chứa các record của table nguồn
     RecordSet1.Open "Hoso", Connection1, adOpenStatic, adCmdTable
     'Tạo connection tới database chứa kết quả
     Connection2.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
     "Data Source=" & dbPath & "data1.mdb;"
     Command2.ActiveConnection = Connection2
     'xóa table Hoso nếu đã có rồi
     strSQL = "drop table Hoso"
     Command2.CommandText = strSQL
     On Error Resume Next
     Command2.Execute
     'xây dựng SQL tạo Table kết quả
     strSQL = "CREATE TABLE Hoso " & "("
     'duyệt tìm từng field của table nguồn
     fstart = 1
     strBuf = "Text"
     For Each fld In RecordSet1.Fields
     'tìm tên và kiểu của field
     Select Case fld.Type
     Case 2
     strBuf = "Integer"
     Case 3
     strBuf = "Integer"
     Case 5
     strBuf = "Currency"
     Case 6
     strBuf = "Double"
     Case 11
     strBuf = "Logical"
     Case 202
     strBuf = "Text"
     Case 135
     strBuf = "Date"
     Case 129
     strBuf = "Text"
     Case 201
     strBuf = "Text"
     Case 131
     strBuf = "Integer"
     Case 133
     strBuf = "Date"
     Case Else
     MsgBox "Type với mã " & fld.Type & " chưa được xử lý!!!"
     End Select
     If fstart Then
     strSQL = strSQL & fld.Name & " " & strBuf
     fstart = 0
     Else
     strSQL = strSQL & ", " & fld.Name & " " & strBuf
     End If
     Next fld
     strSQL = strSQL & ")"
     'Tạo table trên database kết quả
     Command2.CommandText = strSQL
     Command2.Execute
     'Thiết lập recordset chứa các record của table kết quả
     RecordSet2.Open "Hoso", Connection2, adOpenKeyset, adLockOptimistic, adCmdTable
     'copy dữ liệu từ data1.mdb sang datachung.mdb
     While Not RecordSet1.EOF
     'xây dựng SQL INSERT record hiện hành
     RecordSet2.AddNew
     For i = 0 To RecordSet1.Fields.Count - 1
     'copy nội dung của field
     RecordSet2.Fields(i).Value = RecordSet1.Fields(i).Value
     Next i
     RecordSet2.Update
     RecordSet1.MoveNext
     Wend
     'đóng các đối tượng đã dùng lại
     RecordSet1.Close
     Connection1.Close
     'Tạo connection tới database data1.mdb
     Connection1.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
     "Data Source=" & dbPath & "data2.mdb;"
     'Tạo recordset chứa các record của table nguồn
     RecordSet1.Open "Hoso", Connection1, adOpenStatic, adLockReadOnly, adCmdTable
     'copy dữ liệu từ data2.mdb sang datachung.mdb
     While Not RecordSet1.EOF
     'xây dựng SQL INSERT record hiện hành
     RecordSet2.AddNew
     For i = 0 To RecordSet1.Fields.Count - 1
     'copy nội dung của field
     RecordSet2.Fields(i).Value = RecordSet1.Fields(i).Value
     Next i
     RecordSet2.Update
     RecordSet1.MoveNext
     Wend
     'đóng các đối tượng đã dùng lại
     RecordSet1.Close
     Connection1.Close
     'Tạo connection tới database data1.mdb
     Connection1.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
     "Data Source=" & dbPath & "data3.mdb;"
     'Tạo recordset chua cac data cua table nguon
     RecordSet1.Open "Hoso", Connection1, adOpenStatic, adLockReadOnly, adCmdTable
     'copy dữ liệu từ data3.mdb sang datachung.mdb
     While Not RecordSet1.EOF
     'xây dựng SQL INSERT record hiện hành
     RecordSet2.AddNew
     For i = 0 To RecordSet1.Fields.Count - 1
     'copy nội dung của field
     RecordSet2.Fields(i).Value = RecordSet1.Fields(i).Value
     Next i
     RecordSet2.Update
     RecordSet1.MoveNext
     Wend
     'đóng các đối tượng đã dùng lại
     RecordSet1.Close
     Connection1.Close
     RecordSet2.Close
     Connection2.Close
     End Sub
     
     5. Đóng cửa sổ thiết lập Form lại, đặt tên cho cửa sổ để dễ nhận dạng, rồi nhấn đúp chuột vào form trong cửa sổ chọn Form của Access để chạy thử Form.
     Bạn có thể liên hệ với tòa soạn TGVT để copy file Access data1.mdb chứa code VBA được trình bày ở phần trả lời này.
     

    Chuyên mục: Lập trình