Access 使用未绑定的组合框查找和添加记录

Posted

技术标签:

【中文标题】Access 使用未绑定的组合框查找和添加记录【英文标题】:Access Use Unbound Combobox To Find and Add Record 【发布时间】:2017-11-08 20:58:57 【问题描述】:

我有一个显示单个记录信息的项目查找表单。记录上有一个未绑定的组合框,用户用于输入项目编号并通过 DoCmd.SearchForRecord 直接转到该记录。这部分工作正常。

我还想做的是让 unboundcombobox 能够将新项目添加到表中。我现在将 NotInList 设置为:

If MsgBox("Create new inventory item " & NewData & "?", _
    vbQuestion + vbYesNo) = vbNo Then
    Me.PartNumberList.Undo
    Response = acDataErrContinue
    Exit Sub
Else
    CurrentDb.Execute "INSERT INTO Inventory ( PartNumber ) VALUES ('" & NewData & "');"
    Response = acDataErrAdded
End If

表格接收到新数据,但现在我需要重新查询表格,表格才能找到数据。如果我在该代码之后立即添加 Me.Requery,则表单认为我正在尝试将相同的项目输入到表单中,它仍然没有在表中找到它,并且它再次询问我是否要添加该项目。如果我尝试先重新查询组合框,它会告诉我必须先保存数据。在 Requery 前面添加 If Me.Dirty then Me.Dirty = False 并不能解决此问题。

所以经过一番搜索后,我发现我应该在重新查询之前尝试移动到组合框中的第一条记录。这有效,但现在我收到一条通知“您输入的值对此字段无效。”我按 OK,然后一切都被要求,我现在可以手动导航到我的新零件号。但我无法弄清楚到底是什么发出了这个通知。 On Error Resume Next 不会绕过此通知。当我单步执行代码时,通知似乎发生在 NotInList 之后,然后它会跳过所有其他事件。我不会触发我的 BeforeUpdate 或 AfterUpdate。

也许我只是在查找我的项目时都错了。也许我应该让用户添加不同形式的项目。将它们全部保存在一个单一的形式中会很方便。哦,也许值得一提,这个表单是作为对话框打开的,在添加模式下。但即使我在关闭数据输入的情况下自行打开表单,错误仍然存​​在。

【问题讨论】:

【参考方案1】:

在成功将行添加到表后,不是重新查询表单,而是以编程方式设置表单的记录源?因此,请确保表单在设计视图中没有记录源并保存表单。在需要的地方打开对话框表单,并确保 ComboBox 具有 RecordSource。用户输入不在列表中的值,您使用 NotInList 事件将其添加到数据库中,将用户输入的值存储到变量中,仅重新查询您的 ComboBox,将组合框设置为变量,以便选择新条目,然后您的代码将使用:

Me.RecordSource = "SELECT * FROM Inventory WHERE PartNumber= " & Me!YourComboboxValue

Me.RecordSource = "SELECT * FROM Inventory WHERE PartNumber= '" & Me!YourComboboxValue & "'"

如果“PartNumber”是一个字符串值。

这应该比 DoCmd.SearchForRecord 快得多。当您最初打开表单时,您会将永远不需要的行拉入表单。

重新查询组合框后,新值将在列表中但未被选中。这可能适合您的情况。如果您先将零件编号存储在变量中,则可以执行以下操作:

Dim sPartNumber as String
sPartNumber = NewData
<ADD YOUR DATA TO THE TABLE>
Me!ComboBox.Requery
Me.RecordSource = "SELECT * FROM Inventory WHERE PartNumber = '" & sPartNumber & "'"
Me!Combobox = sPartNumber (Optional)

代码可能并不像凭记忆编写那样完美。 :-)

告诉我,祝你好运!

【讨论】:

谢谢!这让一切变得简单得可笑,我以前太努力过度编程了。没有必要重新查询组合框,因为(据我了解)acDataErrAdded 在 NotInList 事件之后自动重新查询组合框,并将组合框保留为新添加的数据。然后我的 AfterUpdate 代码接管并将记录源更改为新添加的记录。 酷。我从未使用过 NotInList 事件,也没有意识到它在内部处理了重新查询事件。考虑到这一点,我们向 Access 团队致敬!祝你好运。

以上是关于Access 使用未绑定的组合框查找和添加记录的主要内容,如果未能解决你的问题,请参考以下文章

更新取消事件之前的 MS Access 不适用于未绑定的组合框

MS ACCESS - 如何在更改事件中获取未绑定组合框的当前列值

MS Access 2010:未绑定的组合框不会更新

Access VBA:根据非绑定列在组合框中查找项目

如果表单未绑定,如何选择 MS Access 组合框中的第一项

如何在组合框中返回未绑定列的值