Naeel Maqsudov » 02 ноя 2006, 23:24
Вот. Поступаем точно так как я советовал, т.е. добавляем переменную CUR_TBL в Watch, выполняем макрос по шагам, "и тупо смотрим что к чему" (с) Стругацкие.
Под отладчиком видно, что переменна CUR_TBL сначала = Nothing, а потом (после Set) становися действительным указателем, но в процессе выполнения ЛЮБОГО следующего оператора (Даже если после Set поставить X=1) перестает быть действительным. Экспериментально установлено, что объект TableDef прекращает свое существование к началу выполнения следующего оператора (составные операторы рассматриваются как несколько).
ФАНТАСТИКА! Я этого не знал! Т.е. работать с экземпляром объекта TableDef можно только в пределах одного оператора. Потом он разрушается, а указатель на него перестает быть действительнывм. Аналогично обстоит дело с объектами лежащими глубже (Например, ссылка на TableDef(...).Fields ведет себя также). Могу только предположить, что TableDef - это лишь логическое отражение некой физической реальности, которая потенциально может быть изменена другим пользователем (или даже просто другим потоком текущего приложения), и поэтому оно не является, например, потокозащищенным, а посему срок его жизни ограничен одним оператором, который в VBA выполняется в одном потоке в CriticalSection (но это только догадки)
Увы ничего тут не поделаешь! Придется писать громоздкий и неэффективный код!!!
Например цикл
Код: Выделить всё
For Each t In CurrentDb.TableDefs
MsgBox t.Name
Next
РАБОТАЕТ
А цикл
Код: Выделить всё
For Each f In CurrentDb.TableDefs(CUR_TBL_NAME).Fields
MsgBox f.Name
Next
Уже не работает, так как при вхождении в цикл переменная f ссылается на объект Field, но уже на первоой же итерации (т.е. к началу выполнения MsgBox f.Name) оказывается ссылкой на недействительный объект!
Увы....
Вот. Поступаем точно так как я советовал, т.е. добавляем переменную CUR_TBL в Watch, выполняем макрос по шагам, "и тупо смотрим что к чему" (с) Стругацкие.
Под отладчиком видно, что переменна CUR_TBL сначала = Nothing, а потом (после Set) становися действительным указателем, но в процессе выполнения ЛЮБОГО следующего оператора (Даже если после Set поставить X=1) перестает быть действительным. Экспериментально установлено, что объект TableDef прекращает свое существование к началу выполнения следующего оператора (составные операторы рассматриваются как несколько).
ФАНТАСТИКА! Я этого не знал! Т.е. работать с экземпляром объекта TableDef можно только в пределах одного оператора. Потом он разрушается, а указатель на него перестает быть действительнывм. Аналогично обстоит дело с объектами лежащими глубже (Например, ссылка на TableDef(...).Fields ведет себя также). Могу только предположить, что TableDef - это лишь логическое отражение некой физической реальности, которая потенциально может быть изменена другим пользователем (или даже просто другим потоком текущего приложения), и поэтому оно не является, например, потокозащищенным, а посему срок его жизни ограничен одним оператором, который в VBA выполняется в одном потоке в CriticalSection (но это только догадки)
Увы ничего тут не поделаешь! Придется писать громоздкий и неэффективный код!!!
Например цикл
[code]
For Each t In CurrentDb.TableDefs
MsgBox t.Name
Next
[/code]
РАБОТАЕТ
А цикл
[code]
For Each f In CurrentDb.TableDefs(CUR_TBL_NAME).Fields
MsgBox f.Name
Next
[/code]
Уже не работает, так как при вхождении в цикл переменная f ссылается на объект Field, но уже на первоой же итерации (т.е. к началу выполнения MsgBox f.Name) оказывается ссылкой на недействительный объект!
Увы....