42325

Технология создания простейшей информационной системы

Лабораторная работа

Информатика, кибернетика и программирование

База данных должна содержать две таблицы: Товары и Приход товаров. Таблицы оперативной части ИС предназначены для работы с оперативной информацией значение которой актуально обычно только в течение короткого времени от момента поступления такой информации до момента окончания её обработки. Рабочая структура таблиц приведена ниже: Таблица Товары Название поля Смысл Тип Длина Tovr Наименование товара Строка 20 EdIzm Единица измерения Строка 10 Zen Цена за единицу измерения Целочисленный Таблица Приход товаров Название поля...

Русский

2013-10-29

8.22 MB

17 чел.

      Лабораторная работа № 4 (часть 1)

       «Технология создания простейшей

       информационной системы»

 Продемонстрируем возможности Delphi по работе с БД на примере создания простой информационной системы. Эту информационную систему можно разработать даже без написания кода: все необходимые операции выполняются с помощью программ (утилит Delphi) Database Desktop и BDE, а также Конструктора формы и Инспектора объектов самого пакета Delphi в интерактивном режиме (режиме диалога пользователя с программами – полуавтоматическом, наполовину ручном, режиме).

Примечание:    Большинство действий по созданию БД и работе с ней, при необходимости, могут быть выполнены программно, самим приложением без участия оператора (в автоматическом режиме), но к сожалению не все. Пользователю  Delphi надо смириться с тем, что, практически всегда, ту или иную часть работы ему придётся выполнять вручную. Какую часть? Это зависит от сложности решаемой задачи, знаний и умений пользователя в написании приложений на Object Pascal. Полуавтоматический режим интерактивного диалога в Delphi и его утилитах как раз и предназначен для того, чтобы, не зная глубоко Object Pascal, пользователь мог бы создавать реально работающие, в том числе, и с БД, достаточно сложные приложения,. В этом режиме по мере диалога с пользователем, на основании его действий мышью и клавиатурой (ручная работа) в графической среде (оболочке) самого пакета Delphi и его утилит, эти утилиты и сам Delphi без участия оператора, автоматически, производят определённые действия с базами данных (создание, регистрация, редактирование, удаление и т .п.) и приложениями (создание текста самих приложений и их частей на Object Pascal, сборка приложений и подключение к ним динамических библиотек с необходимыми подпрограммами, генерирование двоичного исполняемого кода приложений и т.п.).

 Работа над информационной системой состоит из следующих основных этапов:

  создание БД;

  создание приложения.

 Кроме приложения и БД, в информационную систему также входят вычислительная система (локальный компьютер или компьютер-клиент соединённый с компьютером-сервером посредством сети)  и СУБД. Предположим, что компьютер или компьютерная сеть уже существуют, и их характеристики удовлетворяют потребностям будущей информационной системы. В качестве СУБД будем использовать  Delphi.

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

1. Постановка задачи

 Требуется создать приложение, работающее либо на локальной машине в автономном режиме (приложение и БД на локальной машине), либо в локальной сети технологии файл-сервер (приложение – на компьютере-клиенте, а БД на файл-сервере), предназначенное для учета поступающих на склад товаров. База данных должна содержать две таблицы: «Товары» и «Приход товаров». Считаем, что  стоимость единицы товара не зависит от того, откуда поступает этот товар и неизменна во времени. Тогда, таблицу «Товары» будем считать справочником товаров. В нём должна храниться информация о наименованиях товаров, единицах их измерения и ценах на единицу товара. Таблица «Приход товаров» будет содержать сведения о номерах приходов товара, о наименовании товара в соответствующем приходе, дате каждого прихода и количестве товара в приходе (для простоты считаем, что в одном приходе может быть только один товар).

 Говорят, что таблица «Товары» относится к нормативно-справочной или условно-постоянной части ИС. Таблица «Приход товаров» относится к оперативной части ИС. Нормативно-справочная часть ИС состоит из таблиц-справочников, в которые информация заносится один раз, не изменяется долгое время, в течение которого постоянно используется как источник данных для работы с таблицами как оперативной части ИС, так и с другими таблицами условно-постоянной части ИС. Но, в всё же, данные таблиц нормативно-справочной части ИС могут редактироваться, когда в этом есть необходимость. Таблицы оперативной части ИС предназначены для работы с оперативной информацией, значение которой актуально, обычно, только в течение короткого времени (от момента поступления такой информации, до момента окончания её обработки). Информация, хранящаяся в одной из таблиц оперативной части ИС, как правило, не используется при работе с другими таблицами БД.

 С учётом сказанного выше, отношение между таблицами «Товары» и «Приход товаров» должно быть один-ко-многим, то есть одному товару в таблице «Товары» может соответствовать более одной записи в таблице «Приход товаров» (однотипные товары могут в один и тот же день поступать на склад из разных мест или из одного места).

 Рабочая структура таблиц приведена ниже:

 Таблица «Товары»

Название поля

Смысл

Тип

Длина

Tovar

Наименование товара

Строка

20

EdIzm

Единица измерения

Строка

10

Zena

Цена за единицу измерения

Целочисленный

 Таблица «Приход товаров»

Название поля

Смысл

Тип

Длина

N_Prih

Номер прихода

Автоинкремент

Tovar

Наименование товара

Строка

20

DatPrih

Дата прихода

Дата

Kolvo

Количество

Целочисленный

 Для таблицы «Товары» первичный ключ должен быть построен по полю Tovar, а для таблицы «Приход товаров» - по полю N_Prih (соответствующие поля в соответствующих таблицах должны иметь уникальные значения).

 Для реализации ссылочной целостности в таблице «Приход товаров» необходимо построить внешний ключ по полю Tovar. Этот внешний ключ должен ссылаться на первичный ключ таблицы «Товар», созданный по её полю Tovar.

 Для сортировки при выводе в приложении записей таблицы «Приход товаров» по дате прихода и наименованию товара, необходимо создать сложный индекс по полям DatPrih, Tovar.

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

1).  На логическом диске D: компьютера, необходимо создать директорию с именем IsN_M, где

 N - номер группы;

 M - номер подгруппы в группе.

2).  В созданной директории создать поддиректорию L_One, а в ней поддиректорию App. В каталоге D:\ IsN_M\L_One будут размещаться файлы БД, а в каталоге D:\IsN_M\L_One\App файлы приложения, созданные при выполнении данной лабораторной работы.

2. Создание псевдонима (алиаса) базы данных

 Прежде, чем создать алиас базы данных, необходимо определиться с типом таблиц БД, поскольку в  алиасе надо будет указать тип драйвера для работы с таблицами БД (а он, естественно зависит от типа БД). При постановке задачи было оговорено, что требуется создать приложение, работающее либо на локальной машине в автономном режиме, либо в локальной сети технологии файл-сервер. Тогда, с целью экономии аппаратных и программных ресурсов ИС и, в то же время, достижения наибольшей эффективности работы ИС, правильнее всего было бы использовать в ИС таблицы одной из файл-серверных СУБД (dBase, Paradox и т.п.). Поскольку в Delphi для автономных ИС и ИС технологии файл-сервер «родными» (стандартными) считаются таблицы СУБД Paradox, то их и будем использовать для создания БД нашей системы (работа с таблицами других файл-серверных СУБД строится аналогично работе с таблицами СУБД Paradox).    

 При работе с таблицами локальных и файл-серверных СУБД (в число которых входит и СУБД Paradox) сама база данных размещается в каталоге на диске и хранится в виде набора файлов. Для хранения одной таблицы создается отдельный файл. Такие же отдельные файлы создаются для хранения индексов таблицы и мемо-полей. Как было оговорено выше для хранения файлов БД будем использовать директорию D:\IsN_M\L_One.

Обращение к БД из утилит и приложения осуществляется по псевдониму базы данных. Псевдоним должен быть зарегистрирован в файле конфигурации конкретного компьютера при помощи утилиты BDE Administrator (автономного компьютера или компьютера-клиента). Присвоим создаваемой
БД
псевдоним LR4. Для этого запустите утилиту BDE Administrator (проще всего это сделать щёлкнув по иконке BDE Administrator на рабочем столе ). Выберите в главном меню окна утилиты элемент Object \New. В появившемся окне New Database Alias (рис.1) в строке Database Driver Name оставьте тип драйвера создаваемой БД без изменений (STANDARD«по умолчанию» для Delphi это означает Paradox) и нажмите кнопку ОК.

        Рис. 1. Окно выбора типа драйвера БД

 В левом поле окна администратора BDE на вкладке Database Вы увидите строку с именем STANDARD1. Измените это имя на LR4.

В правом поле на вкладке Definition указаны параметры БД. Измените параметр PATH, который указывает маршрут доступа к каталогу, в котором располагается БД. Можно ввести путь вручную, но лучше воспользоваться средствами администратора: для этого нужно щелкнуть по полю PATH и нажать на появившуюся в правом углу  поля кнопку . Затем следует выбрать каталог D:\IsN_M\L_One и нажать кнопку OK (рис. 2).

                         

     Рис. 2. Окно BDE Administrator при определении параметров псевдонима БД

   

Примечание

Использовать БД, которая находится в каталоге D:\IsN_M\L_One, указанном в данном случае в алиасе LR4, можно только на машине с установленной ОС Windows XP (или 98), на которой есть логический диск D:.

Это ограничение связано с тем, что при определении алиаса БД был указан конкретный путь к каталогу БД, а именно: D:\IsN_M\L_One. Поэтому любое приложение Delphi, использующее при работе с БД алиас LR4 (в данном конкретном случае) будет искать БД, находящуюся именно в каталоге D:\IsN_M\L_One. Если каталог не будет найден, например, по причине отсутствия логического диска D:, или отсутствия на этом диске каталога IsN_M\L_One, или отсутствия файлов БД в каталоге D:\IsN_M\L_One, то приложение работать не будет. Одной из возможных причин отсутствия логического диска D: может быть эмуляция виртуального диска с OC Windows виртуальной машиной, работающей в одном из клонов ОС Linux (как это сделано в университете). Или на машине с ОС Windows может просто не быть логического диска D:.

   Для того, чтобы обойти указанную критическую ситуацию, необходимо в процессе определения алиаса БД в BDE указать путь к базе данных не прямо (точный адрес, типа D:\IsN_M\L_One), а косвенно, привязав его к местонахождению скомпилированного .exe-файла приложения (исполняемого модуля программы), а именно: ..\. Это означает, что в каком бы месте не находился .exe-файл программы, файлы БД должны находиться в каталоге, расположенном на одну ступень выше на дереве каталогов, чем каталог, в котором находится .exe-файл приложения. Например: если имя каталога БД IsN_M\L_One, то .exe-файл приложения должен находится в подкаталоге каталога IsN_M\L_One. Имя этого подкаталога и место расположения самого каталога IsN_M\L_One на жёстком диске не имеют значения, как не имеет значения конкретное имя самого каталога БД. Важно лишь то, чтобы .exe-файл приложения находился в подкаталоге каталога БД. Приложение будет работать с БД, файлы которой расположены на одну ступень выше на дереве каталогов, чем каталог, в котором находится .exe-файл.

  Можно изменять как угодно имена каталогов БД и приложения, можно перемещать каталог БД в любое место жёсткого диска (на любой логический или виртуальный диск) - программа будет работать.

