Главная Случайная страница


Категории:

ДомЗдоровьеЗоологияИнформатикаИскусствоИскусствоКомпьютерыКулинарияМаркетингМатематикаМедицинаМенеджментОбразованиеПедагогикаПитомцыПрограммированиеПроизводствоПромышленностьПсихологияРазноеРелигияСоциологияСпортСтатистикаТранспортФизикаФилософияФинансыХимияХоббиЭкологияЭкономикаЭлектроника






Создание структуры таблиц базы данных

Создание таблиц файл-серверных БД осуществляется с помощью утилиты Database Desktop (DBD), входящей в комплект поставки Delphi. Утилита обеспечивает создание, просмотр и модификацию таблиц БД различных форматов (Paradox, dBASE, Microsoft Access). Кроме того, утилита позволяет выполнять выборку информации путем создания запросов.

 
 

Утилита DBD запускается с помощью команды Пуск > Программы > Borland Delphi 7 > Database Desktop (при работе в среде Delphi для запуска используется команда Tools > Database Desktop главного меню). Необходимо настроить рабочий каталог – выбрать команду File > Working Directory и установить в появившемся окне ссылку на каталог С:\ Sale \ Data (рис. 10).

Рис. 10. Установка рабочего каталога

 

 
 

Для создания таблицы IZDELIE следует выбрать команду File > New > Table. DBD откроет окно Create Table, в котором можно выбрать тип таблицы. Щелчком на кнопке ОК согласимся с вариантом Paradox 7, предложенным по умолчанию. На экране появится окноCreate Paradox 7 Table (рис. 11).

Рис. 11. Структура полей таблицы IZDELIE

 

Каждому полю создаваемой таблицы соответствует одна запись в таблице Field rosterокна: в колонку Field Name нужно поместить имя поля, в колонку Type – символ, определяющий тип хранимых в поле данных, в колонку Size – число, определяющее длину поля (требуется не для всех типов полей), в колонку Key – символ звездочки (*), если по значениям этого поля нужно построить первичный ключ.

Введем название первого поля IKod (первый символ названия поля для таблиц Paradox всегда прописной), нажмем клавишу табуляции для перехода к следующей колонке. Нажмем клавишу пробела, чтобы утилита DBD показала список возможных типов, и выберем тип Alpha. В полеSize укажем длину поля – 4. После выбора черный прямоугольник появится в колонке Key. Нажмем клавишу «пробел», чтобы создать по полю первичный ключ.

Продолжим ввод полей таблицы IZDELIE. Для полей INaim и IEdin также выберем тип Alpha, для поля ICena – тип Money. В окне определения структуры таблицы щелкнем кнопку Save as и затем укажем имя файла – Izdelie. Руководствуясь описанием полей физической модели (рис. 7),можно создать остальные таблицы демонстрационной БД.

 

3.3. Свойства таблиц Paradox

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

· автоматически следить за правильностью вводимых в поля данных (пункт Validity Checks в списке Table properties);

· выбирать данные из другой таблицы (Lookup Table);

· строить вторичные индексы, в том числе составные (Secondary Indexes);

· следить за ссылочной целостностью (Referential Integrity);

· защищать таблицу от несанкционированного доступа (Password Security);

· выбирать языковый драйвер (Table Language).

В табл. 16 представлены типы полей, используемых в таблицах Paradox.

По умолчанию после открытия окна редактирования структуры таблицы в списке Table properties выбран пункт Validity Checks, что позволяет контролировать содержимое полей.

С помощью флажка Required Field можно потребовать обязательного заполнения поля при вводе новой записи – за этим будет следить BDE.

На BDE можно возложить контроль за минимальным и максимальным значениями числового поля (строки Minimum Value и Maximum Value).

В строке Default Value можно задать значение поля по умолчанию.

