Giúp mình vấn đề 2 người cùng sửa dữ liệu trên 1 bản ghi qua mạng Lan

glasseggs

New Member
Hội viên mới
MÌnh có 1 phần mềm nhập dữ liệu khách hàng bằng Access, phần mềm dùng trong Công ty cho 3 máy qua mạng Lan. Sau khi test mình phát hiện ra vấn đề sau :
Nếu cùng 1 bản ghi có 2 người đang update ,thì khi 1 người update xong và lưu bản ghi thì đến lượt người thứ 2 sau khi update xong cũng sẽ lưu thì sẽ xuất hiện thông báo như sau :

cungupdatedata.jpg


Vậy các bạn có cách giải quyết nào không ? Mình nghĩ ra 2 cách nhưng không biết chuyên sâu về lập trình nên chịu .
Cách 1 . Dựa vào sự kiện Before Update trên Form để kiểm tra khi có người dùng nào thực hiện update thì kiểm tra xem có ai đang update cùng bản ghi đó chưa, nếu chưa thì cho update bình thường còn nếu đang có người update bản ghi đó thì hiện ra thông báo " Dữ liệu Khách hàng này đang được chỉnh sửa bởi 1 người khác. Xin chờ họ chỉnh sửa xong. "

Cách 2 . Đưa ra thông báo của mình thay cái thông báo tiếng Anh kia.

Cho mình giải pháp theo cách 1 thì tốt hơn cách 2.
Thanks mọi người nhé !!!
:chongmat::mua:
 
Ðề: Giúp mình vấn đề 2 người cùng sửa dữ liệu trên 1 bản ghi qua mạng Lan

MÌnh có 1 phần mềm nhập dữ liệu khách hàng bằng Access, phần mềm dùng trong Công ty cho 3 máy qua mạng Lan. Sau khi test mình phát hiện ra vấn đề sau :
Nếu cùng 1 bản ghi có 2 người đang update ,thì khi 1 người update xong và lưu bản ghi thì đến lượt người thứ 2 sau khi update xong cũng sẽ lưu thì sẽ xuất hiện thông báo như sau :

cungupdatedata.jpg


Vậy các bạn có cách giải quyết nào không ? Mình nghĩ ra 2 cách nhưng không biết chuyên sâu về lập trình nên chịu .
Cách 1 . Dựa vào sự kiện Before Update trên Form để kiểm tra khi có người dùng nào thực hiện update thì kiểm tra xem có ai đang update cùng bản ghi đó chưa, nếu chưa thì cho update bình thường còn nếu đang có người update bản ghi đó thì hiện ra thông báo " Dữ liệu Khách hàng này đang được chỉnh sửa bởi 1 người khác. Xin chờ họ chỉnh sửa xong. "

Cách 2 . Đưa ra thông báo của mình thay cái thông báo tiếng Anh kia.

Cho mình giải pháp theo cách 1 thì tốt hơn cách 2.
Thanks mọi người nhé !!!
:chongmat::mua:

Dùng phân quyền. Admin thì được update hết, User nào thì chỉ được update khách hàng thuộc User đó quản lý. Bạn thử làm theo hướng đó xem
Thân
 
Ðề: Giúp mình vấn đề 2 người cùng sửa dữ liệu trên 1 bản ghi qua mạng Lan

Dùng phân quyền. Admin thì được update hết, User nào thì chỉ được update khách hàng thuộc User đó quản lý. Bạn thử làm theo hướng đó xem
Thân

Tạm theo phương án này của xuanthanh đi bạn.
Trong bảng khách hàng, bạn có field chứa userID của người tạo mới khách hàng.
Khi có sự thay đổi, sẽ đối chiếu user hiện hành với userID của người tạo đã lưu với record đó. Nếu = thì OK. Nếu <> thì chỉ có user có quyền cao nhất được thay đổi, ngược lại thì thông báo là không cho phép xóa, sửa.
 
Ðề: Giúp mình vấn đề 2 người cùng sửa dữ liệu trên 1 bản ghi qua mạng Lan

Nhưng bác ơi . Trong Access 2007 có khoản phân quyền đó không và nó nằm ở chỗ nào.
Mình định làm theo kiểu Dựa vào sự kiện Before Update trên Form ,nhưng làm thì thấy không ổn, vì sự kiện này chỉ xảy ra khi lưu hoặc chuyển record, như vậy không tác dụng.
Sau đó mình làm trên từng sự kiện Before Update của Control thì cũng không ổn.

Vậy cho mình hỏi 2 điều :
1. Có cách nào insert được tên máy tính như 1 bản ghi vào 1 table không ?
2. Câu lệnh nào của VB để lấy ra tên máy tính đang dùng không ?.( Mục đích là mình dùng để so sánh nếu trùng mã CustID và tên máy tính thì sửa bình thường còn nếu không thì thông báo đang có người khác sửa ).
 
