Đánh giá chủ đề:
  • 0 Votes - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[Hỏi] Ứng dụng chạy trong mạng lan
#1
Chào các bạn.
Mình có 1 file ứng dụng access được chia front end và backend. Mình có thiết kế 1 form dùng để chỉnh sửa thông tin của nhân viên, trong form có nút chỉnh sửa. Mình muốn khi 1 client ấn vào nút sửa này thì client khác nếu ấn nút sửa tiếp trên chính record đó sẽ gặp thông báo "nhân viên này đang được chỉnh sửa bởi tài khoản khác", và mình đã tìm ra cách như sau: Tạo 1 table tên là lock, khi client1 ấn nút sửa tự động thêm vào bảng này mã của cái nhân viên đang được sửa kia, khi client2 mở chương trình ấn vào nút sửa thì tự động check trong bảng lock này nếu tồn tại mã nhân viên kia thì hiện thông báo. Đến khi client1 ấn nút lưu thì thực hiện lệnh xóa cái mã nhân viên trong table lock, khi đó client2 mới có thể ấn sửa trên record đó được. 

Nhưng đến đây mình gặp vấn đề, mà theo mình nghĩ có lẽ là độ trể của việc thêm record vào bảng lock, tại vì mình test thử nếu client1 ấn nút sửa, thì client2 ấn nút sửa trể hơn khoảng vài % giây thì vẫn sửa được chứ không có hiện lên msgbox. Nếu client2 đợi khoảng vài giây sau khi client1 bấm nút sửa thì mới hiện lên msgbox, hoặc client2 bấm nút refresh (form này mình có thiết kế nút refresh) thì sau đó bấm nút sửa sẽ hiện lên msgbox.

Câu lệnh để check trong bảng lock khi ấn nút sửa mình thiết kế như sau: 
If dcount("manv" , "lock", "manv =  ' " & me.txt1 & " ' " ) = 1 then
msgbox "thông báo đang được chỉnh sửa"
else
Thực hiện lệnh tiếp theo


Vậy các bạn cho minh hỏi có cách nào cho nó bắt dữ liệu ngay lập tức không, tức là không có độ trể như minh đề cập ở trên.
Và 1 vấn đề nữa là việc thêm nhân viên mới tránh bị trùng khóa chính, ý tưởng của mình là dùng unbound form, khi ấn lưu thì sử dụng lệnh dmax("manv","nhanvien") + 1  như vậy có đảm bảo ko. Nếu bạn nào có cách hay hơn thì giúp mình nhé.

Cho minh cám ơn bạn trước, chúc các bạn sức khỏe.
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
Thiết kế form trong cơ sở dữ liệu nhiều người dùng cho phép thiết đặt khóa record đối với người dùng khác làm việc cùng record là thiết đặt form properties record Lock với 3 giá trị: No Locks (không khóa) điều này sẽ xảy ra lỗi khi 2 người cùng sửa một record, All record (khi mở form sẽ khóa tất cả các record trên record source của form) điều này gây hạn chế rất lớn vì người đầu tiên mở form mới làm việc được với các record, những người mở form sau đó chỉ có ngồi nhìn  018 . Edited Record (Khi một người sửa đổi record thì record sẽ bị khóa, những người khác sẽ không sửa được cho đến khi người thứ nhất sửa xong - form refresh, thì những người khác mới làm việc được).
Về vấn đề tạo record mới có khóa chính:
1/Dữ liệu được truyền qua mạng Lan luôn luôn có độ trể.
2/Không thể kiểm soát được tốc độ trể của từng máy (do rất nhiều yếu tố quyết định, tốc độ các mạng của các main, độ dài cab, lượng dữ liệu truyền tải - nên nhớ dữ liệu truyền qua mạng có thể nhiều thứ chứ không chỉ có tín hiệu của CSDL)
Cách xử lý:
1/Chỉ cho một máy duy nhất tạo các record có khóa chính.
2/Khi tạo khóa chính kèm theo chỉ số phụ của máy (Ví dụ: Khóa chính là 123, sẽ có 123-May1, 123-May2...)
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 mrsiro
#3
Cách khóa record bằng property lock của form rất là bất tiện bạn à. Ví dụ thế này cuối mỗi ngày sẽ chạy code insert vào bảng luuhoadon toàn bộ những record trong bảng hoadon chẳng hạn, nhưng nếu có 1 client nào đó đang ấn chỉnh sửa record trong bảng hoadon thì câu lệnh insert kia không thể thực hiện được, chỉ khi nào client ấn lưu thì mới có thể chạy dc lệnh insert. Vậy nếu xảy ra trường hợp nhân viên ấn chỉnh sửa mà ko ấn lưu, rồi khóa cửa phòng đi về chằng hạn, khi đó không thể thực hiện lệnh insert => hỏng việc.

