ledangvan > 29-04-18, 10:49 AM
ledangvan > 01-05-18, 10:44 PM
ongke0711 > 02-05-18, 10:53 PM
(29-04-18, 10:49 AM)ledangvan Đã viết: Tôi có 2 dữ liệu DB1 và DB2 : DB1 là dữ liệu cũ, DB2 là dữ liệu nâng cấp
Trong dữ liệu DB2 có them 01 bảng C và them ở bảng A 2 trường là 4(Fomat dạng số) và 5 (Format dạng ngày tháng)
Câu hỏi :
1- Muốn so sánh 2 dữ liệu DB1 và DB2 để biết sự khác biệt và lên thông báo.
2- Nếu có sự khác biệt thì có nút chọn : Nâng cấp (Copy và update những sự khác biệt giữa 2 dữ liệu) Không (Không copy update dữ liệu)
3- Nếu có RelationShips.. tạo theo DB2 thì nâng cấp theo (Câu hỏi này them thôi)
Mong các bạn giúp đỡ, xin cảm ơn
http://www.mediafire.com/file/mpzuqx8u7i...angcap.rar
ledangvan > 03-05-18, 04:21 PM
ongke0711 > 03-05-18, 05:08 PM
ledangvan > 03-05-18, 06:14 PM
(03-05-18, 05:08 PM)ongke0711 Đã viết: Cái dữ liệu bên db1 không đuợc chép đè lên từ db2 phải ko a? Chỉ có thể tạo thêm truờng mới nếu có thay đổi bên db2? Nếu có table mới hoàn toàn thì copy qua db1?
ongke0711 > 04-05-18, 10:30 AM
Option Explicit
Public Function SoSanhCapNhatDB(strDBSource As String)
Dim dbDes As DAO.Database 'File database can nâng cap
Dim fldDes As DAO.Field
Dim dbSource As DAO.Database 'File database nang cap
Dim rst1 As ADODB.Recordset
Dim rst2 As ADODB.Recordset
Dim fldSource As DAO.Field
Dim strSQL As String
Dim blnFound As Boolean
Set rst1 = New ADODB.Recordset
Set rst2 = New ADODB.Recordset
Set dbDes = CurrentDb
Set dbSource = DBEngine.Workspaces(0).OpenDatabase(strDBSource, True)
'Loop qua tung Table trong database Source - Database nâng câp
strSQL = "SELECT * FROM msysobjects IN """ & strDBSource & """" & " WHERE type IN (1,6) AND name NOT LIKE ""MSys*"""
rst1.Open strSQL, CurrentProject.Connection, adOpenDynamic, adLockReadOnly
'---------------
'Doan code nay dung kiem tra co su thay doi Field, Table hay không? ->Code còn hoi ruom ra khi phai goi lai o GoTo CapNhat
Dim blnCapNhat As Boolean
blnCapNhat = False
If Not rst1.EOF Then
rst1.MoveFirst
Do Until rst1.EOF
'Kiem tra xem có Table trong Database Source không?
strSQL = "SELECT * FROM msysobjects WHERE type IN (1,6) AND name = """ & rst1!Name & """" 'Type 1: Local tables; 6: Linked tables
rst2.Open strSQL, CurrentProject.Connection, adOpenDynamic, adLockReadOnly
If rst2.EOF Then
'Chua co Table nay trong Database cân nâng câp.
blnCapNhat = True
Else
'Có table trong file database nâng câp
For Each fldSource In dbSource.TableDefs(rst1!Name).Fields
'Kiem tra Field này có tôn tai trong Table o database cân nâng câp hay không?
blnFound = False
For Each fldDes In dbDes.TableDefs(rst1!Name).Fields
If fldSource.Name = fldDes.Name Then
blnFound = True
End If
Next
'Neu khong có Field nay
If Not blnFound Then
blnCapNhat = True
End If
Next
End If
rst2.Close
rst1.MoveNext
Loop
End If
If blnCapNhat Then
If msgBoxUni("Có c" & ChrW(7853) & "p nh" & ChrW(7853) & "t h" & ChrW(7879) & " th" & ChrW(7889) & "ng m" & ChrW(7899) & "i." & vbCrLf & _
"B" & ChrW(7841) & "n có mu" & ChrW(7889) & "n c" & ChrW(7853) & "p nh" & ChrW(7853) & "t không?" & vbCrLf & _
"Ch" & ChrW(7885) & "n [Yes] " & ChrW(273) & ChrW(7875) & " c" & ChrW(7853) & "p nh" & ChrW(7853) & "t, ch" & ChrW(7885) & "n [No] " & ChrW(273) & ChrW(7875) & " h" & ChrW(7911) & "y.", vbYesNo, "Tin vui") = vbYes Then
GoTo CapNhat
Else
Exit Function
End If
Else
msgBoxUni "Chúng tôi " & ChrW(273) & "ang r" & ChrW(7845) & "t b" & ChrW(7853) & "n" & ChrW(8230) & "." & ChrW(273) & "i ch" & ChrW(417) & "i L" & ChrW(7877) & vbCrLf & _
"Nên s" & ChrW(7869) & " không có b" & ChrW(7843) & "n c" & ChrW(7853) & "p nh" & ChrW(7853) & "t nào nhé" & ChrW(8230) & "!!!", vbInformation, "Tin bu" & ChrW(7891) & "n"
Exit Function
End If
'---------------
CapNhat:
rst1.MoveFirst
If Not rst1.EOF Then
'rst1.MoveFirst
Do Until rst1.EOF
'Kiem tra xem có Table trong Database Source không?
strSQL = "SELECT * FROM msysobjects WHERE type IN (1,6) AND name = """ & rst1!Name & """"
rst2.Open strSQL, CurrentProject.Connection, adOpenDynamic, adLockReadOnly
If rst2.EOF Then
'Them Table này vào database cân nâng câp - dbDes
DoCmd.TransferDatabase acImport, "Microsoft Access", strDBSource, acTable, rst1!Name, rst1!Name, False
Else
'Có table trong file database nâng câp
For Each fldSource In dbSource.TableDefs(rst1!Name).Fields
'Kiem tra Field này có tôn tai trong Table o database cân nâng câp hay không?
blnFound = False
For Each fldDes In dbDes.TableDefs(rst1!Name).Fields
If fldSource.Name = fldDes.Name Then
blnFound = True
End If
Next
'Neu khong có Field nay -> Thêm vào Table bên database cân nâng câp.
If Not blnFound Then
AddFieldToTable rst1!Name, fldSource.Name, fldSource.Type
End If
Next
End If
rst2.Close
rst1.MoveNext
Loop
rst1.Close
End If
Set rst2 = Nothing
Set rst1 = Nothing
Set fldDes = Nothing
Set fldSource = Nothing
Set dbDes = Nothing
Set dbSource = Nothing
End Function
Public Sub AddFieldToTable(strTable As String, strField As String, nFieldType As Integer)
Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim fld As DAO.Field
On Error GoTo ErrorHandler
Set db = CurrentDb
Set tdf = db.TableDefs(strTable)
Set fld = tdf.CreateField(strField, nFieldType)
tdf.Fields.Append fld
Set tdf = Nothing
Set db = Nothing
Exit Sub
ErrorHandler:
MsgBox "An error has occurred. Number: " & Err.Number & ", description: " & Err.Description
Exit Sub
End Sub
Private Sub cmdCapNhat_Click()
Dim S2 As String
S2 = CurrentProject.Path & "\db2.mdb"
SoSanhCapNhatDB S2
End Sub
ledangvan > 04-05-18, 11:56 AM
(04-05-18, 10:30 AM)ongke0711 Đã viết: Code nâng cấp kiểu "chuyên nghiệp" như bên dưới. Ý bạn MTNQ là dùng FileSystemObject (FSO) để code cho việc Copy/Paste chứ không phải là copy/paste = tay anh ledangvan.
- Như em nói là sẽ dùng query để kiểm tra trong table hệ thống MSysObject để kiếm thông tin Tables nào thay đổi.
- Chú ý: Code này chạy trực tiếp trên file database cần nâng cấp (hoặc file database back-end cần nâng cấp). Nếu muốn chạy từ file FE thì phải code khác chút trong phần khai báo db1, db2, các hàm thêm table, field.
Link file demo: http://www.mediafire.com/file/mtinmdrw7j...angcap.rar
- Code hàm SoSanhCapNhatDB():
Mã PHP:Option Explicit
Public Function SoSanhCapNhatDB(strDBSource As String)
Dim dbDes As DAO.Database 'File database can nâng cap
Dim fldDes As DAO.Field
Dim dbSource As DAO.Database 'File database nang cap
Dim rst1 As ADODB.Recordset
Dim rst2 As ADODB.Recordset
Dim fldSource As DAO.Field
Dim strSQL As String
Dim blnFound As Boolean
Set rst1 = New ADODB.Recordset
Set rst2 = New ADODB.Recordset
Set dbDes = CurrentDb
Set dbSource = DBEngine.Workspaces(0).OpenDatabase(strDBSource, True)
'Loop qua tung Table trong database Source - Database nâng câp
strSQL = "SELECT * FROM msysobjects IN """ & strDBSource & """" & " WHERE type IN (1,6) AND name NOT LIKE ""MSys*"""
rst1.Open strSQL, CurrentProject.Connection, adOpenDynamic, adLockReadOnly
'---------------
'Doan code nay dung kiem tra co su thay doi Field, Table hay không? ->Code còn hoi ruom ra khi phai goi lai o GoTo CapNhat
Dim blnCapNhat As Boolean
blnCapNhat = False
If Not rst1.EOF Then
rst1.MoveFirst
Do Until rst1.EOF
'Kiem tra xem có Table trong Database Source không?
strSQL = "SELECT * FROM msysobjects WHERE type IN (1,6) AND name = """ & rst1!Name & """" 'Type 1: Local tables; 6: Linked tables
rst2.Open strSQL, CurrentProject.Connection, adOpenDynamic, adLockReadOnly
If rst2.EOF Then
'Chua co Table nay trong Database cân nâng câp.
blnCapNhat = True
Else
'Có table trong file database nâng câp
For Each fldSource In dbSource.TableDefs(rst1!Name).Fields
'Kiem tra Field này có tôn tai trong Table o database cân nâng câp hay không?
blnFound = False
For Each fldDes In dbDes.TableDefs(rst1!Name).Fields
If fldSource.Name = fldDes.Name Then
blnFound = True
End If
Next
'Neu khong có Field nay
If Not blnFound Then
blnCapNhat = True
End If
Next
End If
rst2.Close
rst1.MoveNext
Loop
End If
If blnCapNhat Then
If msgBoxUni("Có c" & ChrW(7853) & "p nh" & ChrW(7853) & "t h" & ChrW(7879) & " th" & ChrW(7889) & "ng m" & ChrW(7899) & "i." & vbCrLf & _
"B" & ChrW(7841) & "n có mu" & ChrW(7889) & "n c" & ChrW(7853) & "p nh" & ChrW(7853) & "t không?" & vbCrLf & _
"Ch" & ChrW(7885) & "n [Yes] " & ChrW(273) & ChrW(7875) & " c" & ChrW(7853) & "p nh" & ChrW(7853) & "t, ch" & ChrW(7885) & "n [No] " & ChrW(273) & ChrW(7875) & " h" & ChrW(7911) & "y.", vbYesNo, "Tin vui") = vbYes Then
GoTo CapNhat
Else
Exit Function
End If
Else
msgBoxUni "Chúng tôi " & ChrW(273) & "ang r" & ChrW(7845) & "t b" & ChrW(7853) & "n" & ChrW(8230) & "." & ChrW(273) & "i ch" & ChrW(417) & "i L" & ChrW(7877) & vbCrLf & _
"Nên s" & ChrW(7869) & " không có b" & ChrW(7843) & "n c" & ChrW(7853) & "p nh" & ChrW(7853) & "t nào nhé" & ChrW(8230) & "!!!", vbInformation, "Tin bu" & ChrW(7891) & "n"
Exit Function
End If
'---------------
CapNhat:
rst1.MoveFirst
If Not rst1.EOF Then
'rst1.MoveFirst
Do Until rst1.EOF
'Kiem tra xem có Table trong Database Source không?
strSQL = "SELECT * FROM msysobjects WHERE type IN (1,6) AND name = """ & rst1!Name & """"
rst2.Open strSQL, CurrentProject.Connection, adOpenDynamic, adLockReadOnly
If rst2.EOF Then
'Them Table này vào database cân nâng câp - dbDes
DoCmd.TransferDatabase acImport, "Microsoft Access", strDBSource, acTable, rst1!Name, rst1!Name, False
Else
'Có table trong file database nâng câp
For Each fldSource In dbSource.TableDefs(rst1!Name).Fields
'Kiem tra Field này có tôn tai trong Table o database cân nâng câp hay không?
blnFound = False
For Each fldDes In dbDes.TableDefs(rst1!Name).Fields
If fldSource.Name = fldDes.Name Then
blnFound = True
End If
Next
'Neu khong có Field nay -> Thêm vào Table bên database cân nâng câp.
If Not blnFound Then
AddFieldToTable rst1!Name, fldSource.Name, fldSource.Type
End If
Next
End If
rst2.Close
rst1.MoveNext
Loop
rst1.Close
End If
Set rst2 = Nothing
Set rst1 = Nothing
Set fldDes = Nothing
Set fldSource = Nothing
Set dbDes = Nothing
Set dbSource = Nothing
End Function
Public Sub AddFieldToTable(strTable As String, strField As String, nFieldType As Integer)
Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim fld As DAO.Field
On Error GoTo ErrorHandler
Set db = CurrentDb
Set tdf = db.TableDefs(strTable)
Set fld = tdf.CreateField(strField, nFieldType)
tdf.Fields.Append fld
Set tdf = Nothing
Set db = Nothing
Exit Sub
ErrorHandler:
MsgBox "An error has occurred. Number: " & Err.Number & ", description: " & Err.Description
Exit Sub
End Sub
- Gọi hàm cập nhật Table:
Mã PHP:Private Sub cmdCapNhat_Click()
Dim S2 As String
S2 = CurrentProject.Path & "\db2.mdb"
SoSanhCapNhatDB S2
End Sub
ongke0711 > 04-05-18, 12:13 PM
(04-05-18, 11:56 AM)ledangvan Đã viết: Quá chuẩn luôn ongke0711 à, nhưng anh muốn là từ một File khác ấn nút so sánh 2 dữ liệu đấy, ĐƯA RA BẢNG SO SÁNH, rồi mới update. Nhưng cũng rất cảm ơn ongke0711 vì đã giải quyết rất lớn phần câu hỏi của anh.
Public Function SoSanhCapNhatDB(strDBDes As String, strDBSource As String)
Dim dbDes As DAO.Database 'File database can nâng cap
Dim fldDes As DAO.Field
Dim dbSource As DAO.Database 'File database nang cap
Dim rst1 As ADODB.Recordset
Dim rst2 As ADODB.Recordset
Dim fldSource As DAO.Field
Dim strSQL As String
Dim blnFound As Boolean
Set rst1 = New ADODB.Recordset
Set rst2 = New ADODB.Recordset
'Set dbDes = CurrentDb
Set dbDes = DBEngine.Workspaces(0).OpenDatabase(strDBDes, True)
Set dbSource = DBEngine.Workspaces(0).OpenDatabase(strDBSource, True)
'Loop qua tung Table trong database Source - Database nâng câp
strSQL = "SELECT * FROM msysobjects IN """ & strDBSource & """" & " WHERE type IN (1,6) AND name NOT LIKE ""MSys*"""
rst1.Open strSQL, CurrentProject.Connection, adOpenDynamic, adLockReadOnly
'---------------
'Doan code nay dung kiem tra co su thay doi Field, Table hay không? ->Code còn hoi ruom ra khi phai goi lai o GoTo CapNhat
Dim blnCapNhat As Boolean
blnCapNhat = False
If Not rst1.EOF Then
rst1.MoveFirst
Do Until rst1.EOF
'Kiem tra xem có Table trong Database Source không?
strSQL = "SELECT * FROM msysobjects IN """ & strDBDes & """" & " WHERE type IN (1,6) AND name = """ & rst1!Name & """" 'Type 1: Local tables; 6: Linked tables
rst2.Open strSQL, CurrentProject.Connection, adOpenDynamic, adLockReadOnly
If rst2.EOF Then
'Chua co Table nay trong Database cân nâng câp.
blnCapNhat = True
Else
'Có table trong file database nâng câp
For Each fldSource In dbSource.TableDefs(rst1!Name).Fields
'Kiem tra Field này có tôn tai trong Table o database cân nâng câp hay không?
blnFound = False
For Each fldDes In dbDes.TableDefs(rst1!Name).Fields
If fldSource.Name = fldDes.Name Then
blnFound = True
End If
Next
'Neu khong có Field nay
If Not blnFound Then
blnCapNhat = True
End If
Next
End If
rst2.Close
rst1.MoveNext
Loop
End If
If blnCapNhat Then
If msgBoxUni("Có c" & ChrW(7853) & "p nh" & ChrW(7853) & "t h" & ChrW(7879) & " th" & ChrW(7889) & "ng m" & ChrW(7899) & "i." & vbCrLf & _
"B" & ChrW(7841) & "n có mu" & ChrW(7889) & "n c" & ChrW(7853) & "p nh" & ChrW(7853) & "t không?" & vbCrLf & _
"Ch" & ChrW(7885) & "n [Yes] " & ChrW(273) & ChrW(7875) & " c" & ChrW(7853) & "p nh" & ChrW(7853) & "t, ch" & ChrW(7885) & "n [No] " & ChrW(273) & ChrW(7875) & " h" & ChrW(7911) & "y.", vbYesNo, "Tin vui") = vbYes Then
GoTo CapNhat
Else
Exit Function
End If
Else
msgBoxUni "Chúng tôi " & ChrW(273) & "ang r" & ChrW(7845) & "t b" & ChrW(7853) & "n" & ChrW(8230) & "." & ChrW(273) & "i ch" & ChrW(417) & "i L" & ChrW(7877) & vbCrLf & _
"Nên s" & ChrW(7869) & " không có b" & ChrW(7843) & "n c" & ChrW(7853) & "p nh" & ChrW(7853) & "t nào nhé" & ChrW(8230) & "!!!", vbInformation, "Tin bu" & ChrW(7891) & "n"
Exit Function
End If
'---------------
CapNhat:
rst1.MoveFirst
If Not rst1.EOF Then
'rst1.MoveFirst
Do Until rst1.EOF
'Kiem tra xem có Table trong Database Source không?
strSQL = "SELECT * FROM msysobjects IN """ & strDBDes & """" & " WHERE type IN (1,6) AND name = """ & rst1!Name & """"
rst2.Open strSQL, CurrentProject.Connection, adOpenDynamic, adLockReadOnly
If rst2.EOF Then
'Them Table này vào database cân nâng câp - dbDes
CurrentDb.Execute "SELECT * INTO " & rst1!Name & " IN """ & strDBDes & """" & " FROM " & rst1!Name & " IN """ & strDBSource & """", dbFailOnError
Else
'Có table trong file database nâng câp
For Each fldSource In dbSource.TableDefs(rst1!Name).Fields
'Kiem tra Field này có tôn tai trong Table o database cân nâng câp hay không?
blnFound = False
For Each fldDes In dbDes.TableDefs(rst1!Name).Fields
If fldSource.Name = fldDes.Name Then
blnFound = True
End If
Next
'Neu khong có Field nay -> Thêm vào Table bên database cân nâng câp.
If Not blnFound Then
AddFieldToTable dbDes, rst1!Name, fldSource.Name, fldSource.Type
End If
Next
End If
rst2.Close
rst1.MoveNext
Loop
rst1.Close
End If
Set rst2 = Nothing
Set rst1 = Nothing
Set fldDes = Nothing
Set fldSource = Nothing
Set dbDes = Nothing
Set dbSource = Nothing
End Function
Public Sub AddFieldToTable(db As DAO.Database, strTable As String, strField As String, nFieldType As Integer)
Dim tdf As DAO.TableDef
Dim fld As DAO.Field
On Error GoTo ErrorHandler
Set tdf = db.TableDefs(strTable)
Set fld = tdf.CreateField(strField, nFieldType)
tdf.Fields.Append fld
Set tdf = Nothing
Exit Sub
ErrorHandler:
MsgBox "An error has occurred. Number: " & Err.Number & ", description: " & Err.Description
Exit Sub
End Sub
Private Sub cmdCapNhat_Click()
Dim S1 As String, S2 As String
S1 = CurrentProject.Path & "\db1.mdb"
S2 = CurrentProject.Path & "\db2.mdb"
SoSanhCapNhatDB S1, S2
End Sub