Ðề: Giúp mình vấn đề 2 người cùng sửa dữ liệu trên 1 bản ghi qua mạng Lan

Nhưng bác ơi . Trong Access 2007 có khoản phân quyền đó không và nó nằm ở chỗ nào.
Mình định làm theo kiểu Dựa vào sự kiện Before Update trên Form ,nhưng làm thì thấy không ổn, vì sự kiện này chỉ xảy ra khi lưu hoặc chuyển record, như vậy không tác dụng.
Sau đó mình làm trên từng sự kiện Before Update của Control thì cũng không ổn.

Vậy cho mình hỏi 2 điều :
1. Có cách nào insert được tên máy tính như 1 bản ghi vào 1 table không ?
2. Câu lệnh nào của VB để lấy ra tên máy tính đang dùng không ?.( Mục đích là mình dùng để so sánh nếu trùng mã CustID và tên máy tính thì sửa bình thường còn nếu không thì thông báo đang có người khác sửa ).

Hai câu hỏi của bạn hoàn toàn có thể làm được nhưng rất rắc rối với người "ít" am hiểu về máy tính và lập trình. Bạn làm theo phương án của tôi và của phatnq2002 sẽ dễ cho bạn quản lý hơn trong mạng LAN
Thân
 
Ðề: Giúp mình vấn đề 2 người cùng sửa dữ liệu trên 1 bản ghi qua mạng Lan

Nhưng bác ơi . Trong Access 2007 có khoản phân quyền đó không và nó nằm ở chỗ nào.
Mình định làm theo kiểu Dựa vào sự kiện Before Update trên Form ,nhưng làm thì thấy không ổn, vì sự kiện này chỉ xảy ra khi lưu hoặc chuyển record, như vậy không tác dụng.
Sau đó mình làm trên từng sự kiện Before Update của Control thì cũng không ổn.

Vậy cho mình hỏi 2 điều :
1. Có cách nào insert được tên máy tính như 1 bản ghi vào 1 table không ?
2. Câu lệnh nào của VB để lấy ra tên máy tính đang dùng không ?.( Mục đích là mình dùng để so sánh nếu trùng mã CustID và tên máy tính thì sửa bình thường còn nếu không thì thông báo đang có người khác sửa ).

Lấy về tên máy tính đang dùng ta dùng hàm Environ("ComputerName"), bạn có thể xử gì với hàm này tùy ý!

Việc tránh 2 user cùng edit 1 record ta có 2 giải pháp:
- giải pháp 1 như của Xuân Thanh.

- Giải pháp 2 : ( rất phức tạp và dễ rủi ro khi thoát chương trình đột ngột) .
Ta tạo 1 table lưu lại ID các record đang được mở. (ví dụ tblLog)
Khi 1 user khác mở record đó, đầu tiên ta vào table này kiểm tra xem có ID trùng với ID đang định mở không,
nếu có thì ra chỉ cho mở dưới dạng Read Only.
Nếu không ta cho mở bình thường , đồng thời lưu số ID vào bản tblLog
...
Sau khi User không còn mở ID đó nữa, ta phải làm động tác xóa ID này trong tblLog đi.

Đương nhiên giải pháp này hạn chế là nếu bị thoát đột ngột, sẽ có những ID bị treo trong tblLog, khi đó ta phải thiết kế thêm 1 chỗ để Clear toàn bộ tblLog.
Giải pháp này còn được dùng trong trường hợp cấm 2 người cùng truy cập với cùng Username, 2 người cùng dùng chung 1 lic ở 1 thời điểm...
 
Sửa lần cuối:
Ðề: Giúp mình vấn đề 2 người cùng sửa dữ liệu trên 1 bản ghi qua mạng Lan

Thanks bạn !
Giải pháp 2 đúng cái mình đang nghĩ đến và đang làm .
Tạo 1 Table Log có 2 trường CustID và Computername
Đầu tiên trên sự kiện Before Update của từng Control mình sẽ kiểm tra CustID và Computername đã có trong table Log chưa . Nếu chưa có hoặc có rồi nhưng trùng tên máy thì cho update bình thường. Rồi lưu CustID và Computername vào Log.
Trường hợp đã có CustID nhưng khác Computername thì hiện thông báo : "Đang có người update"

Sau đó mình dùng sự kiện After Update của Form để xóa bản ghi trong table Log đi.

