Đánh giá chủ đề:
  • 0 Votes - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[Help] Về CSDL quản lý và cập nhật
#1
Chào tất cả mọi người, mình mới lọ mọ vào diễn đàn, mong được mọi người giúp đỡ nhiều.
Mình đang có bài tập Access như sau, xin được mọi người chỉ giáo:
- Mình có file Access gồm 2 bảng: 1 bảng CSDL lưu trữ tên và tình trạng làm việc của nhân viên, 1 bảng là Update như file đính kèm.
- Mình đã tạo relationship cho 2 bảng bởi field ID.
- Ý 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.
- Vấn đề ở đây là:
    + Mình không biết làm những cái trên, mong mọi người chỉ giáo  040
    + Mình cũng đã nghĩ tới cách nhập tay vào bảng Update, sử dụng bảng con. Khi thao tác ở bảng CSDL thì sẽ có bảng con là bảng Update, mình ấn dấu cộng thì nó sẽ hiện ra, cập nhật tới đâu mình đánh tay đến đó. Tuy nhiên, khi thao tác trên bảng thì nó tự nhảy ID từ bảng CSDL sang bảng Update được thật, rất tiện, nhưng khi chuyển sang form thì nó lại không nhảy ô ID, cũng không hiện ô ID mà đánh luôn. Nếu theo cách này cũng xin nhờ mọi người chỉ điểm  040
File đây ạ, suýt quên: https://drive.google.com/file/d/0B135QFv...sp=sharing
Cám ơn mọi người rất nhiều  007 Present 007
Chữ ký của hungthanmx hungthanmx,gia nhập Thủ Thuật Access từ 20-08 -16.
Reply
Những người đã cảm ơn
#2
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.
Chữ ký của toancvp Nếu tất cả đường đời đều trơn láng    
Có thể nào ta nhận ra ta Bat
Reply
Những người đã cảm ơn hungthanmx
#3
(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.

Cám ơn bạn đã góp ý laughing
Tuy nhiên mình cũng k hiểu ý bạn lắm :v
Còn ý của mình là mình có bảng CSDL lưu trữ thông tin, khi mà bất kỳ ai vào thay đổi nội dung của bảng này thì tình trạng thay đổi của nó sẽ được cập nhật vào bảng Update (2 bảng link theo số ID, để mình có thể nhìn cả tổng thể thay đổi của tất cả dữ liệu và của mỗi dữ liệu).
Mong được chỉ giáo thêm T.T
Chữ ký của hungthanmx hungthanmx,gia nhập Thủ Thuật Access từ 20-08 -16.
Reply
Những người đã cảm ơn
#4
Ở #1 thì bạn muốn rằng khi "đó là khi mình nhập dữ liệu vào bảng CSDL", nên mình cho rằng thiết kế như hiện tại là ko hợp lý vì cách bạn bố trí form CSDL như vậy mang tính thay đổi dữ liệu cũ nhiều hơn là nhập mới.
Như ý bạn ở #3 thì "khi mà bất kỳ ai vào thay đổi nội dung của bảng này", vậy theo mình nên dùng append Query.
Tạo một query có các Field thể hiện như ý bạn muốn, tạo điều kiện lọc là [ID] trong Form CSDL để nó chỉ ra một ID duy nhất thôi.
Sau đó biến nó thành Append Query, nối vào các dữ liệu mà bạn muốn.
Ở event After Update của Form CSDL thì tạo cái macro SetWarning = No, sau đó Open Query vừa tạo là ra.
Chữ ký của toancvp Nếu tất cả đường đời đều trơn láng    
Có thể nào ta nhận ra ta Bat
Reply
Những người đã cảm ơn hungthanmx
#5
(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ình: WriteChanges.png]

- Hàm WriteChanges()
Mã PHP:
Public Function WriteChanges()

   Dim frm As Form
   Dim ctl 
As Control
   Dim frmname 
As Stringuser As Stringsql As Stringchanges 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
acComboBoxacListBoxacOptionGroup
              
If IsNull(ctl.OldValue) And Not IsNull(ctl.ValueThen
                 changes 
changes _
                 ctl
.Name "--" "BLANK" "--" ctl.Value _
                 vbCrLf
              
ElseIf IsNull(ctl.Value) And Not IsNull(ctl.OldValueThen
                 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 sqldbFailOnError

   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
Chữ ký của ongke0711 If you BORN poor, it's not your mistake. But if you DIE poor, It's your mistake!
ღღღღღTài sản của ongke0711 (View All Items) ღღღღღ
Reply
Những người đã cảm ơn toancvp , hungthanmx
#6
(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ình: WriteChanges.png]

- Hàm WriteChanges()
Mã PHP:
Public Function WriteChanges()

   Dim frm As Form
   Dim ctl 
As Control
   Dim frmname 
As Stringuser As Stringsql As Stringchanges 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
acComboBoxacListBoxacOptionGroup
              
If IsNull(ctl.OldValue) And Not IsNull(ctl.ValueThen
                 changes 
changes _
                 ctl
.Name "--" "BLANK" "--" ctl.Value _
                 vbCrLf
              
ElseIf IsNull(ctl.Value) And Not IsNull(ctl.OldValueThen
                 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 sqldbFailOnError

   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

Ôi đây là cái em cần này laughing)
Vì mới tìm hiểu Access nên chưa rõ cụ thể lắm.
Em chỉ muốn làm kiểu đơn giản này để cập nhật CSDL thôi laughing
Cám ơn các bác đã chỉ giáo nhiều T.T
Em sẽ cố gắng tìm hiểu thêm T.T
Chữ ký của hungthanmx hungthanmx,gia nhập Thủ Thuật Access từ 20-08 -16.
Reply
Những người đã cảm ơn


Có thể liên quan đến chủ đề
Chủ đề: Tác giả Trả lời: Xem: Bài mới nhất
  Tự động cập nhật hình ảnh sản phẩm theo mã sản phẩm feeling 1 89 13-10-16, 06:36 PM
Bài mới nhất: ongke0711
  xin chương trình quản lý khen thuởng kuzinhy 2 154 29-09-16, 11:49 PM
Bài mới nhất: kuzinhy
  Hướng Dẫn Mọi người giúp e xây dựng phần mềm quản lý bán hàng với ạ! hoanglan142bn 2 298 16-03-16, 08:30 AM
Bài mới nhất: hoanglan142bn
  [Help] Bài tập Quản lý đặt hàng k3nzyyb 2 936 28-07-15, 04:51 PM
Bài mới nhất: thanh25k62
Lightbulb Quản lý tiền tiết kiệm thao ly 3 725 22-06-15, 09:40 AM
Bài mới nhất: tranthanhan1962

Chuyển nhanh:


User(s) browsing this thread: 1 Guest(s)
Diễn Đàn Thơ Văn Thi Ẩm Lâu|Nhà Hàng Sông Thơ