Lập liên bảng bị lỗi trong access phải làm sao năm 2024

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