Đến đấy có vẻ hoàn hảo . Nhưng đúng là mình chưa nghĩ ra trường hợp thoát đột ngột như bạn nói ( Giả sử đang update dở mà mất điện một cái thì toi, như vậy là sự kiện After Update sẽ không xảy ra)
Để xử lý tình huống này buộc phải tạo 1 Command button để xóa thủ công trong Log, như vậy cũng không hay lắm, không biết có cách nào auto không, mình nghĩ mãi không ra .
Thanks mọi người !!!!!!!
 
Ðề: Giúp mình vấn đề 2 người cùng sửa dữ liệu trên 1 bản ghi qua mạng Lan

Thanks bạn !
Giải pháp 2 đúng cái mình đang nghĩ đến và đang làm .
Tạo 1 Table Log có 2 trường CustID và Computername
Đầu tiên trên sự kiện Before Update của từng Control mình sẽ kiểm tra CustID và Computername đã có trong table Log chưa . Nếu chưa có hoặc có rồi nhưng trùng tên máy thì cho update bình thường. Rồi lưu CustID và Computername vào Log.
Trường hợp đã có CustID nhưng khác Computername thì hiện thông báo : "Đang có người update"

Sau đó mình dùng sự kiện After Update của Form để xóa bản ghi trong table Log đi.

Đến đấy có vẻ hoàn hảo . Nhưng đúng là mình chưa nghĩ ra trường hợp thoát đột ngột như bạn nói ( Giả sử đang update dở mà mất điện một cái thì toi, như vậy là sự kiện After Update sẽ không xảy ra)
Để xử lý tình huống này buộc phải tạo 1 Command button để xóa thủ công trong Log, như vậy cũng không hay lắm, không biết có cách nào auto không, mình nghĩ mãi không ra .
Thanks mọi người !!!!!!!

Auto thì thế nào? Bạn có kịch bản nào cho auto chưa? Làm sao phân biệt được ID bị kẹt với ID do người dùng đang edit? Nếu bạn vẫn đeo đuổi theo cách này thì nên phân thời gian , ví dụ so sánh thời gian hiện hành khi người dùng sau update với người dùng trước update. Nếu quá 5 phút thì ok, đồng thời clear luôn.

Giải pháp tiếp là bạn chỉ thiết kế nút clear cho user Admin. Khi bị kẹt thì chỉ có Admin mới vào clear!
 
Ðề: Giúp mình vấn đề 2 người cùng sửa dữ liệu trên 1 bản ghi qua mạng Lan

Sau một ngày CN mình đã tìm ra hướng để Auto. Kịch bản của mình như sau :
Sự cố thoát đột ngột hoàn toàn có thể xảy ra bất cứ lúc nào không thể lường trước được,do vậy thật khó để bắt lỗi nó. Và mình nghĩ ngược lại,tại sao không bắt lỗi nó khi nó chưa bị thoát .

Mình xin trình bày sơ qua thế này : Tại sự kiện Before Update của từng Control (Bắt ngay khi họ thực hiện update) mình sẽ cho chạy 2 Query . 1 cái append vào table Log (Lưu mã CustID, Computername, Username) , 1 cái Append vào table ErrorStatus ( Lưu Computername, Username).

Table ErrorStatus có 3 trường Computername, Username và Status

Tiếp đó tại sự kiện Unload của Form mình sẽ cho chạy Query update Status trong table ErrorStatus tương ứng với user và computer thành 1.
Như vậy sẽ lọc ra được những máy nào và user nào đang update thì bị tắt đột ngột vì trong trường Status của ErrorStatus sẽ là Null

Vấn đề còn lại là không biết lên thực hiện việc xóa dựa vào sự kiện nào cho tối ưu, cho vào sự kiện Loadform thì hơi bất tiện ,cho vào Oncurrent của Form thì mỗi lần next 1 bản ghi nó lại kiểm tra để xóa thì cũng không hay.
Vấn đề xóa mình đang nghĩ theo 2 hướng, nhưng chưa có kinh nghiệm hỏi các bác câu ngây ngô này chút :
Trên mạng Lan có thể có 2 máy tính trùng tên không ? Giả dụ có 2 máy tính đều tên là TUẤN ,sau đó cho kết nối mạng Lan thì nó sẽ thế nào, nó có thông báo buộc phải đổi tên không hay nó tự đổi.
Thanks các bác !
 
Ðề: Giúp mình vấn đề 2 người cùng sửa dữ liệu trên 1 bản ghi qua mạng Lan

Sau một ngày CN mình đã tìm ra hướng để Auto. Kịch bản của mình như sau :
Sự cố thoát đột ngột hoàn toàn có thể xảy ra bất cứ lúc nào không thể lường trước được,do vậy thật khó để bắt lỗi nó. Và mình nghĩ ngược lại,tại sao không bắt lỗi nó khi nó chưa bị thoát .

