text:
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.co.cc/forum

markdown:
**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.co.cc/forum](http://thuthuataccess.co.cc/forum)


text:
Tác giả: Dẫn Lộ Tinh
Thể loại: Truyện Xuyên Không
Tình trạng: Đang cập nhật
Nguồn: sưu tầm
Triêu Đăng trong truyện Muôn Vàn Sủng Ái của tác giả Dẫn Lộ Tinh vốn nên chết lại bất ngờ bị hệ thống trói buộc, yêu cầu thu gom lại những mảnh vỡ nhân cách ở mỗi thế giới xuyên không khác nhau, tuy nói có hào quang hấp dẫn vạn người si luyến, vạn người mê nhưng những mảnh vỡ nhân cách cũng không vì thế mà rung động,Triêu Đăng không thể làm gì khác hơn là sử dụng mưu mẹo dị thế mặc liên bản lĩnh hơn người để hoàn thành nhiệm vụ, y lần lượt tiến công Lạnh Lùng, Lẳng Lơ, Bá Đạo, Đa Nghi, Ngạo Mạn đủ loại đẳng cấp, đủ loại tính cách thay đổi theo từng nhân vật, mãi đến lúc cuối cùng Triêu Đăng mới biết, người đối mặt với mình từ đầu tới cuối đều là một, đối phương vẫn luôn bên cạnh y…Mời bạn theo dõi tiếp diễn biến truyện hay này nhé.

WARC-Type: response

Content-Type: application/http; msgtype=response

WARC-Truncated: length

WARC-Identified-Payload-Type: text/html

Server: nginx

Content-Type: text/html; charset=UTF-8

Connection: close

Vary: Accept-Encoding