Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Не удаляет внешнюю таблицу с именем из русских букв (Access 2003)
 
 автор: Денис82   (04.10.2010 в 15:58)   личное сообщение
 
 

Доброго времени суток.
Есть код, который удаляет из внешней базы ненужные таблицы. Таблицы с латинскими именами таблиц удаляет, а с русскими выдаёт 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

  Ответить  
 
 автор: Анатолий (Киев)   (04.10.2010 в 19:03)   личное сообщение
 
 

Т.е. таблицу находит, а ошибка на DoCmd.DeleteObject? Очень интересно.
Попробуйте удалять "родным" для DAO методом: MYDB.TableDefs.Delete Tabl.Name

А вообще, програмеры делятся на тех, кто всегда называет объекты латинскими символами и регулярно делает резервные копии, и тех, кто этого раньше не делал.

  Ответить  
 
 автор: Силblч   (05.10.2010 в 08:43)   личное сообщение
 
 


А вообще, програмеры делятся на тех, кто всегда называет объекты латинскими символами и регулярно делает резервные копии, и тех, кто этого раньше не делал.


+1

  Ответить  
 
 автор: Денис82   (05.10.2010 в 10:42)   личное сообщение
 
 


автор: Анатолий (Киев) (04.10.2010 в 19:03) личное сообщение
Т.е. таблицу находит, а ошибка на DoCmd.DeleteObject? Очень интересно.
Попробуйте удалять "родным" для DAO методом: MYDB.TableDefs.Delete Tabl.Name



Анатолий,
спасибо тебе пребольшое. Ты молодец.

  Ответить  
 
 автор: Денис82   (06.10.2010 в 15:34)   личное сообщение
 
 

Разобрался.


DoCmd.DeleteObject acTable, Tabl.Name


Это было совсем неправильно. Правильно

MYDB.Execute "DROP TABLE " & "[" & tableName & "]"


А код

MYDB.TableDefs.Delete Tabl.Name

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

  Ответить  
 
 автор: Анатолий (Киев)   (07.10.2010 в 11:24)   личное сообщение
 
 

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 

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList