Код VBA работает в Access 2007, но не работает в Access 2010. Есть идеи? - PullRequest
0 голосов
/ 06 июля 2011

Моя жена написала следующий код, и он работал нормально для нее, когда ее организация использовала 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

Ответы [ 2 ]

3 голосов
/ 06 июля 2011

Это ужасный код. Заполнение раскрывающегося списка или списка путем обхода набора записей и .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"

Я не могу сказать, что не так с кодом, не работающим (я подозреваю, что происходит проблема с режимом песочницы / безопасностью макросов), но это гораздо больше строк кода, чем необходимо.

1 голос
/ 06 июля 2011

В дополнение к предложениям @ David-W-Fenton, я думаю, вам следует использовать строковую переменную для хранения оператора SELECT. Затем вы можете выполнить Debug.Print в Immediate Window, скопировать его в новый запрос (в представлении 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 (сокращение от «this form» ... форма, содержащая код, который вы Бег). Это не намного короче, но Me не нужно будет менять, если форма когда-либо будет переименована. Все еще не большое дело ... только одна менее подробная деталь, с которой вам не придется возиться в будущем.

...