• Lỗi trùng mã khách hàng
  • Lỗi trùng mã khách hàng

    cannguyen > 15-06-17, 02:48 PM

    Chào các bạn
    Mình cần tạo form Bệnh nhân với yêu cầu Mã khách hàng sắp xếp theo ngày. Cấu trúc Mã BN như sau: Năm+Tháng+Ngày+STT. Ví dụ: 2017061501
    Mình viết lệnh cho sự kiện như sau:

    If [NgayNay] = [NgayTruoc] Then
    L2 = BNCuoi + 1
    Else
    L2 = 1
    End If
    DoCmd.GoToRecord , , acNewRec
    MaBN = Year(NgayDau) & Right(("0" & Month(NgayDau)), 2) & Right(("0" & Day(NgayDau)), 2) & Right(("00" & L2), 2)

    Nhâp 1 máy thì ok nhưng nhập nhiều máy thì lỗi trùng mã bệnh nhân. Nhờ các bạn giúp nhé
    Mình gửi kèm link: https://drive.google.com/open?id=0B7F3oA...HNoeE5nNm8

    Cám ơn các bạn
  • RE: Lỗi trùng mã khách hàng

    ongke0711 > 15-06-17, 05:45 PM

    Nếu bạn đang nhập bệnh nhân mới và chưa lưu record thì [BNCuoi] vẫn chưa thay đổi, khi đó máy khác cũng nhập thì nó sẽ lấy lại cùng mã [BNCuoi] để + 1 sau đó cùng lưu sẽ đụng với record bạn vừa nhập.
  • RE: Lỗi trùng mã khách hàng

    tranthanhan1962 > 15-06-17, 07:16 PM

    Nếu nhập với nhiều máy để chắc chắn không trùng mã, bạn phải thêm vào mã máy mới chắc ăn (lúc này có thể xảy ra bệnh nhân trùng số thứ tự nhưng khác mã máy). Nếu muốn nhập với nhiều máy mà không thêm mã máy bạn có thể thiết đặt properties của form RecordLock = All Record (cấm nhập + cấm sửa) hoặt Edited Record (cấm nhập + cho sửa). Khi máy nào mở trước sẽ khóa quyền thêm bệnh nhân mới tất cả các máy khác. Lúc này dù nhiều máy, vẫn chỉ sử dụng được như một máy (máy nào mở form đầu tiên). Thường các bệnh viện chỉ sử dụng một máy để nhận bệnh nhân mới (một cửa), các máy khác thì truy cập và xử lý các phần còn lại.
  • RE: Lỗi trùng mã khách hàng

    cannguyen > 16-06-17, 12:47 AM

    (15-06-17, 05:45 PM)ongke0711 Đã viết: Nếu bạn đang nhập bệnh nhân mới và chưa lưu record thì [BNCuoi] vẫn chưa thay đổi, khi đó máy khác cũng nhập thì nó sẽ lấy lại cùng mã [BNCuoi] để + 1 sau đó cùng lưu sẽ đụng với record bạn vừa nhập.

    Thực ra lúc này là lưu rồi đó ongke0711. Tuy là nút thêm mới nhưng mình "ăn gian" cho lưu luôn nhưng vẫn không được. Nhập nhiều máy vẫn bị trùng. ongke0711 và bạn nào biết xem giúp mình nhé (Mình gửi file đính kèm). Cám ơn
    https://drive.google.com/open?id=0B7F3oA...HNoeE5nNm8
  • RE: Lỗi trùng mã khách hàng

    cannguyen > 16-06-17, 12:52 AM

    (15-06-17, 07:16 PM)tranthanhan1962 Đã viết: Nếu nhập với nhiều máy để chắc chắn không trùng mã, bạn phải thêm vào mã máy mới chắc ăn (lúc này có thể xảy ra bệnh nhân trùng số thứ tự nhưng khác mã máy). Nếu muốn nhập với nhiều máy mà không thêm mã máy bạn có thể thiết đặt properties của form RecordLock = All Record (cấm nhập + cấm sửa) hoặt Edited Record (cấm nhập + cho sửa). Khi máy nào mở trước sẽ khóa quyền thêm bệnh nhân mới tất cả các máy khác. Lúc này dù nhiều máy, vẫn chỉ sử dụng được như một máy (máy nào mở form đầu tiên). Thường các bệnh viện chỉ sử dụng một máy để nhận bệnh nhân mới (một cửa), các máy khác thì truy cập và xử lý các phần còn lại.

    Cám ơn bác nhưng như vậy không được bác à. PK đông nên phải nhiều máy làm BN đỡ phải chờ. Em gửi link bác ngâm cứu thêm giúp nhé
    Cám ơn bác
    https://drive.google.com/open?id=0B7F3oA...HNoeE5nNm8
  • RE: Lỗi trùng mã khách hàng

    tranthanhan1962 > 16-06-17, 05:15 AM

    (16-06-17, 12:52 AM)cannguyen Đã viết: Cám ơn bác nhưng như vậy không được bác à. PK đông nên phải nhiều máy làm BN đỡ phải chờ. Em gửi link bác ngâm cứu thêm giúp nhé
    Cám ơn bác
    Nếu tạo mã tự động, nguyên tắc xử lý là vậy, không thể khác được. Để tránh việc trùng mã, bạn phải chọn một trong 2:
    Nhập 1 máy hoặc ưu tiên xử lý nhập cho máy mở form trước => Bảo đảm việc xử lý số thứ tự không cần mã của máy tham gia.
    Nhập nhiều máy=> Chấp nhận sự tham gia của mã máy nhập, chập nhận trùng số thứ tự khi có máy nhập cùng thời điểm.
    Tất nhiên còn một số cách xử lý:
    1/Cuối ngày chạy lại mã: Bạn không thể dùng cách này vì sau khi đăng ký bệnh nhân mới, phải in ngay tem mã vạch để dán vào sổ khám bệnh. Việc chạy lại mã làm sai mã trên tem.
    2/Xử lý kiểu hóa đơn đỏ: Tạo trước số lượng mã thừa trong ngày, phân phối cho từng máy. Ví dụ: có 5 máy, trung bình 400 người đăng ký / ngày, tạo 500 mã, phân phối máy 1= 1-100, máy 2 = 101-200, máy 3=201-300, việc này cũng sẽ có một số yếu điểm như mã thừa không sử dụng được qua ngày hôm sau nếu mã có thêm ngày. Ví dụ ngày 15/6/2017 còn thừa từ mã 20170615091 - 20170615100 sẽ không sử dụng được ngày hôm sau vì nó phải được bắt đầu từ 20170619001, trong khi đó các số 20170615101, 20170615102 đã được máy khác sử dụng. Muốn xử dụng kiểu này bạn chỉ được lấy STT mà không lấy ngày để ngày hôm sau có thể sử dụng các mã thừa. Kiểu này sẽ làm tăng ký tự mã vì số tứ tự sẽ tăng vô hạn.
    3/Viết code khóa record kiểu đập - nhả, ai tạo lệnh record mới trước sẽ khóa record, sau khi tạo mã xong chuyển textbox khác sẽ mở  form RecordLock = No cho máy khác tạo rồi điền các mục khác. Kiểu này vẫn có thể bị xung đột dữ liệu trong trường hợp 2 máy đều ra lệnh cùng thời điểm.
    Theo mình cũng không nên quan trọng lắm số thứ tự. Cứ kèm mã máy vào số thứ tự là hay nhất, Ví dụ 01-201706151001, 02-201706151002, 03-201706151003, lỡ có trùng số thứ tự 04-201706151004, 05-201706151004 cũng chẳng sao. Việc tạo mã bệnh nhân không có nghĩa là đếm số thứ tự bệnh nhân mà chỉ nhằm tối ưu hóa để in tem mã vạch sổ khám bệnh
  • RE: Lỗi trùng mã khách hàng

    cannguyen > 16-06-17, 10:12 AM

    (16-06-17, 05:15 AM)tranthanhan1962 Đã viết:
    (16-06-17, 12:52 AM)cannguyen Đã viết: Cám ơn bác nhưng như vậy không được bác à. PK đông nên phải nhiều máy làm BN đỡ phải chờ. Em gửi link bác ngâm cứu thêm giúp nhé
    Cám ơn bác
    Nếu tạo mã tự động, nguyên tắc xử lý là vậy, không thể khác được. Để tránh việc trùng mã, bạn phải chọn một trong 2:
    Nhập 1 máy hoặc ưu tiên xử lý nhập cho máy mở form trước => Bảo đảm việc xử lý số thứ tự không cần mã của máy tham gia.
    Nhập nhiều máy=> Chấp nhận sự tham gia của mã máy nhập, chập nhận trùng số thứ tự khi có máy nhập cùng thời điểm.
    Tất nhiên còn một số cách xử lý:
    1/Cuối ngày chạy lại mã: Bạn không thể dùng cách này vì sau khi đăng ký bệnh nhân mới, phải in ngay tem mã vạch để dán vào sổ khám bệnh. Việc chạy lại mã làm sai mã trên tem.
    2/Xử lý kiểu hóa đơn đỏ: Tạo trước số lượng mã thừa trong ngày, phân phối cho từng máy. Ví dụ: có 5 máy, trung bình 400 người đăng ký / ngày, tạo 500 mã, phân phối máy 1= 1-100, máy 2 = 101-200, máy 3=201-300, việc này cũng sẽ có một số yếu điểm như mã thừa không sử dụng được qua ngày hôm sau nếu mã có thêm ngày. Ví dụ ngày 15/6/2017 còn thừa từ mã 20170615091 - 20170615100 sẽ không sử dụng được ngày hôm sau vì nó phải được bắt đầu từ 20170619001, trong khi đó các số 20170615101, 20170615102 đã được máy khác sử dụng. Muốn xử dụng kiểu này bạn chỉ được lấy STT mà không lấy ngày để ngày hôm sau có thể sử dụng các mã thừa. Kiểu này sẽ làm tăng ký tự mã vì số tứ tự sẽ tăng vô hạn.
    3/Viết code khóa record kiểu đập - nhả, ai tạo lệnh record mới trước sẽ khóa record, sau khi tạo mã xong chuyển textbox khác sẽ mở  form RecordLock = No cho máy khác tạo rồi điền các mục khác. Kiểu này vẫn có thể bị xung đột dữ liệu trong trường hợp 2 máy đều ra lệnh cùng thời điểm.
    Theo mình cũng không nên quan trọng lắm số thứ tự. Cứ kèm mã máy vào số thứ tự là hay nhất, Ví dụ 01-201706151001, 02-201706151002, 03-201706151003, lỡ có trùng số thứ tự 04-201706151004, 05-201706151004 cũng chẳng sao. Việc tạo mã bệnh nhân không có nghĩa là đếm số thứ tự bệnh nhân mà chỉ nhằm tối ưu hóa để in tem mã vạch sổ khám bệnh

    Cám ơn bạn. Mục đích mình tạo mã khách hàng  như thế là để biết được trong ngày có bao nhiêu bệnh nhân đó bạn. Nên việc gắn tên máy là không phù hợp
    Mình đã tìm ra được 1 cách tuy nhiên nó không hoàn hảo và pro cho lắm.
    Ví dụ: 2 máy đều mở form Bệnh nhân
    Máy 1: Đang ở BN 01 (Đã lưu), mã BN sẽ là 2017061601
    Máy 2: Khi thêm mới, mã BN sẽ nhảy đúng là 2017061602
                    Khi thêm mới tiếp theo, mã BN cũng sẽ nhảy đúng là 2017061603
                    Khi thêm mới tiếp theo, mã BN cũng sẽ nhảy đúng là 2017061604
    è Lúc này máy 1 mà thêm mới thì mã BN sẽ là 2017061602. Nhưng khi nhấn nút lưu thì không thông báo hoàn tất mà đứng ở mã BN 02. Nhấn Lưu lần nữa mã BN sẽ là 03. Nhấn lần nữa mã BN sẽ là 04. Nhấn thêm lần nữa Mã BN sẽ là 05, lúc này mới thông báo hoàn tất và lưu bệnh nhân với mã BN là 05 (Đúng, vì máy 2 đã tạo từ 01-04). Tuy nhiên phải nhấn quá nhiều lần, mình thấy không ổn
    Bạn nào sửa giúp:
    + 1 là cho chạy tự động (thay vì nhấn nút lưu nhiều lần) cho đến khi mà BN là 05
    + 2 là sửa lại câu lệnh để khi máy 1 thêm mới thì mã BN tạm sẽ là 02 nhưng khi nhấn lưu thì tự động thành 05
    Hơi khó diễn đạt, không biết các bạn hiểu không, có lẽ xem file sẽ rõ hơn. Mỗi lần các bạn nhấn nút lưu thì quan sát Mã BN nhé
     
    https://drive.google.com/open?id=0B0RFCM...0ZwLTB0dUk
  • RE: Lỗi trùng mã khách hàng

    tranthanhan1962 > 16-06-17, 10:53 AM

    Mình chưa xem CSDL của bạn. Nhưng vấn đề để biết bao nhiêu bệnh nhân trong ngày không quá phức tạp như vậy đâu. Chỉ cần một total query là xong.
  • RE: Lỗi trùng mã khách hàng

    cannguyen > 16-06-17, 11:48 AM

    (16-06-17, 10:53 AM)tranthanhan1962 Đã viết: Mình chưa xem CSDL của bạn. Nhưng vấn đề để biết bao nhiêu bệnh nhân trong ngày không quá phức tạp như vậy đâu. Chỉ cần một total query là xong.

    Hi bác, đúng là muốn biết bao nhiêu BN thì chẳng có gì khó. Thậm chí có thể thể hiện số bệnh nhân trong ngày ngay trên textbox của form nhưng như vậy không hay lắm bác. Hơn nữa không phải em chỉ làm mã bệnh nhân nhảy theo ngày mà còn nhiều mã khác going như thế (Số phiếu khám,Số chứng từ điều trị,...) như vậy sẽ rất rối và bất tiện. Em thấy kiến thức bác rất ok nên nhờ bác xem giúp em nhé
    Cám ơn bác
  • RE: Lỗi trùng mã khách hàng

    tranthanhan1962 > 16-06-17, 12:45 PM

    Hiện nay mình vẫn thấy cả các bệnh viện lớn vẫn xử dụng một máy để nhận bệnh nhân, dữ liệu chuyển giao 1-1-1...cho các phòng ban khác tuần tự đến khi phát thuốc. thực ra các số thứ tự không hề giống nhau có người đăng ký rồi bỏ (không khám), có người khám rồi không mua thuốc, bệnh cũng khác nhau, có người chụp X quang - người không, người thì xét nghiệm cái này, cái kia, người khám trước có thể thanh toán tiền xuất viện sau, và ngược lại .  Vì vậy việc đồng bộ của bạn gần như không thể. Bạn cũng không thể quản lý được thời khắc nhập bệnh nhân, nhấn nút lưu của từng cán bộ nhập máy, nên yêu cầu của bạn gần như không tưởng. Sorry, mình chịu thua.  Banghead