Xin giúp về edit data trong form unbound

vijnana

New Member
Hội viên mới
Chào mọi người,

Lần này lại phải nhờ mọi người giúp đỡ nữa rồi. Hơn nữa mình lại cần gấp vì đây là phần cuối cùng mình làm cho 1 chương trình viết bằng Access.

Link download file ở đây:
http://www.mediafire.com/file/gmg2mznnlht/password.mdb

File này mình gặp khó khăn về đổi password.

File có 3 table:
tblUser chứa thông tin về tất cả người sử dụng chương trình như mã người dùng, tên người dùng, mật mã, quyền sử dụng và ngày đổi password.
tblCurrentUser ghi nhận mã người dùng đã đăng nhập trong phiên hiện tại.
tblMsgBoxUnicode để mã hóa unicode tiếng Việt cho các msgbox.

Có 2 query:
QryCurrentUser để lấy thông tin về người dùng đã đăng nhập trong phiên hiện tại.
QryDeleteCurrentUser để xóa mã người dùng trong tblCurrentUser (và sau đó dùng lệnh VBA để insert mã người dùng hiện tại vào tblCurrentUser)

Có 3 form:
Đầu tiên mở frmLogon lên để nhập tên người dùng và mật mã. Form này không có vấn đề gì.
Sau đó khi click nút Đăng nhập chương trình sẽ đóng frmLogon và mở frmChangePassword nếu password đã sau 4 tuần chưa được đổi, hoặc mở frmSplashUser nếu chưa đến thời hạn 4 tuần.
frmSplashUser chỉ dùng để minh họa chứ không có tác dụng gì cả.

Vấn đề mình gặp phải là không đổi được password bằng frmChangePassword.
Trong form này, người dùng sẽ phải nhập password hiện tại, sau đó nhập password mới và nhập lại lần nữa để kiểm tra.

Nếu nhập đúng password hiện tại, password mới không trùng password hiện tại và nhập lại đúng password mới thì sẽ hiện 3 dấu tick. Khi đó click nút Lưu thì password hiện tại sẽ được thay thế bằng password mới (trong txtMatMaMoi). Còn nếu hiện không đủ 3 dấu tick thì click nút Lưu cũng không đổi password được.




Tuy nhiên khi đã hiện đủ 3 dấu tick mình cũng không thể đổi được password vì khi test thử thì đoạn mã này bị báo lỗi:

Dim db As DAO.Database, SQL As String, rCount As Integer

Set db = CurrentDb()

SQL = "UPDATE tblUser SET MatMa = " & txtMatMaMoi.Text & " WHERE MaNguoiDung = " & NguoiDungHienTai.Text & ""

db.Execute SQL, dbFailOnError
rCount = db.RecordsAffected

'Kiem tra xem mat ma da duoc doi chua
If rCount > 0 Then
MsgBox "Doi mat ma thanh cong"
End If



Ngoài lỗi này là nghiêm trọng nhất thì còn những lỗi khác nữa:

Trong code VBA mình đã viết để người dùng bắt buộc phải nhập mật mã hiện tại trước rồi mới đến mật mã mới và cuối cùng là nhập lại mật mã mới. Tuy nhiên khi test thử thì thấy không có tác dụng. Người dùng vẫn có thể nhập cái gì trước cũng được, không bị ép theo thứ tự (chỉ có điều phải click OK cho mấy cái thông báo Chưa nhập mật mã).

(mình không hiểu sao mấy cái SetFocus không có tác dụng ép người dùng trở lại textbox vừa lost focus. Ví dụ lúc đầu đang focus ở txtMatMaHienTai nhưng mình click vào txtNhapLai thì có báo lỗi chưa nhập mật mã ở txtMatMaHienTai. Tuy nhiên mình không bị đưa về txtMatMaHienTai mà vẫn ở txtNhapLai.)

Thứ hai là khi người dùng nhập cái gì trước cũng được thì sau một hồi khi focus vào 1 textbox nào đó nhiều khi lại không được mà lại bị lỗi focus sai tùm lum.

