Đánh giá chủ đề:
  • 0 Votes - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[Hỏi] Đảm bảo tính toàn vẹn của dữ liệu
#1
Mình có 1 trường hợp như sau
Table khoaphong : IDphong, tenphong (có 2 giá trị 01-phòng nhân sự, 02-phòng kế toán)
Table nhanvien : IDnhanvien,hoten,IDphong
Có 1 form nhập liệu nhân viên mới với 1 combox chọn phòng (nguồn là table khoaphong), sau khi chọn phòng thì có 1 txtbox nhận IDphong tương ứng với record trong combox khi chọn.

Trường hợp xảy ra như sau:
Tại computerA, UserA mở form nhập nhân viên lên chọn phòng nhân sự => txtbox đang nhận giá trị là 01. Lúc này chưa ấn lưu.
Tại computerB, UserB khác mở form danh mục khoa phòng và xóa đi 01-phòng nhân sự. 
Sau khi UserB xóa xong, thì lúc sau tại computerA , userA tiến hành ấn lưu (txtbox đang còn 01).

Vậy lúc này điều gì sẽ xảy ra. Nếu nhân viên mới được thêm vào kia có giá trị IDphong là 01 thì rõ ràng là dữ liệu đã bị sai lệch, bởi vì tại table khoaphong đã không còn giá trị này nữa.

Nếu vậy có cách nào để tránh sự sai lệch này hay ko. Mong mọi người giúp đỡ trường hợp này.
Chữ ký của mrsiro Xin chào, mình là mrsiro, Tham gia http://thuthuataccess.com/forum từ ngày 05-12 -14.
Reply
Những người đã cảm ơn
#2
Khi CSDL hoạt động mạng, điều bạn nói không thể xảy ra nếu trường hợp bạn sử dụng form liên kết recordsource. lúc này access sẽ báo lỗi thậm chí chương trình sẽ bị đơ và bạn chỉ có thể tắt bằng task manager
Trường hợp sử dụng form unbound, ai thực hiện trước sẽ được hưởng lợi trước, người thực hiện sau sẽ ôm lỗi (mèo đen ăn vụng, mèo trắng bị đòn). Chẳng có sách nào chỉ cho bạn cách xử lý toàn vẹn dữ liệu cả.
Vì vậy không ai khuyến khích sử dụng form unbound để thiết kế form chạy mạng, vì form unbound thực sự là một ngôi nhà hoang rất khó quản lý.
Nếu bạn sử dụng form liên kết, bạn có thể khóa dữ liệu ở các máy khác khi bạn đang trên form làm việc trước những người đó (bạn có thể thiết lập khóa record hoặc khóa cả table tùy ý) lúc này các máy khác có quyền xem mà không thể thực hiện các thao tác khác như nhập, sửa, xóa. Thậm chí nếu bạn là acmin bạn có thể dành lại quyền quản lý và khóa các máy khác dù họ đang làm việc trước bạn (việc này chắc chắn không thể làm được với form unbound)
Chữ ký của tranthanhan1962 Kết quả cuối cùng của một đời người, không phải bạn có được bao nhiêu tiền bạc, tài sản. Mà bạn còn bao nhiêu người bạn  thumbs up
ღღღღღTài sản của tranthanhan1962 (View All Items) ღღღღღ
Reply
Những người đã cảm ơn
#3
Chào Bạn,
Vấn đề của Bạn là ở việc tổ chức dữ liệu, chứ không phải thiết kế form.
Với ứng dụng cụ thể mà Bạn đang đề cập: Tổ chức phòng ban phải là loại thông tin có trước và ổn định. Sao Bạn lại để cho nó thay đổi tùy ý như vậy được.
Và cũng đâu phải ai cũng có quyền thay đổi thông tin về tổ chức phòng ban.
Chữ ký của lehongduc Lê Hồng Đức
Số ĐT: 0913.941.144
Email: lhongduc@gmail.com, lehongduc@quantribanhang.vn
Website: http://quantribanhang.vn
Reply
Những người đã cảm ơn
#4
(09-10-18, 08:10 PM)tranthanhan1962 Đã viết: Khi CSDL hoạt động mạng, điều bạn nói không thể xảy ra nếu trường hợp bạn sử dụng form liên kết recordsource. lúc này access sẽ báo lỗi thậm chí chương trình sẽ bị đơ và bạn chỉ có thể tắt bằng task manager
Trường hợp sử dụng form unbound, ai thực hiện trước sẽ được hưởng lợi trước, người thực hiện sau sẽ ôm lỗi (mèo đen ăn vụng, mèo trắng bị đòn). Chẳng có sách nào chỉ cho bạn cách xử lý toàn vẹn dữ liệu cả.
Vì vậy không ai khuyến khích sử dụng form unbound để thiết kế form chạy mạng, vì form unbound thực sự là một ngôi nhà hoang rất khó quản lý.
Nếu bạn sử dụng form liên kết, bạn có thể khóa dữ liệu ở các máy khác khi bạn đang trên form làm việc trước những người đó (bạn có thể thiết lập khóa record hoặc khóa cả table tùy ý) lúc này các máy khác có quyền xem mà không thể thực hiện các thao tác khác như nhập, sửa, xóa. Thậm chí nếu bạn là acmin bạn có thể dành lại quyền quản lý và khóa các máy khác dù họ đang làm việc trước bạn (việc này chắc chắn không thể làm được với form unbound)
Chào các Bạn,
Bạn đã viết:
"Vì vậy không ai khuyến khích sử dụng form unbound để thiết kế form chạy mạng, vì form unbound thực sự là một ngôi nhà hoang rất khó quản lý."
Tôi hết sức bối rối khi đọc được nhận định này. Bạn có thể nói rõ hơn được không?
Chữ ký của lehongduc Lê Hồng Đức
Số ĐT: 0913.941.144
Email: lhongduc@gmail.com, lehongduc@quantribanhang.vn
Website: http://quantribanhang.vn
Reply
Những người đã cảm ơn
#5
Việc ứng dụng đa người dùng sẽ có xung đột dữ liệu là điều không thể tránh khỏi và bạn tổ chức CSDL và cách xử lý form như thế nào để hạn chế chuyện này thôi chứ không có tuyệt đối.

