3. Часто встречающиеся вопросы при проектировании БД.
Posted by root2. Группировка и описание объектов БД
2.1. Группировка объектов
Щелкните правой кнопкой по объекту БД (таблица, форма отчет и т. д.) и выберите в контекстном меню «Свойства». В появившемся окне поле «Описание» у начинающих разработчиков скорей всего пустое. Хотя этот комментарий был бы совсем не лишним. Если выбрать вид отображения объектов «Таблица», то проявится колонка «Описание», в котором отображается характеристика объекта (если заполнено «Описание» свойства объекта). При большом их количестве получилась бы краткая справка, облегчающая понимание их назначения. Кроме того, при нажатии на заголовок столбца происходит сортировка по возрастанию. И если описания составлены по определенной системе обозначения – получили бы соответствующую ГРУППИРОВКУ. Таким образом, можно создавать сложные группы объектов, используя только систему их обозначения и описания, что значительно упростит навигацию в проекте, особенно, если объектов там не один десяток.
Еще один способ группировки объектов по какому либо признаку – использование встроенных группировок Access (правой кнопкой по объекту – добавить в группу). При этом объекты помечаются как принадлежащие к выбранной группе, список которых показан в нижней части панели навигации. Этот способ, правда, используется не так часто, видимо потому, что для необходимого понимания назначения объекта достаточно задать ему правильное имя и описание в соответствии с собственной системой обозначений.
2.2. Комментарии в таблице
Начинающие разработчики часто не используют очень полезный атрибут таблицы – возможность составления описания (комментария) к каждому полю таблицы. Хотя это во многом облегчает понимание зачем, для чего и какую роль играет это поле в базе данных. Кроме того, при создании форм и вставке полей из списка этот текст автоматически вставляется в свойство поля «StatusBarText» – текст строки состояния (в нижней части окна приложения или документа и служит для отображения подсказок о командах и кнопках и сведений о выполняемых операциях).
2.3. Получение отчета – справки по БД
Итак, если использовать осмысленные имена таблиц, полей, их описания, комментарии полей таблиц, причем желательно все это делать в соответствии с определенной системой обозначений – то в результате получим довольно объемную «справку» по созданной базе данных. Как же посмотреть «живьем», или, проще говоря, распечатать ее?
Основная информация об объектах базы данных хранится в специальных служебных таблицах: Сервис – Параметры – Вкладка вид – галка: Системные объекты. В результате в окне проекта «Таблицы» увидим новые объекты с трудночитаемыми именами: MSysAccessObjects, MSysAccessXML, MSysACEs, MSysObjects, MSysQueries, MSysRelationships. В них содержится информация об «истории жизни» объектов, их основных свойствах. Чтобы пользователи ненароком не «затерли» чего не следует, их сделали скрытыми, а некоторые вообще закрыли от прямого доступа (MSysACEs).
Например, в таблице MSysRelationships можно напрямую прочитать имена объектов и их описание, а при помощи простого запроса получить нужные параметры – например: имя объекта + описание.
SELECT MSysRelationships.szObject, MSysRelationships.szReferencedObject
FROM MSysRelationships;Наиболее важная среди них - MSysAccessObjects. Рассмотрим ее подробнее (некоторые описания опущены, так как точную документацию по этому вопросу найти сложно)
Имя поля
Тип поляОписание
Connect
Поле МЕМО для прилинкованных НЕ Access таблиц в этом поле содержиться значение свойства Connect
Database
Поле МЕМО для прилинкованных таблиц в этом поле содержиться полный путь и имя файла, откуда была прилинкована таблица
DateCreate
Дата/время дата и время создания объекта
DateUpdate
Дата/время дата и время обновления объекта
Flags
Числовой
ForeignName
Текстовый (255) для прилинкованных таблиц в этом поле содержиться "реальное" имя таблицы
Id
Числовой (Long Int) ключевое поле. Содержит уникальный идентификатор для каждого объекта БД
Lv
Поле объекта OLE
LvExtra
Поле объекта OLE
LvModule
Поле объекта OLE скомпилированный текст модулей БД (предположение)
LvProp
Поле объекта OLE
Name
Текстовый (255) имя объекта БД
Owner
Двоичный (255)
ParentId
Числовой (Long Int) Prim.key значение id родительского объекта
RmtInfoLong
Поле объекта OLE
RmtInfoShort
Двоичный (255)
Type
Числовой (Integer) тип объекта БД
Вот некоторые значения параметра Type:
Тип объекта БД
Значение поля Type
"Родные" таблицы (в том числе и системные)
1
Глобальные "семейства" объектов (Relationships, Databases, Tables, Modules, SysRel, Scripts, Forms, Reports)
3
Запросы (в том числе и те, которые на самом деле являются SQL-выражениями в источниках данных форм, отчетов, элементов управления и т.д.)
5
Прилинкованные таблицы
6
Формы
-32768
Отчеты
-32764
Макросы
-32766
Модули (в том числе модули классов)
-32761
В итоге можно получить следующие данные:
Что можем получить
SQL
Список "родных" таблиц
SELECT MSysObjects.Id, MSysObjects.Name
FROM MSysObjects
WHERE (((MSysObjects.Type)=1) AND ((Left([Name],4))<>"MSys" And (Left([Name],4))<>"USys"));Список присоединенных таблиц
SELECT MSysObjects.Id, MSysObjects.Name
FROM MSysObjects
WHERE (((MSysObjects.Type)=6) AND ((Left([Name],4))<>"MSys" And (Left([Name],4))<>"USys"));Список "родных" и присоединенных таблиц
SELECT MSysObjects.Id, MSysObjects.Name, MSysObjects.Type
FROM MSysObjects
WHERE (((MSysObjects.Type)=1 Or (MSysObjects.Type)=6) AND ((Left([Name],4))<>"MSys" And (Left([Name],4))<>"USys"));Список запросов
SELECT MSysObjects.Id, MSysObjects.Name
FROM MSysObjects
WHERE (((Left([Name],4))<>"~sq_") AND ((MSysObjects.Type)=5));Список форм
SELECT MSysObjects.Id, MSysObjects.Name
FROM MSysObjects
WHERE (((MSysObjects.Type)=-32768));Список отчетов
SELECT MSysObjects.Id, MSysObjects.Name
FROM MSysObjects
WHERE (((MSysObjects.Type)=-32764));Список макросов
SELECT MSysObjects.Id, MSysObjects.Name
FROM MSysObjects
WHERE (((MSysObjects.Type)=-32766));Список модулей
SELECT MSysObjects.Id, MSysObjects.Name
FROM MSysObjects
WHERE (((MSysObjects.Type)=-32761));Список форм, имеющих выражение SQL в источнике
SELECT MSysObjects_1.Id AS [Id Форм], Right([MSysObjects]![Name],Len([MSysObjects]![Name])-5) AS [Имя формы], MSysObjects.Id AS [Id Запроса]
FROM MSysObjects, MSysObjects AS MSysObjects_1
WHERE (((Right([MSysObjects]![Name],Len([MSysObjects]![Name])-5))= [MSysObjects_1]![Name]) AND ((Left([MSysObjects]![Name],5))="~sq_f") AND ((MSysObjects.Type)=5) AND ((MSysObjects_1.Type)=-32768));Список отчетов, имеющих выражение SQL в источнике
SELECT MSysObjects_1.Id AS [Id Отчета], Right([MSysObjects]![Name],Len([MSysObjects]![Name])-5) AS [Имя отчета], MSysObjects.Id AS [Id Запроса]
FROM MSysObjects, MSysObjects AS MSysObjects_1
WHERE (((Right([MSysObjects]![Name], Len([MSysObjects]![Name])-5))=[MSysObjects_1]![Name]) AND ((Left([MSysObjects]![Name],5))="~sq_r") AND ((MSysObjects.Type)=5) AND ((MSysObjects_1.Type)=-32764));Список элементов управления форм, имеющих выражение SQL в источнике
SELECT MSysObjects_1.Id, Mid([MSysObjects]![Name],6,InStr(2,[MSysObjects]![Name],"~sq_c")-6) AS [Имя формы], Mid([MSysObjects]![Name],InStr(2,[MSysObjects]![Name],"~sq_c")+5) AS [Имя элемента]
FROM MSysObjects AS MSysObjects_1, MSysObjects
WHERE (((Mid([MSysObjects]![Name],6,InStr(2,[MSysObjects]![Name], "~sq_c")-6))=[MSysObjects_1]![Name]) AND ((Left([MSysObjects]![Name],5))="~sq_c") AND ((MSysObjects.Type)=5) AND ((MSysObjects_1.Type)=-32768));Список элементов управления отчетов, имеющих выражение SQL в источнике
SELECT MSysObjects_1.Id, Mid([MSysObjects]![Name],6,InStr(2,[MSysObjects]![Name],"~sq_d")-6) AS [Имя отчета], Mid([MSysObjects]![Name],InStr(2,[MSysObjects]![Name],"~sq_d")+5) AS [Имя элемента]
FROM MSysObjects, MSysObjects AS MSysObjects_1
WHERE (((Mid([MSysObjects]![Name],6,InStr(2,[MSysObjects]![Name], "~sq_d")-6))=[MSysObjects_1]![Name]) AND ((Left([MSysObjects]![Name],5))="~sq_d") AND ((MSysObjects.Type)=5) AND ((MSysObjects_1.Type)=-32764));Стало быть, если покопаться в структуре таблиц и составить нужные запросы – получим необходимые для отчетов источники данных. Правда, некоторые данные хранятся в двоичном виде, и придется использовать специальные процедуры, для их чтения. А некоторых параметров нет в таблицах – их можно прочитать, только обратившись к свойству объекта. Но можно воспользоваться одним из способов:
1. Сервис – анализ – архивариус
В результате автоматически создается отчет по базе данных. Но он, к сожалению, не удобочитаем и содержит много не нужной в большинстве случаев информации. Поэтому, лучше воспользоваться специальной процедурой, читающей свойства объектов БД и вставляющая их в специально созданные служебные таблицы.
2. Специальная процедура чтения свойств объектов БД
Вот пример процедуры с Hiprog.com. При ее выполнении происходит следующее:
- создает таблицу ~TBL со списком таблиц базы (кроме MSys*) с их основными свойствами
- создает таблицу ~FLD со списком полей таблиц базы
- создает таблицу ~PRP со списком свойств полей таблиц базы
- устанавливает связи между таблицами ~TBL, ~FLD, ~PRP
в результате получим целую базу свойств нашей БД, откуда без труда можно выводить всю нужную информацию в виде отчетов или сводных таблиц. Полученная «справка» станет весьма полезным приложением, значительно облегчающим понимание (и вспоминание) структуры базы, назначение объектов.
Автор: sprt16@accessoft.ru
![]()