mrsiro > 02-02-18, 11:52 PM
tt1212 > 03-02-18, 10:59 AM
ongke0711 > 05-02-18, 06:40 AM
(02-02-18, 11:52 PM)mrsiro Đã viết: ...
- Thêm dữ liệu: Tránh bị trùng khóa chính khi thêm mới.
- Sửa dữ liệu: Nhiều user cùng sửa trên 1 record.
- Xóa dữ liệu: user A xóa dữ liệu trong khi user B đang focus để sửa dữ liệu.
Vấn đề nhức nhối nữa là độ trể của access dùng trong mạng lan. Ví dụ: Khi thêm mới dữ liệu thiết kế nút lưu theo cấu trúc lấy mã khóa chính + 1 (dmax(mahd) + 1). Nhưng vì có độ trể nên nếu 2 user cùng click vào nút lưu đồng thời thì cấu trúc dmax + 1 lỗi ngay, để không lỗi thì user A ấn lưu, sau đó user B phải đợi khoảng vài giây thì ấn lưu mới lấy mã user A vừa lưu + 1.
...
mrsiro > 05-02-18, 07:11 PM
(05-02-18, 06:40 AM)ongke0711 Đã viết: 1. Để giải quyết vấn "Thêm mới" dữ liệu bạn xem link bài này: http://thuthuataccess.com/forum/post-357...l#pid35777
-> Nó giải quyết việc tránh bị trùng Primary Key khi nhiều người cùng tạo mới và lưu dữ liệu.
2. Sửa/Xóa dữ liệu: bạn dùng thuộc tính Record Lock trong Form: Edited record. Khi có ai đang sửa dữ liệu thì Record đó sẽ bị khóa.
ongke0711 > 05-02-18, 09:13 PM
(05-02-18, 07:11 PM)mrsiro Đã viết: Cám ơn bạn, vấn đề đặt ra là độ trể của việc lưu dữ liệu trong mạng lan đó bạn. Ví dụ: 1 unbound form để thêm dữ liệu, với button lưu, cấu trúc lệnh là khi ấn nút lưu thì kiểm tra mahd trên table, lấy dmax + 1. Thì khi chạy trong mạng lan, khi user A ấn lưu thì check dmax là 10 chẳng hạn thì kết quả lưu vào table sẽ là 11, nhưng nếu user B ấn lưu cùng lúc ở 1 máy khác thì cả 2 đều là 11 (lỗi), nếu user B chờ khoảng 1-2s (thời gian khá đáng kể) thì ấn lưu mới lấy 11 + 1 (dmax của user A vừa lưu).
mrsiro > 05-02-18, 10:57 PM
(05-02-18, 09:13 PM)ongke0711 Đã viết: Bạn ngâm cứu kỹ cái link tôi gửi đi, nó y chang trường hợp của bạn và nó giải quyết cái vụ mà bạn kêu "độ trễ" đó. Nó thực ra là vấn đề nhập liệu trong môi trường đa người dùng. Cái ví dụ trong link là thay vì lấy (Dmax +1) thì nó là tạo 1 cái Primary Key tự động theo cấu trúc khác (ngày tháng, mã BN) nhưng cũng gặp một vấn đề chung là bị trùng Primary Key khi 2 người cùng nhập liệu mới cùng lưu một lúc.Độ trể tính bằng milisecond thì mình nghĩ không cần phải bẩy lỗi, tại vì như bạn cũng đã nói là hầu như khó xảy ra. Nhưng độ trể mình đề cập là có thể nhận biết đó bạn (1-2s). Ứng dụng của mình thiết kế như thế này: Khi người dùng 1 ấn chỉnh sửa trên 1 record, thì chạy sql insert vào bảng lock mã của record đang được chỉnh sửa đó, khi người dùng khác ấn chính sửa trên chính record đó thì lập tức check trong bảng lock nếu tồn tại mã này ra thông báo đang được chỉnh sửa, khi người dùng 1 ấn lưu thì thực hiện delete mã này trong bảng lock, lúc đó người dùng khác mới ấn button chỉnh sửa được. Nhưng do độ trể 1-2s nên nếu 2 người dùng ấn nút chỉnh sửa cách nhau khoảng 0,5 - 1s thì bẩy lỗi vô tác dụng. Tương tự khi người dùng 1 ấn lưu thì cũng khoảng 1-2s thì mã record kia mới dc xóa trong bảng lock, nếu người dùng 2 ấn nút sửa khoảng 0.5 - 1s sau khi người dùng 1 ấn lưu thì lại bị bẫy lỗi "đang được chỉnh sửa" trong khi người dùng 1 đã ấn lưu rồi, nhưng do độ trể nên khoảng 1-2s sau người dùng 2 ấn sửa mới không hiện bẩy lỗi. Không biết là bạn đã gặp vấn đề này chưa. Nếu như độ trể bạn đề cập là milisecond thì thật sự quá tốt, bởi vì đó là khoảng thời gian là người dùng khó có thể nhận ra.
Thực ra trong thực tế rất khó nào có sự trùng hợp cả 2, 3, 4... máy cùng lưu dư liệu ở cùng 1 thời điểm chính xác bằng phần ngàn giây (milisecond) mà phải có máy nào truy cập trước lưu trước, máy nào sau thì lưu sau. Do đó giải pháp trong đó của tôi là khi 1 table cần lưu nhận được tín hiệu lưu của máy nào trước sẽ lập tức khóa table đó luôn để máy sau không truy cập được để lấy số thứ tự Dmax+1 và tất nhiên Access sẽ báo lỗi ngay. Tôi sẽ bẫy lỗi này và để người dùng thứ 2 chờ trong vài phần ngàn giây để table đang bị khóa được giải phóng và máy truy cập để lấy số thứ tự mới nhất và lưu kế tiếp. Việc chờ vài phần ngàn giây thì không ảnh hưởng gì đáng kể đến người dùng.
Việc này cũng áp dụng tương tự cho việc quản lý Login. Máy nào gửi tín hiệu truy cập trước sẽ Lock user (vd: cập nhật field [Login status]= true) đó ngay để máy sau thấy dấu hiệu "khóa" sẽ báo lỗi và không cho truy cập.
ongke0711 > 05-02-18, 11:09 PM
mrsiro > 05-02-18, 11:59 PM
ongke0711 > 06-02-18, 01:13 AM