Mình xin trình bày sơ qua thế này : Tại sự kiện Before Update của từng Control (Bắt ngay khi họ thực hiện update) mình sẽ cho chạy 2 Query . 1 cái append vào table Log (Lưu mã CustID, Computername, Username) , 1 cái Append vào table ErrorStatus ( Lưu Computername, Username).

Table ErrorStatus có 3 trường Computername, Username và Status

Tiếp đó tại sự kiện Unload của Form mình sẽ cho chạy Query update Status trong table ErrorStatus tương ứng với user và computer thành 1.
Như vậy sẽ lọc ra được những máy nào và user nào đang update thì bị tắt đột ngột vì trong trường Status của ErrorStatus sẽ là Null

Vấn đề còn lại là không biết lên thực hiện việc xóa dựa vào sự kiện nào cho tối ưu, cho vào sự kiện Loadform thì hơi bất tiện ,cho vào Oncurrent của Form thì mỗi lần next 1 bản ghi nó lại kiểm tra để xóa thì cũng không hay.
Vấn đề xóa mình đang nghĩ theo 2 hướng, nhưng chưa có kinh nghiệm hỏi các bác câu ngây ngô này chút :
Trên mạng Lan có thể có 2 máy tính trùng tên không ? Giả dụ có 2 máy tính đều tên là TUẤN ,sau đó cho kết nối mạng Lan thì nó sẽ thế nào, nó có thông báo buộc phải đổi tên không hay nó tự đổi.
Thanks các bác !


Nếu thực sự bạn muốn theo hướng ủũa mình thì bạn nên thay cái ComputerName bằng một cái Serial của ổ đĩa. Lý do :
1/ Nhiều máy có thể có cùng một computername khi dùng trong mạng lan của đơn vị
2/ Mổi lần cài lại Win là cái ComputerName có thể bị thay đổi(Chuyện này xảy ra như cơm bữa)
3/ Dùng Serial của ổ cứng, chỉ khi nào thay ổ cứng thì nó mới thay đổi(Chuyện này ít xảy ra hơn)

Vài lời trao đổi cùng bạn
Thân
 
Ðề: Giúp mình vấn đề 2 người cùng sửa dữ liệu trên 1 bản ghi qua mạng Lan

Cách xóa của mình vẫn không ổn, nó vẫn vậy. Thôi làm theo cách của LoveBlue tạo 1 nút để Clear vậy.
Thanks mọi người nhé !
 
Ðề: Giúp mình vấn đề 2 người cùng sửa dữ liệu trên 1 bản ghi qua mạng Lan

LoveBlue ơi . 3 hàm đọc thông số CPU , Main và Driver của bạn thì cái đọc Main không lỗi nhưng chỉ hiện ra dấu phẩy . Cái Driver thì lỗi như sau :
Lỗi 450 . Wrong number of arguments or invalid property assignment .
Nhấn Debug thì nó báo lỗi dòng này :
Set Drv = fso.GetDrive()

Chỉ có cái CPU là ngon lành.

Cho mình hỏi chút ,liệu cái số serial CPu ,main và HDD này là duy nhất không có nhà sản xuất nào trùng nhau à .
Thanks
 
Sửa lần cuối:
Ðề: Giúp mình vấn đề 2 người cùng sửa dữ liệu trên 1 bản ghi qua mạng Lan

LoveBlue ơi . 3 hàm đọc thông số CPU , Main và Driver của bạn thì cái đọc Main không lỗi nhưng chỉ hiện ra dấu phẩy . Cái Driver thì lỗi như sau :
Lỗi 450 . Wrong number of arguments or invalid property assignment .
Nhấn Debug thì nó báo lỗi dòng này :
Set Drv = fso.GetDrive()

Chỉ có cái CPU là ngon lành.

Cho mình hỏi chút ,liệu cái số serial CPu ,main và HDD này là duy nhất không có nhà sản xuất nào trùng nhau à .
Thanks

Mấy cái hàm này mình sưu tầm chứ chưa dùng thử! Các số Seria là duy nhất, nhưng hiện tại có 1 số cao thủ viết hook giả lập cho máy nhận nhầm số Seria định sẵn. Mình nghĩ trong phạm vi chương trình của bạn chẳng ai làm chuyện đó đâu nhỉ!
 

CẨM NANG KẾ TOÁN TRƯỞNG


Liên hệ: 090.6969.247

KÊNH YOUTUBE DKT

Cách làm file Excel quản lý lãi vay

Đăng ký kênh nhé cả nhà

SÁCH QUYẾT TOÁN THUẾ


Liên hệ: 090.6969.247

Top