Thủ Thuật Access
[Hỏi] Help ACE Sửa giúp em code Delete với ? - Phiên bản có thể in

+- Thủ Thuật Access (http://thuthuataccess.com/forum)
+-- Diễn đàn: Access Cơ Bản (http://thuthuataccess.com/forum/forum-5.html)
+--- Diễn đàn: Table (http://thuthuataccess.com/forum/forum-6.html)
+--- Chủ đề: [Hỏi] Help ACE Sửa giúp em code Delete với ? (/thread-10954.html)



Help ACE Sửa giúp em code Delete với ? - Cuong Servenet - 14-05-19

Anh chị cho em hỏi có cách nào để xóa nhiều dòng dữ liệu 1 lúc mà chỉ hiện 1 msgbox Yes - Cancel không ạ ? 

hiện tại code bên dưới khi bấm nút DELETE trên bàn phím thì xóa từng dòng 1 thì msgbox không có vấn đề gì cả .

Nhưng khi xóa từ 2 dòng trở đi thì msgbox xác nhận nó lặp đi lặp lại nhiều lần

Vậy có cách nào để giải quyết vấn đề "Chỉ 1 msgbox xác nhận là xóa dc nhiều dòng trong form ko vậy a?"


Code :
Private plngDelSelCnt As Variant

Private Sub Form_BeforeDelConfirm(Cancel As Integer, Response As Integer)
    Response = acDataErrContinue
End Sub

Private Sub Form_Delete(Cancel As Integer)
    plngDelSelCnt = Me.SelHeight
    
    If MsgBox(plngDelSelCnt & " Xoa" & vbCrLf & _
              "xac nhan xoa", vbOKCancel) = vbCancel Then
        Cancel = True
    End If
End Sub


RE: Help ACE Sửa giúp em code Delete với ? - Cuong Servenet - 14-05-19

upTrả lời


RE: Help ACE Sửa giúp em code Delete với ? - paulsteigel - 14-05-19

(14-05-19, 03:19 PM)Cuong Servenet Đã viết: Anh chị cho em hỏi có cách nào để xóa nhiều dòng dữ liệu 1 lúc mà chỉ hiện 1 msgbox Yes - Cancel không ạ ? 

hiện tại code bên dưới khi bấm nút DELETE trên bàn phím thì xóa từng dòng 1 thì msgbox không có vấn đề gì cả .

Nhưng khi xóa từ 2 dòng trở đi thì msgbox xác nhận nó lặp đi lặp lại nhiều lần

Vậy có cách nào để giải quyết vấn đề "Chỉ 1 msgbox xác nhận là xóa dc nhiều dòng trong form ko vậy a?"


Code :
Private plngDelSelCnt As Variant

Private Sub Form_BeforeDelConfirm(Cancel As Integer, Response As Integer)
    Response = acDataErrContinue
End Subt

Private Sub Form_Delete(Cancel As Integer)
    plngDelSelCnt = Me.SelHeight
    
    If MsgBox(plngDelSelCnt & " Xoa" & vbCrLf & _
              "xac nhan xoa", vbOKCancel) = vbCancel Then
        Cancel = True
    End If
End Sub

Các bước để bạn làm như sau:
1. Bạn muốn xóa nhưng record có đặc điểm gì? Ví dụ các bản ghi có trường Hovaten có chữ bắt đầu là "Hoa"
2. Thực hiện tập lệnh SQL để xóa: docmd.RunSQL
Ví dụ: 
+ Đoạn sau sẽ xóa tất cả các bản ghi có trường [tentruong] bắt đầu bằng chữ Hoa (từ khóa Like để lọc những bản gi thỏa mãn để xóa).
DoCmd.RunSQL "Delete * from [tenbang] WHERE [tentruong] like 'Hoa*';"
+ Đoạn sau sẽ xóa tất cả các bản ghi có trường [tentruong] là chữ Hoa (Toán tử ='Hoa' để xóa các bản ghi có trường là chữ Hoa. Vì Trường này là ký tự nên bạn phải đặt trong dấu nháy kép, còn nếu là trường số bạn sẽ không cần nó.
DoCmd.RunSQL "Delete * from [tenbang] WHERE [tentruong] = 'Hoa';"


RE: Help ACE Sửa giúp em code Delete với ? - tranthanhan1962 - 15-05-19

Thực ra bạn sử dụng lệnh xóa trên một button nên chỉ xóa được một record mà thôi.
Nếu bạn đã có code BeforeDelConfirm và thiết kế form với record selectors = yes
     Private Sub Form_BeforeDelConfirm(Cancel As Integer, Response As Integer)

     Dim n_Reply, TraLoi As Integer
     Response = acDataErrContinue
     TraLoi = MsgBox("Xác nhận xóa", vbQuestion + vbYesNo, "Thông báo")
     If TraLoi = vbNo Then
     Cancel = True
     End If
     End Sub
Khi đã đưa phần thông báo vào BeforeDelConfirm, code  nút xóa (cmdDel)  đơn giản hơn
[i]     Private Sub cmdDel_Click()
[/i]

     DoCmd.RunCommand acCmdDeleteRecord

    [i]End Sub[/i]


Lúc này, chỉ cần bạn quét các dòng record liện tục và bấm delete nó cũng chỉ hiện thông báo một lần, nếu bạn yes nó sẽ xóa tất tần tật những record mà bạn đã chọn, nên nhớ, nó chỉ xóa hết khi bạn dùng nút delete trên bàn phím còn nếu bạn sử dụng button xóa trên form nó cũng chỉ xóa 1 record đầu tiên trên nhóm record mà bạn chọn


RE: Help ACE Sửa giúp em code Delete với ? - tranthanhan1962 - 15-05-19

Thực ra bạn sử dụng lệnh xóa trên button trên form nên chỉ xóa được một record mà thôi.
Nếu bạn đã có code BeforeDelConfirm và thiết kế form với record selectors = yes
     Private Sub Form_BeforeDelConfirm(Cancel As Integer, Response As Integer)

     Dim  TraLoi As Integer
     Response = acDataErrContinue
     TraLoi = MsgBox("Xác nhận xóa", vbQuestion + vbYesNo, "Thông báo")
     If TraLoi = vbNo Then
     Cancel = True
     End If
     End Sub
Khi đã đưa phần thông báo vào BeforeDelConfirm, code  nút xóa (cmdDel)  đơn giản hơn
[i]     Private Sub cmdDel_Click()
[/i]

     DoCmd.RunCommand acCmdDeleteRecord

    [i]End Sub[/i]


Lúc này, chỉ cần bạn quét các dòng record liện tục và bấm delete nó cũng chỉ hiện thông báo một lần, nếu bạn yes nó sẽ xóa tất tần tật những record mà bạn đã chọn, nên nhớ, nó chỉ xóa hết khi bạn dùng nút delete trên bàn phím còn nếu bạn sử dụng button xóa trên form nó cũng chỉ xóa 1 record đầu tiên trên nhóm record mà bạn chọn


RE: Help ACE Sửa giúp em code Delete với ? - Cuong Servenet - 16-05-19

(15-05-19, 05:07 PM)tranthanhan1962 Đã viết: Thực ra bạn sử dụng lệnh xóa trên button trên form nên chỉ xóa được một record mà thôi.
Nếu bạn đã có code BeforeDelConfirm và thiết kế form với record selectors = yes
     Private Sub Form_BeforeDelConfirm(Cancel As Integer, Response As Integer)

     Dim  TraLoi As Integer
     Response = acDataErrContinue
     TraLoi = MsgBox("Xác nhận xóa", vbQuestion + vbYesNo, "Thông báo")
     If TraLoi = vbNo Then
     Cancel = True
     End If
     End Sub
Khi đã đưa phần thông báo vào BeforeDelConfirm, code  nút xóa (cmdDel)  đơn giản hơn
[i]     Private Sub cmdDel_Click()
[/i]

     DoCmd.RunCommand acCmdDeleteRecord

    [i]End Sub[/i]


Lúc này, chỉ cần bạn quét các dòng record liện tục và bấm delete nó cũng chỉ hiện thông báo một lần, nếu bạn yes nó sẽ xóa tất tần tật những record mà bạn đã chọn, nên nhớ, nó chỉ xóa hết khi bạn dùng nút delete trên bàn phím còn nếu bạn sử dụng button xóa trên form nó cũng chỉ xóa 1 record đầu tiên trên nhóm record mà bạn chọn


cam on anh nhe.
cái form của em thì ko thiết kế nút xóa mà thay vào đó dùng nút Delete trên keyboard ạ

khi dùng cách đó thì mình chọn 1 dòng xóa thì ko vấn đề gì cả nhưng khi chọn nhiều dòng dữ liệu xóa thì nó hiện thông báo tin yes-no nhiều lần .


RE: Help ACE Sửa giúp em code Delete với ? - tranthanhan1962 - 16-05-19

(16-05-19, 08:30 AM)Cuong Servenet Đã viết: cái form của em thì ko thiết kế nút xóa mà thay vào đó dùng nút Delete trên keyboard ạ
khi dùng cách đó thì mình chọn 1 dòng xóa thì ko vấn đề gì cả nhưng khi chọn nhiều dòng dữ liệu xóa thì nó hiện thông báo tin yes-no nhiều lần .
Khi bạn đưa code gọi msgbox vào thủ tục (procedure) Form_Delete và sử dụng phím delete xóa một nhóm record, access sẽ thực hiện bấy nhiêu thủ tục xóa lần lượt từng record một, vì trong thủ tục Form_Delete có chứa dòng lệnh gọi msgbox nên mỗi lần xóa một record thì nó sẽ thực hiện lệnh gọi msgbox một lần, nên xóa bao nhiêu record nó sẽ hiện lên bấy nhiêu msgbox, còn khi bạn đưa công việc gọi msgbox cho BeforeDelConfirm (xác nhận trước khi xóa) thì sau khi xác nhận một lần cho việc xóa các record được chọn đó thì công việc của lệnh Form_Delete chỉ còn là việc xóa hoặc không xóa các record đó, vì trong thủ tục này không có lệnh gọi msgbox.
* Thứ tự các thủ tục khi xóa record
BeforeDelConfirm: Thủ tục trước khi xóa, nhằm xử lý một công việc trước khi record: hỏi xóa hay không? lưu các record bị xóa sang table khác....
Form_Delete(Cancel As Integer): thủ tục khi xóa, một công việc cùng lúc với việc xóa record
Form_AfterDelConfirm(Status As Integer): thủ tục thực hiện sau khi xóa. requery một đối tượng nào đó, di chuyển trỏ chuột đến vị trí nào đó sau khi xóa...
* Khi dùng phím delete mà không cần gọi lệnh gì thêm thì không cần sử dụng thủ tục Form_Delete vì nó cùng bản chất.