Đánh giá chủ đề:
  • 0 Votes - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Lỗi thường gặp với Null và cách xử lý
#1
Đâ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
 
Chữ ký của tranthanhan1962 Kết quả cuối cùng của một đời người, không phải bạn có được bao nhiêu tiền bạc, tài sản. Mà bạn còn bao nhiêu người bạn  thumbs up
ღღღღღTài sản của tranthanhan1962 (View All Items) ღღღღღ
Reply
Những người đã cảm ơn maidinhdan , Noname , honglv157 , hungle2006


Có thể liên quan đến chủ đề
Chủ đề: Tác giả Trả lời: Xem: Bài mới nhất
  Xin chỉ cách điền số thứ tự tự động trong report là chữ cái A-B-C nvdtruong 1 1,536 18-08-12, 02:18 PM
Bài mới nhất: Noname
Thumbs Down SHARE: Cách hiển thị cảnh báo bằng Unicode (không ảnh hưởng hệ thống) bomnhauag 1 1,643 29-02-12, 09:22 PM
Bài mới nhất: minhhoang
  So Sanh chính Xác chữ Hoa- Thường trong Access Noname 0 1,713 26-08-10, 09:11 AM
Bài mới nhất: Noname
  Cách chuyển số sang tỷ lệ phần trăm Noname 0 6,329 06-08-10, 12:42 PM
Bài mới nhất: Noname

Chuyển nhanh:


User(s) browsing this thread: 1 Guest(s)
Diễn Đàn Thơ Văn Thi Ẩm Lâu|Nhà Hàng Sông Thơ