0

我的妻子编写了以下代码,当她的组织使用 Access 2007 时,它曾经对她正常工作。他们刚刚更新到 Access 2010,它不再工作。我对 Access 一点也不熟悉,但我建议我将它呈现给 Stack,看看你们是否可以直接看到在 Access 2010 中不起作用的任何内容。提前感谢您的任何见解。

Private Sub Originating_Zone_AfterUpdate()

Dim EscortDB As DAO.Database

Dim rstBldgs As DAO.Recordset

Set EscortDB = CurrentDb()
Set rstBldgs = EscortDB.OpenRecordset("SELECT BuildingName FROM" & _
" ZoneBldgLookup WHERE ZoneLocation = '" & _
Forms!DateID!EscortIDSubform.Form.[Originating Zone] & _
"' ORDER BY BuildingName", [dbOpenDynaset])


rstBldgs.MoveLast

rstBldgs.MoveFirst

Do Until rstBldgs.EOF
Forms!DateID!EscortIDSubform.Form.[Pick Up Location].AddItem rstBldgs!BuildingName
rstBldgs.MoveNext
Loop

rstBldgs.Close


End Sub

更新:她使用以下代码让它工作。谢谢你的帮助!

Private Sub Originating_Zone_AfterUpdate()

Dim sBuildList As String

sBuildList = ("SELECT BuildingName FROM" & _
" ZoneBldgLookup WHERE ZoneLocation = '" & _
Forms!DateID!EscortIDSubform.Form.[Originating Zone] & _
"' ORDER BY BuildingName")

Forms!DateID!EscortIDSubform.Form.[Pick Up Location].RowSource = sBuildList
Forms!DateID!EscortIDSubform.Form.[Pick Up Location].Requery

End Sub
4

2 回答 2

3

这是可怕的代码。通过遍历记录集和 .AddItem 来填充下拉列表或列表框是非常低效的。只需将 SQL 字符串分配给组合框/列表框的 Rowsource 属性,整个事情就可以在没有代码的情况下完成。

现在,很明显,列表会根据此 AfterUpdate 事件所附加到的控件中的选择而更改,但这意味着您在此事件中分配了 Rowsource。可能,以上所有代码都可以替换为:

  Forms!DateID!EscortIDSubform.Form.[Pick Up Location].Rowsource = "SELECT BuildingName FROM" & _
     " ZoneBldgLookup WHERE ZoneLocation = '" & _
     Forms!DateID!EscortIDSubform.Form.[Originating Zone] & _
     "' ORDER BY BuildingName"

我不能说代码不起作用有什么问题(我怀疑存在沙盒模式/宏安全问题),但它的代码行数比需要的多。

于 2011-07-06T01:51:20.763 回答
1

除了@David-W-Fenton 的建议之外,我认为您应该使用字符串变量来保存 SELECT 语句。然后您可以 Debug.Print 将其打印到即时窗口,将其复制到新查询(在 SQL 视图中),并确保它实际返回行。

Dim strSql As String
strSql = "SELECT BuildingName FROM" & _
    " ZoneBldgLookup WHERE ZoneLocation = '" & _
    Forms!DateID!EscortIDSubform.Form.[Originating Zone] & _
    "' ORDER BY BuildingName"
Debug.Print strSql
Forms!DateID!EscortIDSubform.Form.[Pick Up Location].Rowsource = strSql

此外,如果这是名为 DateID 的表单模块中的代码,您可以替换Forms!DateID为关键字Me(这是“此表单”的简写......包含您正在运行的代码的表单)。这并没有显着缩短,但Me如果表单被重命名,则不需要更改。仍然不是什么大不了的事......只是少了一个你不必在路上摆弄的细节。

于 2011-07-06T02:23:03.407 回答