-
Tạo bẫy cảnh báo Write Conflict
Minh Tiên > 11-09-19, 06:00 PM
Chào cả nhà !
Tiên có trường hợp như sau: Khi một ai đó đang sửa chữa trực tiếp một record trên form1 (Gõ nội dung nhưng chưa enter để hoàn thiện nội dung) thì trên form2 người khác thực hiện lệnh ghi đúng vào bảng record đó => Sẽ bị báo "Write Conflict".
Nhờ cả nhà chỉ giúp cách cảnh báo khi gặp lỗi "Write Conflict" thì ko cho lưu. Hoặc cách đặt một TempVar giám sát nội dung chưa hoàn thành của form1 để Form2 tham chiếu trước khi thực hiện lệnh ghi.
Cảm ơn cả nhà ! -
RE: Tạo bẫy cảnh báo Write Conflict
ongke0711 > 11-09-19, 09:53 PM
Bạn có thử cách kiểm tra Record có bị locked trước khi Edit chưa?
Cái kiểu mở DAO Recordset rồi rs.Edit cái record hiện tại, nếu báo lỗi thì nó đang locked. -
RE: Tạo bẫy cảnh báo Write Conflict
tranthanhan1962 > 11-09-19, 09:58 PM
Tốt nhất là xử lý chiếm quyền khi mở form thiết đặt Record Locks, nếu bình đẳng thì người nào mở form trước sẽ chiếm quyền ưu tiên, hoặc nếu form ưu tiên thì khóa các form khác. -
RE: Tạo bẫy cảnh báo Write Conflict
maidinhdan > 11-09-19, 11:30 PM
(11-09-19, 06:00 PM)Minh Tiên Đã viết: Chào cả nhà !
Tiên có trường hợp như sau: Khi một ai đó đang sửa chữa trực tiếp một record trên form1 (Gõ nội dung nhưng chưa enter để hoàn thiện nội dung) thì trên form2 người khác thực hiện lệnh ghi đúng vào bảng record đó => Sẽ bị báo "Write Conflict".
Nhờ cả nhà chỉ giúp cách cảnh báo khi gặp lỗi "Write Conflict" thì ko cho lưu. Hoặc cách đặt một TempVar giám sát nội dung chưa hoàn thành của form1 để Form2 tham chiếu trước khi thực hiện lệnh ghi.
Cảm ơn cả nhà !
Xem bài viết này: https://docs.microsoft.com/en-us/office/...operty-dao -
RE: Tạo bẫy cảnh báo Write Conflict
Minh Tiên > 12-09-19, 09:43 AM
Tình huống này là sự vô tình của người dùng nên mới xảy ra.
Cụ thể: Để thuận lợi trong việc điều chỉnh "Danh sách hàng hóa" Tiên cho NSD điều chỉnh trực tiếp trên form Continuous, người này đang điều chỉnh vào 1 trường Số lượng của Mã hàng a10 từ 10 thành 12 nhưng đang gõ 1 (Chưa gõ 2 và Enter hoặc di chuyển Focus để kết thúc điều chỉnh) thì lại mở Form xuất hàng bán, vô tình xuất vào đúng mặt hàng a10 đanh điều chỉnh nên khi lưu phiếu bị báo lỗi này.
Tiên sẽ nghiên cứu trạng thái expression .LockEdits và rs.edit để cảnh báo cho NSD quay lại hoàn thiện thao tác trên form "Danh sách hàng hóa" rồi mới tiến hành save.
Cảm ơn anh tranthanhnhan1962, maidinhdan & ongke0711 đã quan tâm giúp ! -
RE: Tạo bẫy cảnh báo Write Conflict
ongke0711 > 13-09-19, 04:33 PM
(12-09-19, 09:43 AM)Minh Tiên Đã viết: Cụ thể: Để thuận lợi trong việc điều chỉnh "Danh sách hàng hóa" Tiên cho NSD điều chỉnh trực tiếp trên form Continuous, người này đang điều chỉnh vào 1 trường Số lượng của Mã hàng a10 từ 10 thành 12 nhưng đang gõ 1 (Chưa gõ 2 và Enter hoặc di chuyển Focus để kết thúc điều chỉnh) thì lại mở Form xuất hàng bán, vô tình xuất vào đúng mặt hàng a10 đanh điều chỉnh nên khi lưu phiếu bị báo lỗi này.
Không biết bạn dùng Bound hay Unbound Form nên có làm cái demo để cùng nhau mỗ sẻ vụ "Write Conflict" này.
Tôi có làm 2 trường hợp:
- Có 1 Form tôi dùng thuộc tính RecordLocked = Edited Record của Form nhập liệu để khoá record khi chỉnh sửa (xem frmPhuLieu). Khi đó nếu mở frmNhapLieu và edit đúng dòng đang chỉnh sửa bên form kia thì nó không phản ứng gì và hiện biểu tượng khoá bên góc trái nhưng nó cũng sẽ không hiện thông báo gì. Trường hợp này thì tôi cũng chưa biết bẫy lỗi hiển thị thông báo như thế nào. Anh tranhthanhan1962 và các bạn khác có giải pháp gì thì góp ý nhé.
- Một form khác dạng Unbound thì có thể bẫy lỗi hiển thị thông báo khi bấm nút lưu. Cách này thì tôi nghĩ là dễ với bạn Minh Tiên rồi.
Link demo: http://www.mediafire.com/file/alq2h4p6in...accdb/file
-
RE: Tạo bẫy cảnh báo Write Conflict
tranthanhan1962 > 13-09-19, 07:44 PM
Ngoài thiết đặt Me.RecordLocks từ properties cũng có thể viết code để xử lý ở event Form_Open, Form_Load:
Me.RecordLocks = 0(1,2)
0: không khóa
1: khóa tất cả các record trên form
2: Chỉ khóa record hiện hành.
Sau khi thoát form viết code ở Form_Unload bỏ khóa (tránh trường hợp xảy ra lỗi khóa còn bị treo)
Còn về nó không phản ứng gì ở form bên kia thì đúng rồi, ngoại trừ khi cố gắng sửa chữa thì nó sẽ thông báo ở dòng statusbar là record bị khóa
Có vài phương pháp để xử lý nhưng cũ quá không biết nó OK với accbd không các bạn có thể nghiên cứu
https://www.experts-exchange.com/questio...nment.html
https://www.tek-tips.com/viewthread.cfm?qid=153766
Mình thì hay sử dụng thêm một field X trên table để xử lý giá trị khóa hay không khóa cho record khi form ưu tiên đến vị trí record nào đang xử lý tại form ưu tiên thì giá trị trên field đó là 1 các record còn lại là 0
ở form bên khi viết code Form_Current là
Me.Refresh
If field X =1 then msgbox ".............." -
RE: Tạo bẫy cảnh báo Write Conflict
Minh Tiên > 16-09-19, 11:49 AM
Đúng là khi dùng Bound như ongke0711 mô tả, có thấy biểu tượng đang sửa (Cây viết chì), nhưng ko biết làm sao để "bắt được" trạng thái này. (Nếu dùng UnBound thì ko vấn đề gì).
Mình cũng đã nghiên cứu theo Link bài viết của a tranhthanhnhan1962 nhưng vẫn ko cảnh báo gì.
Còn cách thiết lập cho field X như a tranthanhnhan1962 nói thì Tiên chưa hình dung được thao tác trong trường hợp Bound trên form. Dùng OnKeypress hay OnChange để thiết lập field X ? Mỗi Mã hàng có nhiều field như Soluong, Dongia, Donvitinh, ... Nếu sửa bất cứ field nào thì field X cũng đặt về 1 hay sao ? Nhờ a tranthanhnhan1962 có thể nói rõ hơn ạ ?
Cảm ơn ACE ! -
RE: Tạo bẫy cảnh báo Write Conflict
ongke0711 > 16-09-19, 12:40 PM
Tôi thì cũng có sử dụng 1 field locked để ngăn việc chỉnh sửa dữ liệu và khi người dùng.
Bạn thử cách này: Bound form
- Dùng sự kiện On Change cho toàn bộ các textbox nhập liệu trên Continuous Form của bạn sẽ gán trị true/false cho file Locked.
- Khi người dùng mở form khác có liên quan đến table đang thao tác dang dỡ sẽ kiểm tra field [Locked] để hiển thị thông báo status luôn.
Hình demo:
-
RE: Tạo bẫy cảnh báo Write Conflict
Minh Tiên > 16-09-19, 03:16 PM
Thanks ongke0711. Vẫn chưa đúng yêu cầu của mình.
Yêu của mình là Danh sách hàng hóa vẫn mở bình thường (như hình), cho phép người dùng sửa trực tiếp khi chọn Checkbox ở cột tương ứng sang trạnh thái True là sửa trực tiếp vào Record của cột đó (Khi chọn checkbox sẽ yêu cầu Pass, nếu đúng Pass thì mới chuyển trạng thái True và Unlock Textbox/Conbobox cột tương ứng).
Bình thường nếu form Danh sách hàng hóa này mở, Cho dù có Checkbox nào đó ở trạng thái True (Textbox/Conbobox: Unlock) nhưng các Record ko ở trạnh thái Editing (Cây bút chì đang viết) thì các Form nhập , xuất liên quan đến bất cứ Record nào thì đều truy xuất, ghi bình thường.
Chỉ khi có 1 Record ở trạng thái Editing (Cây bút chì đang viết) thì khi các form khác ghi vào Danh sách hàng hóa đúng mã hàng của Record đó thì mới bị báo lỗi "Write Conlict"
Hiện mình chỉ giám sát thông qua trạng thái Checkbox=true ở cột tương ứng để thông báo đang sửa.
Tuy nhiên cách này vẫn chưa tối ưu vì có thế có Checkbox đang = true những Record Editing không trùng với Record ghi vào Danh sách hàng hóa => Vẫn bị báo đang sửa.
Rất mong cả nhà cho giải pháp tối ưu. Cảm ơn nhiều !
Thân./.