Việc bạn dùng công nghệ gì trong việc kết nối CSDL sẽ có cách xử lý tuỳ theo công nghệ đó. 
- Nếu dùng DAO thì như anh tranthanhan1962 có nói là có thuộc tính Record Locks (Edited Lock, All Records) và phải là Bound Form.
- Nếu dùng ADO  thì có dùng các thuộc tính của nó như bên dưới và cũng bắt buộc là giữ kết nối với CSDL backend liên tục cho đến khi Update xong mới được. Cách này thì dùng Unbound Form cũng được.
    rst.CursorType =     adOpenKeyset
    rst.LockType =       adLockPessimistic
    rst.CursorLocation = adUseServer

Bên cạnh đó nó còn liên quan đến việc bạn tạo Relationship giữa các Table như thế nào nữa. 
- Nếu khi tạo quan hệ bạn chọn mục 1, 2 (Enforce Referential Intergrity, Cascade Update Related Record) thì khi bạn xoá record bên Table tham chiếu (table phòng ban của bạn) thì các table khác có mã liên quan sẽ tự động đổi thành Null. 
- Nếu chọn mục 1 không thôi thì: khi xoá nếu mã đó đã được sử dụng trong table khác thì nó sẽ báo lỗi 3200. Bạn sẽ dùng trường hợp này để bẫy lỗi không cho xoá Record khi đã có dữ liệu phát sinh. Nếu chưa có phát sinh dữ liệu thì người dùng vẫn xoá được, khi đó thì "ai tới trước được phục vụ trước" thôi.
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 NguyenDungAnh
#6
Cái vụ error 3200 có thể áp dụng vào mục không cho xóa hóa đơn nhập khi đã có hóa đơn xuất mặt hàng đó bác nhỉ
Chữ ký của NguyenDungAnh Đến với cuộc đời hai tay trắng
Giã từ trần thế trắng hai tay
Bao nhiêu tiếng nói tiếng cười
Sống ở cuộc đời lãi được vậy thôi
ღღღღღTài sản của NguyenDungAnh (View All Items) ღღღღღ
Reply
Những người đã cảm ơn
#7
(11-10-18, 08:50 AM)NguyenDungAnh Đã viết: Cái vụ error 3200 có thể áp dụng vào mục không cho xóa hóa đơn nhập khi đã có hóa đơn xuất mặt hàng đó bác nhỉ

Được nhưng vì cái mã hàng có thể có quan hệ với nhiều table khác nữa nên để cụ thể tôi thường hay dùng thêm câu lệnh SQL để check xem có phát sinh giao dịch liên quan đến mã hàng này không. 

Ví dụ: Xoá mã văn phòng phẩm

Mã PHP:
Private Sub cmdXoa_Click()
On Error GoTo Err_cmdXoa_Click

   If IsNull