Теперь необходимо запомнить определение псевдонима в конфигурационном файле Delphi. Для этого в левом окне администратора БД необходимо щелкнуть по имени псевдонима правой кнопкой мыши и в дополнительном меню выбрать опцию Apply. В появившемся диалоговом  окне (в нём спрашивается, собираемся ли мы запоминать изменения для псевдонима) нажмите кнопку ОК. Закройте окно утилиты BDE Administrator: создание псевдонима завершено и к нему можно обращаться из других утилит и приложений.

 Однако каталог, на который ссылается псевдоним БД, еще пуст. Необходимо создать в нём таблицы базы данных. То есть реально, к данному моменту, ещё до создания БД, мы определили её алиас (в Delphi алиас – это специальный объект) и свойства этого алиаса, а именно: имя алиаса, путь к каталогу хранения файлов таблиц БД и драйвер доступа к данным в таблицах БД. После того, как файлы БД будут созданы, к базе данных можно будет обращаться из приложения или из любой утилиты Delphi по имени её алиаса, не указывая при этом ни путь к файлам её таблиц, ни драйвер доступа к данным этих таблиц.

3. Создание таблиц базы данных

 Для работы с таблицами БД при проектировании приложения удобно использовать программу Database Desktop (DBD), которая позволяет:

  •  создавать таблицы;
  •  просматривать и изменять структуры таблиц и их свойства;
  •  редактировать записи таблиц.

 Кроме того, с помощью Database Desktop можно выполнять и другие действия над БД (создание, редактирование и выполнение визуальных и SQL-запросов, операции с псевдонимами)

Примечание:    Характерной особенностью объектно-ориентированной среды раз-работки  программ Delphi является то, что работа самой этой среды на конкретном компьютере зависит от многих сторонних факторов: версии Delphi; типа и версии операционной системы (ОС), из-под которой запускается Delphi; типа виртуальной машины (если она используется в компьютере и в ней запускается ОС из-под которой запускается Delphi); типа и количества процессоров, типа и особенностей чипсета и объема оперативной памяти  компьютера. Все эти факторы анализируются в процессе инсталляции пакета Delphi и определяют то, в каком варианте будут установлены те, или иные компоненты и утилиты пакета. А от этого зависит то, как будут работать эти компоненты и утилиты.

     Программы, создание которых рассматривается в лабораторных    работах, разрабатывались и отлаживались в среде Delphi 7.0 под ОС    Windows XP (SP2) на компьютере c двухъядерным процессором Intel     Core 2 Duo (chipset Intel) и двумя гигабайтами памяти.

 При работе в таких условиях проявилась следующая особенность работы входящей в пакет Delphi 7.0 утилиты Database Desktop (DBD): при выходе из утилиты на экране монитора появляется сообщение об ошибке. Для завершения работы утилиты предлагается нажать либо на кнопку «ОК», либо на кнопку «Abort».

Для завершения работы утилиты DBD в этом случае необходимо использовать только кнопку «Abort».

 Ни в коем случае нельзя использовать кнопку «ОК». Если восполь-зоваться ею, то все попытки снова запустить утилиту DBD ни к чему не приведут (она перестанет запускаться). В этом случае даже перезагрузка компьютера не гарантирует того, что Database Dеsktop снова станет запускаться.

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

 

 Запустите утилиту Database Desktop. После запуска утилиты укажем DBD псевдоним БД, с которой утилита должна работать «по умолчанию». Для этого нужно выбрать элемент главного меню File\ Working Directory и в выпадающем списке Aliases выбрать имя псевдонима LR4, после чего нажать кнопку ОК (рис.3).

       Рис. 3. Определение алиаса «по умолчанию»

 При этом в строке Working Directory установится значение :LR4:. Это означает, что алиас с указанным именем найден в конфигурационной базе данных Delphi и путь к вашей базе данных, указанный в свойствах алиаса, принят в качестве пути «по умолчанию» для доступа к файлам БД. Можно было поступить наоборот – в строке Working Directory указать полный путь к файлам БД (используя Browse…). В этом случае DBD работал бы с файлами БД, расположенными в указанном месте. То есть, в данном случае алиас используется для того, чтобы автоматически взять из него для DBD путь к файлам БД «по умолчанию».

 Процесс создания новой таблицы начинается вызовом команды File/New/Table (Файл/Новая/Таблица) и происходит в интерактивном (диалоговом) режиме. При этом разработчик должен:

- указать (выбрать) тип (формат) таблицы;

- задать структуру таблицы.

 В начале создания новой таблицы в окне Create Table (File/New/Table) (рис. 4) выбирается её тип (тип СУБД, с таблицами которой мы будем работать). «По умолчанию» предлагается формат таблицы Paradox версии 7, который мы и будем использовать Для таблиц других типов, например dBase IV, действия по созданию таблицы практически не отличаются. Выбор типа таблицы, подтвержаем нажатием клавиши ОК.

       Рис. 4. Выбор типа (формата) таблицы

 После выбора типа (формата) таблицы появляется окно определения структуры таблицы, причём таблицы выбранного типа. В нашем случае это окно Create Paradox 7 Table (рис.5), в котором выполняются следующие действия:

  •  описание полей;
  •  задание первичного ключа;
  •  задание индексов;
  •  определение ограничений на значения полей;
  •  определение условий (ограничений) ссылочной целостности;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
  •  задание паролей;
  •  задание языкового драйвера;
  •  задание таблицы для выбора значений.

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

 

       Рис.5. Определение структуры таблицы БД типа Paradox 7.

Примечание:     При создании новой таблицы сразу после выбора ее типа можно не создавать структуру таблицы, а скопировать её из другой таблицы: при нажатии на кнопку Borrow... (Взаймы) открывается окно Select Borrow Table (Выбор таблицы для заимствования). В этом окне можно выбрать таблицу (главный её файл) и указать копируемые элементы структуры, установив соответствующий флаг, например, Primary index (Первичный индекс) для первичного ключа. После нажатия кнопки Open из выбранной таблицы в новую копируются описания полей, а также те элементы, для которых установлен флаг. Если какой-либо элемент в структуре копируемой таблицы отсутствует, то состояние флага не имеет значения. Например, если в выбранной таблице не определены ограничения ссылочной целостности, то в новой таблице они не появятся, даже если установлен переключатель Referential
integrity (Ссылочная целостность).

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

   После определения структуры таблицы ее необходимо сохранить, нажав кнопку Save as... и указав расположение таблицы на диске и её имя. В результате на диск записывается новая таблица, первоначально пустая, при этом все необходимые файлы создаются автоматически.

3.1 Описание полей

 Центральной частью окна определения структуры таблицы (рис. 5) является список Field
roster, в котором указываются поля таблицы Для каждого поля задаются:

  •   имя — в столбце Field Name;

 тип — в столбце Туре;

 размер — в столбце Size (для строковых полей, поскольку иные типы полей подразумевают размер, определяемый самим типом поля «по умолчанию»);

 признак поля первичного ключа – в столбце Key (заполняется только для полей первичного ключа). Содержит звездочку «*», если поле входит в состав первичного ключа. Если в первичный ключ входит несколько полей, они должны определяться в той последовательности, в которой  присутствуют в первичном ключе. Кроме того, все поля, входящие в состав первичного ключа, должны определяться перед иными полями, то есть первыми определяться в списке полей.

 Имя поля вводится по правилам, установленным для выбранного типа таблиц. Правила именования и допустимые типы полей таблиц Paradox 7 описаны в таблице 1.

Таблица 1. Типы полей таблиц в Paradox 7

Тип поля

Обозн-

аение

поля

Хранимые значения

Alpha

A

Строка символов. Длина не более 255 символов.

Number

N

Число с плавающей точкой. Диапазон -10307 .. 10308.

Точность 15 цифр мантиссы.

Money

$

Денежная сумма. Отличается от типа Number тем, что в значении отображается денежный знак. Число знаков после запятой «по умолчанию» равно двум. Обозначение денежного знака зависит от установок Windows.

Short

S

Целое число. Диапазон -32 768 ... 32 767.

LongInteger

L

Целое число. Диапазон -2 147 483 648 .. 2 147 483 647.

BCD

#

Числовые значения, в том числе и дробные, в двоично-десятичном формате. Обеспечивает исключительную точность в работе с большим числом знаков в дробной части. Применяют в вычислениях, где важна точность (финансовые, научные приложения). Для проведения вычислений требует больше времени, чем для числовых полей иных типов.

Date

D

Дата. Диапазон 01.01.9999 до н.э .. 31.12.9999.

Time

T

Значения времени.

Tumestamp

@

Значения даты и времени.

Memo

M

Строка символов. Длина не ограничена. Первые 240 символов хранятся в файле таблицы, остальные в memo-файле (расширением MB).

Formatted Memo

F

Строка символов. Отличается от типа Memo тем, что строка может содержать форматированный текст (отдельные фрагменты текста могут использовать разные шрифты, цвет и стили).

Grafic Fields

G

Графическое изображение. Форматы BMP, PCX, TIF, GIF и EPS, которые

при хранении в поле преобразуются к формату BMP. Для хранения изображения используется файл с расширением .MB.

OLE

O

Данные в формате, который поддерживается технологией OLE. Данные хранятся в файле с расширением .MB.

Logical

L

Логическое значение. Допустимы значения True (истина) и False (ложь). Разрешается использование прописных букв.

Autoincrement

+

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

Binary

B

Последовательность байтов. Длина не ограничена. Байты содержат произвольные двоичные значения, которые должны интерпретироваться приложением пользователя. Первые 240 байтов хранятся в файле таблицы, остальные в файле с расширением .MB.

Bytes

Y

Последовательность байтов, значения которых должны интерпретироваться приложением пользователя. Длина не более 255 байтов. Хранятся в файле таблицы.

