使用文本框中的值更新/编辑在列表框中选择的多个记录

时间:2017-12-29 19:10:05

标签: vba ms-access access-vba

我遇到了一个非常棘手的问题,我无法解决。

我有一个存储在仓库中的工具的访问数据库,这些工具从它借用到生产站点。我有一个表,用于存储借入和退回物品到仓库的日期数据(ofc以及其他数据,如工人ID等)。当item在仓库之外时,表中的returning_date字段为空。

所以我创建了一个查询,只显示了returns_date字段为空的记录,并创建了一个带有(多选)列表框的表单,该列表框显示来自查询的数据和一个日期格式化的文本框。现在我想要实现的是能够在列表框中选择多个记录,并使用文本框中的日期更新返回日期字段的所选记录。我遇到的问题是我不知道如何回忆所选记录中的某个字段以在那里插入数据。这可能和我一样吗?如果没有,我该如何解决这个问题?

编辑:对于迭代过程,我尝试使用两种类型的迭代:

For Each varItm In Me.Listbox.ItemsSelected
'update statement should go here
Next varItm

和第二个:

For i = 0 to Listbox.ItemsSelected.Count - 1
'update statement
Next i

我遇到了变量和丢失对象的问题(运行时错误424),但主要问题是我不知道如何将数据插入到选定行的某些字段中。

1 个答案:

答案 0 :(得分:1)

您的列表框应至少有两列提供源查询中的数据。第一个应该是ToolID,第二个应该是ToolName(或者调用包含工具名称的任何字段)。附近的按钮可以运行您上面的例程,以确保在正确选择所有项目之前不运行。然后,标识columns属性以获取运行查询的ID号。请记住,虽然在Access中第一列是0,就像第一个记录在列表框中是0一样(这就是为什么在列表计数结束时你有一个-1)。

如果您想分别为每个ID调用更新例程,这是一种方法:

Dim ToolID as Long
Dim strSQL as String
For i = 0 To Me.lsbTools.ListCount - 1
    If Me.lsbTools.Selected(i) Then
        ToolID = Me.lsbTools.Column(0, i)
        strSQL = "UPDATE tblTool SET ReturnDate=#" & me.txbDateReturned & "# WHERE ToolID=" & ToolID
        DoCmd.RunSQL strSQL
    End If
Next

但是,您也可以构造SQL运行一次并更新所有包含的SQL,如下所示:

Dim ToolID as Long
Dim strSQL as String
'The hashtags around the dates ONLY work in MS ACCESS and will not work in T-SQL.  you will have to edit the syntax to use this on a SQL-server linked table
strSQL = "UPDATE tblTool SET ReturnDate=#" & me.txbDateReturned & "# WHERE ToolID IS IN("

For i = 0 To Me.lsbTools.ListCount - 1
    If Me.lsbTools.Selected(i) Then
        ToolID = Me.lsbTools.Column(0, i)
        strSQL = strSQL & ToolID &", "
    End If
Next
'This checks to make sure the last two characters are a comma and space, and removes them
If Right(strSQL,2) = ", " Then                   
    strSQL = Left$(strSQL, Len(strSQL)-2) & ")"
    DoCmd.RunSQL strSQL                    'This runs the SQL statement
End if