Vì thế cho nên mình mới nghĩ ra cách như trên thêm mã hóa đơn đó vào bảng lock khi ấn chỉnh sửa, cuối ngày nếu mà nhân viên đó có đóng cửa đi về đi chăng nữa thì mình có thể vào bảng lock xóa mã hóa đơn trong đó là thực hiện câu lệnh insert bình thường. Nhưng như bạn nói về độ trể của access nên khi 2 client ấn sửa trên cùng record mà ấn cùng lúc thì bẫy lỗi không tác dụng. Không biết là bạn còn cao kiến gì không.

Còn vấn đề thêm record tránh bị trùng khóa chính khi nhiều client cùng thêm, thì cách của bạn cũng hay, nhưng phải lấy tên máy thì phiền, đôi khi mã khóa chính cần để là dạng số để dễ sắp xếp chẳng hạn, mà thêm có cả tên máy thì ko hay cho lắm. Bạn còn cách nào không chỉ mình với.
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
#4
Đây là vấn đề tổ chức của bạn. Không phải cái gì máy cũng có thể làm thay con người. Nhưng cũng có một vài cách để hỗ trợ xử lý.
1/Bạn có thể thiết đặt tất cả các máy tự động tắt máy sau giờ làm việc (ví dụ 17h). Tất nhiên máy của bạn có thể còn hoạt động để bạn cho phần mềm làm công việc gì đó (insert, update...)
2/Với một form có recordsource thì bạn không cần phải lưu. Record sẽ tự động refresh khi close form hoặc đóng ứng dụng.
3/Ngoài cách khóa trực tiếp trên properties form bạn có thể dùng phương thức Edit và Update trên table Me.RecordsetClone Với 2 cơ chế khóa thụ động (pessimistic), và khóa chủ động (optimistic).

Khóa thụ động:
Mã:
Sub PessimisticLock()
Dim rst As Recordset
Set rst = Me.recordsetClone
...
rst.LockEdits = True
rst.Edit    ' Bắt đầu khóa record
rst!<tên field> = <Giá trị mới>
rst.Update   !Ghi xuống đĩa và mở khóa ra
rst.LockEdits = False
...
End Sub

Khóa chủ động:

Mã:
Sub OptimisticLock()
Dim rst As Recordset
Set rst = Me.recordsetClone
...
rst.Edit    
rst!<tên field> = <Giá trị mới>
rst.LockEdits = True
rst.Update   !Ghi xuống đĩa và mở khóa ra
rst.LockEdits = False
...
End Sub

Đôi khi khi xung đột khóa xuất hiện. Cần phải dùng kỹ thuật On Error trong các sub liên quan để xử lý:
3260: Khi record hiện hành bị khóa bởi người sử dụng khác. Phải chờ một thời gian ngắn sau đó thử khóa lại.
3197: Record đã bị người dùng khác vừa thay đổi giá trị. Phải refresh dữ liệu rồi mới khóa record lại.
3167: Record đã bị người sử dụng khác vừa xóa bỏ. Phải refresh dữ liệu, tất nhiên record này cũng mất tiêu luôn.
3197: Record bị người dùng khác vừa mới thay đổi giá trị. Có 2 chọn lựa 1/Ghi chồng lên thay đổi người khác. 2/Chấp nhận thay đổi đó.
3186: Xảy ra khi update để lưu record lại trên trang đang bị khóa.
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 mrsiro
#5
Chào các Bạn,

Các Bạn có thể sử dụng thuộc tính Dirty của Form để xử lý chuyện này.
Dirty của Form sẽ có giá trị = True khi Record đang bị thay đổi và chưa được lưu lại, và có giá trị = False khi các thay đổi đã được lưu lại rồi.

Sau đây là 1 giải pháp gợi ý trong trường hợp thông thường: nếu User duy trì tình trạng Dirty = True quá 1 thời gian xác định nào đó (thường chỉ 1 vài giây):
+ Ứng dụng sẽ tự động cho lưu
+ Hoặc ứng dụng cho copy các thay đổi vào Clipboard, sau đó trả Record về như cũ và hiện cảnh báo yêu cầu User xử lý ngay, nếu không xử lý các thay đổi sẽ bị bỏ qua.