Примечание:     При работе с таблицей в среде утилиты Database Desktop значения полей типа Graphic, Binary, Memo и Ole не отображаются.

 Имя поля в таблице Paradox должно состоять из букв (допускается, но не рекомендуется, криллица) и цифр и начинаться с буквы. Максимальная длина имени составляет 25 символов. В имени не реко-мендуется использовать символы «.», «!», и «|», так как они зарезервированы в Delphi для других целей.

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

 Тип поля можно задать, непосредственно указав соответствующий символ, например, А для символьного или I для целочисленного поля, или выбрать его из списка, раскрываемого при нажатии клавиши <Пробел> или щелчком правой кнопки мыши в столбце Туре. Список содержит все типы полей, допустимые для заданного формата таблицы. В списке подчеркнуты символы, используемые для обозначения соответствующего типа, при выборе типа эти символы автоматически заносятся в столбец Туре.

 Размер поля задается не всегда, необходимость его указания зависит от типа поля Для полей определенною типа, например, автоинкрементного (+) или целочисленною (I), размер поля не задается. Для поля строкового типа размер определяет максимальное число символов, которые могут храниться в поле.

  Добавление к списку полей таблицы новой строки выполняется переводом курсора вниз на несуществующую строку, в результате чего эта строка появляется в конце списка. Вставка новой строки между существующими строками с описанием полей выполняется нажатием клавиши <Insert>. Новая строка вставляется перед строкой, в которой расположен курсор. Для удаления строки необходимо уста-
новить курсор на эту строку и нажать комбинацию клавиш <
Ctrl>+<Delete>.

 Первичный ключ создается указанием его полей. Для указания ключевых полей в столбце ключа (Key) нужно установить символ *, переведя в эту позицию курсор и нажав любую алфавитно-цифровую клавишу. При повторном нажатии клавиши отметка о принадлежности поля ключу снимается. В структуре таблицы ключевые поля должны быть первыми, т. е. верхними в списке полей. Часто для клю-
ча используют автоинкрементное поле.

 Для таблиц Paradox первичный ключ также называют первичным индексом (Primary Index), а для таблиц dBase ключ не создается, и его роль выполняет один из индексов.

 Для определения свойств таблицы используется комбинированный список Table properties (Свойства таблицы), содержащий следующие пункты:

 Secondary Indexes — вторичные индексы;

 Validity Checks — проверка правильности ввода значений полей (выбирается

 по умолчанию);

 Referential Integrity — ссылочная целостность;

 Password Security — пароли;

 Table Language — язык таблицы (языковой драйвер);

 Table Lookup — таблица выбора;

 Dependent Tables — подчиненные таблицы.

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

Состав данного списка зависит от типа (формата) таблицы. Так, для таблицы dBase он содержит только пункты Indexes и Table Language.

 3.2 Задание ограничений на значения полей

  Задание ограничений на значения полей заключается в указании для полей:
 требования обязательности ввода значения;

 минимального значения;

 максимального значения;

 значения по умолчанию;

 маски ввода.

Примечание:     Установленные ограничения задаются на физическом уровне (уровне таблицы) и действуют для любых программ, выполняющих операции с таблицей: как для утилит типа Database Desktop, так и для приложений, создаваемых в Delphi. Дополнительно к этим ограничениям или вместо них в приложении можно также задать программные ограничения.

 Для выполнения операций, связанных с заданием ограничений на значения полей, нужно выбрать пункт Validity Checks (Проверка значений) комбинированного списка Table Properties (рис. 5), при этом под списком появляются переключатель Required Field (Обязательное поле), поля редактирования Minimum Value, Maximum Value, Default Value, Picture (Маска ввода) и кнопка Assist
(
Помощь). Переключатель и поля редактирования отображают установки для поля таблицы, которое выбрано в списке (курсор находится в строке этого поля).

 Требование обязательного ввода значения означает, что поле не может быть пустым (иметь значение Null). Это требование действует при добавлении к таблице новой записи. До того как  изменения в таблице будут подтверждены, поле должно получить какое-либо непустое значение, в противном случае генерируется ошибка. Ошибка может также возникнуть при редактировании записи, когда будет удалено старое значение поля и не присвоено новое.

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

 Для указания обязательности ввода значения в поле необходимо установить
флаг
Required Field, который по умолчанию выключен.

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

 Значение поля по умолчанию указывается в строке Default Value. Его значение устанавливается при добавлении новой записи, если при этом для поля не указано какое-либо значение.

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

 В строке редактирования Picture можно задать маску (шаблон) для ввода значения строкового поля. Ввод по маске поддерживается, например, для таких типов полей, как числовой или строковый. Его удобно использовать для ввода информации определенных форматов, например, телефонных номеров или почтовых индексов.

 Для маски используются следующие символы:

   # — цифра;

 ? — любая буква (регистр не учитывается);

 & — любая буква (преобразуется к верхнему регистру);

 ~ — любая буква (преобразуется к нижнему регистру);

 @ — любой символ;

 ! — любой символ (преобразуется к верхнему регистру);

 ; — за этим символом следует буквенный символ;

 * — число повторов следующего символа;

 [abc] или {а,b,с} — любой из приведенных символов (а, b, или с), значения перечисляются через запятую без пробелов.

       Рис. 6. Определение маски ввода строкового поля

 

Маску можно ввести в строке Picture вручную или использовать для этого окно Picture Assistance, вызываемое нажатием кнопки Assist (рис. 6).

 Указанное окно помогает ввести, выбрать или откорректировать маску, а также проверить её функционирование.

 Список Sample pictures содержит образцы масок, которые выбираются нажатием кнопки Use. Выбранная маска помещается в поле редактирования Picture и доступна для изменения. Для модификации списка образцов масок служат кнопки Add to List и Delete from List: первая добавляет к списку маску, содержащуюся в поле Picture, а вторая удаляет из списка выбранную маску.

 Проверка синтаксиса маски выполняется по нажатию кнопки Verify Syntax, результат проверки выводится в информационном поле. Кнопка Restore Original (Вернуть исходную) служит для восстановления начального (т. е. до начала редактирования) значения маски.

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

3.3 Задание языкового драйвера

 Поскольку в структуре нашей таблицы используются символьные поля (Tovar и Edlzm), значения которых, скорее всего, будут составлять строки русского текста (кириллицы), необходимо установить соответствующий языковый драйвер, чтобы русский текст отображался на экране без искажений. Процедуру установки нужного языкового драйвера следует проводить до создания индексов по символьным (строковым) полям и до установления по ним ссылочной целостности (желательно, стазу после определения всех полей таблицы).

 Для задания языкового драйвера нужно выбрать пункт Table Language (Язык таблицы) комбинированного списка Table Properties окна определения структуры таблицы (см. рис. 5). При этом под списком становится доступной кнопка Modify, открывающая окно Table Language (рис. 7).

       Рис. 7. Определение языкового драйвера

Под языком таблицы понимается языковой драйвер, используемый для этой таблицы. В поле списка Language отображается текущий драйвер.  В списке можно выбрать драйвер нужного языка. Для русского языка это драйвер Pdox ANSI Cyrillic, который корректно отображает символы русского алфавита и выполняет с ними операции сортировки.

 «По умолчанию» языковой драйвер определяется установками процессора баз данных BDE, поэтому если известно, что при работе со всеми таблицами всех БД надо использовать один и тот же определённой языковой драйвер, целесообразно установить его «по умолчанию», например, с помощью программы Administrator BDE (параметр LANGDRIVER раздела Configuration/INIT вкладки Configuration подокна Drivers and Systems основного окна BDE-администратора).  

3.4 Запоминание таблицы

 Чтобы запомнить созданную таблицу на диске, необходимо нажать кнопку Save As и в появившемся окне укажите имя таблицы. Поскольку вы работаете в Windows 32, имя таблицы в отличие от имен полей могло бы состоять из русских букв. При желании вы можете именно так назвать таблицу без малейшего ущерба для дальнейшего выполнения нашего примера. Однако следует помнить о том, что в реальной работе вам, возможно, потребуется перейти к системам клиент-сервер. Все промышленные SQL-серверы не принимают кириллицу в именах таблиц, поэтому вам придется русские имена заменять на латинские и вносить дополнительные изменения в уже созданные Вами программы.

В момент сохранения в каталоге указанном при определении псевдонима будет создан табличный файл СУБД Paradox <Имя таблицы>.DB и файл первичного  ключа (первичного индекса) <Имя таблицы>.PX.

Задание (часть 1)

 1). Если Вы до сих пор не создали псевдоним БД, основываясь на материале раздела 2 создайте алиас БД. Если вы уже создали псевдоним БД, то можете переходить ко второму пункту задания.

 2). Используя DBD создайте таблицу «Товары». При создании, в соответствие с постановкой задачи (раздел 1), определите для неё тип (Paradox 7), структуру, поле первичного ключа. Установите для всех полей условие обязательности ввода. Задайте для таблицы языковой драйвер. Запомните таблицу по именем Tovary. Закройте таблицу Tovary.

 3). Используя DBD создайте таблицу «Приход товаров». При создании, в соответствие с постановкой задачи (раздел 1), определите для неё тип (Paradox 7), структуру, поле первичного ключа. Установите для всех полей, кроме поля автоинкрементного типа, условие обязательности ввода. Задайте для таблицы языковой драйвер. Запомните таблицу по именем Prihod. Закройте таблицу Prihod.

 3.5 Просмотр и изменение структуры таблицы и её свойств

 Структуру существующей таблицы можно изменить, выполнив команду Table/Restructure... после предварительного выбора таблицы и её открытия (File/Open/Table) в окне программы Database Desktop. В результате открывается окно изменения структуры таблицы, и дальнейшие действия не отличаются от действий, выполняемых при создании таблицы.

Примечание:     При изменении структуры таблицы с ней не должны работать другие приложения, в том числе Delphi. Поэтому предварительно необходимо закрыть Delphi или приложение, в котором компоненты Table связаны с перестраиваемой таблицей. Другим вариантом является отключение активности компонентов Table, связанных с перестраиваемой таблицей, для чего свойству Active этих компонентов через Инспектор объектов устанавливается значение False.

  Переименование таблицы следует выполнять из среды программы Database
