Câu hỏi về thủ tục kiểm tra lỗi

Liên hệ QC

nguoiconxunui

Thành viên hoạt động
Tham gia
31/8/06
Bài viết
198
Được thích
116
Không biết đặt tiêu đề như thế nào cho đúng nữa và không biêt có đúng nơi không. sr trước bà con vậy
Vấn đề thế này:
-Em có cái form nhập liệu có khoản trên dưới 30 textbox (khoảng 20 kiểu number và còn lại là string)
-Khi click button "Ghi dữ liệu" nó phải hiện chính xác những textbox nào gây ra lỗi (không đúng kiểu dữ liệu), format thành màu đỏ toàn bộ những dữ liệu gây ra lỗi - nói thì dễ nhưng làm có dễ không thì chưa biết, ncxn làm hoài không được.
- ncxn hiện giờ Chỉ tạm thời
1. dùng hàm or theo kiểu if or textbox1 or ...not numberic() then msgbox()<-- cho kiểu number...
2. on error go to xulyloi:
-------
xulyloi:
>đơn giản thì if err.number = xxx then msgbox
>phức tạp hơn thì vòng lặp tìm mã số lỗi rùi thông báo theo thông số tương ứng
3. Cách này dài hơi hơn: kiểm tra trực tiếp từng textbox bằng các sự kiện key_xxx để lập tức thông báo khi dữ liệu đưa vào không đúng và không cho di chuyển con trỏ đến chổ khác khi chưa đúng dữ liệu.
---------------------
Tóm lại cách 1 & 2 thì đơn giản nhưng người nhập liệu không biết sai chỗ nào.
cách 3 thì Ok nhưng viết code kiểu này chắc điên trước khi SP được sử dụng.
--------------
Anh chị nào có phương pháp hay hơn xin giúp em, xin cảm ơn và ...
-----------
ncxn
 
Không biết đặt tiêu đề như thế nào cho đúng nữa và không biêt có đúng nơi không. sr trước bà con vậy
Vấn đề thế này:
-Em có cái form nhập liệu có khoản trên dưới 30 textbox (khoảng 20 kiểu number và còn lại là string)
-Khi click button "Ghi dữ liệu" nó phải hiện chính xác những textbox nào gây ra lỗi (không đúng kiểu dữ liệu), format thành màu đỏ toàn bộ những dữ liệu gây ra lỗi - nói thì dễ nhưng làm có dễ không thì chưa biết, ncxn làm hoài không được.
- ncxn hiện giờ Chỉ tạm thời
1. dùng hàm or theo kiểu if or textbox1 or ...not numberic() then msgbox()<-- cho kiểu number...
2. on error go to xulyloi:
-------
xulyloi:
>đơn giản thì if err.number = xxx then msgbox
>phức tạp hơn thì vòng lặp tìm mã số lỗi rùi thông báo theo thông số tương ứng
3. Cách này dài hơi hơn: kiểm tra trực tiếp từng textbox bằng các sự kiện key_xxx để lập tức thông báo khi dữ liệu đưa vào không đúng và không cho di chuyển con trỏ đến chổ khác khi chưa đúng dữ liệu.
---------------------
Tóm lại cách 1 & 2 thì đơn giản nhưng người nhập liệu không biết sai chỗ nào.
cách 3 thì Ok nhưng viết code kiểu này chắc điên trước khi SP được sử dụng.
--------------
Anh chị nào có phương pháp hay hơn xin giúp em, xin cảm ơn và ...
-----------
ncxn

Theo mình thì làm như sau :

1. Các Textbox chứa số thì nên đặt sự kiện Keypress để chỉ cho nhập dữ liệu là số :

Làm cách này gọi là "phụ tải", tiến trình kiểm tra sai sót sẽ được kiểm tra san sẻ ngay cho lúc nhập liệu. Chỉ cần Copy là OK mà.
Sau này kiểm tra sai sót rất dễ.

VD : Chỉ cho nhập số

PHP:
Private Sub H_TBABC_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    On Error Resume Next
    Select Case KeyAscii
    Case 48 To 57
    Case 44    ' 45 = ","  
    Case 46    ' 47 = "."
    Case Else
        KeyAscii = 0
    End Select
End Sub
2. Khi nhấn nút ghi thì sẽ kiểm tra xem có TB nào rỗng hay không thôi. Cái này ta làm một vòng lặp các Control là được.

Thân!
 
Upvote 0
Mã:
Dim cCont As Control

    For Each cCont In Me.Controls

        If TypeOf cCont Is TextBox Then
           If cCont.DataField = "" Then
                 'Xử lý lệnh ở đây
           Else 
                 'Xử lý lệnh ở đây
        End If

    Next cCont
Dùng key_xxx thì đã làm rồi, copy + past cũng ớn với vài chục form
Dùng vòng lặp như trên ổn không nhỉ, em thì muốn nó "tìm" hết những controls nào thỏa đk rồi in ra hoặc đổi định dạng (cho mọi người dễ thấy thôi)
----------
Thanks anh nhiều
 
