如何删除Access上的多个选定记录?

问题描述 投票:1回答:1

我的任务是在Access上创建一个表单,删除多个选定的记录而无需用户控件和删除查询。

用户使用记录选择器选择(通过突出显示)记录。我需要将VBA代码添加到删除按钮,删除所有选定的记录。当我这样做时,只删除第一条记录。

如何使突出显示的记录成为活动记录并一次删除它们?我假设我需要某种循环。

我查看了一些建议的链接,这就是我所拥有的:

intHeight = Me.Form.SelHeight
intTop = Me.Form.SelTop

Dim N As Integer
With Me.Form.RecordsetClone
    If .RecordCount < 1 Then
        MsgBox "Nothing saved, Delete canceled.", , "Remove Test Error"
    Else
        Response = MsgBox("Are you sure you want to delete records?", vbYesNo,   "Duplicate?", 0, 0)
        If Response = vbYes Then
            MsgBox (intHeight)
            For N = 1 To intHeight
                .AbsolutePosition = intTop - 1
                .MoveFirst
                sql = "DELETE FROM [Feb Fleet] Where [ID]=&Me.ID.Value"
                CurrentDb.Execute (sql)
                Me.Form.Requery
            Next
        End If
    End If
End With

代码通过但没有删除。当我检查intHeight值时,我得到0.我不确定.SelTop方法是否适用于我的代码。

ms-access access-vba
1个回答
0
投票

Access中的问题是当焦点移动到按钮时选择会丢失。我通过在主窗体上的数据表视图中放置一个子窗体来解决问题。主窗体没有数据源或绑定到父记录。

子表单控件有一个Exit事件。在此活动期间,子表单选择仍然有效。因此,我使用此事件来存储选择

Dim top As Long, height As Long

'Exit event of the sub-form control
Private Sub frmSelect_Products_Exit(Cancel As Integer)
    top = frmSelect_Products.Form.SelTop
    height = frmSelect_Products.Form.SelHeight
End Sub

在删除事件处理程序中,您可以执行类似这样的操作(只需进行一些测试输出而不实际删除)。此外,你将不得不调整一些名称。

Dim N As Long, sql As String

'Restore the selection so the user can see it during the delete dialog.
frmSelect_Products.Form.SelHeight = height

'Test
MsgBox "top = " & top & ",    height = " & height

With frmSelect_Products.Form.RecordsetClone
    For N = top + height - 1 To top Step -1
        .AbsolutePosition = N - 1 'Zero-based
        sql = "DELETE FROM [Feb Fleet] Where [ID]=" & .Fields!ProductID
        MsgBox sql
        'CurrentDb.Execute sql
    Next
End With
Me.Form.Requery

您的代码移动到.AbsolutePosition = intTop - 1的第一个选定项目,然后使用.MoveFirst移动到第一个记录,忽略先前通过AbsolutePosition设置的位置。即,循环变量N给出的位置被完全忽略。

© www.soinside.com 2019 - 2024. All rights reserved.