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

    cannguyen > 16-06-17, 01:16 PM

    (16-06-17, 12:45 PM)tranthanhan1962 Đã viết: 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

    ý em không phải đồng bộ trước sau như bác nói. Thôi vụ của em xem như bỏ qua, em cho người nhập nhấn lưu mấy phát cũng ok rồi.
    Nhưng ví dụ đây là phần mềm kế toán thì sao bác? Phiếu thu/chi không thể trùng số (trong 1 tháng hoặc 1 năm, tùy công ty). Ví dụ: PCHI-01, PCHI-02 chứ không thể là M1-PCHI-01, M2-PCHI-01 được bác. Không lẽ đây là hạn chế của access? Có lẽ không phải, do em gà mờ nên chưa tìm ra cách thôi. Bác nào biết giúp em nhé
  • RE: Lỗi trùng mã khách hàng

    ongke0711 > 16-06-17, 04:14 PM

    Theo tôi biết thì dùng Dmax()+1 cho sự kiện Before Update của form sẽ dùng đc cho môi truờng nhiều nguời dùng. Để test lại xem thử.
  • RE: Lỗi trùng mã khách hàng

    cannguyen > 16-06-17, 04:22 PM

    (16-06-17, 04:14 PM)ongke0711 Đã viết: Theo tôi biết thì dùng Dmax()+1 cho sự kiện Before Update của form sẽ dùng đc cho môi truờng nhiều nguời dùng. Để test lại xem thử.

    Vậy nhờ bác giúp nhé
  • RE: Lỗi trùng mã khách hàng

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

    (16-06-17, 01:16 PM)cannguyen Đã viết: ý em không phải đồng bộ trước sau như bác nói. Thôi vụ của em xem như bỏ qua, em cho người nhập nhấn lưu mấy phát cũng ok rồi.
    Nhưng ví dụ đây là phần mềm kế toán thì sao bác? Phiếu thu/chi không thể trùng số (trong 1 tháng hoặc 1 năm, tùy công ty). Ví dụ: PCHI-01, PCHI-02 chứ không thể là M1-PCHI-01, M2-PCHI-01 được bác. Không lẽ đây là hạn chế của access? Có lẽ không phải, do em gà mờ nên chưa tìm ra cách thôi. Bác nào biết giúp em nhé
    Phần mềm kế toán có nhiều cách xử lý. Đối với các phiếu thu chi nhập xuất  đóng sẳn Numéro thì chỉ gõ đúng số Numéro trên cùi phiếu là được. Vã lại thông thường nếu cho số phiếu tự động thì cũng không xảy ra lỗi vì thường là 1 máy ra phiếu thu + phiếu xuất, một máy ra phiếu nhập + chi, cũng có rất nhiều đơn vị chỉ có một nhân viên xử lý phiếu (1 kế toán viên nhập liệu), nên không có việc trùng dữ liệu xảy ra. Đối với ngân hàng, họ xử lý số phiếu chỉ có số thứ tự chứ không đưa ngày vào số phiếu  và cấp cho từng máy riêng từng sery số phiếu, khi hết họ sẽ cấp cho sery khác (nhân viên nhập liệu chịu trách nhiệm trên sery phiếu của mình), Hóa đơn tự in của các công ty phải đăng ký các sery hóa đơn cho chi cục thuế hay cục thuế trực tiếp quản lý. Vì vậy có những công ty đăng ký số lượng hóa đơn lớn xuất 2-3 năm vẫn còn nên bạn sẽ thấy ví dụ như ngày xuất là 1/6/2017 mà mã số hóa đơn có đuôi là 15E (có nghĩa là số này được đăng ký từ năm 2015)
    Cách quản lý tuy có khác nhau nhưng ngày và số phiếu là 2 đơn vị độc lập không dính vào như mã số bệnh nhân của bạn. Bạn có quyền xuất một phiếu số 120 trước số 40 với yêu cầu khi đơn vị thuế kiểm tra bạn có một giải trình hợp lý.
  • RE: Lỗi trùng mã khách hàng

    tieu_ngao > 16-06-17, 08:20 PM

    (16-06-17, 01:16 PM)cannguyen Đã viết:
    (16-06-17, 12:45 PM)tranthanhan1962 Đã viết: 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

    ý em không phải đồng bộ trước sau như bác nói. Thôi vụ của em xem như bỏ qua, em cho người nhập nhấn lưu mấy phát cũng ok rồi.
    Nhưng ví dụ đây là phần mềm kế toán thì sao bác? Phiếu thu/chi không thể trùng số (trong 1 tháng hoặc 1 năm, tùy công ty). Ví dụ: PCHI-01, PCHI-02 chứ không thể là M1-PCHI-01, M2-PCHI-01 được bác. Không lẽ đây là hạn chế của access? Có lẽ không phải, do em gà mờ nên chưa tìm ra cách thôi. Bác nào biết giúp em nhé

    Bạn thử cái này xem nhé! Mình ko có 2 máy để test. Nếu có gì hồi âm lại nhé
    Link tải
  • RE: Lỗi trùng mã khách hàng

    MTNQ > 16-06-17, 09:44 PM

    (15-06-17, 02:48 PM)cannguyen Đã viết: 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

    Chào bạn!
    Xem qua file của bạn mình có vài góp ý như sau:
    -Nếu trường MaBN là kiểu Long Integer thì không nên lấy theo kiểu yyyymmdd00, Làm như vậy sẽ không ổn nếu trong ngày có hơn 100 BN khám
    ->Nên Format theo kiểu yymmdd0000, tức là chỉ lấy 2 số cuối của năm

    -Nên tách hàm tạo MaBN riêng để dễ chỉnh sửa và sử lý lỗi

    -Không nên tạo MaBN ngay khi "thêm mới" vì làm như vậy sẽ có nguy cơ tạo ra nhiều Record trống, chỉ có MaBN mà không có dữ liệu
    -> Chỉ tạo MaBN sau khi đã nhập tên BN (Gọi hàm tạo MaBN ở sự kiện TenBN_AfterUpdate)

    -Điều khiển nào không cho người dùng chỉnh sửa (như MaBN) thì phải khoá lại (Locked = yes). Không nên đặt tên các điều khiển trùng với tên trường trong table để tránh nhầm lẫn khi viết code....


    Sau đây là hàm tạo mã BN:
    Mã:
    Private Function fcTaoMaBN() As Long
       Dim lngMaBN_Max As Long
       Dim lngMaBN_New As Long
       Dim datNgay_Max As Date
       
       lngMaBN_Max = Nz(DMax("[MaBN]", "BenhNhan"), 0)
       If lngMaBN_Max <> 0 Then
           datNgay_Max = DateValue(Mid(lngMaBN_Max, 5, 2) & "/" & Mid(lngMaBN_Max, 3, 2) & "/" & Left(lngMaBN_Max, 2))
           'Debug.Print datNgay_Max
           If datNgay_Max >= date Then
               If datNgay_Max > date Then
                   MsgBox "Ngay thang tren he thong khong phu hop, vui long lien he Admin ", vbCritical, "Luu y"
               End If
               lngMaBN_New = lngMaBN_Max + 1
           Else
               lngMaBN_New = Val(Format(date, "yymmdd") & "0000") + 1
           End If
       Else
           lngMaBN_New = Val(Format(date, "yymmdd") & "0000") + 1
       End If
       
       fcTaoMaBN = lngMaBN_New
    End Function

    -Code cho sự kiện AfterUpdate của TenBN: 
    Mã:
    Private Sub TenBN_AfterUpdate()
       If Nz(Me.TenBN, "") = "" Then Exit Sub

    If Nz(MaBN, 0) = 0 Then
           MaBN = fcTaoMaBN
           DaLuu = "Y"
       DoCmd.RunCommand acCmdSaveRecord
       End If
    End Sub

    Điều kiện  "If Nz(MaBN, 0) = 0 Then" rất quan trọng vì nếu thiếu thì khi chỉnh sửa tên Bn nó lại tạo thêm ra một MaBn mới
    Sau khi tạo MaBN rồi thì nhớ câu thần chú DoCmd.RunCommand acCmdSaveRecord. Nếu không thì ở máy khác sẽ không nhận biết được sự tồn tại của nó và vấn đề trùng mã lại diễn ra  014 

    -Như vậy code cho nút mới chỉ còn là:
    Mã:
    Private Sub moi_Click()
       DoCmd.DoMenuItem acFormBar, acRecordsMenu, 5, , acMenuVer70

       LockCtrls False
       DoCmd.GoToRecord , , acNewRec
       TenBN.SetFocus
    End Sub

    Thủ tục LockCtrls nhằm tránh viết nhiều lần cùng một đoạn mã:
    Mã:
    Sub LockCtrls(blnLock As Boolean)
       MaBN.Enabled = Not blnLock
       TenBN.Enabled = Not blnLock
       NamSinh.Enabled = Not blnLock
       DiaChi.Enabled = Not blnLock
       DienThoai.Enabled = Not blnLock
       GhiChu.Enabled = Not blnLock
       GioiTinh.Enabled = Not blnLock
       NgayBHYT.Enabled = Not blnLock
       SoBHYT.Enabled = Not blnLock
       luu.Enabled = Not blnLock
       moi.Enabled = blnLock
       I.Enabled = blnLock
       xoa.Enabled = blnLock
       SUa.Enabled = blnLock
    End Sub

    Khi muốn mở hoặc khoá các điều khiển trên form bạn chỉ cần gọi LockCtrls False hoặc LockCtrls True

    Ví dụ:
    Mã:
    Private Sub Form_Open(Cancel As Integer)
    'MaBN.Enabled = False
    'TenBN.Enabled = False
    'NamSinh.Enabled = False
    'DiaChi.Enabled = False
    'DienThoai.Enabled = False
    'GhiChu.Enabled = False
    'GioiTinh.Enabled = False
    'luu.Enabled = False
    'NgayDau.Enabled = False
    'SoBHYT.Enabled = False
    'NgayBHYT.Enabled = False
       LockCtrls True
    End Sub

    và:
    Mã:
    Private Sub sua_Click()
       LockCtrls False
    End Sub
  • RE: Lỗi trùng mã khách hàng

    MTNQ > 16-06-17, 11:03 PM

    à quên,code cho nut "luu" tương tự như sau:

    Mã:
    Private Sub luu_Click()
       If Nz([TenBN], "") = "" Then
           MsgBox "Vui long nhap ho ten benh nhan", vbCritical, "Luu y"
       Else
    'MaBN = MaBN

           LockCtrls True
           DoCmd.DoMenuItem acFormBar, acRecordsMenu, 5, , acMenuVer70
           MsgBox "Thanh cong!", vbInformation, "TB"
           DoCmd.RunCommand acCmdSaveRecord
           DoCmd.DoMenuItem acFormBar, acRecordsMenu, 5, , acMenuVer70
       'DoCmd.Close
       'DoCmd.OpenForm "BenhNhan"
           Me.Requery
       End If
    'End If
    End Sub


    các thủ tục trên chưa có bẫy lỗi, bạn nhớ thêm vào nhé

    Còn một vấn đề nữa, từ Access 2007 về trước thì trước khi khoá  control (Enabled = False)  phải set Focus sang Control khác nếu không sẽ báo lỗi
  • RE: Lỗi trùng mã khách hàng

    cannguyen > 17-06-17, 12:28 AM

    (16-06-17, 08:20 PM)tieu_ngao Đã viết:
    (16-06-17, 01:16 PM)cannguyen Đã viết:
    (16-06-17, 12:45 PM)tranthanhan1962 Đã viết: 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

    ý em không phải đồng bộ trước sau như bác nói. Thôi vụ của em xem như bỏ qua, em cho người nhập nhấn lưu mấy phát cũng ok rồi.
    Nhưng ví dụ đây là phần mềm kế toán thì sao bác? Phiếu thu/chi không thể trùng số (trong 1 tháng hoặc 1 năm, tùy công ty). Ví dụ: PCHI-01, PCHI-02 chứ không thể là M1-PCHI-01, M2-PCHI-01 được bác. Không lẽ đây là hạn chế của access? Có lẽ không phải, do em gà mờ nên chưa tìm ra cách thôi. Bác nào biết giúp em nhé

    Bạn thử cái này xem nhé! Mình ko có 2 máy để test. Nếu có gì hồi âm lại nhé
    Link tải

    Cám ơn bác. Mình đã thử nhưng vẫn không được bác nhé
  • RE: Lỗi trùng mã khách hàng

    cannguyen > 17-06-17, 12:42 AM

    (16-06-17, 09:44 PM)MTNQ Đã viết:
    (15-06-17, 02:48 PM)cannguyen Đã viết: 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

    Chào bạn!
    Xem qua file của bạn mình có vài góp ý như sau:
    -Nếu trường MaBN là kiểu Long Integer thì không nên lấy theo kiểu yyyymmdd00, Làm như vậy sẽ không ổn nếu trong ngày có hơn 100 BN khám
    ->Nên Format theo kiểu yymmdd0000, tức là chỉ lấy 2 số cuối của năm

    -Nên tách hàm tạo MaBN riêng để dễ chỉnh sửa và sử lý lỗi

    -Không nên tạo MaBN ngay khi "thêm mới" vì làm như vậy sẽ có nguy cơ tạo ra nhiều Record trống, chỉ có MaBN mà không có dữ liệu
    -> Chỉ tạo MaBN sau khi đã nhập tên BN (Gọi hàm tạo MaBN ở sự kiện TenBN_AfterUpdate)

    -Điều khiển nào không cho người dùng chỉnh sửa (như MaBN) thì phải khoá lại (Locked = yes). Không nên đặt tên các điều khiển trùng với tên trường trong table để tránh nhầm lẫn khi viết code....


    Sau đây là hàm tạo mã BN:
    Mã:
    Private Function fcTaoMaBN() As Long
       Dim lngMaBN_Max As Long
       Dim lngMaBN_New As Long
       Dim datNgay_Max As Date
       
       lngMaBN_Max = Nz(DMax("[MaBN]", "BenhNhan"), 0)
       If lngMaBN_Max <> 0 Then
           datNgay_Max = DateValue(Mid(lngMaBN_Max, 5, 2) & "/" & Mid(lngMaBN_Max, 3, 2) & "/" & Left(lngMaBN_Max, 2))
           'Debug.Print datNgay_Max
           If datNgay_Max >= date Then
               If datNgay_Max > date Then
                   MsgBox "Ngay thang tren he thong khong phu hop, vui long lien he Admin ", vbCritical, "Luu y"
               End If
               lngMaBN_New = lngMaBN_Max + 1
           Else
               lngMaBN_New = Val(Format(date, "yymmdd") & "0000") + 1
           End If
       Else
           lngMaBN_New = Val(Format(date, "yymmdd") & "0000") + 1
       End If
       
       fcTaoMaBN = lngMaBN_New
    End Function

    -Code cho sự kiện AfterUpdate của TenBN: 
    Mã:
    Private Sub TenBN_AfterUpdate()
       If Nz(Me.TenBN, "") = "" Then Exit Sub

    If Nz(MaBN, 0) = 0 Then
           MaBN = fcTaoMaBN
           DaLuu = "Y"
       DoCmd.RunCommand acCmdSaveRecord
       End If
    End Sub

    Điều kiện  "If Nz(MaBN, 0) = 0 Then" rất quan trọng vì nếu thiếu thì khi chỉnh sửa tên Bn nó lại tạo thêm ra một MaBn mới
    Sau khi tạo MaBN rồi thì nhớ câu thần chú DoCmd.RunCommand acCmdSaveRecord. Nếu không thì ở máy khác sẽ không nhận biết được sự tồn tại của nó và vấn đề trùng mã lại diễn ra  014 

    -Như vậy code cho nút mới chỉ còn là:
    Mã:
    Private Sub moi_Click()
       DoCmd.DoMenuItem acFormBar, acRecordsMenu, 5, , acMenuVer70

       LockCtrls False
       DoCmd.GoToRecord , , acNewRec
       TenBN.SetFocus
    End Sub

    Thủ tục LockCtrls nhằm tránh viết nhiều lần cùng một đoạn mã:
    Mã:
    Sub LockCtrls(blnLock As Boolean)
       MaBN.Enabled = Not blnLock
       TenBN.Enabled = Not blnLock
       NamSinh.Enabled = Not blnLock
       DiaChi.Enabled = Not blnLock
       DienThoai.Enabled = Not blnLock
       GhiChu.Enabled = Not blnLock
       GioiTinh.Enabled = Not blnLock
       NgayBHYT.Enabled = Not blnLock
       SoBHYT.Enabled = Not blnLock
       luu.Enabled = Not blnLock
       moi.Enabled = blnLock
       I.Enabled = blnLock
       xoa.Enabled = blnLock
       SUa.Enabled = blnLock
    End Sub

    Khi muốn mở hoặc khoá các điều khiển trên form bạn chỉ cần gọi LockCtrls False hoặc LockCtrls True

    Ví dụ:
    Mã:
    Private Sub Form_Open(Cancel As Integer)
    'MaBN.Enabled = False
    'TenBN.Enabled = False
    'NamSinh.Enabled = False
    'DiaChi.Enabled = False
    'DienThoai.Enabled = False
    'GhiChu.Enabled = False
    'GioiTinh.Enabled = False
    'luu.Enabled = False
    'NgayDau.Enabled = False
    'SoBHYT.Enabled = False
    'NgayBHYT.Enabled = False
       LockCtrls True
    End Sub

    và:
    Mã:
    Private Sub sua_Click()
       LockCtrls False
    End Sub

    Cám ơn góp ý của bác
    Bản chính thức của mình đã fix mấy lỗi này lâu rồi:
    - Mã BN đáp ứng cho trường hợp 1 ngày có 9,999 bệnh nhân
    - Nút thêm không cho phép lưu ngay. Chỉ khi nào nhấn nút Lưu và nhập đày đủ thông tin yêu cầu mới cho lưu
    - Nói chung ứng dụng đang chạy ok cho 1 máy, đã đưa vào sử dụng 4 tháng nay thấy ổn, giờ chỉ muốn fix lỗi nhập nhiều máy thôi
    File mình gửi lên là file cũ chủ yếu nhờ các bác giúp về phần nhập nhiều máy không bị trùng mã thôi còn các vấn đề khác các bác không cần quan tâm nhé, sẽ mất thời gian của các bác
    Bác có file demo gửi giúp em với
    Cám ơn bác
  • RE: Lỗi trùng mã khách hàng

    tieu_ngao > 17-06-17, 06:17 AM

    (16-06-17, 09:44 PM)MTNQ Đã viết:
    (15-06-17, 02:48 PM)cannguyen Đã viết: 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

    Chào bạn!
    Xem qua file của bạn mình có vài góp ý như sau:
    -Nếu trường MaBN là kiểu Long Integer thì không nên lấy theo kiểu yyyymmdd00, Làm như vậy sẽ không ổn nếu trong ngày có hơn 100 BN khám
    ->Nên Format theo kiểu yymmdd0000, tức là chỉ lấy 2 số cuối của năm

    -Nên tách hàm tạo MaBN riêng để dễ chỉnh sửa và sử lý lỗi

    -Không nên tạo MaBN ngay khi "thêm mới" vì làm như vậy sẽ có nguy cơ tạo ra nhiều Record trống, chỉ có MaBN mà không có dữ liệu
    -> Chỉ tạo MaBN sau khi đã nhập tên BN (Gọi hàm tạo MaBN ở sự kiện TenBN_AfterUpdate)

    -Điều khiển nào không cho người dùng chỉnh sửa (như MaBN) thì phải khoá lại (Locked = yes). Không nên đặt tên các điều khiển trùng với tên trường trong table để tránh nhầm lẫn khi viết code....


    Sau đây là hàm tạo mã BN:
    Mã:
    Private Function fcTaoMaBN() As Long
       Dim lngMaBN_Max As Long
       Dim lngMaBN_New As Long
       Dim datNgay_Max As Date
       
       lngMaBN_Max = Nz(DMax("[MaBN]", "BenhNhan"), 0)
       If lngMaBN_Max <> 0 Then
           datNgay_Max = DateValue(Mid(lngMaBN_Max, 5, 2) & "/" & Mid(lngMaBN_Max, 3, 2) & "/" & Left(lngMaBN_Max, 2))
           'Debug.Print datNgay_Max
           If datNgay_Max >= date Then
               If datNgay_Max > date Then
                   MsgBox "Ngay thang tren he thong khong phu hop, vui long lien he Admin ", vbCritical, "Luu y"
               End If
               lngMaBN_New = lngMaBN_Max + 1
           Else
               lngMaBN_New = Val(Format(date, "yymmdd") & "0000") + 1
           End If
       Else
           lngMaBN_New = Val(Format(date, "yymmdd") & "0000") + 1
       End If
       
       fcTaoMaBN = lngMaBN_New
    End Function

    -Code cho sự kiện AfterUpdate của TenBN: 
    Mã:
    Private Sub TenBN_AfterUpdate()
       If Nz(Me.TenBN, "") = "" Then Exit Sub

    If Nz(MaBN, 0) = 0 Then
           MaBN = fcTaoMaBN
           DaLuu = "Y"
       DoCmd.RunCommand acCmdSaveRecord
       End If
    End Sub

    Điều kiện  "If Nz(MaBN, 0) = 0 Then" rất quan trọng vì nếu thiếu thì khi chỉnh sửa tên Bn nó lại tạo thêm ra một MaBn mới
    Sau khi tạo MaBN rồi thì nhớ câu thần chú DoCmd.RunCommand acCmdSaveRecord. Nếu không thì ở máy khác sẽ không nhận biết được sự tồn tại của nó và vấn đề trùng mã lại diễn ra  014 

    -Như vậy code cho nút mới chỉ còn là:
    Mã:
    Private Sub moi_Click()
       DoCmd.DoMenuItem acFormBar, acRecordsMenu, 5, , acMenuVer70

       LockCtrls False
       DoCmd.GoToRecord , , acNewRec
       TenBN.SetFocus
    End Sub

    Thủ tục LockCtrls nhằm tránh viết nhiều lần cùng một đoạn mã:
    Mã:
    Sub LockCtrls(blnLock As Boolean)
       MaBN.Enabled = Not blnLock
       TenBN.Enabled = Not blnLock
       NamSinh.Enabled = Not blnLock
       DiaChi.Enabled = Not blnLock
       DienThoai.Enabled = Not blnLock
       GhiChu.Enabled = Not blnLock
       GioiTinh.Enabled = Not blnLock
       NgayBHYT.Enabled = Not blnLock
       SoBHYT.Enabled = Not blnLock
       luu.Enabled = Not blnLock
       moi.Enabled = blnLock
       I.Enabled = blnLock
       xoa.Enabled = blnLock
       SUa.Enabled = blnLock
    End Sub

    Khi muốn mở hoặc khoá các điều khiển trên form bạn chỉ cần gọi LockCtrls False hoặc LockCtrls True

    Ví dụ:
    Mã:
    Private Sub Form_Open(Cancel As Integer)
    'MaBN.Enabled = False
    'TenBN.Enabled = False
    'NamSinh.Enabled = False
    'DiaChi.Enabled = False
    'DienThoai.Enabled = False
    'GhiChu.Enabled = False
    'GioiTinh.Enabled = False
    'luu.Enabled = False
    'NgayDau.Enabled = False
    'SoBHYT.Enabled = False
    'NgayBHYT.Enabled = False
       LockCtrls True
    End Sub

    và:
    Mã:
    Private Sub sua_Click()
       LockCtrls False
    End Sub

    Bài viết của anh hay quá