Upvote 0
Ví dụ: form của bạn có 20 textbox (Txt01, Txt02, ..., Txt20) nhập số và 1 Button ComNhap. Chỉ cho phép ComNhap thi hành lệnh khi:
- Không có textbox nào rỗng.
- Dữ liệu trong textbox phải là số.

Đề xuất cách giải:
+ Txt01, Txt02, ..., Txt20: (tên txtbox nhập số theo quy luật dạng Txtnn với n là chữ số)
- Dùng sự kiện KeyPress kiểm tra phím bấm, chỉ cho phép nhập 0 >9 để dữ liệu nhập phải là nhập số.
PHP:
Private Sub Txt01_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If KeyAscii < 48 And KeyAscii > 57 Then KeyAscii = 0
End Sub
- Dùng sự kiện Change kiểm tra các textbox Txt01, Txt02, ..., Txt20 có nhập đủ dữ liệu chưa (khác rổng). Nếu có Textbox chưa nhập, vô hiệu ComNhap.
Đây là vấn đề của bài này. Bạn phải viết 20 sự kiện Change cho 20 Textbox Txtnn như thế này:
PHP:
Private Sub TxtN01_Change()
If TxtN01.Value = "" Then
  ComNhap.Enabled = False
Else
  If TxtN02.Value = "" Then
    ComNhap.Enabled = False
  ElseIf TxtN03.Value = "" Then
    ComNhap.Enabled = False
  ElseIf TxtN... = "" Then
    ........
  ElseIf TxtN20 = "" Then
     ........
Else
    ComNhap.Enabled = True
  End If
End If
End Sub
Các sự kiện này viết giống nhau, ta có thể tách các dòng lệnh bên trong thành Sub KiemTra. sự kiện Change thành:
PHP:
Private Sub TxtN01_Change()
KiemTra
End Sub
PHP:
Private Sub TxtN...._Change()
KiemTra
End Sub
PHP:
Private Sub TxtN20_Change()
 KiemTra
 End Sub
Và:
PHP:
Private Sub KiemTra()
If TxtN01.Value = "" Then
  ComNhap.Enabled = False
Else
  If TxtN02.Value = "" Then
    ComNhap.Enabled = False
  ElseIf TxtN03.Value = "" Then
    ComNhap.Enabled = False
  ElseIf TxtN... = "" Then
     ........
  ElseIf TxtN20 = "" Then
      ........
Else
    ComNhap.Enabled = True
  End If
End If
End Sub
Nhưng do tên các textbox Txt01, Txt02, ..., Txt20 có quy luật, nên có thể viết:
PHP:
Private Sub KiemTra()
ComNhap.Enabled = True
Dim ComN As Object
For i = 0 To UserForm1.Controls.Count - 1
  If Left(UserForm1.Controls(i).Name, 4) = "TxtN" Then
    If UserForm1.Controls(i).Value = "" Then
      ComNhap.Enabled = False
      Exit Sub
    End If
  End If
Next
=================================================
Như vậy, mỗi textbox bạn chỉ cần 2 thủ tục đơn giản:
PHP:
Private Sub Txt01_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If KeyAscii < 48 And KeyAscii > 57 Then KeyAscii = 0
End Sub
PHP:
Private Sub TxtN01_Change()
KiemTra
End Sub

và 1 thủ tục kiểm tra chung:
PHP:
Private Sub KiemTra()
ComNhap.Enabled = True
Dim ComN As Object
For i = 0 To UserForm1.Controls.Count - 1
  If Left(UserForm1.Controls(i).Name, 4) = "TxtN" Then
    If UserForm1.Controls(i).Value = "" Then
      ComNhap.Enabled = False
      Exit Sub
    End If
  End If
Next
 
Lần chỉnh sửa cuối:
Upvote 0
rất cảm ơn các anh chị, ncxn đã giải quyết được vấn đề sau khi lựa chọn nhiều phuơng án, cuối cùng đành ăn cắp ý tưởng của PHP & ajax (tuy hơi củ chuối nhưng an toàn)
1. Có bao nhiêu kiểu dữ liệu insert vào thì có bao nhiêu thủ tục kiểm tra tương ứng
ví dụ: txtQ chỉ nhập số dùng luôn isnumeric()=false then :
-đổi màu nền txtQ.backcolor=() sang màu đỏ
-không cho thoát co trỏ khỏi vị trí lỗi
-.....
thêm ví dụ như kiểu string, kiểm tra và loại bỏ các ký tự ảnh hưởng đến cấu trúc lệnh SQL
2. Thủ tục kiểm tra chung khi ghi dữ liệu
-------------------
hì hì khi nào bí chạy lênh hỏi típ
cảm ơn lần nữa
 
Upvote 0
Web KT
Back
Top Bottom