tranthanhan1962 > 29-06-17, 11:31 AM
DooHoaangPhuuc > 17-07-17, 12:16 AM
tranthanhan1962 > 17-07-17, 08:44 AM
thdanh > 20-08-19, 11:30 AM
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.
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 String, DBName 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 table và cù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.Recordset, rs1 As New ADODB.Recordset, rs2 As New ADODB.Recordset, rs3 As New ADODB.Recordset
[/font]
Dim con As New ADODB.Connection, con1 As New ADODB.Connection, con2 As New ADODB.Connection, con3 As New ADODB.Connection
Dim duongDan As String
Dim sqlS1 As String
Private Sub gopFile_Click()
Dim a As String, b As 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 sqlS1, con, , , 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