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

Форум: MS ACCESS

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

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

 
 

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

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

тема: Как проверить есть ли в базе таблица или нет?
 
 автор: Волшебник   (13.11.2009 в 20:25)   личное сообщение
 
 

Как проверить есть ли в базе таблица или нет?
Это нужно для того чтобы определиться с вариантами действий
1, есть - 1 вариант действий
2,нет - второй вариант действий

  Ответить  
 
 автор: Explorer   (13.11.2009 в 20:40)   личное сообщение
 
 

обратиться к таблице по имени и
1 выполнить действие 1
2 обработать ошибку и выполнить действие 2

  Ответить  
 
 автор: Волшебник   (13.11.2009 в 21:17)   личное сообщение
 
 

Дело в том что я не знаю как кней обратиться
я уже думал может так IsNull([Table]![Таблица1])

  Ответить  
 
 автор: час   (13.11.2009 в 21:41)   личное сообщение
 
 

попробуйте вот так





Public Function IsTable(ZP_NameTable As String) As Long
' проверка на наличие определенной таблицы
' ZP_NameTable - наименование таблицы

Application.Echo False 'отключаем обновление экрана
On Error Resume Next
DoCmd.OpenTable ZP_NameTable
If Err.Number = 0 Then
DoCmd.Close acTable, ZP_NameTable
Else
IsTable = Err.Number
End If
Application.Echo True

End Function 'IsTable

  Ответить  
 
 автор: Волшебник   (13.11.2009 в 22:04)   личное сообщение
 
 

Ошибку так выдает на открытие, форма всплывающая, может в этом дело?

  Ответить  
 
 автор: ShadowOfSun   (13.11.2009 в 22:15)   личное сообщение
 
 

попробуй этот код (подключи библиотеку ADO)


   Dim cnn As ADODB.Connection
   Dim rstDictionary As ADODB.Recordset
   Dim cat As ADOX.Catalog
   Dim tbl As ADOX.Table
   Dim col As ADOX.Column
   
   Set cnn = New ADODB.Connection
   Set cnn = CurrentProject.Connection
   
   Set cat = New ADOX.Catalog
   Set cat.ActiveConnection = CurrentProject.Connection
   
   For Each tbl In cat.Tables
      For Each col In tbl.Columns
         Debug.Print "++++++++++++++++++++++"
         Debug.Print tbl.Name
         Debug.Print "----------------------"
         Debug.Print col.Name
         Debug.Print col.Type
      Next col
   Next tbl


  Ответить  
 
 автор: Волшебник   (13.11.2009 в 22:34)   личное сообщение
23 Кб.
 
 

А Какую из АДО?

  Ответить  
 
 автор: ShadowOfSun   (13.11.2009 в 22:59)   личное сообщение
17 Кб.
 
 

Мне хватило самой нижней 2,8

  Ответить  
 
 автор: час   (13.11.2009 в 22:42)   личное сообщение
11 Кб.
 
 

Посмотри пример.

  Ответить  
 
 автор: Волшебник   (13.11.2009 в 23:26)   личное сообщение
 
 

ShadowOfSun
Честно я не понял здесь,
плюсы и минусы - это таблицы?
На кнопке Всплывающая подсказка - Восстановить запись
а Debug.Printы - редактируем?


ЧАС
В примере True False, а
У Меня вылетает Если есть, то Месага 0,
Если нет, то Месага 7874

То что надо Спасибо Час!

  Ответить  
 
 автор: ShadowOfSun   (14.11.2009 в 01:29)   личное сообщение
 
 

вместо Debug.Print'ов напиши
if "ИмяТвоейТаблицы" = tbl.Name then tblKey=True

перед поиском выставь tblKey=False

а в конце процедуры результат будет
если таблица есть tblKey=True
если таблицы нет tblKey=False

P. S. Час, по моему писать программы на обработчиках ошибок это близко к парковке по звуку "Бумм"

  Ответить  
 
 автор: час   (14.11.2009 в 13:18)   личное сообщение
 
 

