Chào mừng đến với Diễn đàn Dân Kế Toán - Kế toán tổng hợp thực tế.
Trang 1 của 2 12 CuốiCuối
Kết quả 1 đến 10 của 14
  1. #1
    Ngày tham gia
    Aug 2015
    Bài viết
    0

    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 :



    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:

  2. #2
    Ngày tham gia
    Nov 2015
    Bài viết
    0
    Ðề: 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




    Trích dẫn Gửi bởi glasseggs
    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 :



    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

  3. #3
    Ngày tham gia
    Aug 2015
    Bài viết
    0
    Ðề: 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




    Trích dẫn Gửi bởi xuanthanh
    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.

  4. #4
    Ngày tham gia
    Aug 2015
    Bài viết
    0
    Ðề: 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 ).

  5. #5
    Ngày tham gia
    Aug 2015
    Bài viết
    0
    Ðề: 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




    Trích dẫn Gửi bởi glasseggs
    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

  6. #6
    Ngày tham gia
    Aug 2015
    Bài viết
    0
    Ðề: 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




    Trích dẫn Gửi bởi glasseggs
    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...

  7. #7
    Ngày tham gia
    Nov 2015
    Bài viết
    0
    Ðề: 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 !!!!!!!

  8. #8
    Ngày tham gia
    Aug 2015
    Bài viết
    0
    Ðề: 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




    Trích dẫn Gửi bởi glasseggs
    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!

  9. #9
    Ngày tham gia
    Nov 2015
    Bài viết
    0
    Ðề: 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 !

  10. #10
    Ngày tham gia
    Apr 2016
    Bài viết
    271
    Ðề: 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




    Trích dẫn Gửi bởi glasseggs
    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

 

 
Trang 1 của 2 12 CuốiCuối

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •