我有一个访问表单,我希望用户在其中选择一个 AwardNumber。当他们选择奖项时,该奖项的相关文档会显示在“未完成”或“完成”列表框中。然后我希望他们能够将项目从一个列表移动到另一个列表。列表框是单选的。
这是后端:
不完整的列表框(在设计中说未绑定)有 3 列。Bound 列是 1,但第 1 列和第 3 列的宽度为 0,因此被隐藏。列表框还具有以下 RowSource:
SELECT DocTbl.DocID, DocTbl.DocTitle, DocTbl.DocLink
FROM DocTbl
WHERE ((DocTbl.Complete <> Yes) AND (DocTbl.AwardNumber = Forms!Select_Doc_To_Code!Award_CBox.Text))
ORDER BY DocTbl.DocID
(完整的 ListBox 具有相同的功能,只是它不是DocTbl.Complete <> Yes
,而是DocTbl.Complete = Yes
。)
当他们在 ComboBox 中选择 AwardNumber 时,有一些 VBA 运行以下命令来填充列表,这可以按预期工作:
Me.Incompletes.Requery
Me.Completes.Requery
这两个按钮触发代码以“移动”项目。这是顶部按钮的代码,用于将文档从“未完成”列表框“移动”到“完成”列表框(即,将文档的“完成”值设置为“是”,然后重新查询列表框)。指示的行是出错的地方:
Sub Move_To_Complete_Click()
docID = Incompletes.Column(0, Incompletes.ListIndex)
Set Tbl = CurrentDb.TableRefs("DocTbl")
Set db = CurrentDb
db.Execute = "UPDATE DocTbl " & _
" SET DocTbl.Complete = Yes " & _
" WHERE DocTbl.DocID = " & docID
---->Me.Incompletes.Requery
---->Me.Completes.Requery
End Sub
换句话说,UPDATE 查询有效(我在表中看到更新的数据),但是当我尝试重新查询两个 ListBox 以刷新它们时,所有项目都会从两者中消失!。此外,如果我从 ComboBox 中选择另一个奖项,然后重新选择相同的奖项,列表会再次正确填充,只需运行相同的 .Requery 命令!
我试过了Me.Refresh
,Me.Recalc
。我也尝试过再次设置 RowSource。我想知道它是否过早地重新查询;我已经放置了断点和 DoEvents,所以我认为这不是时间问题,但可能更多的是代码需要停止运行以重新查询工作。这是没有意义的,因为重新查询是代码。
我知道还有其他方法可以做到这一点(我已经尝试过但失败了),但我真的很想知道为什么这种方法不起作用。
提前致谢!!