Cuối cùng là nếu người dùng muốn thoát khỏi form bằng nút X trên caption của form thì sẽ có báo lỗi Chưa nhập mật mã. Mình không biết làm thế nào để msgbox này không hiện ra nếu người ta muốn thoát (mà vẫn đảm bảo lúc đổi password khi textbox nào đó trống thì vẫn có thông báo Chưa nhập mật mã).



Mong các bạn có thể giúp mình sớm, vì mình đang rất cần. Sắp đến hạn chót rồi.
 
Ðề: Xin giúp về edit data trong form unbound

Tuy nhiên khi đã hiện đủ 3 dấu tick mình cũng không thể đổi được password vì khi test thử thì đoạn mã này bị báo lỗi:

Dim db As DAO.Database, SQL As String, rCount As Integer

Set db = CurrentDb()

SQL = "UPDATE tblUser SET MatMa = " & txtMatMaMoi.Text & " WHERE MaNguoiDung = " & NguoiDungHienTai.Text & ""

db.Execute SQL, dbFailOnError
rCount = db.RecordsAffected

'Kiem tra xem mat ma da duoc doi chua
If rCount > 0 Then
MsgBox "Doi mat ma thanh cong"
End If

Mật mã là chuỗi thì khi nối chuỗi, phải biến hóa sao cho kết quả trả về phải có dạng gán chuỗi. Sau dấu bằng, ngay trước dấu ", cho thêm một dấu '(nháy đơn), và sau dấu " thứ 2, cũng thế. Tương tự ở chỗ mã người dùng nữa.

Trong code VBA mình đã viết để người dùng bắt buộc phải nhập mật mã hiện tại trước rồi mới đến mật mã mới và cuối cùng là nhập lại mật mã mới. Tuy nhiên khi test thử thì thấy không có tác dụng. Người dùng vẫn có thể nhập cái gì trước cũng được, không bị ép theo thứ tự (chỉ có điều phải click OK cho mấy cái thông báo Chưa nhập mật mã).
(mình không hiểu sao mấy cái SetFocus không có tác dụng ép người dùng trở lại textbox vừa lost focus. Ví dụ lúc đầu đang focus ở txtMatMaHienTai nhưng mình click vào txtNhapLai thì có báo lỗi chưa nhập mật mã ở txtMatMaHienTai. Tuy nhiên mình không bị đưa về txtMatMaHienTai mà vẫn ở txtNhapLai.)
Thứ hai là khi người dùng nhập cái gì trước cũng được thì sau một hồi khi focus vào 1 textbox nào đó nhiều khi lại không được mà lại bị lỗi focus sai tùm lum.

Muốn bắt control ngay khi nó rời focus, nếu nó error hoặc không thỏa điều kiện thì không cho ra, bạn không nên bẫy LostFocus mà phải bẫy Exit. LostFocus sẽ xảy ra sau khi focus thật sự rời khỏi control. Rời khỏi rồi lấy gì trở lại. Exit thì xảy ra khi vừa "chớm chớm" ra khỏi control mà thôi, do vậy có thể gán Cancel = True để hủy sự kiện. Như vậy không thể ra khỏi control nếu chưa thỏa điều kiện.

Cuối cùng là nếu người dùng muốn thoát khỏi form bằng nút X trên caption của form thì sẽ có báo lỗi Chưa nhập mật mã. Mình không biết làm thế nào để msgbox này không hiện ra nếu người ta muốn thoát (mà vẫn đảm bảo lúc đổi password khi textbox nào đó trống thì vẫn có thông báo Chưa nhập mật mã).
Theo cơ chế của Access, khi nhắp vào nút Close trên Caption thì xem như bạn đã LostFocus current control, thế nên nó vẫn bắt.

Theo kinh nghiệm và theo thông thường, chúng ta chỉ nên bắt điều kiện khi người sử dụng nhấn vào nút OK hoặc Close. Hạn chế bắt ngay control vì như vậy, thứ nhất làm cho người sử dụng bối rối, thứ hai làm cho họ bực mình.
Khi kiểm ở nút OK hoặc Close, chúng ta có thể SetFocus lại control mà chúng ta muốn người sử dụng nhập lại cho đúng. Cái này tốt hơn, dễ code hơn và dễ kiểm soát hơn.
 