(Me.txtIDThen
       Beep
   ElseIf msgBoxUni
("B" ChrW(7841) & "n có ch" ChrW(7855) & "c ch" ChrW(7855) & "n mu" ChrW(7889) & "n xóa mã hàng này?"vbYesNo vbQuestion"Thông báo") = vbYes Then
       If XoaVPP
(Me.txtIDThen
           msgBoxUni ChrW
(272) & "ã xóa xong!"vbOKOnly vbInformation"Thông báo"
           Me.lstDMSP.Requery
           DoCmd
.Requery
       Else
           msgBoxUni 
"Không th" ChrW(7875) & " xóa mã hàng này vì " ChrW(273) & "ã có phát sinh giao d" ChrW(7883) & "ch!"vbOKOnly vbCritical"Thông báo"
       End If
   End If

   SetFormState False
   Exit Sub
   
Exit_cmdXoa_Click
:
   Exit Sub

Err_cmdXoa_Click
:
   MsgBox Err.Description
   Resume Exit_cmdXoa_Click
End Sub 

- Cái hàm XoaVPP:

Mã PHP:
Function XoaVPP(MaSP As Long) As Boolean
   Dim strSQL 
As String
   Dim rs 
As Recordset
   On Error 
GoTo ErrorHandler
       strSQL 
"SELECT count(*) as Existed FROM tblPhieuNhapChiTiet WHERE [MaSP]=" MaSP
       Set rs 
CurrentDb.OpenRecordset(strSQL)
       If rs!Existed 0 Then
           strSQL 
"DELETE tblDMSP.* FROM tblDMSP WHERE [ID]=" MaSP
           CurrentDb
.Execute strSQLdbFailOnError
           XoaVPP 
True
       Else
           XoaVPP 
False
       End 
If
       rs.Close
       Set rs 
Nothing
       Exit 
Function
       
ErrorHandler
:
   XoaVPP False
   rs
.Close
   Set rs 
Nothing
End 
Function 
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 NguyenDungAnh
#8
Bạn ongke hiểu nhầm ý của mình rồi, trường hợp bạn đề cập đó là xóa dữ liệu ở bảng khóa chính khi bảng khóa ngoại đã có dữ liệu, đối với trường hợp này mình giải quyết ok. Cụ thể trong ví dụ khi phòng 01-nhân sự đã có trong bảng nhân viên, lúc này chỉ cần dùng dcount để check nếu >0 tức là có tồn tại, ko cho xóa trong bảng khoaphong nữa.

Còn trường hợp mình đang muốn hỏi là dữ liệu 01-nhân sự chưa tồn tại trong bảng nhanvien, nó chỉ đang sắp tồn tại bởi vì tại computerA, userA chưa ấn nút lưu, chỉ mới chọn trong combox rồi để đấy.

Sau khi userB xóa 01-nhân sự, thì lúc này userA ấn lưu (lúc này txtbox vẫn đang có giá trị 01, vì trước đó userA đã chọn phòng nhân sự trên combox - control source của txtbox là combox.column(1)).
Chữ ký của mrsiro Xin chào, mình là mrsiro, Tham gia http://thuthuataccess.com/forum từ ngày 05-12 -14.
Reply
Những người đã cảm ơn
#9
Vấn để của bạn tôi đã có mấy ý trả lời ở post #5 rồi đó. Khi B cần xoá mục trong table chính thì A có cố lưu cũng không có ý nghĩa vì table chính không có dữ liệu. Còn không thì phân quyền không cho xoá các table tham chiếu.
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
#10
Nếu mình không nhầm thì là ý này

Trích dẫn: Nếu khi tạo quan hệ bạn chọn mục 1, 2 (Enforce Referential Intergrity, Cascade Update Related Record) thì khi bạn xoá record bên Table tham chiếu (table phòng ban của bạn) thì các table khác có mã liên quan sẽ tự động đổi thành Null. 

Với trường hợp này thì khi A ấn lưu record vào table nhanvien, trường maphongban là null hay bật lên lỗi không cho lưu luôn.

Nếu cho lưu với trường maphongban là null thì sẽ có vấn đề xảy ra nếu dùng câu select mà có inner join giữa table nhanvien và phongban, kết quả trả về sẽ ko có cái nhân viên có trường maphongban là null.

Ở đây mình muốn bắt lỗi khi không tồn tại giá trị đó ở bảng khóa chính thì không cho lưu giá trị đó vào bảng khóa ngoại luôn.
Chữ ký của mrsiro Xin chào, mình là mrsiro, Tham gia http://thuthuataccess.com/forum từ ngày 05-12 -14.
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
  [Hỏi] Nhờ giúp dùm cách lọc dữ liệu trong report để in ra giấy bo bin 2 118 05-12-18, 12:24 PM
Bài mới nhất: bo bin
  [Hỏi] Lỗi khi không chọn dữ liệu khi Save As 'Invalid procedure call or argument.' doandinhtam 2 277 02-09-18, 09:48 AM
Bài mới nhất: doandinhtam
  Hướng Dẫn Hỏi cách tạo code phục hồi dữ liệu trong table sau khi backup doandinhtam 31 1,680 29-08-18, 03:54 PM
Bài mới nhất: doandinhtam
  [Hỏi] Cách tổng hợp số liệu từ nhiều máy vào 1 máy vuthaiha90 3 1,295 25-07-17, 02:45 PM
Bài mới nhất: maidinhdan
  [Lỗi] Lỗi thập phân trong tính toán access toidjtjmtoi 3 1,065 13-05-17, 12:13 PM
Bài mới nhất: cpucloi

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ơ| PMA Nha Trang| Gỗ Acrylic Không Đường Line