Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Access
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.03.2012, 18:28   #1
Langoria
Новичок
Джуниор
 
Регистрация: 05.03.2012
Сообщений: 1
По умолчанию Наличие таблицы в БД

Как написать на VBA в обработчике кнопки запрос:

если таблица с именем Name содержится в базе данных, то удалить её
Langoria вне форума Ответить с цитированием
Старый 05.03.2012, 19:50   #2
Teslenko_EA
Участник клуба
 
Регистрация: 10.08.2009
Сообщений: 1,796
По умолчанию

Здравствуйте Langoria.
Удалить таблицу можно подобным кодом:
Код:
Sub delTable()
    Const sQ = "DROP TABLE Name"
    On Error Resume Next
    CurrentDb.Execute sQ
    Select Case Err.Number
    Case 0: 'удаление выполнено
    Case 3376: 'таблица не существует
    Case 3211: 'таблица заблокирована (используется)
    End Select
    
'    Debug.Print Err.Number, Err.Description
'    MsgBox Err.Number & vbCrLf & Err.Description
    Err.Clear
End Sub
И хотя он не соответствует задаче "..если таблица .. содержится в базе данных, то удалить её .."
(т.е. не выполняет проверку существования таблицы, а сразу пытается удалить)
результат получается ожидаемый, его проверить можно прочитав код возвращаемой ошибки.

Евгений.
P.S. выкладывая вопрос не забывайте обращаться к тем кому Вы его адресуете,
не знаете как - можно просто поздоровавшись.

Последний раз редактировалось Teslenko_EA; 05.03.2012 в 19:56.
Teslenko_EA вне форума Ответить с цитированием
Старый 19.07.2012, 13:17   #3
Vovka_Ya
 
Регистрация: 19.07.2012
Сообщений: 3
По умолчанию

Всем Доброго Дня!
Teslenko_EA, Вам отдельного, Доброго Дня!

У меня такой вопрос по предложенной процедуре - как ей передать аргументом имя таблицы, которую нужно удалить и после этого использовать его (имя таблицы) в SQL запросе?
Весь день мучаюсь, получаю ошибку Constant Expression Required. Пробовал и кавычки, и ByVal, и много разных вариантов. Чета все не клеится.
Код:
    Private Sub Restore_Click()
 'query the procedure for tblTest deleting
        delTable tblTest

Sub delTable(Name As String)
    Const sQ = "DROP TABLE " & Name & ""
    On Error Resume Next
    CurrentDb.Execute sQ
    Select Case Err.Number
    Case 0: 'удаление выполнено
    Case 3376: 'таблица не существует
    Case 3211: 'таблица заблокирована (используется)
    End Select
    
'    Debug.Print Err.Number, Err.Description
'    MsgBox Err.Number & vbCrLf & Err.Description
    Err.Clear
End Sub
Спс
Vovka_Ya вне форума Ответить с цитированием
Старый 19.07.2012, 16:20   #4
Vovka_Ya
 
Регистрация: 19.07.2012
Сообщений: 3
По умолчанию

Вроде разобрался, вот так работает:

Код:
    Private Sub Restore_Click()
 'query the procedure for tblTest deleting
        delTable "[tblTest]"

Sub delTable(Name As String)
    Dim sQ As String
    sQ = "DROP TABLE " & Name
    On Error Resume Next
    CurrentDb.Execute sQ
    Select Case Err.Number
    Case 0: 'удаление выполнено
    Case 3376: 'таблица не существует
    Case 3211: 'таблица заблокирована (используется)
    End Select
    
'    Debug.Print Err.Number, Err.Description
'    MsgBox Err.Number & vbCrLf & Err.Description
    Err.Clear
End Sub
Спс
Vovka_Ya вне форума Ответить с цитированием
Старый 19.07.2012, 17:30   #5
Teslenko_EA
Участник клуба
 
Регистрация: 10.08.2009
Сообщений: 1,796
По умолчанию

Здравствуйте Vovka_Ya.
"..мучаюсь, получаю ошибку Constant Expression Required.."
"..Вроде разобрался.." - это хорошо что Вы поняли что константу изменить нельзя.
Но для практического применения лучше создать функцию и по её результату продолжать или прекращать выполнение кода
Код:
Sub Restore_Click()
        If Not delTable("[tblTest]") then Exit sub
        ...

Function delTable(sName As String) As Boolean
    Const sQ = "DROP TABLE " 
    On Error Resume Next
    CurrentDb.Execute sQ + sName
    If Err.number =0 Then delTable =true else Err.clear
End function
совет : откажитесь от использования зарезервированных в слов (в Вашем случае Name)
в качестве имен своих объектов и переменных, это избавит от проблем в будущем.
Евгений.

P.S.
на интересующую тему можно сослаться, не выкладывая в чужой теме свой вопрос,
придерживайтесь правила "один вопрос=одна тема".
все свои сообщения я подписываю в надежде, что обращаться ко мне будут по имени.
Teslenko_EA вне форума Ответить с цитированием
Старый 19.07.2012, 18:05   #6
Vovka_Ya
 
Регистрация: 19.07.2012
Сообщений: 3
По умолчанию

Евгений, благодарю за рекомендацию.

P.S. Новую тему создавать не стал, т.к. цель была таже, что и у Langoria, но немного дополненная/уточненная
BR
Vovka_Ya вне форума Ответить с цитированием
Старый 19.07.2012, 20:11   #7
Myhaylo
Форумчанин
 
Регистрация: 19.07.2012
Сообщений: 520
По умолчанию

Имена всех существующих таблиц можно узнать так:

SELECT MSysObjects.Name FROM MSysObjects WHERE MSysObjects.Type=1

Т. е. можно обойтись и без обработчика ошибок:

Sub delTable(sName As String)
Iif Not IsNull(DLookup("Name", "MSysObjects", "Type=1 AND Name=""" + sName + """")) Then CurrentDb.Execute "DROP TABLE " & sName
End Sub
Окупант, руки прочь от Украины!!! Слава Героям!
Myhaylo вне форума Ответить с цитированием
Старый 19.07.2012, 21:55   #8
Teslenko_EA
Участник клуба
 
Регистрация: 10.08.2009
Сообщений: 1,796
По умолчанию

Здравствуйте Myhaylo.
Предложенный Вами способ хорош, но утверждать: "..обойтись и без обработчика ошибок.." я бы не стал
Ошибку 3376 Ваша конструкция обходит, а как быть с другими возможными (?) например 3211,
для каждой создавать собственный обработчик?
думаю обработчик ошибок в подобной процедуре имеет право на жизнь.
Евгений.

P.S. для удобочитаемости выкладываемый код заключайте в тэги [соde] ... [/соde]
для этого на панели инструментов размещена кнопка #.
Teslenko_EA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Наличие цифры Shouldercannon Общие вопросы Delphi 9 26.07.2010 08:20
Проверка на наличие файла ruavia3 Microsoft Office Excel 1 05.02.2010 21:13
Проверка на наличие файла Demetrius Помощь студентам 12 28.07.2009 00:27
Проверит наличие програмы. blackstersl Общие вопросы Delphi 5 24.06.2009 12:16
Проверка на наличие таблицы в БД Ramires БД в Delphi 3 18.12.2008 08:59