писать программы на обработчиках ошибок это близко к парковке по звуку 

наверное -ДА
"Бумм"


=======================
Но я больше так делать не буду....

  Ответить  
 
 автор: час   (14.11.2009 в 21:25)   личное сообщение
 
 

Буду писать вот так:
'Возвращает true если есть таблица в базе


Function НаличиеТаблицыБазы(str As String) As Boolean

  НаличиеТаблицыБазы = False
  On Error GoTo Met1
  Dim SearchString As String
  SearchString = CurrentDb.TableDefs(str).Connect
  НаличиеТаблицыБазы = True
Exit Function
Met1:
  НаличиеТаблицыБазы = False

End Function



Ан нет - тожа на ошибке обращения выходит..........



ТАДА...

  Ответить  
 
 автор: час   (14.11.2009 в 21:35)   личное сообщение
 
 

А вообщето вопрос обширный

Вопрос: Проверка существования таблицы в базе данных

Совет:
Public Function CheckTable(strtblName As String) As Boolean

Dim tbl As dao.TableDef
On Error Resume Next
Set tbl = CurrentDb().TableDefs(strtblName)
If err.Number = 0 Then
CheckTable = True
Else
CheckTable = False
End If

CheckTable_EXIT:
Exit Function

CheckTable_ERR:
Select Case err.Number
Case Else
MsgBox err.Description & "(" & err.Number & ") в процедуре CheckTable"
Resume CheckTable_EXIT
End Select
End Function

osmor

==================

Dim ao As AccessObject
For Each ao In CurrentData.AllTables
MsgBox ao.Name
Next

==================

Переделка из Кена Гетца

Public Function adhExists(strName As String) As Boolean
Dim dbs As Database
Dim ctr As Container
Dim doc As Document
Set dbs = CurrentDb
On Error Resume Next
Set ctr = dbs.Containers!Tables
Set doc = ctr(strName)
'Debug.Print doc.LastUpdated
Set doc = Nothing
Set ctr = Nothing


Set dbs = Nothing
adhExists = (Err.Number = 0)
Err.Clear
End Function

Anatoliy

==================

Еще вариант

Function IsTableInDB(db As Database, tbl As String) As Integer
Dim tdf As TableDef
On Error GoTo IsTableInDB_Err
Set tdf = db.TableDefs(tbl)
IsTableInDB = True
Exit Function
IsTableInDB_Err:
IsTableInDB = False
End Function

StaleX

==================

ща попробую функцию изобразить

Function Проверка_существования_таблицы(mytdf as string) As Boolean
dim tdf As TableDef
For Each tdf In carrentdb.TableDefs
If tdf.Name = mytdf Then mytdf = true
Next tdf
End Function

filosof
==================

Для А2000 и выше

Dim aob As AccessObject
Dim bol As Boolean
For Each aob In CurrentData.AllTables
If aob.Name = "Клиенты" Then
bol = True
Exit For
End If
Next
MsgBox bol

ДиД

==============

можно так
Public Function IsTable(strNameTbl As String) As Boolean
'***************************************************************************************
' Возвращает истину если таблица есть в базе и ложь если нет
' Комментарий : strNameTbl - имя искомой таблицы
'***************************************************************************************
On Error GoTo IsTable_ERR
IsTable = False
Dim tbl As DAO.TableDef
On Error Resume Next
Set tbl = CurrentDb.TableDefs(strNameTbl)
If Err = 0 Then IsTable = True
Resume 0
IsTable_EXIT:
Exit Function

IsTable_ERR:
Select Case Err.Number
Case Else
MsgBox Err.Description & "(" & Err.Number & ") в процедуре IsTable"
Resume IsTable_EXIT
End Select
End Function


или пробежатся по коллекции tabledefs или посмотреть системную таблицу
Я на прошлой неделе отвечал на этот вопрос, поищите

osmor

===========

