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

Форум: MS ACCESS

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

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

 
 

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

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

тема: Не работает определения наличия модуля в базе (Access 2002)
 
 автор: Truelove   (16.09.2008 в 18:58)   личное сообщение
 
 

День добрый!

Пишу процедуру, которая проверяет наличие модуля в базе и, если модуля нет, создает новый.
Сначала проверяем наличие модуля

Dim sModuleName, sCheck As String
On Error Resume Next
sModuleName = "имя проверяемого модуля"
sCheck = Modules(sModuleName).Name
If Err.Number Then 'ошибка, т.е. выбрать модуль не удалось, значит такого модуля в базе нет

После этого я создаю пустой модуль и переименовываю его.
DoCmd.RunCommand acCmdNewObjectModule
sModuleNewName = Modules(Modules.Count - 1).Name 'автоматическое новое имя
DoCmd.Save acModule, sModuleNewName 'сохраняем
DoCmd.Rename sModuleName, acModule, sModuleNewName 'переименовываем

Получаем ошибку
"The name you entered already exists for another object of the same type in this database."
И в самом деле, есть такой модуль в базе, а проверка не сработала.
Причем для всех остальных модулей в проекте проверка прошла успешно.
Проблемный модуль может быть разный в зависимости от набора модулей в базе.
Пробовал делать Compact and Repair - не помогает...

Может я чего-то не понимаю в этом Access'е?

  Ответить  
 
 автор: Lukas   (16.09.2008 в 19:23)   личное сообщение
 
 

При проверке, в случае отсутствия ошибки нет выхода из процедуры/функции.
Далее Вы пытаетесь сохранить модуль под имеющимся именем. Поэтому генерируется ошибка.

  Ответить  
 
 автор: Lukas   (16.09.2008 в 19:27)   личное сообщение
 
 

Проверка на наличие модуля через Error мне кажется не совсем правильной.
Может просматривать коллекцию модулей на совпадение имен будет более правильно?

  Ответить  
 
 автор: Bellerofont   (16.09.2008 в 22:35)   личное сообщение
 
 

Какой у вас Access? Если 2000 и больше, то забудьте о коллекции Modules.
Есть Application.VBE и его надо использовать:

sCheck = application.VBE.ActiveVBProject.VBComponents(sModuleName).Name

а лучше

sCheck = application.VBE.VBProjects("ИмяВашегоПроекта").VBComponents(sModuleName).Name

  Ответить  
 
 автор: Lukas   (16.09.2008 в 22:49)   личное сообщение
 
 

Я попробовал предложенный вариант.
Он точно так-же, как у автора топика, возвращает имя модуля при его наличии, и ошибку при его отсутствии. (9)

Если не затруднит можно поподробней, в чем изюм?

  Ответить  
 
 автор: Bellerofont   (17.09.2008 в 00:25)   личное сообщение
 
 


Если не затруднит можно поподробней, в чем изюм?

Если вы внимательно читали сообщение автора топика, то вы должны были видеть, что имя модуля не всегда возвращается, хотя модуль есть. Почему? Ответ есть в Help


The Modules collection contains all open standard modules and class modules in a Microsoft Access database.

Using the Modules Collection
You can enumerate through the Modules collection by using the For Each...Next statement.
To determine whether an individual Module object represents a standard module or a class module, check the Module object's Type property.

All open modules are included in the Modules collection, whether they are uncompiled, are compiled, are in break mode, or contain the code that's running.

просто этот модуль не является открытым.

  Ответить  
 
 автор: Lukas   (17.09.2008 в 00:32)   личное сообщение
 
 

Большое мерси.
Надо заняться изучением VBE.

  Ответить  
 
 автор: Truelove   (17.09.2008 в 15:41)   личное сообщение
 
 

Спасибо за ответ!
Теперь понятно.
Получается можно для проверки не считывать имя, а пытаться открыть модуль. Тогда ошибка будет говорить о его отсутствии.
Я тем временем уже сделал другой вариант проверки - через таблицу MSysObjects.

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