С помощью строки Picture можно задать шаблон для автоматического форматирования значения поля. Например, если задан шаблон (###)### - #### и в поле введена строка 9151653939, она будет автоматически преобразована к виду (915)165-3939.

Для какого-либо поля таблицы иногда требуется установить однозначную связь с полем другой таблицы. В этом случае BDE 6удет следить за тем, чтобы значение вводимой записи в поле первой таблицы было бы одним из значений указанного поля в другой таблице, которая в этом случае называется таблицей подстановки.

Например, в нашей БД поле NZKod таблицы NAKLAD должно содержать ссылку на код заказчика в таблице ZAKAZCIK. Если с помощью DBD установить связь между этим полем и полем ZKod таблицы ZAKAZCIK, при вводе или редактировании таблицы NAKLAD BDE будет отвергать любые значения, которые не совпадают с одним из значений поля ZKod таблицы подстановки ZAKAZCIK.

Таблица 16

Type Size Описание
Alpha Number Money   Short Long Integer ВСD   Date Time Timestamp Memo     Formatted Memo Graphic OLE Logical Autoincre-ment Binary Bytes 1-255   0-32     1-240     0-240   0-240   0-240   0-240   1-255 Текстовое поле указанной длины Числа с плавающей запятой в диапазоне от –10307 до +10307 с 15 значащими десятичными разрядами Денежное поле. Содержит вещественные числа с фиксированной запятой, 6 знаками целой части и 2 знаками дробной Целые числа в диапазоне от –32 768 до +32 768 Целые числа в диапазоне от –2 147 483 648 до +2 147 483 647   Двоично-десятичные вещественные числа. Size – количество разрядов после запятой Дата в диапазоне от 1.01.0000 до 31.12.9999 Время с точностью до миллисекунд Дата и время Мемо-поле для размещения произвольных текстовых cтрок неограниченной длины. Первые Size символов хранятся в основной таблице, остальные – в файле с расширением .MB Мемо-поле для размещения форматированного текста в формате RTF Графическое изображение в формате BMP. Size байтов хранится в основной таблице, остальные – в отдельном файле Объект OLE Логическое поле. Содержит значение Тrue или False Автоинкрементное поле   Набор байтов произвольной длины. Первые Size байтов хранятся в основной таблице, остальные – в отдельном файле Набор из Size байтов (целиком хранится в таблице)  

 

Для установления связи нужно выбрать пункт Table Lookup в списке Table propertiesи щелкнуть на кнопке Define. В появившемся окне Table Lookup (рис. 12) в списке Fields выбирается поле, за значениями которого нужно следить, и щелчком на кнопке со стрелкой вправо имя этого поля переносится в строку Field name. Затем в списке Lookup tableвыбирается нужная таблица и щелчком на кнопке со стрелкой влево имя первичного ключевого поля этой таблицы переносится в строку Lookup field.

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

Назначение переключателей:

· Just current field – проверяется соответствие только связанных полей;

· All corresponding fields – проверяется соответствие всех полей обеих таблиц (в этом случае структуры обеих таблиц должны быть идентичными);

· Fill no help – при редактировании проверяемого поля таблица подстановки не показывается;

·

 
 

Help and fill – если при редактировании проверяемого поля нажать клавиши Ctrl+Пробел, таблица подстановки будет показана в отдельном окне.

Рис. 12. Установление связи с таблицей подстановки

 

 
 

Вторичный индекс в таблице Paradox может быть создан, только если в ней предварительно создан первичный ключ для одного или нескольких первых полей.

Рис. 13. Определение вторичного индексного поля

 

Определим вторичный индекс в таблице NAKLAD по полю NData. Для этого раскроем список Table Properties, выберем пункт Secondary Indexes и щелкнем на появившейся кнопке Define. В окне Define Secondary Index (рис. 13) в списке полей таблицы выделим щелчком поле NData и щелкнем на кнопке со стрелкой вправо, чтобы перенести поле в список Indexed fields. Таким способом можно перенести несколько полей (составной вторичный индекс).

С помощью флажков группы Index options можно определить следующие особенности индекса:

· Unique – индекс будет содержать уникальные значения;

· Maintained – индексные поля сортируются по возрастанию значений;

· Case sensitive – индекс чувствителен к регистру букв в текстовых полях;

· Descending – индексные поля сортируются по убыванию значений.

При щелчке на кнопке ОК DBD запросит имя индекса (в таблицах Paradox, как и в большинстве серверов БД индексы именуются). Введем строку Data_Naklad и щелкнем на кнопке ОК.

Ссылочная целостность – это особый механизм, способствующий поддержанию непротиворечивых сведений в связанных таблицах БД. Таблица NAKLAD содержит данные о накладных, а таблица SNAKL – о строках этих накладных. Перед удалением данных о накладной нужно предварительно удалить связанный с ней список строк, иначе таблица SNAKL будет содержать записи о «ничейных» строках. Если таблицы связаны механизмом ссылочной целостности, BDE будет блокировать попытки изменения поля связи в родительской таблице, пока не изменены связанные с ним записи в дочерней таблице.

Определить все связи ссылочной целостности помогает физическая модель данных предметной области (рис. 7).

 
 

Для установления ссылочной целостности нужно выбрать пункт Referential Integrity в списке Table properties и щелкнуть на кнопке Define. Откроется окно Referential Integrity, показанное на рис. 14.

Рис.14. Установление ссылочной целостности

 

В списке Fields выбирается поле связи редактируемой таблицы (она должна быть дочерней), а в списке Table – нужная родительская таблица. После щелчков на кнопках со стрелкамиимена полей связи переносятся в строки Child fields и Parents fields. Далее нужно щелкнуть на кнопке ОК. BDE запросит имя вновь создаваемой ссылочной целостности, а затем создаст ее.

С помощью переключателей в группе Update rule определяются правила поддержания ссылочной целостности:

· ProhibitBDE отвергает любые изменения в связанном поле родительской таблицы без соответствующего изменения записей в дочерней таблице; блокируется удаление записи родительской таблицы до удаления связанных с ней записей в дочерней таблице;

· CascadeBDE автоматически производит каскадные изменения в дочерней таблице при изменениях родительской таблицы.

Любая таблица Paradox может быть полностью или частично защищена от несанкционированного доступа. Для этого в списке Table properties выбирается пункт Password Security и щелчком на кнопке Define открывается диалоговое окно Password Security (рис. 15).

 
 

Рис. 15. Окно определения пароля

 

Пароль может содержать от 1 до 15 любых символов, в том числе и пробелы. Он чувствителен к регистру букв. С помощью кнопки Auxiliary Passwords вызывается дополнительное окно, в котором можно уточнить, какие поля и как защищаются.

 
 

Если таблица имеет текстовые поля, для нее нужно указать языковый драйвер. Для этого в списке Table properties выбирается пункт Table Language и щелчком на кнопке Define открывается диалоговое окно Table Language (рис. 16).

Рис. 16. Окно выбора языкового драйвера

 

Для правильного отображения русскоязычного текста следует выбирать драйвер Pdox ANSI Cyrillic или Paradox Суrr 866. Первый использует кодовую страницу 1251 для Windows, второй – страницу 866 для MS-DOS.

Устанавливать языковый драйвер следует даже для таблиц, которые содержат одни числовые поля. Часто приходится дополнять таблицу полями из других таблиц с помощью подстановочных (lookup) полей. Если для таблицы не установлен нужный языковый драйвер, содержимое подстановочных полей будет искажено. Устанавливать языковый драйвер следует до определения ссылочной целостности.

 

Заполнение таблиц базы данных

Если в процессе сохранения таблицы в диалоговом окне Save Table As установить флажок Display table, то в результате нажатия кнопки Сохранить откроется диалоговое окно Table, которое позволяет ввести данные в только что созданную таблицу.

Если таблица БД была ранее закрыта, то ее необходимо открыть командой File > Open > Table, и в появившемся диалоговом окне Open Table в списке Alias выбрать псевдоним нужной БД и таблицу (если в начале работы с утилитой не был определен рабочий каталог). Таблица открывается в режиме просмотра, в котором изменять ее содержимое нельзя. Для ввода данных следует активизировать режим редактирования командой Table > Edit Data.

Данные в поля записи вводятся с клавиатуры обычным образом. Для перехода к следующему полю нужно нажать клавишу <Enter>. Если поле оказывается последним полем последней записи, то в результате нажатия клавишу <Enter> в таблицу добавляется еще одна запись.

Если во время заполнения таблицы необходимо внести изменения в уже заполненное поле, то следует выбрать это поле, воспользовавшись клавишами перемещения курсора, нажать клавишу <F2> и внести нужные изменения.

 
 

Если при вводе данных в таблицу буквы русского алфавита отображаются неверно, необходимо изменить шрифт, используемый для отображения данных. Для этого выбирается команда Edit > Preferences и в появившемся диалоговом окне, во вкладке General щелкнуть на кнопке Change. Внесенные в конфигурацию изменения будут действительны только после перезапуска утилиты DBD.

Рис. 17. Просмотр структуры БД с помощью SQL Explorer

Зарегистрировать в системе BDE (см. п. 3.2) существующую БД можно также с помощью утилиты SQL Explorer. Эта утилита запускается командой Пуск > Программы > Borland Delphi 7 > SQL Explorer или непосредственно из среды Delphi командой Database > Explore.

Интерфейс утилиты SQL Explorer напоминает интерфейс утилиты BDE Administrator. Регистрация БД в системе и создание псевдонима осуществляются аналогично. Однако, если раскрыть созданный объект Sale, щелкнув на значке «+» перед его именем, на правой панели можно просмотреть структуру БД и содержимое любой таблицы (рис. 17).

После изучения структуры базу данных следует закрыть с помощью команды Close контекстного меню. При этом выделение объекта будет снято.

 

МодулЬ данных

 

Модуль данных (Data Module) – это специализированная форма, которая предназначена для размещения используемых в проекте невизуальных компонентов доступа к данным.

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

В общем случае на модуле данных можно разместить любой невизуальный компонент из Палитры компонентов. Рекомендуется все компоненты типа TTable, TQuery, TDataSource, используемые в проекте, хранить именно в модуле данных. Доступ к этим компонентам осуществляется путем включения имени файла модуля данных в секцию uses модуля формы.

 

Создание модуля данных

В приложении, работающем с демонстрационной БД, нам понадобятся шесть компонентов Table (по числу таблиц БД) и, соответственно, шесть компонентов DataSource, связанных с этими таблицами.

Создадим новый проект. Сохраним модуль главной формы (которую мы пока не изменяли) под именем fmMainUnit, а весь проект – под именем Sale. Добавим в проект модуль данных командой File > New > Data Module. В свойство Name модуля данных поместим значение DM и сохраним модуль в файле dmSaleUnit. Свяжем модуль с проектом командой Project > Add to Projectи выберем только что созданный файл dmSaleUnit.

Теперь в модуле данных необходимо разместить компоненты, которые обеспечат доступ к таблицам БД. Дерево, описывающее логические связи между компонентами, можно просмотреть, выполнив команду View > Object TreeView.

Можно изменять положение объектов в этом дереве методом перетаскивания, а также добавлять к ним новые объекты.

С помощью правой кнопки мыши можно быстро получить доступ к основным свойствам каждого из элементов. Все они доступны также из контекстного меню объектов, расположенных в правой части окна.

Для связи таблиц с БД воспользуемся компонентом Database на вкладке BDE палитры компонентов: щелкнем на нем и затем – на имени модуля DM в окне дерева объектов. В окне инспектора объектов раскроем список свойства AliasName и выберем псевдоним Sale. В строке свойства DatabaseName укажем произвольное имя (например, ААА) так называемого локального псевдонима, который создает компонент Database.

Локальный псевдоним доступен только в той программе, в которой используется компонент Database. Этот компонент выполняет множество полезных функций, обеспечивающих связь программы с БД. Для файл-серверных систем только с его помощью можно реализовать транзакции – специальный механизм доступа к данным, повышающий их достоверность и непротиворечивость.

После определения псевдонима БД и создания локального псевдонима исчезнет красный знак вопроса слева от компонента в окне дерева объектов, что свидетельствует о готовности компонента к работе. Заменим заданное по умолчанию имя компонента Database1 на DB.

Перенесем в окно дерева объектов компонент Table (вкладка BDE) и «положим» его на псевдоним ААА. В окне инспектора объектов в свойстве DatabaseName нового компонента автоматически появится имя локального псевдонима ААА, однако слева от компонента в окне дерева объектов будет красный знак вопроса, означающий, что компонент Table еще не готов к работе.

Компонент Table является набором данных (НД). Он преимущественно используется в локальных и файл-серверных системах для доступа к данным из одной или нескольких таблиц БД.

Чтобы подготовить компонент к работе, необходимо определить имя таблицы: раскроем список свойства TableName и выберем в нем таблицу IZDELIE. Изменим его имя Table1, заданное по умолчанию, на имя связанной с ним таблицы: в строке свойства Name введем Izdelie. Чтобы к таблице можно было обращаться из программы, свойству Active надо присвоить значение True.

       
   

Таким же образом надо добавить в модуль данных и наборы данных для остальных таблиц. Окно модуля данных примет вид, показанный на рис. 18.

Рис. 18. Добавление НД в модуль данных

 

Соответственно, в модуле данных надо подготовить шесть объектов DataSource, связать каждый из них со своим НД и дать им подходящие имена. Выделим компонент на вкладке Data Access палитры компонентов и затем щелкнем на компоненте Izdelie в окне дерева объектов, чтобы связать его с НД. Компонент может быть размещен и прямо в окне компонентов модуля данных. Тогда источник данных после размещения в модуле данных связывается с конкретным НД с помощью свойства DataSet. В процессе связывания источники данных будут перемещаться «вглубь» дерева, описывающего эти НД.

Заменим в строке свойства Name заданное по умолчанию имя DataSource1 на имя SourceIzd.

       
   

Таким же образом подготовим остальные объекты. Вид модуля данных к этому моменту показан на рис. 19.

Рис. 19. Описание таблиц БД в качестве источников данных

 

Связывание наборов данных

Наборы данных, размещенные в модуле данных, связаны реляционными отношениями один-ко-многим. Например, единственной записи (накладной) в наборе Naklad может соответствовать произвольное количество записей (строк) в наборе Snakl. Чтобы НД «знали» об этом и согласованно отображали данные, их необходимо предварительно подготовить.

Два НД связываются друг с другом по ключевому полю с помощью свойств MasterSource / MasterFields. Зададим значение свойства MasterSource для НД Snakl равным SourceNak (главная таблица, на записи которой ссылается подчиненная таблица). Вызовем специальный редактор отношений, обратившись с помощью Инспектора объектов к свойству MasterFields. В списке Available Indexes (Доступные индексы) по умолчанию отображается значение Primary (Первичный). Выберем созданный на этапе проектирования таблицы первичный индекс по полю SnNNom и свяжем его с полем NNom таблицы Naklad с помощью кнопки Add, как показано на рис. 20.

Если внешний ключ не входит в состав первичного ключа таблицы, то раскрывается список Available Indexes, в котором необходимо выбрать соответствующее значение.

Существует еще один, более удобный и наглядный способ связывания НД по ключевым полям, который будет рассмотрен в п. 4.5. Этот способ предполагает использование диаграмм (схем данных).

 
 

Рис. 20. Связывание НД с использованием первичного индекса

 

Создание объектов-полей

Двойным щелчком на компоненте Izdelie откроем окно редактора полей, щелкнем в окне редактора правой кнопкой мыши и в контекстном меню выберем команду Add all fields. Окно редактора заполнится списком всех полей таблицы IZDELIE.

Это означает, что теперь для каждого поля набора данных Izdelie создан специальный объект со своими свойствами, методами и событиями. Если щелкнуть на любом поле в окне редактора полей, то в окне инспектора объектов станут доступными свойства и события объекта-поля. По умолчанию Delphi присваивает объекту-полю имя, полученное сцеплением имени набора данных и имени поля, так что теперь в программе окажутся компоненты с именами IzdelieIKod, IzdelieINaim, IzdelieIEdin, IzdelieICena (объявление этих компонентов можно увидеть в окне кода модуля данных в объявлении класса TDM).

Создание объектов полей для каждого используемого в программе набора данных можно считать признаком хорошего стиля программирования, так как они упрощают доступ к данным и дают программисту дополнительные возможности. Например, с помощью свойства DisplayLabel можно изменить заголовки соответствующих колонок в сетках отображения данных, с помощью обработчика события OnGetText – изменить формат отображения данных и т. п.

При этом следует помнить, что, если для НД создан хотя бы один объект-поле, соответствующий НД будет содержать значения только тех полей, для которых созданы объекты. И наоборот, если для НД не созданы объекты-поля, он содержит данные из всех полей соответствующей таблицы.

Если мы собираемся расширить НД за счет добавления к нему подстановочных полей из других таблиц, то без объектов-полей в этом случае не обойтись – это еще один довод в пользу их создания.

Напомним, что НД Naklad содержит поле NZkod (код заказчика), но не содержит полей, отображающих наименование, адрес и телефон заказчика. Решить проблему можно с помощью подстановочных полей или полей соответствия (Lookup fields), которые создаются в редакторе полей (Fields editor) для физической таблицы Naklad. Они имитируют реальные поля, выполняя подстановку значений полей из других таблиц, соответствующих имеющимся ключевым значениям.

 
 


ВНИМАНИЕ! Перед созданием новых полей в НД необходимо закрыть этот НД, выбрав для его свойства Active значение False.

 
 


 
 

В модуле данных двойным щелчком на компоненте Naklad откроем окно редактора полей и щелчком правой кнопки мыши вызовем его контекстное меню. Выберем команду New Field, чтобы открыть окно конструктора нового поля (рис. 21).

Рис. 21. Окно конструктора нового поля

 

С помощью конструктора нового поля можно создать в НД новые поля одного из трех типов (тип определяется переключателями в группе Field type):

· Data – поля содержат произвольные данные;

· Calculated – поля содержат вычисляемые данные;

· Lookup – поля содержат данные из таблицы подстановки.

Поле первого типа будет отображаться в сетке пустой колонкой, которую можно заполнить в обработчике события OnGetText этого поля. Вычисляемое поле заполняется в обработчике события OnCalcFields набора данных. Для заполнения подстановочного поля данные берутся из нужного поля другого НД.

В строке Name окна конструктора поля введем имя нового поля Naim, раскроем список Type и выберем для поля тип String, его размер Size установите равным 18. Установим переключатель Lookup, раскроем список полей Key Fields и выберите в нем поле NZKod, в списке Dataset выберем НД Zakazcik, в списке Lookup Fields – ключевое поле ZKod и, наконец, в списке Result Field – поле ZNaim. Закроем окно конструктора щелчком на кнопке ОК. Таким же образом создадим для НД Naklad подстановочные поля Adres и Telefon, указав в качестве результирующих полей соответственно ZAdres и ZTelef и задав размеры 20 и 10 символов.

Для НД Snakl создадим два подстановочных поля с именами Name и Cena, связав их с помощью поля SnIKod с НД Izdelie (поле IKod) и указав в качестве результирующих полей соответственно INaim (тип поля – String, размер – 25) и ICena (тип поля – Currency). Также создадим вычисляемое поле Summa, для чего в строке Name введем имя Summa, в строке Type выберем тип Currency и установим переключатель Calculated.

Для НД Plateg также создадим подстановочные поля Naim, Adres и Telefon, характеризующие заказчика, связав их с помощью поля SpZKod с НД Zakazcik (поле ZKod). Укажем в качестве результирующих полей соответственно ZNaim, ZAdres и ZTelef, выберем тип String и зададим размеры 18, 20 и 10 символов.

Для НД Splat создадим два подстановочных поля с именами Name и Cena, связав их с помощью поля SpIKod с НД Izdelie (поле IKod) и указав в качестве результирующих полей соответственно INaim (тип поля – String, размер – 25) и ICena (тип поля – Currency). Также создадим вычисляемое поле Summa, для чего в строке Name введем имя Summa, в строке Type выберем тип Currency и установим переключатель Calculated.

Щелкнем один раз на НД Snakl и напишем обработчик события OnCalcFields:

procedure TDM.SnaklCalcFields(DataSet: TDataSet);

begin

SnaklSumma.Value:=SnaklCena.Value*SnaklSnOtgKol.Value;

end;

Щелкнем один раз на НД Splat и напишем обработчик события OnCalcFields:

procedure TDM.SplatCalcFields(DataSet: TDataSet);

begin

SplatSumma.Value:=SplatCena.Value*SplatSpOplKol.Value;

end;

 

Последнее изменение этой страницы: 2016-08-28

lectmania.ru. Все права принадлежат авторам данных материалов. В случае нарушения авторского права напишите нам сюда...