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

Форум: MS ACCESS

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

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

 
 

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

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

тема: Как программно узнать эта таблица: системная, временная, созданная программистом?
 
 автор: patq   (09.08.2006 в 00:00)
 
 

Как программно узнать эта таблица: системная, временная, созданная программистом?

Первоначально новая БД в Access содержит системные таблицы, потом программист добавляет свои. А в процессе работы при ошибках Access создает свои таблицы, где описывает эти ошибки. К ним относятся “Ошибки ввода”, Ошибки импорта”, могут быть другие.
В Help Access на странице Attributes Property нашел, что в системных файлах .Attributes=dbSystemObject. В отладчике просмотрел системный файл, его .Attributes=2,
просмотрел там же dbSystemObject, его значение равно несколько тысяч.
Можно конечно таблицы отнести к разным видам анализирую их наименования, но возможны ошибки.
Вопрос, можно ли программно определить к какому виду относится каждая таблица?
Если да, то какой параметр нужно анализировать?


С уважением, patq

  Ответить  
 
 автор: SRG   (09.08.2006 в 00:00)
 
 

tdf.attributes В следующем примере проверяется значение свойства Attributes каждой таблицы текущей базы данных, а также отображаются имена системных и скрытых таблиц ядра базы данных Microsoft Jet.
Следует отметить, что оператор And выполняет поразрядное сравнение для определения установленных атрибутов.

Sub CheckAttributes()
Dim dbs As Database, tdf As TableDef

Возвращает ссылку на текущую базу данных.
Set dbs = CurrentDb
For Each tdf In dbs.TableDefs
Сравнивает значение свойства с заданными константами.
If (tdf.Attributes And dbSystemObject) Or _
(tdf.Attributes And dbHiddenObject) Then
Debug.Print tdf.Name
End If
Next tdf
Set dbs = Nothing
End Sub

  Ответить  
 
 автор: patq   (10.08.2006 в 00:00)
 
 

Re: Не все так просто в подлунном мире Не все так просто в подлунном мире

Должно быть у Access есть несколько типов системных таблиц и у них разные Attributes, так у таблиц MSysAccessStorage MSysCmbbar TableDef.Attributes=2, у остальных MSys …другие числа. (Числовые данные взяты из Отладчика). Что-то у меня не выявились таблицы по dbSystemObject. В общем, пока не понял
Спасибо за консультацию, буду искать место, где зарыта собака.

С уважением, patq

  Ответить  
 
 автор: SRG   (10.08.2006 в 00:00)
 
 

зарыта собака вот где: Значение Attributes нужно оценивать в двоичном выражении (обратите внимание на оператор AND в выражении "tdf.Attributes And dbSystemObject"):

Например, если
1 = серый
2 = бурый
4 = малиновый
, то
то объект с attributes=1 - серый, а объект с attributes=1+2+4=7 - серо-буро-малиновый

Вообщем, в подлунном мире все довольно просто :)

  Ответить  
 
 автор: patq   (11.08.2006 в 00:00)
 
 

Re[2]: Не все так просто в подлунном мире Так я тоже пробовал, эффект такой же.
Должно быть мой Access необновленный.

Как вариант системные таблицы можно узнать по началу наименования "MSys".
А вот можно ли выявить таблицы ошибок?

  Ответить  
 
 автор: SRG   (11.08.2006 в 00:00)
 
 

Re: Access необновленный Вы хотите сказать, что этот код у Вас НЕ ВЫПОЛНЯЕТСЯ???:

***************
Sub opertbl()
Dim tdf As TableDef
Dim dbs As Database

Set dbs = CurrentDb

For Each tdf In dbs.TableDefs
If (tdf.Attributes And dbSystemObject) Then
Debug.Print tdf.Name & " - system"
Else
Debug.Print tdf.Name & " - NON-system"
End If
Next tdf

End Sub
***************

RE:системные таблицы можно узнать по началу наименования "MSys":
это нехорошо и неправильно. Есть штатные средства - пользуйтесь ими.

RE:А вот можно ли выявить таблицы ошибок?:
Что за таблицы Вы имеете ввиду?

  Ответить  
 
 автор: patq   (12.08.2006 в 00:00)
 
 

Re: Как программно узнать эта таблица: системная, временная, созданная программистом? Уточнение вопроса как и откуда все вызывается
Поиск системных таблиц Access и временных таблиц Access (таблиц ошибок) производится из программы, написанной на VBA.

1. Системные таблицы Access
С системными более-менее ясно. Ниже приведен код программы, где тремя методами выявляются системные таблицы. Еще ниже приведены результаты их работы.


Public AccObj As Access.Application
Public TestBD As Database тестируемая БД

Sub AboutTable()
Dim i_Ob As Integer
Dim i_End As Integer
Dim i_Soo As String

‘создаем приложение Access
Set AccObj = CreateObject("Access.Application.8")
Set TestBD = CurrentDb
i_End = TestBD.TableDefs.Count
For i_Ob = 0 To i_End - 1
With TestBD.TableDefs(i_Ob)
Сравнивает значение свойства с заданными константами.
If (.Attributes And dbSystemObject) > 0 Then 1-ый метод выявления
i_Soo = .Name
End If
If .Attributes = dbSystemObject Then ‘2-ой метод выявления
i_Soo = .Name
End If
If Mid(.Name, 1, 4) = "MSys" Then 3-ий метод выявления
i_Soo = .Name
End If
End With
Next i_Ob
End Sub

Результаты выявления системных таблиц
Таблица And = "MSys"
MSysAccessObjects + - +
MSysACEs - - +
MSysCmdbars + - +
MSysModules + - +
MSysModules2 + - +
MSysObjects - - +
MSysQueries - - +
MSysRelationships - - +
где "+" - таблица выявлена
"-" - таблица не выявлена

2 Временные таблицы Access
Повторюсь (см. вопрос). Если в процессе работы БД (открытие БД, импорт данных, преобразование данных, …), возникает ошибка, то Access создает свои таблицы, где описывает эти ошибки (обычно это одна строка), с Attributes=0. К таким таблицам относятся “Ошибки ввода”, Ошибки импорта”, (из личного опыта и Help Access). В одной из моих БД он создал их аж 409 с наименованием “Ошибки преобразования409” (взято из реальной БД).
И непонятно, как выявить их

  Ответить  
 
 автор: SRG   (30.11.-1 в 00:00)
 
 

ДЫК. Все ж таки воспользуйтесь правильным методом - процедурой из моего поста - и будет Вам счастье :)

По поводу 2:

Тут наверное стоит обдумать архитектуру приложения, например так:
если приложение работает на связанных таблицах, то автоматически - все таблицы, физически находящиеся в самом приложении, либо системные/служебные, либо "чужие" (в т.ч. и ошибки) - которые удалить не жалко

  Ответить  
 
 автор: osmor   (30.11.-1 в 00:00)
 
 

как мне кажется таблицы “Ошибки ввода”, Ошибки импорта” являются не временными, а обычными таблицами, по этому отличить их от других кроме (как по имени) не получится.

Использование системы именования объектов вполне позволяет отсеить все таблицы не созданные программистом.

Что касается методов определения...

Первый способ должен выглядеть так:
If (.Attributes And dbSystemObject) <> 0 then

второй способ есть неверная модификация первого по этому ничего и не нашел
от покажет только таблицы которые объявлены ТОЛЬКО системными без каких либо других атрибутов т.е. скрытую и системную таблицу не найдет

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