Lỗi thường gặp với Null và cách xử lý
tranthanhan1962 > 29-07-15, 09:36 AM
Đây là bài viết của Allen Browne, tháng 11 năm 1999 mình thấy hay nên xử lý lại và post lên để các bạn tham khảo
Lỗi 1: Nulls trong thiết đặt điều kiện
Nếu bạn thiết đặt điều kiện cho một trường trong một query, khi kiểm tra điều kiện table. Các record có giá trị Nulls sẽ bị bỏ qua.
Ví dụ, giả sử bạn có một table Danh sách học sinh. Bạn tạo nột query với điều kiện như sau: Học sinh nào có địa chỉ không phải thành phố Hồ chí minh sẽ được cộng thêm điểm thi là 0,5. Lúc đó bạn sẽ xử lý như sau:
CongDiem: IIf([DiaChi]<>"Thành phố Hồ Chí Minh";[DiemThi] + 0,5; [DiemThi])
Công thức này sẽ không cộng điểm thi cho các học sinh có địa chỉ là Null, mặc dù chắc chắn các em này không không ở Thành phố Hồ Chí Minh
Xử lý:
CongDiem: IIf([DiaChi]<>"Thành phố Hồ Chí Minh" Or Nul;[DiemThi] + 0,5; [DiemThi])
Lỗi 2: Nulls trong các biểu thức
Trong các biểu thức nếu có một số hạng có giá trị Null, bài toán này sẽ không được làm. Ví dụ, Trong table công nợ có 2 trường là [ThieuNo] và [TraNo]:
TonNo= [ThieuNo] - [TraNo]
Nếu trường [TraNo] có giá trị 0 thì trường [TonNo] có giá trị bằng với trường [ThieuNo], Nếu trường [TraNo] là Null. Bạn sẽ thấy trường [TraNo] trống rổng và có thể hiểu nhầm người này không còn nợ
Xử lý
Sử dụng hàm NZ () để chỉ định một giá trị cho Null:
TonNo= Nz ([ThieuNo], 0) - Nz ([TraNo], 0)
Lỗi 3: Nulls trong khóa ngoại
Khi nhập dữ liệu các table có relationship, nó cho phép bạn nhập null trên trường khóa ngoại thoải mái. Nhưng khi tạo các subform hoặc tạo các tổng nhóm primary key nó sẽ bỏ các record của table con có khóa ngoại giá trị Null ra. Kết quả tổng thực sự khác tổng của các nhóm. Điều này làm sai lệch giá trị thực của những bài toán trên các trường kiểu số của các table. Để ngăn ngừa điều này bạn tạo đầy đủ các nhóm (primary key) trên table bố mẹ.
Xử lý:
Luôn thiết lập thuộc tính bắt buộc của các Required là Yes trên trường khóa ngoại trong table con. Và cần thiết phải tạo một “Nhóm không phải là nhóm” trên ở trường primary của table bố mẹ để các tham chiếu được toàn vẹn.
Lỗi 4: Nulls và không phải Variant
Trong Visual Basic, các kiểu dữ liệu chỉ có thể chứa Null là Variant. Bất cứ khi nào bạn gán giá trị của một trường không phải là Variant, bạn phải xem xét khả năng rằng trường này có thể là null. Bạn có thể xem những gì có thể đi sai với code này trong module của một Form?
Dim strHoTen As String
Dim lngID As Long
strName = Me.Ten
lngID = Me.KhachHangID
Khi trường [Ten] chứa Null, nỗ lực để gán Null cho một chuỗi tạo ra một lỗi .
Tương tự như sự phân công của giá trị KhachHangID cho một biến có thể gây ra một lỗi. Thậm chí nếu KhachHangID là khóa chính, mã này là không an toàn: khóa chính chứa Null ở record mới.
Giải pháp
(A) Sử dụng một kiểu dữ liệu Variant nếu bạn cần phải làm việc bằng null.
(B) Sử dụng các NZ () chức năng để xác định một giá trị sử dụng cho Null. Ví dụ như:
strName = Nz (Me.Ten ",")
lngID = Nz (Me.KhachHangID, 0)
Lỗi 5: So sánh một cái gì đó với null
Các biểu hiện:
If [Ten] = Null Then
là một điều vô nghĩa rằng sẽ không bao giờ có thật. Ngay cả khi Ten là Null, VBA nghĩ bạn hỏi:
Làm không rõ bằng không rõ? (Does Unknown equal Unknown?)
và luôn luôn trả lời:
"Làm thế nào để biết những cái không rõ của bạn là bằng nhau?"
("How do I know whether your unknowns are equal?"). Giống như kiểu 0/0 kết quả là vô định.
Xử lý:
Lỗi 6: Forgetting Null không phải là thật cũng không sai.
Đây là hai cấu trúc này làm cùng một công việc?
(a) If [Ten] = "Nguyễn văn A" Then
MsgBox "Đây là Nguyễn văn A"
Else
MsgBox "Đây không phải là Nguyễn văn A"
End If
(b) If [Ten] <> "Nguyễn văn A" Then
MsgBox "Đây không phải là Nguyễn văn A"
Else
MsgBox "Đây là Nguyễn văn A"
End If
Khi Ten là Null, những 2 mẩu này mâu thuẫn với nhau. Trong cả hai trường hợp, nếu không thành công, vì vậy khác thực hiện, kết quả là thông điệp mâu thuẫn.
Giải pháp
(A) Xử lý tất cả ba kết quả của một sự so sánh - True, False, và Null :
If [Ten] = "Nguyễn văn A" Then
MsgBox "Đó là một Nguyễn văn A"
ElseIf [Ten] <> "Nguyễn văn A" Then
MsgBox "Nó không phải là một Nguyễn văn A"
Else
MsgBox "Chúng tôi không biết đây có phải là một Nguyễn văn A"
End If
(B) Trong một số trường hợp, hàm NZ () cho phép bạn xử lý hai trường hợp lại với nhau. Ví dụ, để điều trị Null và Interger trong cùng một phương pháp:
If Len(Nz([Ten],"")) = 0 Then