Tìm thủ thuật nhanh hơn với chức năng tìm trong Blog

3/2/10

Bẫy lỗi trong code

Tác Giả: phatnq2002 - Danketoan

Trong quá trình thao tác nhập liệu trên form, hoặc khi thực hiện một thủ tục nào đó trong code, có thể sẽ phát sinh ra lỗi. Khi một lỗi xảy ra, hệ thống (Access) sẽ thông báo và khi đó tiến trình sẽ bị ngắt, các giá trị đã gán trước đó sẽ bị hủy và như vậy nếu cho thực thi tiếp lại xảy ra những lỗi khác.

Lỗi được tạm chia làm hai dạng:
- Dạng xảy ra khi có một sự cố về việc cập nhật dữ liệu: thường là lỗi Primary key bị trùng hoặc để trống, lỗi field được xác lập thuộc tính Required là Yes nhưng không nhập gì cả, …
- Dạng xảy ra do một câu lệnh khi thực thi đã sản sinh ra một lỗi: ví dụ câu lệnh a = b/c, trong đó c = 0, …

Để có thể tiếp tục thực hiện tiếp những công việc sau đó mà ứng dụng không bị ngắt, chúng ta phải thực hiện một công việc được gọi là bẫy lỗi (trap errors).

Trường hợp 1:
Để bẫy lỗi do hệ thống trả về, chúng ta có thể điều khiển sự kiện OnError của Form. Sự kiện này xảy ra khi có bất kỳ một lỗi nào được sản sinh trong quá trình nhập liệu trên form, nó được “lẩy” khi record hiện thời chuẩn bị được lưu vào table. Chúng ta có thể code cho thủ tục sự kiện Form_Error để bẫy những lỗi này.

Ví dụ sau đây dùng để bẫy một số lỗi cơ bản:


Private Sub Form_Error (DataErr As Integer, Response As Integer)
Response = acDataErrContinue ‘ tắt thông báo của Access
Select Case DataErr
Case 3022
MsgBox “Trùng khóa chính.”
Case 3058
MsgBox “Khóa chính để trống.”
Case 3314
MsgBox “Có ít nhất một field chưa nhập theo yêu cầu bắt buộc.”
Case Else
MsgBox “Có lỗi xảy ra.” & Chr(13) & “Chỉ số lỗi: “ & DataErr & Chr(13) & _
“Nội dung lỗi: “ & Err.Description
End Select
End Sub

Trường hợp 2:
Để bẫy lỗi trong code, chúng ta sẽ sử dụng cấu trúc sau:

Cấu trúc 1: Bỏ qua câu lệnh sản sinh ra lỗi, tiếp tục thực hiện lệnh kế sau.
Cấu trúc này thường dùng khi những lỗi xảy ra không phải là lỗi nghiêm trọng, không ảnh hưởng đến dữ liệu và các xử lý tiếp theo.


On Error Resume Next
Lệnh 1
Lệnh 2

On Error Goto 0

Ví dụ: Khi nhấn vào nút In, sẽ cho thi hành lệnh mở report rptIN ở chế độ Preview.


Private Sub cmdIn_Click ()
DoCdm.OpenReport “rptIN”, acViewPreview
End Sub

Sẽ không có gì xảy ra khi người sử dụng nhấn nút. Nhưng nếu trong rptIN, có đặt một đoạn code sau cho sự kiện OnNoData để hiển thị thông báo “Không có dữ liệu để in.”, đồng thời không cho mở report.


Private Sub Report_NoData (Cancel As Integer)
MsgBox “Không có dữ liệu để in.”
Cancel = True
End Sub

Câu lệnh DoCdm.OpenReport “rptIN”, acViewPreview trong thủ tục cmdIn_Click sẽ gây ra một lỗi ngay. Tuy nhiên lỗi này không phải là lỗi nghiêm trọng gì, chẳng qua là không có gì để in thôi.

Do đó chúng ta sẽ thiết kế lại thủ tục cmdIn_Click như sau:


Private Sub cmdIn_Click ()
On Error Resume Next
DoCdm.OpenReport “rptIN”, acViewPreview
On Error Goto 0
End Sub

Cấu trúc 2: Chuyển hướng xử lý.
Cấu trúc này thường dùng khi có lỗi nghiêm trọng ảnh hưởng đến việc nhập liệu và xử lý.


Sub [Function] rouName (………) [As ….]
Lệnh k
Lệnh k + 1

On Error Goto Nhãn_2
Lệnh 1
Lệnh 2

[Nhãn_3:]
Lệnh n – 2
Lệnh n – 1
Lệnh n
Nhãn_1:
Exit Sub ‘hoặc Exit Function tùy theo đây là thủ tục hay hàm
Nhãn_2:
‘ Kiểm tra xem lỗi gì xảy ra bằng Err.Number và Err.Description, sau đó thông báo
‘ cho người dùng biết.
‘ Đến đây, có thể cho chuyển hướng xử lý bắng một trong hai cách:
‘ Resume Nhãn_3: nếu muốn trước khi ngưng thủ tục hoặc hàm, phải thực hiện tiếp một số lệnh
‘Resume Nhãn_1: ngưng ngay thủ tục hoặc hàm
End Sub [hoặc Function]

Ví dụ: Trong một thủ tục, có yêu cầu thi hành một lệnh SQL để insert dữ liệu vào một từ table từ dữ liệu của table khác. Để tránh trường hợp nơi nhận có nhiều field hơn hoặc nơi nhận có ít field hơn hoặc tên field không tồn tại, chúng ta sẽ bẫy lỗi để phòng.


Private Sub Test ()
On Error Goto loi
CurrentDB.Execute “INSERT INTO tblA (fieldA, fieldB) SELECT fieldA, fieldB, fieldC FROM tblB” ‘Câu lệnh insert có số filed ở SELECT nhiều hơn số field nhận
DoCmd.OpenReport “rptInDuLieuTableA”
thoat:
Exit Sub
loi:
MsgBox “Có lỗi xảy ra khi có ý định chèn dữ liệu vào table A. Vui lòng liên hệ lập trình viên.”
Resume thoat
End Sub
____________________________________________________________________________________
Thảo luận thêm: http://thuthuataccess.com/forum

1 nhận xét:

  1. mình làm phần mềm trên access 2003 quản lý điểm sinh viên thi Đại học, nhưng khi nhập kết quả vào bảng> ketqua(mssv, matruong, khoithi, manganh, dm1,...) mình đặt mssv,matruong,khoithi, va manganh lam khoa.... minh muốn đặt dk cho nút ghi là nếu cả 4 khóa trên đều bị trùng thì thông báo lên thì mình phải viết code như thế nào/
    trả lời qua email giúp mình.. hoanganngocquyen3@yahoo.com
    thanks

    Trả lờiXóa

» Hãy để lại tên, email của bạn khi bạn post comment, để mình có thể dễ dàng trả lời comment của bạn khi cần.
» Có thể sử dụng các thẻ < b>,< i>,< a>. Và các icon thông dụng trên YM