Còn cách ưu việt nhất là đừng thiết kế Bound Form mà hãy dùng UnBound Form, nghĩa là Form không được khai báo gắn kết với 1 nguồn dữ liệu nào cả, khi cần lưu lại nội dung ta vừa nhập trên Form thì bấm 1 nút lệnh để gọi một thủ tục thêm mới hoặc sửa chữa Record tương ứ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 maidinhdan , tranthanhan1962 , mrsiro
#6
Chào các Bạn,

Có Bạn vừa gửi email hỏi tôi về vấn đề này có kèm theo file ứng dụng có dữ liệu.

File ứng dụng do Bạn ấy thiết kế có 1 form thiết kế để nhập chứng từ bán hàng phát sinh, gồm có:
+ Main Form: ghi thông tin chung của chứng từ (số chứng từ, ngày lập chứng từ, khách mua hàng, ...)
+ Sub Form: ghi chi tiết hàng hóa phát sinh của chứng từ (mã hàng, tên hàng, đơn vị tính, đơn giá, chiết khấu, thành tiền)

Tất cả đều là Bound Form

Bạn ấy than là Form load lên quá chậm (dữ liệu phát sinh của Bạn ấy có trên 30.000 chứng từ) và hỏi tôi cách khắc phục.

Việc khắc phục việc Form này load lên chậm rất đơn giản thôi các Bạn ạ, cụ thể như thế này:
- Tại sao chúng ta lại cho nạp tất tần tật trên 30.000 chứng từ lên form chi vậy?
- Sao chúng ta không hạn chế số mẫu tin được nạp theo nguyên tắc: cần tới đâu lấy tới đó thôi.

- Tôi xin đưa ra giải pháp cho trường hợp này là:
+ Nếu các Bạn muốn sử dụng 1 Bound Form, nghĩa là luôn gắn kết form với 1 nguồn dữ liệu xác đinh, thì hãy giới hạn nguồn dữ liệu ấy (RecordSource) ở giới hạn thấp nhất, đến zero mẫu tin nếu được.
+ Nếu mở form ra để nhập chứng từ mới phát sinh thì ta đặt RecordSource với điều kiện lọc tương tự như sau:
Mã:
SELECT ... 
FROM ...
WHERE((tableChungtu.SoChungtu) Is Null)
+ Khi nào cần tìm và mở ra xem nội dung các chứng từ theo điều kiện nào đó thì ta lại khai báo RecordSource cho form với điều kiện ở mệnh đề WHERE một cách thích hợp.

+ Tôi xin thêm một gợi ý nữa trong thiết kế form này là: nên bố trí 1 nút lệnh "thêm mới" với thủ tục cho nạp lại RecordSource có giới hạn về zero mẫu tin như đã nêu ở trên và đưa Form về trạng thái sẵn sàng nhận dữ liệu mới:
Mã:
...
WHERE((tableChungtu.SoChungtu) Is Null)

Vậy là gọn gàng, vừa đủ dùng cho nhu cầu, nên form load lên sẽ nhanh hơn rất nhiều, lại giới hạn được xung đột ở mức tối thiểu. 

Chúc các Bạn thành cô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 DooHoaangPhuuc , cpucloi , tranthanhan1962


Có thể liên quan đến chủ đề
Chủ đề: Tác giả Trả lời: Xem: Bài mới nhất
  [Hỏi] Cách tạo Cbo để lọc các mặt hàng trong Sub Form samacxanh 3 270 17-10-18, 10:33 AM
Bài mới nhất: vulhu06
  Tạo thêm trường số thứ tự trong subform? feeling 1 129 05-10-18, 08:08 AM
Bài mới nhất: cpucloi
  Tìm kiếm Record ngay khi gõ trong Combobox - Class ongke0711 9 657 25-09-18, 12:00 PM
Bài mới nhất: ledangvan
  [Help] Sự kiện gotforcus và after update ko đúng trong Main-sub form NguyenDungAnh 9 398 09-09-18, 11:03 PM
Bài mới nhất: NguyenDungAnh
  [Help] Khoá phím shift + khóa Design View trong access Cuong Servenet 1 194 22-08-18, 02:18 PM
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ơ| PMA Nha Trang| Gỗ Acrylic Không Đường Line