Desktop, а не из среды Windows, например, с помощью Проводника. Для этого
при работе со структурой таблицы можно нажать кнопку
Save as... и задать новое имя таблицы. В результате в указанном каталоге диска появятся все необходимые файлы таблицы При этом старая таблица также сохраняется. Информация о названии таблицы используется внутри ее файлов, поэтому про-
стое переименование всех файлов таблицы приведет к ошибке при попытке
доступа к ней.

 Если необходимо ознакомиться со структурой таблицы, то выполняется команда Table/Info Structure.... В результате появляется окно определения структуры таблицы, но элементы, с помощью которых в структуру таблицы могут быть внесены изменения, заблокированы. Просмотр структуры возможен также и для таблицы, с которой в это время связаны другие приложения

 3.6 Определение индексов

 Задание индекса сводится к определению:

 состава полей индекса;

 параметров индекса;

 имени индекса.

Эти элементы устанавливаются или изменяются при выполнении операций соз-
дания, изменения и удаления индекса.

 Для выполнения операций, связанных с заданием индексов, необходимо выбрать пункт Secondary Indexes (Вторичные индексы) комбинированного списка Table Properties в окне Restructure Paradox table DBD, которое можно вызвать из Главное меню DBD/Table/Restructure.. после того, как в DBD будет открыта таблица, для которой будут создаваться индексы (Главное меню DBD/Open/Table). При этом под списком появляются кнопки Define (Определить) и Modify (Изменить), список индексов и кнопка Erase (Удалить). В списке индексов под этими кнопками выводятся имена созданных ранее (существующих) индексов данной таблицы (точнее, имён этих индексов), если индексы ранее создавались для данной таблицы. Кнопки Modify и Erase становятся доступными только при выборе в списке индексов имени одного из существующих индексов таблицы.

 Напомним, что для таблиц Paradox индекс называют вторичным индексом

 Создание нового индекса начинается с нажатия всегда доступной кнопки Define. Это приводит к появлению окна Define Secondary Index (Задание вторичного индекса), в котором задаются состав полей и параметры индекса (рис. 8).

       Рис. 8. Определение индекса

 В списке Fields окна выводятся имена всех полей таблицы, включая и те, которые нельзя включать в состав индекса, например, графическое поле или поле комментария. В списке Indexed Fields (Индекс-ные поля) содержатся поля, которые включаются в состав создаваемого индекса. Перемещение полей между списками выполняется выделением нужного поля (полей) и нажатием расположенных между списками кнопок с изображением горизонтальных стрелок. Имена полей, которые нельзя включать в состав индекса, выделяются в левом списке серым цветом. Поле не может быть повторно включено в состав индекса, если оно уже выбрано и находится в правом списке.

Примечание:     При работе с записями индексные поля обрабатываются в порядке следования этих полей в составе индекса. Это нужно учитывать при указании порядка полей в индексе.

  Изменить порядок следования полей в индексе можно с помощью кнопки
с изображением вертикальных стрелок, имеющих общее название
Change order (Изменение порядка). Для перемещения поля (полей) необходимо его (их) выделить и нажать нужную кнопку.

 Переключатели, расположенные в нижней части окна задания индекса, позволяют указать следующие параметры индекса:

 Unique — индекс требует, чтобы совокупность значений составляющих его полей была бы уникальна. Установка этой опции не позволяет индексировать таблицу, если в ней находятся дубликаты совокупности значений включённых в индекс полей. Например, установка этой опции для индекса Sort_Family_First_Second, определение которого показано на рис.8, не допустила бы наличия в таблице данных о полных тёзках (о людях с совпадающими фамилиями, именами и отчествами);

 Maintained — если эта опция установлена, то индекс обновляется при каждом изменении в таблице В противном случае индекс обновляется только в момент связывания с таблицей или передачи в неё запроса. Это несколько замедляет обработку запросов. Поэтому полезно включать эту опцию для обновляемых таблиц. Если таблица используется только для чтения, эту опцию лучше не включать. Опция доступна только для использования в DBD. Её нельзя определить и использовать для индекса, если он создаётся программно и используется приложением при работе с таблицей;

 Case sensitive — для полей строкового типа учитывается регистр символов;

 Descending — сортировка выполняется в порядке убывания значений (по умолчанию упорядочивание происходит по степени нарастания значений).

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

 После задания состава индексных полей и нажатия кнопки ОК появляется окно
Save Index As, в котором указывается имя индекса.

  Для удобства обращения к индексу в его имя можно включить имена полей, указав какой-
нибудь префикс, например
Sort. Нежелательно образовывать имя индекса только из имен полей, т. к. для таблиц Paradox подобная система именования используется при автоматическом образовании имен для обозначения ссылочной целостности между таблицами. После повторного нажатия ОК  сформированный индекс добавляется к таблице, и его имя появляется в списке индексов (рис. 9).

 Рис. 9. Список индексов, определённых для таблицы

 Созданный индекс можно изменить, определив новый состав полей, параметров и имени индекса. Изменение индекса не отличается от процесса его создания. После выделения индекса в списке и нажатия кнопки Modify снова открывается, окно определения индекса (рис. 8). При нажатии кнопки ОК появляется окно сохранения индекса, содержащее имя изменяемого индекса, которое можно исправить или оставить прежним.

 Для удаления индекса его нужно выделить в списке индексов и нажать кнопку Erase. В результате индекс удаляется без предупреждающих сообщений.

 Как говорилось выше кнопки Modify и Erase доступны, только если индекс выбран в списке.

Задание (часть 2)

 1). Создайте для таблицы Prihod сложный (комбинированный) индекс по полям DatPrih и Tovar.  Запомните его под именем Sort_Datprih_Tovar. Сохраните таблицу Prihod (индекс физически будет создан при сохранении таблицы).

 3.6 Определение ссылочной целостности

 Понятие ссылочной целостности (Referential Integrity) относится к связанным таблицам и проявляется в следующих вариантах взаимодействия таблиц:

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

 при изменении или удалении записи в главной таблице автоматически изменяются или удаляются соответствующие ей записи в подчиненной таблице (каскадное удаление).

 Поддержка подобных условий поддержания целостности на уровне ссылок допустима не для всех типов таблиц, но для таблиц Paradox она предусмотрена.

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

 Условие ссылочной целостности задается для подчиненной таблицы и определяется следующими элементами:

 полями связи подчиненной таблицы;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       

 именем главной таблицы;

 полями связи главной таблицы;

 параметрами.

Сначала надо открыть в DBD таблицу, которая будет дочерней (File/Open/Table), войти в режим её реструктуризации (Table/Restructure) (рис. 9) и в окне комбинированного списка Table Properties выбрать раздел Referential Integrity. При этом, как и в случае задания индексов, появляются кнопки Define, Modify, Erase и список, в котором выводятся имена созданных условий ссылочной целостности.

Для задания условия ссылочной целостности нужно нажать кнопку Define, после чего появляется окно Referential Integrity (рис. 10).

       Рис. 10. Определение условия ссылочной целостности

 В списке Fields левой панели окна Referential Integrity следует выбрать поле, связываемое с ключевым полем главной таблицы, и нажатием кнопки со стрелкой вправо перевести его в список Child Fields (Дочерние поля). Если полей связи несколько, то эти действия выполняются для каждого из них. Кнопка со стрелкой влево удаляет выбранное поле из списка полей связи.

 В списке Table надо указать главную таблицу. Имена таблиц выбираются из рабочего каталога программы Database Desktop (каталог, определенный нами ранее как Working Directory). После выбора таблицы и нажатия кнопки со стрелкой влево (рядом со списком таблиц) в список Parent's key ав-
томатически заносятся ключевые поля главной таблицы.

Примечание:  Главная таблица должна быть закрыта и не использоваться другими программами, включая Database Desktop. В противном случае при попытке сохранить структуру таблицы возникает ошибка.

 Параметры ссылочной целостности выбираются переключателями. Группа Update rules (Правила изменения) определяет вид взаимодействия таблиц при изменениях и удалениях записей в главной таблице. Если установить опцию Cascade, то при изменении значения ключевого поля записи главной таблицы аналогичные изменения автоматически произойдут во всех полях записей подчинённой таблицы, связанных с изменённым полем главной таблицы. А при удалении записи родительской таблицы, содержащей некоторое значение ключевого поля, в дочерней таблице автоматически будут удалены все записи, связанные с этим значением ключевого поля. Переключатель Prohibit  устанавливает режим запрещения изменения или удаления записей главной таблицы, для которых имеются ссылки из записей подчинённой таблицы.

 Переключатель Strict referential Integrity (Жесткая ссылочная целостность) не позволит ранним версиям СУБД Paradox (в частности, версиям Paradox для DOS, которые не поддерживают механизм ссылочной целостности) открыть и испортить таблицы, для которых определена целостность на уровне ссылок.

 После установки нужных флагов и нажатия кнопки ОК появляется окно Save Referential Integrity As, в котором указывается имя условия (рис. 11). Для таблиц Paradox условия ссылочной целостности именуются.

       Рис. 11 Присвоение имени

       условию ссылочной целостности

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

Примечание:     Условия ссылочной целостности задаются на физическом уровне и действуют для любых программ, выполняющих операции с таблицей: как для утилит типа Database Desktop, так и для приложений, создаваемых в Delphi.

 Созданное условие ссылочной целостности можно изменить, определив новый состав полей и новые значения параметров. Изменение условия ссылочной целостности не отличается от процесса его создания: после выделения имени условия в списке имён условий ссылочной целостности в окне реструктуризации таблицы и нажатия кнопки Modify открывается окно определения ссылочной целостности (рис. 10). При нажатии кнопки ОК измененное условие ссылочной целостности сохраняется под тем же именем.

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

 Кнопки Modify и Erase доступны только, если имя условия ссылочной целостности выбрано в списке.

3.7 Просмотр списка подчинённых таблиц

 Таблица, связанная с другими таблицами, является либо главной, либо подчиненной. Выше мы рассмотрели задание ссылочной целостности для подчинённой таблицы. Для главной таблицы можно просмотреть список подчинённых таблиц, отображаемый при выборе пункта Dependent Table (Подчиненная таблица) все того же комбинированного списка Table Properties (см. рис. 9). Этот список содержит имена всех таблиц, имеющих условия ссылочной целостности с участием данной таблицы.

