| |
|
|
| | Доброго времени суток.
Есть код, который удаляет из внешней базы ненужные таблицы. Таблицы с латинскими именами таблиц удаляет, а с русскими выдаёт run-time error '7874': приложению Microsoft office access не удается найти объект... Как с этим бороться?
(при запуске аналогичного кода в локальной базе всё работает)
Вот код:
Dim MYDB As Database
Dim baseStr As String
Dim Tabl As TableDef
baseStr = "путь к базе"
Set MYDB = DBEngine.Workspaces(0).OpenDatabase(baseStr)
For Each Tabl In MYDB.TableDefs
If Tabl.Name "ненужная таблица" Then
DoCmd.DeleteObject acTable, Tabl.Name
End If
Next
|
| |
| |
| |
| |
|
|
| | Т.е. таблицу находит, а ошибка на DoCmd.DeleteObject? Очень интересно.
Попробуйте удалять "родным" для DAO методом: MYDB.TableDefs.Delete Tabl.Name
А вообще, програмеры делятся на тех, кто всегда называет объекты латинскими символами и регулярно делает резервные копии, и тех, кто этого раньше не делал.  | |
| |
| |
| |
|
|
| |
А вообще, програмеры делятся на тех, кто всегда называет объекты латинскими символами и регулярно делает резервные копии, и тех, кто этого раньше не делал.
|
+1  | |
| |
| |
| |
|
|
| |
автор: Анатолий (Киев) (04.10.2010 в 19:03) личное сообщение
Т.е. таблицу находит, а ошибка на DoCmd.DeleteObject? Очень интересно.
Попробуйте удалять "родным" для DAO методом: MYDB.TableDefs.Delete Tabl.Name
|
Анатолий,
спасибо тебе пребольшое. Ты молодец.  | |
| |
| |
| |
|
|
| | Разобрался.
DoCmd.DeleteObject acTable, Tabl.Name
|
Это было совсем неправильно. Правильно
MYDB.Execute "DROP TABLE " & "[" & tableName & "]"
|
А код MYDB.TableDefs.Delete Tabl.Name | работает, но не с первого раза. Приходится его несколько раз запустить, чтобы он все таблицы удалил (если кто знает, почему так, напишите). | |
| |
| |
| |
|
|
| | MYDB.TableDefs.Delete Tabl.Name
работает, но не с первого раза. Приходится его несколько раз запустить, чтобы он все таблицы удалил (если кто знает, почему так, напишите). | Когда вы удаляете элемент из коллекции, то индексы оставшихся объектов перенастраиваются. Например, после удаления элата с индексом 2 - 3-й элементт становится 2-м, а 4-й - 3-м.
Если это делается в цикле по коллекции в прямом направлении (по возрастанию индекса), то после удаления 2-го элемента следующим будет 4-й, а 3-й "затаился".
Поэтому множественное удаление элементов коллекции нужно выполнять в обратном цикле, т.е.:
For i = MYDB.TableDefs.Count-1 To 0 Step -1
MYDB.TableDefs.Delete MYDB.TableDefs(i).Name
Next
|
| |
| |
| |