• Nối dữ liệu từ nhiều file Access??
  • RE: Nối dữ liệu từ nhiều file Access??

    tranthanhan1962 > 29-06-17, 11:31 AM

    Có lẽ do thói quen mình hay dùng Docmd.RunSQL do khỏi phải khai báo biến, lệnh lại ngắn gọn. Một thói quen nữa mình luôn luôn tắt action query access nên cũng không cần xử lý lệnh SetWarnings luôn. Thực ra nếu CSDL được phân tích kỹ, xác định rõ ràng  các kiểu dữ liệu của field, các bẩy lỗi nhập liệu chính xác để các dữ liệu luôn được minh bạch thì rất ít có, hoặc sẽ không có chuyện lỗi của action query.
  • RE: Nối dữ liệu từ nhiều file Access??

    DooHoaangPhuuc > 17-07-17, 12:16 AM

    1. Để tránh tự động tạo thêm record đầu tiên có các giá trị 0, ...0, trong các trường khi sử dụng append query có cần phải viết thêm lệnh hay vào table (ví dụ Table-DATA nêu trên) xoá theo manual.
    2. Khi thay đổi giá trị trong các Fields của các Table (DATA1, DATA2, DATA3 ....) , để cập nhật tự động giá trị các Field trong Table-DATA thay đổi theo mà không dùng query delete để xoá và Append query để ghi mới lại , như dạng chỉ copy để cập lại những thay đổi trên field của Table DATA. Vậy giải pháp tốt nhất là dùng lệnh về so sánh như thế nào.
  • RE: Nối dữ liệu từ nhiều file Access??

    tranthanhan1962 > 17-07-17, 08:44 AM

    Cũng có thể dùng relationships để nối các khóa chính giữa DATA và các table DATA1, DATA2, DATA3 ...tạo các update query đễ  cập nhật giá trị cho DATA. Nhưng nếu có phát sinh mới trên DATA1, DATA2, DATA3 thì những record đó không được ghi lên DATA. Chắc ăn nhất vẫn là delete, append
  • RE: Nối dữ liệu từ nhiều file Access??

    thdanh > 20-08-19, 11:30 AM

    Mấy bác cao thủ cho em hỏi ? 
    Như mình có table 1 có sẳn dữ liệu như mã hàng, tenhàng......
    và table 2 có field mã hàng, tenhàng, các trường khác tương tự như table 1
    Khi mình copy dữ liệu vào  table 2 thì mình làm thể nào mà mahang của table 2 dò tìmm trong table 1 nếu mahàng có trong table 1 thì sẽ copy gộp lại thành 1 table có sẳn là table 3 có bao gồm các trường của table 1 và 2.
  • RE: Nối dữ liệu từ nhiều file Access??

    Noname > 20-08-19, 05:55 PM

    (20-08-19, 11:30 AM)thdanh Đã viết: Mấy bác cao thủ cho em hỏi ? 
    Như mình có table 1 có sẳn dữ liệu như mã hàng, tenhàng......
    và table 2 có field mã hàng, tenhàng, các trường khác tương tự như table 1
    Khi mình copy dữ liệu vào  table 2 thì mình làm thể nào mà mahang của table 2 dò tìmm trong table 1 nếu mahàng có trong table 1 thì sẽ copy gộp lại thành 1 table có sẳn là table 3 có bao gồm các trường của table 1 và 2.

    Không có dữ liệu mẫu khó trả lời cho đúng với ý bạn. Để cụ thể hơn, bạn nên tách chủ đề này ra thành 1 chủ đề mới để tiện theo dõi. Khi post, nhớ kèm dữ link file dữ liệu mẫu để mọi người dễ trả lời và hình dung.
    Vì câu trả lời chung chung nên mình chỉ có thể trả lời thế này:
    - Bạn tạo 1 query Append, có table 1 & table 2 join lại với nhau, sau đó , append vào table 3. Như vậy table 3 sẽ có đủ thông tin của cả table 1 và 2 .
  • RE: Nối dữ liệu từ nhiều file Access??

    k2d_nh0k > 26-03-21, 04:53 PM

    (29-06-17, 01:26 AM)ongke0711 Đã viết: Nếu chỉ đơn giản là bạn muốn gộp 1 table nào đó (table "A") trong cái database thôi thì code như bên dưới. 
    - Code này tự động nối được nhiều trường trong table chứ không phải làm thủ công từng Field như code bạn đang làm.
       Vd: rs!ten = rs1.Fields("ten").Value  => Nếu table có mấy chục Field thì thêm cũng mệt nghỉ.
    - Không cần khai báo một đống biến rs1, rs2, rs3, con1, con2, con3.
    - Không lập lại các đoạn code Open Connection, Open Recordset giống nhau, chỉ khác tham số. Nếu gặp trường hợp cần nối 10 cái file .accdb thì code lập lại một chục lần, kéo trang mỏi tay luôn.

    - Code gồm 1 cái Function GetRecordset () để lấy Recordset từ 3 table ở 3 cái database Data1, 2, 3. Tránh việc lập lại code giống nhau cho cả 3 lần như bạn đang làm.
    - Gồm 1 Sub MergeTables () để gán trị của các trường trong table ở Database nguồn vào table ở database đích. Trong Sub này dùng 1 Collection để lần lượt loop qua các Database.

    Mã PHP:
    Option Explicit

    Dim DBFile 
    As Variant

    Private Sub gopFile_Click()
       MergeTables
    End Sub

    Private Sub MergeTables()

       Dim rsDest As New ADODB.Recordset
       Dim rsSource 
    As New ADODB.Recordset
       Dim fld 
    As ADODB.Field
       Dim DBFileList 
    As Collection

       Dim SourceTable 
    As String
       Dim DestTable 
    As String

       Set DBFileList 
    = New Collection
       DBFileList
    .Add "Data1.accdb"
       DBFileList.Add "Data2.accdb"
       DBFileList.Add "Data3.accdb"

       SourceTable "A"              'Tên table 'A' giông nhau o tat ca cac file DATA 1,2,3
       DestTable = "A"

       Set rsDest = GetRecordset("SELECT * FROM " & DestTable & "", "DATA.accdb")

       For Each DBFile In DBFileList
           Debug.Print "Lay du lieu tu file: " & DBFile
           Set rsSource = GetRecordset("SELECT * FROM " & DestTable & "", DBFile)

           Do Until rsSource.EOF
               rsDest.AddNew
               For Each fld In rsSource.Fields
                   If (fld.Attributes And dbAutoIncrField) = dbAutoIncrField Then
                       '
    do nothing bo qua field AutoNumber
                   Else
                       rsDest
    .Fields(fld.Name).Value fld.Value
                   End 
    If
               Next
               rsDest
    .Update
               rsSource
    .MoveNext
           Loop
           rsSource
    .Close
       Next

       MsgBox 
    "Thanh cong"vbOKOnly"Thông báo"
       
       rsDest
    .Close
       Set rsDest 
    Nothing
       Set rsSource 
    Nothing

    End Sub

    Function GetRecordset(strSQL As StringDBName As Variant) As ADODB.Recordset

       On Error 
    GoTo HandleError
       
       Dim DBPath 
    As String
       DBPath 
    CurrentProject.Path

       Dim conn 
    As New ADODB.Connection
       If conn
    .State And adStateOpen adStateOpen Then conn.Close
       With conn
           
    .ConnectionString "Driver={Microsoft Access Driver (*.mdb, *.accdb)};Dbq=" DBPath "\" & DBName & ";Uid=;Pwd=;"
           .Open
       End With

       Dim rsCont As New ADODB.Recordset
       With rsCont
           .CursorType = adOpenDynamic
           .CursorLocation = adUseClient
           .LockType = adLockOptimistic
           .Open strSQL, conn
           '.ActiveConnection = Nothing
       End With

       'conn.Close
      
       Set GetRecordset = rsCont

       Exit Function

    HandleError:
       MsgBox "
    Error" & Err.Number & vbCrLf & "Description" & Err.Description
       Exit Function

    End Function 

    Bên cạnh đó sẽ có trường hợp khác là: 3 cái database này có nhiều tablecùng tên, cùng cấu trúc yêu cầu gộp tất cả các table này vào cái database khác cũng có nhiều table cùng tên? (Gộp nhiều table chứ không phải 1 cái table như trong ví dụ của bạn). Cái này giống như cùng một file back-end bạn copy cho nhiều chi nhánh nhập liệu sau đó muốn gộp tất cả dữ liệu của các file BE ở chi nhánh thành file BE tổng công ty. Trường hợp này thì tôi chưa code cho nó. Rảnh rỗi sẽ suy nghĩ làm.

    ------------------------------------------------------------------------------

    Code cũ của bạn:

    Mã PHP:
    Dim rs As New ADODB.Recordsetrs1 As New ADODB.Recordsetrs2 As New ADODB.Recordsetrs3 As New ADODB.Recordset
    [/font]
    Dim con As New ADODB.Connectioncon1 As New ADODB.Connectioncon2 As New ADODB.Connectioncon3 As New ADODB.Connection
    Dim duongDan 
    As String
    Dim sqlS1 
    As String

    Private Sub gopFile_Click()
       Dim a As StringAs String
       duongDan 
    CurrentProject.Path

       If con
    .State adStateOpen Then con.Close
       With con
           
    .CursorLocation adUseClient
           
    .ConnectionString "Driver={Microsoft Access Driver (*.mdb, *.accdb)};Dbq=" duongDan "\DATA.accdb;Uid=Admin;Pwd=;"
           .Open
       End With
       sqlS1 
    "Select * from A"
       With rs
           
    .CursorLocation adUseClient
           
    .CursorType adOpenDynamic
           
    .LockType adLockOptimistic
           
    .Open sqlS1con, , , adCmdText
       End With

       If con1
    .State adStateOpen Then con1.Close
       With con1
           
    .CursorLocation adUseClient
           
    .ConnectionString "Driver={Microsoft Access Driver (*.mdb, *.accdb)};Dbq=" duongDan "\DATA1.accdb;Uid=Admin;Pwd=;"
           .Open
       End With
       If rs1
    .State adStateOpen Then rs1.Close
       With rs1
           
    .CursorLocation adUseClient
           
    .CursorType adOpenDynamic
           
    .LockType adLockOptimistic
           
    .Open "A"con1, , , adCmdTable
       End With
       
       If con2
    .State adStateOpen Then con2.Close
       With con2
           
    .CursorLocation adUseClient
           
    .ConnectionString "Driver={Microsoft Access Driver (*.mdb, *.accdb)};Dbq=" duongDan "\DATA2.accdb;Uid=Admin;Pwd=;"
           .Open
       End With
       If rs2
    .State adStateOpen Then rs2.Close
       With rs2
           
    .CursorLocation adUseClient
           
    .CursorType adOpenDynamic
           
    .LockType adLockOptimistic
           
    .Open "A"con2, , , adCmdTable
       End With
       
       If con3
    .State adStateOpen Then con3.Close
       With con3
           
    .CursorLocation adUseClient
           
    .ConnectionString "Driver={Microsoft Access Driver (*.mdb, *.accdb)};Dbq=" duongDan "\DATA3.accdb;Uid=Admin;Pwd=;"
           .Open
       End With
       If rs3
    .State adStateOpen Then rs3.Close
       With rs3
           
    .CursorLocation adUseClient
           
    .CursorType adOpenDynamic
           
    .LockType adLockOptimistic
           
    .Open "A"con3, , , adCmdTable
       End With
       
       Do Until rs1
    .EOF
           rs
    .AddNew
           rs
    !ten rs1.Fields("ten").Value
           rs
    .Update
           rs1
    .MoveNext
       Loop
       rs1
    .Close
       con1
    .Close
       
       Do Until rs2
    .EOF
           rs
    .AddNew
           rs
    !ten rs2.Fields("ten").Value
           rs
    .Update
           rs2
    .MoveNext
       Loop
       rs2
    .Close
       con2
    .Close
       
       Do Until rs3
    .EOF
           rs
    .AddNew
           rs
    !ten rs3.Fields("ten").Value
           rs
    .Update
           rs3
    .MoveNext
    [list=1]
    [*]
       Loop
    [/list]   rs3.Close
       con3
    .Close
       rs
    .Close
       con
    .Close
       
       MsgBox 
    "Thanh Cong"vbOKOnly"Thong bao"
    [font=Tahoma]End Sub 

    Em làm theo như anh nhưng khi chạy GopFile thì trong Database DATA field số 8 (WLEN) lại bị trống ?
    Em mới tìm hiểu nên còn gà mờ lắm. Nhờ anh xem giúp.
    Mong nhận được phản hồi từ anh.
    Thành thật cám ơn.

    Theo em hiểu code thì định dạng Data Pype là Number thì bỏ qua. 
    http://upfile.vn/ymGt_CZCKrBC/desktop-7z.html