Задание (часть 3)

 1). Определите для таблицы Prihod условие ссылочной целостности, исходя из следующих предпосылок:

  •  родительской таблицей для таблицы Prihod должна являться таблица Tovarу;
  •  поле Tovar дочерней (подчинённой) таблицы Prihod должно ссылаться на поле первичного ключа

 Tovar родительской (главной) таблицы Tovarу;

  •  правила изменения записей таблиц должны определяться режимом Cascade;
  •  флажок режима Strict referential Integrity должен быть установлен.

 Запомните определённое Вами условие ссылочной целостности под именем Integrity_Tovary_Prihod.

 Сохраните изменения в таблице Prihod (кнопка Save) и заново войдите в режим реструктуризации (Table Restructure). В выпадающем списке Table properties выберите элемент Secondary Indexes (индексы таблицы, кроме индекса, построенного по определению первичного ключа). В списке индексов Вы увидите новый индекс с именем Tovar. Этот индекс построен автоматически по неявному определению внешнего ключа при определении условия ссылочной целостности. Закройте таблицу Prihod.

 Откройте в DBD таблицу Tovar. В списке Table properties выберите элемент Dependent Table и убедитесь в том, что в открывшемся списке указано имя подчинённой по отношению к таблице Tovar таблицы.

 Выйдите из режима реструктуризации (кнопка Cancel) и закройте окно DBD.

Примечание:     Помимо описанных выше свойств и структур таблиц БД (вторичные индексы, условия ссылочной целостности, языковой драйвер и т. п.) при создании таблицы могут быть определены и другие (список Table Properties). Например, пароли: для ограничения прав доступа к самой таблице – Master Password, для ограничения прав на виды операций с записями таблицы и на изменение её структуры – Auxiliary Password. Кроме этого, при задании Auxiliary Password для каждого поля таблицы можно установить отдельные права доступа, не зависящие от прав доступа к другим полям.

        Для полей некоторых типов создаваемой таблицы (строковых, числовых, типа дата) можно определить некоторую таблицы выбора значений (Table Lookup). Если для поля задана таблица выбора, то в него можно ввести только значение, содержащееся в указанном поле таблицы выбора (в любой из записей). Задание таблицы выбора гарантирует, что в поле не будет введено недопустимое значение. Действие набора допустимых значений распространяется и на ввод данных и их редактирование программным образом: при попытке присвоить полю недопустимое значение генерируется исключительная ситуация (учитывается регистр, значения Null разрешены всегда, если специально не оговорено, что поле не может быть пустым).

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

 На этом создание базы данных данной лабораторной работы завершено. Теперь, открыв при помощи проводника Windows папку D:\IsN_M\L_One Вы можете увидеть файлы созданных в формате СУБД Paradox таблиц Tovary и Prihod. Этих файлов довольно много. Чтобы можно было ориентироваться в том, какие файлы непосредственно относятся к таблицам БД СУБД Paradox (на случай необходимости их копирования, переноса в другое место или удаления) ниже приведен список расширений имён файлов таблиц БД СУБД Paradox:

 Файлы таблиц Paradox имеют следующие расширения:

 .DB — таблица с данными;

 .MB — ВLOB-данные;

 .РХ — главный индекс (первичный ключ);

 .XG* и .YG* — вторичные индексы;

 .VAL — параметры для проверки данных и ссылочной целостности;

 .TV и .РАМ — форматы вывода таблицы в программе Database Desktop.

 Указанные файлы создаются только, если в них есть необходимость; конкретная таблица может не иметь всех приведенных файлов.

 Кроме названных файлов, при работе в сети для контроля доступа к таблицам Paradox используются файлы с расширением .NET.

4. Разработка приложения

 Поскольку в наша БД состоит из таблиц Paradox, а с этими таблицами Delphi работает посредством BDE (см. выше) – нас должны интересовать компоненты, используемые BDE для связи с базами данных.    В Delphi 7 и 6 компоненты, обеспечивающие доступ к данным через BDE находятся на странице BDE (в версиях, младше Delphi 6, эти компоненты расположены на странице Data Access). Компонент DataSource расположен на странице Data Access. Компоненты отображения и редактирования данных во всех версиях размещены на странице Data Control.

 Каждое приложение, использующее базы данных, обычно имеет, по крайней мере, по одному  компоненту следующих трех типов:

  Компоненты - наборы данных (data set), непосредственно связывающиеся с базой данных. Надо понимать, что когда речь идёт о компонентах – наборах данных (устоявшееся название – от data set), на самом деле под ними подразумеваются компоненты доступа к данным. В Delphi под набором данных, в самом общем смысле, понимают множество записей одной или нескольких таблиц, переданных в приложение, в результате активизации одного из компонентов доступа к данным. Набор данных инкапсулируется в компонент доступа к данным и только в таком виде передаётся приложению. В Delphi реализован базовый класс TDataSet, поддерживающий функциональность наборов данных, и, практически идентичные по составу, наборы дочерних компонентов для различных технологий доступа к данным (BDE, dbExpress, InterBase Express, ADO).

  Для BDE это такие компоненты, как Table, Query, StoredProc.

   Компонент Table (таблица) обеспечивает доступ к таблице БД целиком, создавая набор данных, структура полей которого полностью повторяет структуру таблицы БД. Компонент прост в настройке, обладает многими дополнительными функциями, которые позволяют работать с индексами таблицы. Компонент используется в основном, при работе с БД технологии файл-сервер, поскольку при работе с серверами БД в клиент-серверной технологии, промежуточное ПО используемых технологий доступа к данным всё равно транслирует запрос на получение табличного набора в простейший SQL-запрос на выборку из таблицы всех хранящихся в ней данных. Набор данных – редактируем.

  Компонент Query предназначен для создания SQL-запроса, подготовки его параметров, передачи запроса на SQL-сервер БД и представления результата запроса в наборе данных. Набор данных может содержать лишь ограниченную выборку (как по записям так и по полям) или полную выборку данных одной или нескольких таблиц БД. При этом, набор данных может быть редактируемым или не редактируемым.

  Компонент StoredProc (хранимая процедура) предназначен для определения процедуры, установки её параметров, выполнения процедуры и возвращения её результатов в компонент.

  Компонент — источник данных (data source), осуществляющий обмен информацией между компонентами доступа к данным и компонентами визуализации и управления данными. Таким компонентом является DataSource. Его роль заключается в управлении потоками данных между набором данных (инкапсулированным в компоненте доступа к данным), с одной стороны, и связанным с ним компонентом отображения данных, с другой стороны. Этот компонент обес-печивает передачу данных в визуальные компоненты и возврат результатов редактирования в набор данных, отвечает за изменение состояния визуальных компонентов при изменении состояния набора данных, передаёт сигналы управления от пользователя (визуальных компонентов) в набор данных.

  Компоненты визуализации и управления данными, такие, как DBGrid, DBText, DBEdit и множество других. Связь этих компонентов друг с другом и с базой данных можно представить
схемой, приведенной на рис. 12.

Таблица
базы
данных

 

data set:
Table,Query
или StoredProc

 

data source:
DataSource

 

Визуализация
и
 управление:
DBGrid,
DBText,
DВNavigator ...

 

 

 

                             Рис.12 Схема взаимодействия компонентов Delphi с базой данных

 Помимо указанных компонентов, в приложении может размещаться компонент Database. Этот компонент в основном используется в приложениях, работающих на платформе клиент/сервер. Он организует общение с удаленным сервером, реализует транзакции, работает с паролями. Компонент Database целесообразно явно вводить в приложение только в сравнительно редких случаях. Если он не введен явно, Delphi всё равно автоматически создает и настраивает его для каждой используемой в приложении базы данных.

Еще один компонент, который тоже автоматически создается Delphi — компонент Session. Это главный компонент любого приложения, работающего с базами данных. Но в явном виде этот компонент имеет смысл вводить только в многозадачные приложения, в которых параллельно обрабатывается несколько потоков информации.

 В приложении с таблицей (таблицами) БД взаимодействует компонент доступа к данным, который инкапсулирует набор данных и обращается к функциям соответствующей технологии доступа к данным для выполнения различных операций. Набор данных, инкапсулированный в компоненте доступа к данным, представляет собой "образ" таблицы (таблиц, или их частей) базы данных в приложении. Общее число таких компонентов в приложении не ограничено.

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

 Ещё одна функция компонента DataSource заключается в синхронизации поведения компонентов отображения данных с состоянием набора данных. Например, если набор данных не активен, то  компонент DataSource обеспечивает удаление данных из компонентов отображения данных и их перевод в неактивное состояние Или, если набор данных работает в режиме «только для чтения», то компонент DataSource обязан передать в компоненты отображения данных запрещение на изменение данных.

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

 При открытии набора данных компонент доступа к данным обеспечивает передачу в набор данных записей из требуемой таблицы БД. Курсор набора данных устанавливается на первую запись Компонент DataSource организует передачу в компоненты отображения данных значений необходимых полей из текущей записи. При перемещении по записям набора данных текущие значения полей в компонентах отображения данных автоматически обновляются. Пользователь при помощи компонентов отображения данных может просматривать и редактировать данные. Измененные значения сразу же передаются из элемента управления в набор данных при помощи компонента DataSource. Затем изменения могут быть переданы в базу данных или отменены.

 

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

4.1 Создание проекта

 При создании проекта приложения разработчик обычно решает две задачи:

1). Создание части приложения, которая отвечает за пользовательский интерфейс приложения.

2). Создание части приложения, которая отвечает за всё, кроме общения приложения с пользователем (обработка данных, ввод и вывод данных в автоматическом режиме и т.п.).

 Важнейшими составляющими первой задачи является конструирование форм отображения информации на экране монитора, разработка и реализация средств интерактивного диалога пользователь-приложение (если такой диалог предусмотрен заданием или определён логикой построения приложения). При запуске пакета Delphi разработчику «по умолчанию» предлагается исходная пустая форма-шаблон, модифицируя и дополняя которую, разработчик может одновременно и разрабатывать пользовательский интерфейс приложения и создавать его основную рабочую часть.

 Процесс создания приложения называется в Delphi процессом создания проекта.

 В ходе создания проекта в каталоге, определённом заранее в качестве места нахождения проекта, Delphi создаёт файлы со следующими расширениями:

 .DPR - описание проекта в текстовом виде (может быть просмотрен в любом текстовом редакторе);
 .DFM - описания форм проекта в текстовом виде (можно просмотреть в любом редакторе);
 .PAS - описания модулей форм проекта в текстовом виде (можно просмотреть в любом редакторе);
 .PAS - описания отдельных не визуальных модулей проекта (можно посмотреть в любом редакторе);

 .DOF - установки параметров проекта;

 .RES - описание ресурсов проекта;

 .DCU - файл откомпилированного модуля, до сборки проекта линкером;

 .ЕХЕ - исполняемый файл проекта;

  .CFG — параметры среды Delphi;

 .DSK -  параметры рабочего стола.

 Файлы *.DFM, *.PAS (описания модуля формы), *.DCU, относящиеся к одной форме имеют
