Реализация базы данных в Delphi
Базы данных в Delphi реализуют с помощью компоненты Database Desktop. Ее можно вызывать как прямо из Delphi (пункт меню Tools, затем Database Desktop), так и непосредственно из операционной системы. Database Desktop является типичным представителем MDI – приложения: его меню изменяется в зависимости от выполняемой работы. Database Desktop позволяет создать базы данных по форматам данных многих СУБД, мы будем работать с Paradox 7.0 (файлы данных *.db). После вхождения в Database Desktop выбираем из меню File – New – Table. Далее предлагают выбрать СУБД, выберем Paradox 7.0. Откроется таблица для определения структуры первого файла. Если следовать приведенным рекомендациям, то можно получить таблицу следующей структуры (рис. 1).
Рис. 1. Определение структуры базы данных
Создаем файл DAT1.db. В графу “Field Name” занесем имя поля, нажатием на “Enter” переходим к следующей графе “Type”. Имеется выпадающий перечень типов данных, который появляется при нажатии на клавишу пробел. Лучше не набирать тип данных на клавиатуре, а выбрать из перечня. Длина поля (Size) требуется лишь для данных, имеющих нестандартную длину. В нашем примере – только для символьных строк. Paradox 7.0 допускает использовать в качестве имен полей строки длиной до 25 символов, разрешены и пробелы в именах. Настоятельно не рекомендуется использовать в именах пробелы, потому что это сильно затрудняет обработку файла в некоторых случаях. В правой части экрана имеются поля для уточнения свойств создаваемого файла “Table Properties”.
По умолчанию показано свойство “Validity Checks” – допустимые значения:
Required Field – если отметить его, то в этом поле файла всегда должно быть значение, пустое поле не допускается;
Minimum value – можно задать нижнюю границу значения для этого поля;
Maximum value – можно задать верхнюю границу;
Default value – значение по умолчанию: если для многих записей поле имеет постоянное значение, то его занесение в это свойство позволяет уменьшить объем ввода.
Рассмотрим подробнее типы данных в Paradox 7.0.
Alpha – символьные строки длиной 1 – 255 символов, допускают все операции сравнения;
Number – для вещественных чисел;
Short – для целых чисел, длиной 2 байта;
Long Integer – для целых чисел длиной 4 байта;
Logical – аналог типу Boolean в Pascal‘е;
Date – для хранения дат, даты должны быть представлены в формате месяц/день/год, в таком же формате можно задавать минимальные и максимальные значения;
Time – время.
Таким образом, строка за строкой, заполним таблицу, задавая структуру создаваемого файла. Из задач, перечисленных выше, остались нерассмотренными две: определение ключа и вторичного индекса. Для определения ключа достаточно поставить * в колонку Key в строке(ах) ключевого поля. Для создания вторичного индекса обратимся к свойствам таблицы. Из перечня возможных свойств выбираем Secondary Indexes (вторичный индекс). Нажмем на кнопку Define. В ответ откроется перечень полей данного файла, из которых и выбираем поле (поля) для вторичного индек-са. В нашем примере ограничимся индексацией по полю SPEC. Database Desktop спросит еще имя индекса, желательны имена следующего вида имя_поля_IND, что позволяет легко отличить имена индексов от других.
После завершения формирования структуры файла необходимо его сначала сохранить, после этого можно начинать ввод и редактирование данных. Чтобы облегчить сохранение и повторное открытие файлов данных целесообразно сначала определить рабочий и личный директории: это делается путем выбора из пункта меню File пунктов Working Directory и Private Directory. При нажатии на традиционную кнопку Save As откроется знакомое диалоговое окно Windows для сохранения. Для ввода и редактирования данных надо нажать на клавишу F9 или выбрать из меню Table пункт Edit Data. Если необходимо внести изменения в структуру файла (в том числе изменить границы допустимых значений или индексы), то выберите из меню Table пункт Restructure.
Для ввода данных откроется таблица определенной нами структуры и можно начинать ввод и редактирование данных. При попытке ввести в какое-то поле значение, которое не принадлежит области допустимых значений, оно просто не будет принято, специальное предупреждение при этом не выдается. После завершения ввода (редактирования) закроем файл. Обратим внимание на то, что один и тот же файл не может быть одновременно открыт в Database Desktop и Delphi.
Создадим второй файл DAT2.db со следующей структуры
№ | Содержание поля | Имя поля | Тип данных, длина | Диапазон значений | Индексы |
1 | Номер специальности | SPEC | Короткое целое – 2 | Ключ | |
2 | Номер специальности | NAZV_SPEC | Символ – 18 |
Объединим таблицы по полю SPEC. Условия для соединения выполнены: данные в полях обеих таблиц имеют одинаковый тип и длину, в таблице DAT1.db имеется вторичный индекс по этому полю, в DAT2.db это поле ключевое. Соединение файлов можно выполнять как в Database Desktop, так и в Delphi во время разработки приложений (вторичный индекс обязателен). Более предпочтительным является второй вариант – он обладает большей гибкостью, особенно если файлов много и их можно по-разному объединить. Созданные при проектировании базы данных соединения не могут быть пересмотрены во время разработки приложений. Напомним, что до выполнения соединения надо определить характер отношения между участвующими полями (1:1; 1:M или N:M). При (1:1) соединение симметричное и неважно, из какого файла его создавать. При (1:M) необходимо соединение выполнять из файла детализации, отношение (N:M) не допускается, оно должно предварительно быть сведено к (1:M).
Для соединения в Database Desktop откроем файл детализации (в нашем случае DAT1.db), главный файл (DAT2.db) не должен быть в это время открыт. Войдем в режим реструктуризации, из списка свойств файла выберем Referential Integrity, затем Define и пред нами откроется таблица установления соединения: в левом столбце перечислены поля файла DAT1, а в правом – перечень файлов из рабочего директория. Выберем сначала поле из левого столбца, а затем имя файла из правого. Получим соединение между выделенным полем и ключевым полем файла. Другие виды соединений (по индексированным неключевым полям) в этом режиме не предусмотрены. Соединение завершается присвоением ему имени и сохранением.