А чем плохо это?
Function ЕстьТакаяТаблица (ИмяТаблицы as String) As Boolean
Dim oTable As TableDef
On Error Resume Next
Set oTable=CurrentDB.TableDefs("ИмяТаблицы")
If Err.Number<>0 Then
Err.Clear
ЕстьТакаяТаблица=False
Else
ЕстьТакаяТаблица=True
End If
End Function

ЛМВ

===========================

Public Function ThereIsTable(strNameTable As String) As Boolean
Dim tdf As TableDef

On Error Resume Next
Set tdf = CurrentDb.TableDefs(strNameTable)
ThereIsTable = (Err.Number = 0)
Set tdf = Nothing
End Function

  Ответить  
 
 автор: час   (14.11.2009 в 21:36)   личное сообщение
 
 

Так что - есть выбор.........

  Ответить  
 
 автор: час   (14.11.2009 в 21:38)   личное сообщение
 
 

или вот ещё круче

Вопрос: Проверяет наличие таблицы как внутри базы, так и во внешней

Совет:
Public Function ExistsTable(strNameTable As String, Optional ByRef strResult As String = "") As Byte
On Error Resume Next

DoCmd.SetWarnings False
DoCmd.RunSQL "Insert INTO " & strNameTable & " SELECT * FROM " & strNameTable & " WHERE 0=1"
Select Case Err.Number
Case 0
ExistsTable = 0
strResult = "Таблица существует"
Case 3078
ExistsTable = 1
strResult = "Таблица отсутствует"
Case 3024, 3011
ExistsTable = 2
strResult = "Не найден файл"
Case 3044
ExistsTable = 3
strResult = "Указан ошибочный путь"
Case 3343
ExistsTable = 4
strResult = "Нераспознаваемый формат базы данных"
Case 3321
ExistsTable = 5
strResult = "Не задана база данных в строке подключения"
Case Else
ExistsTable = 6
strResult = "Неизвестная ошибка"
End Select
Err.Clear
DoCmd.SetWarnings True
End Function

============================================end================================

  Ответить  
 
 автор: час   (14.11.2009 в 21:41)   личное сообщение
 
 

или вот тоже вариант неплохой

Вопрос: Функция проверки существования таблицы или запроса в текущей базе данных

Совет:
Аргументы: strObjName - имя объекта, strObjType - тип проверяемого объекта
Назначение: Проверяет существует ли таблица или запрос с именем strObjName в текущей базе данных
Возвращает: Результат: True - обект существует False - обьекта с таким именем нет

Public Function ObjExists(strObjType As String, strObjName As String) As Boolean
On Error Resume Next
Select Case strObjType
Case "Table"
ObjExists = (CurrentDb.TableDefs(strObjName).Name = strObjName)
Case "Query"
ObjExists = (CurrentDb.QueryDefs(strObjName).Name = strObjName)
Case Else
ObjExists = (CurrentDb.Containers(strObjType & "s").Documents(strObjName).Name = strObjName)
End Select
Err.Clear
End Function

  Ответить  
 
 автор: час   (14.11.2009 в 21:42)   личное сообщение
 
 

Можно продолжить ,
но у ВОЛШЕБНИКА наверное всё нормально работает

так что отдохнём

  Ответить  
 
 автор: Волшебник   (15.11.2009 в 18:10)   личное сообщение
 
 

Да, вариантов много

  Ответить  
 
 автор: Explorer   (15.11.2009 в 16:06)   личное сообщение
 
 


по моему писать программы на обработчиках ошибок это близко к парковке по звуку "Бумм"



вообще-то да :)))

но с другой стороны обращаться к таблице не зная есть она или нет, это все равно что вызывать пожарных набирая телефонный номер наугад...

  Ответить  
 
 автор: osmor   (15.11.2009 в 18:21)   личное сообщение
 
 

FAQ
http://hiprog.com/index.php?option=com_content&task=blogcategory&id=119&Itemid=159
Q4

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