одинаковые имена, отличные от имени проекта. Остальные файлы проекта имеют имя,
совпадающее с именем проекта.

*.DPR

 Файл текста проекта, который отображается в окне проекта «Редактора кода» при работе над проектом. Может быть просмотрен в любом текстовом редакторе.

 Файл проекта является центральным файлом проекта и представляет собой собственно программу-приложение. Для приложения, включающего в свой, состав одну форму, файл проекта «по умолчанию» имеет следующий вид:

program Project1;

uses

Forms,
Unit1 in 'Unit1.pas' (Form1);

($R *.RES)

begin

Application. Initialize;

Application.CreateForm(Tform, Form1);

Application.Run;
end.

 Имя проекта (программы) совпадает с именем файла проекта и указывается при сохранении этого
файла на диске. Первоначально («по умолчанию») это имя
Project1. To же имя имеют файлы ресурсов и параметров проекта, при переименовании файла проекта данные файлы автоматически пере-именовываются.

 Сборка всего проекта выполняется при компиляции файла проекта. При этом имя создаваемого
приложения (
ЕХЕ-файла) или библиотеки динамической компоновки (DLL-файла) будет совпадать с названием файла проекта. В дальнейшем будем предполагать, что создается приложение, а не динамическая библиотека.

 В разделе uses указывается имя подключаемого модуля Forms, который является обязательным для всех приложений, имеющих в своем составе формы. Кроме того, в разделе uses перечисляются подключаемые модули всех форм проекта, первоначально это модуль Unit1 формы Form1.
Директива $R подключает к проекту файл ресурсов, который по умолчанию имеет имя, совпадающее с
именем файла проекта. Поэтому вместо имени файла ресурса указан символ "*". Кроме этого файла,
разработчик может подключить к проекту и другие ресурсы, самостоятельно добавив директивы
$R и
указав в них соответствующие имена файлов ресурсов.

 Ресурсы, указанные в директиве $R, подключаются к проекту при его компиляции и сборке, увеличивая размер файла приложения. Поэтому таким образом желательно подключать только относительно небольшие в смысле затрат памяти ресурсы, такие как пиктограммы или курсоры. Подключение больших растровых изображений лучше выполнять динамически, используя соответст- вующие методы, например, LoadFromFile.

Изначально, программа, содержащаяся в проекте (она автоматически формируется самим пакетом Delphi «по умолчанию», как только пользователь указывает, что надо создать новый проект), состоит всего из трех операторов, выполняющих инициализацию приложения, создание формы Form1 и запуск приложения.

 Для отображения текста проекта в окне «Редактора кода» достаточно выбрать в главном меню
Project/View Source или вызвать то же самое нажатием Ctrl+F12, после чего выбрать в окне View Unit имя проекта.

*.DFM

 Файл описания формы (каждый .dfm-файл описывает отдельную форму) в текстовом виде.

Но это не то, что отображается в окне формы «Редактора кода» при работе над проектом.
Это детальное текстовое описание формы, содержащее сведения обо всех использованных в форме
компонентах (объектах), их свойствах, изменённых в редакторе объектов (возможно, только о
значимых для данной формы свойствах) и о взаимодействии компонентов между собой.

 Очень полезный файл, который можно использовать, например, для того, чтобы узнать свойства
того или иного компонента формы в данном проете (чтобы не запоминать картинку инспектора
объектов для каждого подключаемого к форме компонента).

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

 Файл описания формы является ресурсом Delphi и содержит характеристики формы и её
компонентов.

 Содержимое файла описания формы при необходимости можно отобразить на экране в
текстовом виде и в этом виде редактировать. Для этого нужно закрыть окно формы, для которой
выполняется конструирование, после чего командой
File/Open этот файл открывается как файл *.dfm.
Содержимое файла описания формы отображается в окне «Редактора кода» и доступно для просмотра и
редактирования. Одновременно, при изменении файла описания формы *.
DMF автоматически
синхронно будет изменяться файл модуля формы *.
PAS. Однако, на практике, подобные действия
выполняются, обычно, для каждого компонента формы отдельно, в соответствующем ему окне
«Инспектора объектов».

 Чтобы снова открыть окно «Конструктора формы», предварительно, в «Редакторе кода» командой
меню
File/Close должен быть закрыт файл описания соответствующей формы. Открытие окна
”Конструктора формы” выполняется командой
View/Forms или комбинацией клавиш <Shift>+<F12>, в
результате чего открывается диалоговое окно
View Form, в котором выбирается нужная форма. В
списке окна можно выбрать любую из форм приложения. На экране можно одновременно отобразить
несколько форм. Закрытие формы —
File/Close или щелчок мыши по кнопке закрытия соответствующего окна.

*.PAS

 Файл модуля формы (каждый .pas-файл описывает отдельную форму) в текстовом виде. Это то, что отображается в окне формы «Редактора кода» при работе над проектом. То есть, это текст самого мо-дуля формы, описывающий из каких компонентов состоит форма, какие обработчики событий в ней используются и т.п. Именно текст этого модуля и редактируется в окне формы «Редактора кода» при работой над проектом.

 В разделе interface модуля формы содержится описание класса формы, а в разделе implementation
подключение к модулю директивой $R визуального описания соответствующей формы (файла с тем
же именем, но с расширением .
DFM).

Тексты модулей форм отображаются и редактируются с помощью Редактора кода. Открыть
модуль формы можно в стандартном окне открытия файла, вызываемом командой
File/Open, или в
диалоговом окне
View Unit, которое появляется при выполнении команды View/Units или нажатии комбинации клавиш <Ctrl>+<F12>. В окне View Unit можно выбрать также нужный модуль формы.

 После выбора нужного модуля формы и нажатия кнопки ОК его текст появляется на
отдельной странице Редактора кода.

 Отметим, что оба файла каждой формы (описания и модуля) имеют одинаковое имя, которое
отличается от имени файла проекта, несмотря на то, что файл проекта имеет другое расширение.

*.DCU

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

*.PAS

 Файл отдельного модуля, несвязанного ни с какой формой. Кроме модулей форм, при
программировании можно использовать и
отдельные модули, не связанные с какой-либо формой. Они
оформляются по обычным правилам языка
Object Pascal и сохраняются в отдельных файлах. Для
подключения модуля его имя указывается в разделе
uses того модуля или проекта, который использует
средства этого модуля.

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

*.DOF

 Файл параметров проекта. Это символьный файл, который может читаться любым редактором
текста. В нём построчно располагаются параметры проекта и их значения. (Устаревшее расширение
.ОРТ).

 Для установки параметров проекта используется окно Project Options, вызываемое командой
меню
Project/Options или нажатием комбинации клавиш <Ctrl>+<Shift>+<F11>. Параметры разбиты на
группы, каждая из которых располагается в окне параметров на своей странице.
После установки отдельных параметров
Delphi автоматически вносит нужные изменения в
соответствующие файлы проекта. Так, параметры из страниц
Forms и Application вносятся в файлы
проекта и ресурсов, а параметры из страниц
Compiler и Linker — в файл параметров проекта.

*.RES

 Файл ресурсов. Автоматически создаётся при первом сохранении проекта. Может содержать
следующие ресурсы:

• пиктограммы;

•    растровые изображения (битовые массивы);

•    курсоры.

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

 Для работы с файлами ресурсов в состав Delphi включен графический редактор Image Editor версии 3.0, вызываемый командой Тооls/Image Editor.

 Файл ресурсов имеет иерархическую структуру, в которой ресурсы разбиты на группы, а каждый
ресурс имеет уникальное в пределах группы имя. Имя ресурса задается при его создании и в
последующем используется в приложении для доступа к этому ресурсу. Пиктограмма проекта находится
в группе
Icon и по умолчанию имеет имя MAINICON.

Кроме файла с расширением RES, объединяющего несколько ресурсов, редактор Image Editor
также позволяет работать со следующими файлами отдельных ресурсов:

 пиктограммы компонентов (*.DCR);

 растровые изображения (*.BMP);

 пиктограммы приложений (*.ICO);

 курсоры (*.CUR).

*.ЕХЕ

 Исполняемый файл приложения.

*.CFG

Файл параметров среды Delphi. Это символьный файл, который может читаться любым редактором
текста. В нём сохраняются значения параметров среды окружения
Delphi на момент завершения работы
с проектом (те, что устанавливаются в
Maim Menu/Tools/Environment Option).

*.DSK

Текстовый файл, в котором сохраняются все параметры рабочего стола на момент компиляции
(запоминания проекта), если соответствующая опция была установлена в
Maim Menu/Tools/Environment
Option/Preferens/Desktop Contens. Это текстовый файл, читаемый любым редактором.

 Вспомним, что для хранения файлов проекта (приложения) ранее бал создан каталог D:\IsN_M\L_One\App. Пусть имя проекта будет Pr4_N_M, а имя формы (она в нашем проекте одна) F4_N_M.

 Категорически не рекомендуется изменять вручную файлы ни одного из указанных
типов вне среды
Delphi.

 В среде Delphi вручную в «Редакторе кода» можно изменять (редактировать) только файл описания проекта (.dpr) и файл модуля формы (.pas) во время работы с проектом.                                                                                                                                                                                                                                                                                                                      

4.2 Создание приложения

 Как было оговорено ранее, при постановке задачи приложение должно работать с двумя таблицами БД (Tovar и Prihod), позволяя заполнять записи этих таблиц, а также просматривать, редактировать и удалять их. Таблица Tovar – родительская, а таблица Prihod – дочерняя. Связаны они отношением «один ко многим» по полю Tovar главной таблицы (на него ссылается поле Tovar подчинённой таблицы). То есть, в поле Tovar подчинённой таблицы должны присутствовать только значения, имеющиеся в поле Tovar главной таблицы (в любой из её записей) и удаление или изменение записей в таблицах подчиняются требованиям установленных условий ссылочной целостности (см. выше). Кроме этого, оговорено, что при просмотре данных таблицы Prihod записи таблицы должны быть отсортированы в порядке, соответствующем сложному вторичному индексу по полям DatPrih и Tovar. Записи таблицы Tovar, всегда будут отсортированы в порядке, соответствующем первичному ключу таблицы, созданному по полю Tovar.

 Условимся, что пользовательский интерфейс приложения должен обеспечивать работу одновременно с записями обеих таблиц (для записей каждой таблицы – своё окно). Из соображений удобства работы сделаем так, чтобы в окне таблицы Prihod в любой момент времени отображалось бы содержимое лишь тех записей этой таблицы, которые ссылаются на текущую запись (в этот момент времени) таблицы Tovar (запись, на которую в данный момент времени указывает внутренний курсор таблицы Tovar).

 Условимся также, что в качестве компонента доступа к данным (набора данных) будем использовать компонент Table; в качестве компонента – источника данных будем использовать компонент DataSource; в качестве компонента визуализации и управления используем компонент DBGrid.

 Запустите Delphi. По умолчанию Delphi при своем запуске создает пустую форму для нового приложения. Воспользуемся ею. В палитре компонентов на странице BDE выберите мышью компонент  доступа к данным (набор данных) Table. Щёлкните на нем мышью и, затем, щёлкните мышью на форме. После этого изображение компонента останется в форме. В окне Object Inspector (Инспектор Объектов) будут отображены свойства объекта Table (закладка Properties) и события, которые с ним могут происходить (закладка Events).

 В окне Object Inspector (Инспектор Объектов) установите в свойство DatabaseName (псевдоним БД)