Ðề: Xin giúp về edit data trong form unbound

Vì đường link ở trên của bạn có lỗi nên không lấy về thử được. Bạn xem lại đường link.
Do không biết thông báo lỗi của đoạn Update nên cũng khó nói nó bị cái gì.
Set Focus sẽ thực hiện sau khi điều kiện để thoát khỏi control hiện thời là được phép.
Vì control hiện thời ví dụ là txtMatMaHienTai không cho phép thoát khỏi nó khi chưa gõ mật mã hiện tại thì máy sẽ không thể thực hiện SetFocus cho control khác được.
Bạn kiểm tra lại trong OnLostFocus hoặc OnExit hoặc OnChange xem điều kiện nào khiến nó không thoát ra khỏi textbox hiện thời được.
 
Ðề: Xin giúp về edit data trong form unbound

@ muontennguoi: mình vừa kiểm tra lại thì link vẫn download được mà bạn. Mình up lên host khác để bạn download về xem giùm mình vì mình đã sửa như bạn phatnq2002 lẫn bỏ 2 cái .Text nhưng vẫn không đổi password được.

http://www.fileden.com/files/2008/9/12/2093719/password.rar


@ phatnq2002: Mình đã sửa lại như bạn chỉ nhưng nó lại báo lỗi khác: Data type mismatch in criteria expression.
 
Ðề: Xin giúp về edit data trong form unbound

@ muontennguoi: mình vừa kiểm tra lại thì link vẫn download được mà bạn. Mình up lên host khác để bạn download về xem giùm mình vì mình đã sửa như bạn phatnq2002 lẫn bỏ 2 cái .Text nhưng vẫn không đổi password được.

http://www.fileden.com/files/2008/9/12/2093719/password.rar


@ phatnq2002: Mình đã sửa lại như bạn chỉ nhưng nó lại báo lỗi khác: Data type mismatch in criteria expression.

Thứ nhất: Bạn không thể tham chiếu thuộc tính text của các textbox, mà phải tham chiếu thuộc tính Value.
Thứ hai: bạn không để cặp dấu nháy đơn như bài trước tôi đã nói.
Thứ ba: Do mã người dùng, bạn dùng AutoNumber thì bạn đâu cần để trong dấu nháy chuỗi.

Biến SQL bạn gán lại như sau:

SQL = "UPDATE tblUser SET MatMa = '" & txtMatMaMoi.Value & "' WHERE MaNguoiDung = " & NguoiDungHienTai.Value

Tuy nhiên, cách bạn viết không ổn. Thứ nhất, bạn không kiểm việc password phân biệt hoa thường. Thứ hai, một lỗi cơ bản rất nghiêm trọng là form ChangePassword của bạn lại dùng RecordSource ???
Đây phải là form Unbound, lúc đó mới Db.Execute được mà không bị thông báo lỗi.

Bạn nên viết lại cái code cho form này đi.
 
Ðề: Xin giúp về edit data trong form unbound

Thưa anh Phatnq2002. Em cũng đã làm Form đăng nhập, Đổi mật khẩu. Nhưng em hóc ở chỗ là phân biệt chưa HOA và chữ thường.

Tiện đây mong được anh Phatnq2002 cũng như mem khác hướng dẫn em giải quyết hóc búa đó.
Em xin cảm ơn!
 
Ðề: Xin giúp về edit data trong form unbound

Thưa anh Phatnq2002. Em cũng đã làm Form đăng nhập, Đổi mật khẩu. Nhưng em hóc ở chỗ là phân biệt chưa HOA và chữ thường.

Tiện đây mong được anh Phatnq2002 cũng như mem khác hướng dẫn em giải quyết hóc búa đó.
Em xin cảm ơn!
Muốn cho Access phân biệt chữ hoa và chữ thường thì đầu Module bạn thay dòng mặc định Option Compare Database thành Option Compare Binary là Ok.
 

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