hungthanmx > 20-08-16, 10:26 AM
toancvp > 20-08-16, 05:28 PM
hungthanmx > 20-08-16, 08:38 PM
(20-08-16, 05:28 PM)toancvp Đã viết: Hình như bạn có chút nhầm lẫn trong ý tưởng thiết kế, form nhập liệu của bạn là form cho "bảng cha", theo mình ko nên là form dùng cập nhật dữ liệu cho "bảng con". Bởi vì bạn hình dung hôm nay nhập ID 001 chẳng hạn, ngày mai bạn thay đổi tình trạng của 001 thì sẽ phải vào Edit chứ ko phải Add new.
toancvp > 21-08-16, 12:34 PM
ongke0711 > 21-08-16, 04:03 PM
(20-08-16, 10:26 AM)hungthanmx Đã viết: ...
- Ý mình muốn đối với file này, đó là khi mình nhập dữ liệu vào bảng CSDL, thì dữ liệu của bảng Update tự nhảy (tự động điền):
+ ID: Tự nhảy về ID đang cập nhật ở bảng CSDL.
+ Ngày cập nhật: Tự nhảy về ngày hiện tại.
+ Tình hình cập nhật: Tự nhảy theo cấu trúc: "Thay đổi [Tên cột] từ [Giá trị cũ] sang [Giá trị mới]".
+ Người cập nhật: Tự nhảy về user đang dùng máy.
...
Public Function WriteChanges()
Dim frm As Form
Dim ctl As Control
Dim frmname As String, user As String, sql As String, changes As String
Dim db As DAO.Database
Set frm = Screen.ActiveForm
Set db = CurrentDb
frmname = Screen.ActiveForm.Name
user = Application.CurrentUser
changes = ""
sql = "INSERT INTO tblUpdate " & _
"([NgayCapNhat],[FormCapNhat], [NguoiCapNhat], [TinhHinhCapNhat]) " & _
"VALUES (#" & Date & "#,'" & frmname & "', '" & user & "', "
For Each ctl In frm.Controls
Select Case ctl.ControlType
Case acTextBox, acComboBox, acListBox, acOptionGroup
If IsNull(ctl.OldValue) And Not IsNull(ctl.Value) Then
changes = changes & _
ctl.Name & "--" & "BLANK" & "--" & ctl.Value & _
vbCrLf
ElseIf IsNull(ctl.Value) And Not IsNull(ctl.OldValue) Then
changes = changes & _
ctl.Name & "--" & ctl.OldValue & "--" & "BLANK" & _
vbCrLf
ElseIf ctl.Value <> ctl.OldValue Then
changes = changes & _
ctl.Name & ": " & ctl.OldValue & "--> " & ctl.Value & _
vbCrLf
End If
End Select
Next ctl
sql = sql & "'ID=" & frm.txtID & "-" & changes & "');"
db.Execute sql, dbFailOnError
Set frm = Nothing
Set db = Nothing
End Function
Private Sub Form_BeforeUpdate(Cancel As Integer)
WriteChanges
Me.subUpdate.Requery
End Sub
hungthanmx > 22-08-16, 09:53 AM
(21-08-16, 04:03 PM)ongke0711 Đã viết: Cái bạn muốn là một dạng theo dõi, ghi lại nhưng thay đổi dữ liệu khi người dùng cập nhật dữ liệu (Track change).
Hàm sau đây (WriteChanges) sẽ thực hiện điều này. Hàm sẽ thực hiện Insert thông tin các trường được cập nhật và nội dung cập nhật vào table "tblUpdate".
Chú ý:
- Những form mà bạn muốn theo dõi phải là dạng Bound Form. Sử dụng sự kiện Before Update của form và OldValue của Control để ghi lại những thay đổi phát sinh.
- Tên table không được đặt trùng tên với các từ khóa mặc địng của Access. Vd: bạn đặt tên table "Update" là vi phạm, khi chạy code sẽ báo lỗi.
- Hàm WriteChanges()
Mã PHP:Public Function WriteChanges()
Dim frm As Form
Dim ctl As Control
Dim frmname As String, user As String, sql As String, changes As String
Dim db As DAO.Database
Set frm = Screen.ActiveForm
Set db = CurrentDb
frmname = Screen.ActiveForm.Name
user = Application.CurrentUser
changes = ""
sql = "INSERT INTO tblUpdate " & _
"([NgayCapNhat],[FormCapNhat], [NguoiCapNhat], [TinhHinhCapNhat]) " & _
"VALUES (#" & Date & "#,'" & frmname & "', '" & user & "', "
For Each ctl In frm.Controls
Select Case ctl.ControlType
Case acTextBox, acComboBox, acListBox, acOptionGroup
If IsNull(ctl.OldValue) And Not IsNull(ctl.Value) Then
changes = changes & _
ctl.Name & "--" & "BLANK" & "--" & ctl.Value & _
vbCrLf
ElseIf IsNull(ctl.Value) And Not IsNull(ctl.OldValue) Then
changes = changes & _
ctl.Name & "--" & ctl.OldValue & "--" & "BLANK" & _
vbCrLf
ElseIf ctl.Value <> ctl.OldValue Then
changes = changes & _
ctl.Name & ": " & ctl.OldValue & "--> " & ctl.Value & _
vbCrLf
End If
End Select
Next ctl
sql = sql & "'ID=" & frm.txtID & "-" & changes & "');"
db.Execute sql, dbFailOnError
Set frm = Nothing
Set db = Nothing
End Function
- Ở sự kiện Form_BeforeUpdate:
Mã PHP:Private Sub Form_BeforeUpdate(Cancel As Integer)
WriteChanges
Me.subUpdate.Requery
End Sub
Link file demo: http://www.mediafire.com/download/6l3hcj...esForm.mdb
toidjtjmtoi > 18-09-17, 05:35 PM
(21-08-16, 04:03 PM)ongke0711 Đã viết:(20-08-16, 10:26 AM)hungthanmx Đã viết: ...
- Ý mình muốn đối với file này, đó là khi mình nhập dữ liệu vào bảng CSDL, thì dữ liệu của bảng Update tự nhảy (tự động điền):
+ ID: Tự nhảy về ID đang cập nhật ở bảng CSDL.
+ Ngày cập nhật: Tự nhảy về ngày hiện tại.
+ Tình hình cập nhật: Tự nhảy theo cấu trúc: "Thay đổi [Tên cột] từ [Giá trị cũ] sang [Giá trị mới]".
+ Người cập nhật: Tự nhảy về user đang dùng máy.
...
Cái bạn muốn là một dạng theo dõi, ghi lại nhưng thay đổi dữ liệu khi người dùng cập nhật dữ liệu (Track change).
Hàm sau đây (WriteChanges) sẽ thực hiện điều này. Hàm sẽ thực hiện Insert thông tin các trường được cập nhật và nội dung cập nhật vào table "tblUpdate".
Chú ý:
- Những form mà bạn muốn theo dõi phải là dạng Bound Form. Sử dụng sự kiện Before Update của form và OldValue của Control để ghi lại những thay đổi phát sinh.
- Tên table không được đặt trùng tên với các từ khóa mặc địng của Access. Vd: bạn đặt tên table "Update" là vi phạm, khi chạy code sẽ báo lỗi.
- Hàm WriteChanges()
Mã PHP:Public Function WriteChanges()
Dim frm As Form
Dim ctl As Control
Dim frmname As String, user As String, sql As String, changes As String
Dim db As DAO.Database
Set frm = Screen.ActiveForm
Set db = CurrentDb
frmname = Screen.ActiveForm.Name
user = Application.CurrentUser
changes = ""
sql = "INSERT INTO tblUpdate " & _
"([NgayCapNhat],[FormCapNhat], [NguoiCapNhat], [TinhHinhCapNhat]) " & _
"VALUES (#" & Date & "#,'" & frmname & "', '" & user & "', "
For Each ctl In frm.Controls
Select Case ctl.ControlType
Case acTextBox, acComboBox, acListBox, acOptionGroup
If IsNull(ctl.OldValue) And Not IsNull(ctl.Value) Then
changes = changes & _
ctl.Name & "--" & "BLANK" & "--" & ctl.Value & _
vbCrLf
ElseIf IsNull(ctl.Value) And Not IsNull(ctl.OldValue) Then
changes = changes & _
ctl.Name & "--" & ctl.OldValue & "--" & "BLANK" & _
vbCrLf
ElseIf ctl.Value <> ctl.OldValue Then
changes = changes & _
ctl.Name & ": " & ctl.OldValue & "--> " & ctl.Value & _
vbCrLf
End If
End Select
Next ctl
sql = sql & "'ID=" & frm.txtID & "-" & changes & "');"
db.Execute sql, dbFailOnError
Set frm = Nothing
Set db = Nothing
End Function
- Ở sự kiện Form_BeforeUpdate:
Mã PHP:Private Sub Form_BeforeUpdate(Cancel As Integer)
WriteChanges
Me.subUpdate.Requery
End Sub
Link file demo: http://www.mediafire.com/download/6l3hcj...esForm.mdb
ongke0711 > 18-09-17, 08:46 PM
(18-09-17, 05:35 PM)toidjtjmtoi Đã viết: cho mình hỏi biến nguoicapnhat lấy ở đâu vậy bạn
toidjtjmtoi > 19-09-17, 10:13 AM
(18-09-17, 08:46 PM)ongke0711 Đã viết:(18-09-17, 05:35 PM)toidjtjmtoi Đã viết: cho mình hỏi biến nguoicapnhat lấy ở đâu vậy bạn
sql = "INSERT INTO tblUpdate " & _
"([NgayCapNhat],[FormCapNhat], [NguoiCapNhat], [TinhHinhCapNhat]) " & _
...
Nó không phải là biến mà là tên trường ở table ghi lại thông tin khi có người sửa đổi dữ liệu.
Table gồm các trường: NgayCaphat, FormCapNhat,NguoiCapNhat, TinhHinhCapNhat
ongke0711 > 19-09-17, 10:41 AM
(19-09-17, 10:13 AM)toidjtjmtoi Đã viết: mình thay from rồi mà người cập nhật nó cứ mặc định gi là admin :