значение
LR4 (имя алиаса нашей БД, который мы ранее для неё создали) при помощи выпадающего списка или вручную. Таким же образом установите значение Tovary.db в свойство TableName (имя таблицы БД). Для свойства Active установите значение True. В этот момент произойдет реальное связывание компонента Table (он по умолчанию имеет имя Table1) с таблицей Tovary.db.

 Расположите на форме компонент – источник данных DataSource (со страницы DataAccess палитры компонентов Delphi). Он будет являться связующим звеном между не визуальными компонентами (в данном случае Table1 – имя набора данных из таблицы Tovary в компоненте Tablе, см. свойство Name) и визуальными компонентами, которые мы добавим в форму позднее. Установите в свойство DataSet (имя набора данных) компонента значение Table1, выбрав его из выпадающего списка.

 Расположим на форме компонент визуализации и управления DBGrid, взяв его из палитры компонентов Delphi на странице Data Controls. Установите в свойство DataSource компонента значение DataSource1 (это имя, присвоенное по умолчанию созданному нами перед этим компоненту DataSource), выбрав его из выпадающего списка.

                                                 

                                   Рис. 13. Вид формы проекта

                                   на первом этапе разработки

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

 Вид разрабатываемой формы проекта к этому моменту представлен на рис. 13.

 Сохраните форму и проект на диске, соответственно под именами F4_N_M и Pr4_N_M.

Теперь можно откомпилировать проект и запустить его на выполнение. Это можно сделать, выбрав Главное меню Delphi/Run/Run, или просто нажав клавишу F9. Delphi откомпилирует проект, скомпанует его (Компановка, или линковка, или сборка, это процесс сборки всех откомпилированных модулей проекта, подключаемых файлов, необходимых динамических библиотек, форм и т.п., находящихся в объектном двоичном коде, в единое целое и оформление единого исполняемого файла проекта, имеющего расширение .exe). Если в процесссе компиляции и компановки не будет обнаружено никаких ошибок, то полученный испоняемый файл сразу будет запущен на выполнение. При обнаружении в процессе компиляции и сборки ошибки, соответствующие процессы прекращаются, исполняемый файл не формируется, на экран монитора выводится сообщение об обнаруженной ошибке. После того, как пользователь нажатием клавиши ОК  подтвердит то, что он уведомлен об ошибке, на экран монитора выводится окно «Редактора кода» с кодом проекта, в котором экранный курсор будет установлен на элемент, определивший появление ошибки. После исправления кода приложения, нужно перекомпилировать проект, нажав клавишу F9 (или выбрав Run/Run) и т.д., пока процессы компиляции и компановки не  завершатся успешно и исполняемый файл приложения не будет запущен на выполнение. Условимся, в дальнейшем, под словосочетанием «запустить проект (приложение, программу) на выполнение» подразумевать нажатие клавиши F9 (или выбор Run/Run).

 Итак, запустите Вашу программу на выполнение.

 Работающая программа открывает вам непосредственный доступ к данным в таблице Tovary. Для добавления записи нужно нажать на клавиатуре клавишу Insert или, находясь на последней записи набора данных, нажать клавишу смещения курсора вниз. Таблица автоматически перейдет в режим добавления новой записи После ввода значений в поля записи запомнить запись в наборе данных можно, перейдя на другую запись при помощи клавиш управления курсором. Отказаться от запоминания записи можно, нажав кнопку Esc.

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

 Для удаления записи следует установить на нее указатель текущей записи и нажать Ctrl+Del.

На рис. 14  показан вид окна программы в момент добавления в таблицу Tovary новой записи.

                              

                           Рис.14. Добавление новой записи к таблице Tovary (окно приложения).

4.3 Подключение второго набора данных, установление связи между наборами данных  Свяжем в одной форме два набора данных (главный и подчинённый) так, чтобы, в соответствии с оговоренными ранее условиями (см. п.4.2), в подчинённом наборе всегда показывались только записи, соответствующие текущей записи в главном наборе.

 Поместите на форму еще одну пару компонентов Таblе (с именем Table2) и DataSource (имя DataSource2) для работы с таблицей Prihod. С помощью свойств DatabaseName и TableName настройте компонент Table2 на работу с таблицей Prihod.db и установите в его свойство Active значение True, а с помощью свойства DataSet компонента DataSource2 свяжите его с компонентом Table2. Разместите на
форме компонент
DBGrid (имя DBGrid2) и установите в его свойство DataSource значение DataSource2. Чтобы пояснить, содержимое каких таблиц отображают компоненты DBGrid, поместите над каждым из них по компоненту Label (закладка Standard палитры компонентов Delphi) и установите в их свойствах Caption значения Товары и Приход товаров.(рис. 15). Откройте обе таблицы, поместив в их свойства Active значения True.

 

    Рис. 15. Форма с главным и подчинённым наборами данных

                                       в процессе разработки

 Если в таком состоянии откомпилировать и запустить программу на исполнение (F9), то визуальные отображения обоих наборов данных в соответствующих им окнах будут независимы друг от друга. Эта независимость отображения выражается в том, что не будет выполняться условие, оговоренное в п.4.2, то есть в окне «Товары» будут отображаться все записи таблицы Tovary, а в окне «Приход товаров» будут отображаться все записи таблицы Prihod. При этом надо помнить, что таблицы Tovary и Prihod связаны условием ссылочной целостности в отношении «один ко многим». Поэтому, если при заполнении поля Tovar таблицы Prihod в него будет введено наименование товара, которого нет в поле Tovar таблицы Tovar, то будет выдано сообщение об ошибке и выполнение приложения будет прервано.

  Чтобы выполнялось условие, оговоренное в п.4.2, то есть в окне таблицы «Приход товаров» отображалась бы только часть подчинённого набора (набора данных таблицы Prihod), содержимое которой соответствовало бы текущей записи в главном наборе (наборе данных таблицы Tovary), подчинённый набор данных надо связать с главным набором на уровне полей, через которые взаимодействуют таблицы. Это можно сделать при помощи Редактора связей (Field Link Designer). Как говорится в документации Delphi Field Link Designer позволяет визуализировать связь между главной и подчинённой таблицами (рис. 16).

 В окне Инспектора объектов (Object Inspector) для компонента Table2 раскройте список выбора                                                                          свойства MasterSource и выберите единственное, имеющееся в нем значение, DataSource1. Затем щелчком по кнопке с  тремя точками в правой части строки  свойства MasterFields  запустите  Редактор

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

связей (Field Link Designer). В нём, слева, в окне Detail Fields указаны имена полей подчинённой таблицы, но только тех, которые входят в индекс, выбранный в данный момент времени в строке Available Indexes. Раскройте список Available Indexes в верхней части этого окна и выберите индекс Tovar (индекс подчинённой таблицы, который участвует в поддержании связи с главной таблицей) - в окошке Detail Fields появится имя поля связи Tovar, по которому был создан индекс Tovar. Выберите это же поле в окошке Master Fields (в котором отображаются все поля главной таблицы) и нажмите кнопку Add. Если бы индекс Tovar был бы первичным ключом подчинённой таблицы, или, являясь её первичным ключом, входил бы первым в состав индекса, по которому поддерживается связь с главной таблицей (в этом случае операцию Add пришлось бы повторить и для других взаимодействующих полей ключа), то связь была бы установлена сразу после нажатия клавиши OK  - оба варианта в Delphi являются стандартными «по умолчанию». При этом в инспекторе объектов в свойстве  MasterFields набора данных Table2 появился бы текст – имя  связанного поля (имена связанных полей), а в свойстве IndexName появилось бы имя индекса подчинённой таблицы, участвующего в поддержании связи между таблицами. Но, наш случай для Delphi нестандартный, но возможный: в поддержании связи между таблицами участвует не первичный ключевой индекс (по полю N_Prih) подчинённой таблицы, а вторичный индекс Tovar  по полю Tovar.

 Поэтому:

1). После щелчка по кнопке OK на экране появится предупреждающее сообщение об ошибке: Invalid value for fieldN_Prih’. Это сообщение говорит о том, что Delphi «по умолчанию» всё же пытается использовать для визуализации связей между таблицами первичный индекс подчинённой таблицы, созданный по автоинкрементному полю N_Prih, но не находит в поле первичного ключа главной таблицы (Tovar) значений, которым бы соответствовали значения, находящиеся в поле N_Prih подчинённой таблицы. Здесь надо просто щёлкнуть по кнопе ОК, подтвердив получение сообщения об ошибке. В инспекторе объектов в свойстве MasterFields набора данных Table2 появится текст – имя  связанного поля – в данном случае Tovar. Но, в свойстве IndexName имя индекса подчинённой таблицы, участвующего в поддержании связи между таблицами, не появится (поскольку Delphi «по умолчанию» посчитал возникшую ситуацию ошибочной), и визуализации связи между таблицами не произойдёт.

2). Необходимо щелчком мыши по правой части свойства IndexName набора данных Table2 активизировать раскрывающийся список и выбрать в нём имя вторичного индекса подчинённой таблицы, который реально участвует в поддержании связи между таблицами (в данном случае Tovar). Связь межу таблицами будет визуализирована.

 Если теперь скомпилировать и запустить приложение, то работать с данными (ввод, редактирование, удаление) таблицы Prihod  можно будет в окне «Приход товаров», с учётом ограничений, накладываемых на данные этой таблицы условиями ссылочной целостности и в соот-ветствии с условиями визуализации связи между таблицами (см. п.4.2 и рис. 17).

            Рис. 17. Заполнение таблицы Prihod после визуализации

       связи между таблицами Tovar и Prihod  

А именно:

-  при вставке новой записи в таблицу Prihod значение поля связи (у нас – это поле Prihod) формируется автоматически – в него подставляется текущее значение поля связи главной таблицы, на которое в данный момент указывает курсор главной таблицы (новое поле появляется при нажатии в окне подчинённой таблицы клавиш «Стрелка вниз» или «Insert»;

-  в окне таблицы  Prihod будут отображаться только те строки, в которых содержимое поля связи (Prihod) соответствует содержимому поля связи (Prihod) текущей записи главной таблицы – Tovary;

-  редактировать в подчинённой таблице поле связи можно, но если в результате редакции в нём окажется значение, отсутствующее в поле связи одной из записей главной таблицы, будет сгенерировано сообщение об ошибке и выполнение приложения будет остановлено (Если в результате редакции в поле связи подчинённой таблицы окажется значение, соответствующее значению поля связи не текущей записи главной таблицы, оно будет введено в таблицу, но при первом же переходе в окне подчинённой таблицы к другой записи, строка, в которой будет стоять это значение, станет невидимой. Она будет видима тогда, когда текущей строкой главной таблицы станет та, в которой значение поля связи будет таким, каким является новое значение поля связи данной строки в подчинённой таблице.);

-  редактировать (вводить, удалять) данные в полях подчинённой таблицы (кроме поля связи и поля первичного ключа N_Prih) можно произвольным образом, не забывая, что для того чтобы строка была сохранена в таблице значения всех её полей должны быть определены (это условие оговаривалось для каждого поля при создании таблиц) – иначе будет выдано сообщение об ошибке и работа приложения будет остановлена.

Примечание:    Свойство IndexName подчинённого набора данных не должно ссылаться на какой-либо индекс, в котором поле связи не является ведущим. В противном случае визуализации связи между таблицами не произойдёт и они останутся визуально не связанными (хотя реальная связь между ними, определяемая ограничениями ссылочной целостности, останется).

        

Задание (часть 4)

1). Создайте свой проект (см. п. 4.1).

2). Создайте приложение, работающее (первоначально) с одной таблицей – Tovary (см. п. 4.2).

3). Заполните таблицу Tovary данными (10-15 строк).

4). Подключите вторую таблицу (второй набор данных)– Prihod (см. п. 4.3).

5). Заполните несколько строк таблицы. Проверьте, действительно ли таблицы связаны условием ссылочной целостности – можно ли в записях таблицы  Prihod в поле Tovar вводить значения, отличные от имеющихся в поле Tovar в записях таблицы Tovar. Что при этом происходит?

При заполнении данными строк таблицы Prihod надо помнить, что поле её первичного ключа N_Prih имеет тип «Автоинкремент», то есть заполнять его от руки не надо. После завершения ввода во все другие поля записи, в момент перехода на любую другую запись (существующую или новую) автоматически будет сгенерировано числовое значение, на единицу большее аналогичного значения, сгенерированного при предыдущем вводе строки, которое будет помещено в поле N_Prih вводимой строки.  

6). Визуализируйте отношения (связь) между таблицами (см. п. 4.3).

7). Заполните таблицу Prihod (3-4 значения прихода каждого товара из таблицы Tovar за различные даты прихода).

8). Закройте проект в Delphi. Закройте Delphi.

8.1).  Используя Database Desktop реконфигурируйте таблицу Prihod таким образом, чтобы правила обновления (Update rule) ограничений ссылочной целостности (Referential Integrity) были бы Prohibit.

8.2).  При помощи проводника Windows найдите и запустите на выполнение исполняемый (.exe) файл проекта.

8.3).  Проанализируйте действие ограничений условия ссылочной целостности отношения «один ко многим», определяемых правилом обновления Prohibit для случаев (редактировать можно только поле Tovar):

  - редактирование записи подчинённой таблицы таким образом, чтобы в её поле Tovar оказалось бы новое значение, но имеющееся в поле Tovar одной из записей таблицы Tovar;

  - редактирование записи подчинённой таблицы таким образом, чтобы в её поле Tovar оказалось бы новое значение, которого нет в поле Tovar ни одной из записей таблицы Tovar;

  - редактирование записи главной таблицы на которую не ссылается ни одна запись подчинённой таблицы;

  - редактирование записи главной таблицы, на которую ссылается хотя бы одна запись подчинённой таблицы;

 - удаление записи из подчинённой таблицы;

  -  удаление записи из главной таблицы, если на неё не ссылается ни одна запись подчинённой

  таблицы;

  -  удаление записи из главной таблицы, если на неё ссылается хотя бы одна запись подчинённой

  таблицы.

 Сделайте выводы о действии ограничений условия ссылочной целостности отношения «один ко многим» при установленных правилах обновления Prohibit для таблиц Paradox и поместите их в отчёт.

9). Закройте приложение.

9.1).  Используя Database Desktop реконфигурируйте таблицу Prihod таким образом, чтобы правила обновления (Update rule) ограничений ссылочной целостности (Referential Integrity) были бы Cascade.

9.2).  При помощи проводника Windows найдите и запустите на выполнение исполняемый (.exe) файл проекта.

9.3).  Проанализируйте действие ограничений условия ссылочной целостности отношения «один ко многим», определяемых правилом обновления Cascade для случаев (редактировать можно только поле Tovar):

  - редактирование записи подчинённой таблицы таким образом, чтобы в её поле Tovar оказалось бы новое значение, но имеющееся в поле Tovar одной из записей таблицы Tovar;

  - редактирование записи подчинённой таблицы таким образом, чтобы в её поле Tovar оказалось бы новое значение, которого нет в поле Tovar ни одной из записей таблицы Tovar;

  - редактирование записи главной таблицы на которую не ссылается ни одна запись подчинённой таблицы;

  - редактирование записи главной таблицы, на которую ссылается хотя бы одна запись подчинённой таблицы;

 - удаление записи из подчинённой таблицы;

  -  удаление записи из главной таблицы, если на неё не ссылается ни одна запись подчинённой

  таблицы;

  -  удаление записи из главной таблицы, если на неё ссылается хотя бы одна запись подчинённой

  таблицы.

 Сделайте выводы о действии ограничений условия ссылочной целостности отношения «один ко многим» при установленных правилах обновления Cascade для таблиц Paradox и поместите их в отчёт.

 




 

А также другие работы, которые могут Вас заинтересовать

25189. Сутність матеріалістичного розуміння історії 28 KB
  зору його внутрішньої структури; з т. зору процесу в якому задіяний: його історичних складових і звязків; з т. зору закономірностей його розвитку переходу одного його історичного стану в інший.
25190. Р.Рорті про походження ы засади теорії пізнання (Філософія і дзеркало природи) 37.5 KB
  Оба эти допущения по Рорти вовсе не являются неизбежными для философии; при этом первое из них берет своё начало ещё в античности прежде всего в платонизме а второе представляет собой специфический продукт философии Нового времени начиная с Декарта. Соответственно отказ от этого допущения позволяет Рорти деконструировать образ Зеркала Природы а это в свою очередь ведет к опровержению исходного взгляда на философию как на гарант добывания человеком объективной истины о себе и мире. Эпистемология теория познания с точки...
25191. Громадянське суспільство і держава 25.5 KB
  В основі ідеї громадянського суспільства лежить проблема відносин людини з політичною владою суспільства з державою. Вона є похідною від громадянського суспільства і її призначення полягає в тому щоб слугувати йому. Від ступеня розвиненості громадянського суспільства залежить ступінь демократизму держави. Етатизм навпаки всіляко перебільшує роль держави в житті суспільства.
25192. Філософське вчення Г. Сковороди 27.5 KB
  Сковорода 1722 1794 був всебічно освіченою для свого часу людиною досконало знав стародавні та нові європейські мови старогрецьку філософію і літературу. Сковорода стверджував що природа є безкінечна кількість світів . Сковорода пов'язував цю думку з концепцією двох натур двох природ лат. Сковорода намагався подолати дуалізм вчення про дві натури та знайти єдине начало€.
25193. Головні пункти критики спекулятивної диалектики з боку сучасників Гегеля (Шеллінг, Шопенгауер, Фейєрбах, Кіркегор) 29.5 KB
  Головні пункти критики спекулятивної диалектики з боку сучасників Гегеля Шеллінг Шопенгауер Фейєрбах Кіркегор. Фейєрбах: учень Гегеля незадоволений абстрактністю спекулятивної системи діалектикою €œчужістю€ системи конкретному людському індивідові. з гегелевською ідеєю абсолютного духа – €œвідстороненої€ сили Кіркегор: субєктивна екзистенціальна діалектика Кіркегора виростає як протиставлення системі Гегеля де людина підвладна анонімному принципу історичного розвитку втрачає свою індивідуальність. Критикував Гегеля також за...
25194. Гадамер про герменевтичний досвід і природу філософської істини 24.5 KB
  Мета філософської герменевтики – порятунок цілісного досвіду сприйняття світу. Більшість людських проблем пов’язані з збідненням досвіду ФГ. Вчить дотримуватися набутого досвіду. Герменевтичний досвід не може не залежити від наших упереджень попереднього досвіду.
25195. Знання як особлива форма освоєння світу 27.5 KB
  Пізнання це такий процес що спрямований на отримання знання. Пізнання має багато модусів оскільки людина відноситься до світу у різних площинах і пізнає його у різних ракурсах. Тому можна виділяти наукове пізнання етичне релігійне філософське мистецьке та інші. Пізнанням є таке відношення до світу в якому людина змінює себе за допомогою світу.
25196. Пізнання як особлива форма освоєння світу 25 KB
  Пізнання як особлива форма освоєння світу Якщо дуже просто то пізнання – це процес взаємодії суб’єкта та об’єкта що своїм результатом має знання. Існують різні способи пізнання а отже й різні види знання. Поряд із різноманітністю видів знань існує величезна кількість поглядів на саму природу пізнання. Говорять про абстрактне і конкретне пізнання повне і неповне наукове і філософське тощо.
25197. Концепції комунікативно-структурованого життєсвіту за Ю.Габермасом 35 KB
  Габермас виходить з концепції суспільної еволюції де суспільний розвиток постає у формі руху від родовогоархаїчного до традиційногодержавноорганізованого а потім до модерногокапіталістичного суспільства. Концепція життєсвіту дістає своє втілення в архаїчних суспільствах де структури нормативної інтеграції опосередковані мовленнєвою комунікацією водночас становлять системні структури. Системні механізми в цих суспільства невіддільні від соціальноінтегративних інституцій заснованих на життєвому світі. За умов традиційного...