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

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

1. Первоначально написать всю программу (script-файл) в любом из текстовых редакторов. При ее сохранении файлу следует задать расширение sql. Затем программу можно ввести с помощью утилиты WISQL (Run on ISQL Script).

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

2. Здесь может использоваться утилита WISQL или утилита SQL Exiorer.

При вызове WISQL полезно закрепить "русификацию". Для этого в режиме Session/Advanced Setting в окне Character Set On надо задать WINI251.

Для создания структуры таблиц и их заполнения используется язык SQL.

Установим сетевое соединение БД с WISQL через элемент File/ Connect to Database его головного меню. В открывшемся окне зададим путь к БД, имя пользователя и пароль.

В появившейся заставке в верхнем окне SQL Statement следует набрать SQL-оператор. Так, для создания таблицы Pravila наберем

CREATE TABLE Pravila(

Nomprav integer Not Null,

FIO varchar(15),

Stepen varchar(5),

Otkrytie varchar(5),

Znak_ball varchar(5),

Sr_ball numeric! 15,2),

Znak_Stag varchar(5),

Stag integer,

Dolgnost varchar(10),

Objasnenia varchar(120)

);

По завершении набора следует нажать кнопку Run.

Набор "переходит" в окно ISQL Output и при отсутствии ошибок выполняется. При наличии ошибок выдается сообщение, в котором указывается строка и знак в наборе, где допущена ошибка. После ее исправления следует снова нажать кнопку Run.

Описанная процедура утомительна, и потому в WISQL кнопками Previous и Next можно возвратить необходимый оператор из нижнего окна в верхнее. После его корректировки он вводится нажатием кнопки Run.

Подтверждение окончания набора программы осуществляется выбором в головном меню File/Commit Work, а отказ от выполнения – Filc/Rollback Work.

После завершения работ с WISQL отсоединение от БД проводится выбором File/Disconnect from Database. Выбор кнопки Exit означает выход из WISQL.

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

Чтобы контролировать работу WISQL, возможно использовать меню.

При нажатии элемента меню View/Metadata Information выдается заставка View Information. В ней можно выбрать тип и имя объекта, в результате чего в окне ISQL Output будет показана программа объекта на вложенном языке SQL.

Если имя объекта не задано, выдается список объектов данного типа.

Выбор элемента меню Extract /SQL Metadata for Table и имени таблицы приведет к выдаче данных о ней, которые могут быть сохранены в txt-файле.

Нажатие Extract /SQL Metadata for Database вызовет выдачу метаданных о БД в виде программы на вложенном языке SQL. Ее можно скопировать в буфер и затем сохранить, например, в редакторе Word.

Пример такой SQL-программы приведен в Приложении 3.

Заполнение таблиц

Заполнение можно осуществить в WISQL или в SQL Explorer.

В первом случае производится построчная вставка данных с помощью оператора INSERT. Корректировка данных может осуществляться операторами UPDATE и DELETE, контроль полученных результатов – оператором SELECT. Однако такой способ утомителен.

Более удобно использование утилиты SQL Explorer, которая позволяет к тому же создавать структуру таблиц.

После открытия SQL Explorer на экране появляется двухоконная заставка. В левом окне выбирается закладка Databases и необходимый алиас. Нажатие "+" слева от него раскрывает перечень типов объектов БД. Нажатие "+" у выбранного типа объектов раскрывает перечень имен этого типа объектов. Выбор имени вызывает появление в правом окне трех (для таблиц – четырех) закладок.

Закладка Definition определяет метаданные конкретного объекта, закладка Text позволяет получить SQL-оператор создания конкретного объекта. Выбор закладки Data (для таблиц) позволяет провести просмотр, заполнение и корректировку данных в выбранной таблице.

Для введения новых данных следует нажать "+" в навигаторе и последовательно вводить записи. При переходе на последующую запись Назад запоминается автоматически. Для запоминания последней записи необходимо нажать кнопку Post или Refresh навигатора.

Создание программного кода любою объекта осуществляется при выборе закладки Enter SQL. В верхней части правого окна набирается SQL-оператор и нажимается кнопка с изображением молнии. Если оператор набран корректно, в нижней части правого окна появляется результат выполнения оператора (в противном случае выдается сообщение об ошибке). После успешного выполнения оператора следует обновить в утилите информацию о БД с помощью элемента меню View/Refresh.

Контроль за работой БД и сервера в удаленном варианте осуществляется утилитой Interbase Server Manager.

Б. ИНТЕРФЕЙС ПОЛЬЗОВАТЕЛЯ. В режиме клиент-сервер серверная часть интерфейса пользователя развита, как правило, слабо. В нем выводятся параметры, общие для всех клиентов. Таких параметров обычно немного.

Основной акцент в разработке интерфейса пользователя переносится на интерфейс клиента.

При формировании интерфейса учтем опыт, накопленный при выполнении работы [19], где интерфейс пользователя построен на

основе одной формы Delphi. В связи с этим усложнился программный код за счет организации доступа к элементам управления, введения дополнительных кнопок при переходе от групп элементов меню к другим элементам меню, постоянного изменения SQL-оператора в компонентах Query.

При использовании нескольких форм компоненты Query' можно закрепить за конкретными выводимыми на экран вариантами таблиц, переносом SQL-операторов в свойства SQL компонент Query. При этом потребуется дополнительный программный код для взаимодействия форм, но он много проще "устраняемого" программного кода.

В общем случае можно использовать девять форм Delphi для клиента и одну – для сервера.

При переходе к хранимым процедурам алгоритм приложения клиентской части резко упрощается. Для таблиц "Кадры", "Работающие", "Претенденты", "Принимаемые", "Принятые" SQL-операторы почти совпадают.

В связи с этим лучше использовать четыре формы Delphi для клиента и одну – для сервера. Тогда возможно такое "распределение" таблиц.

Сервер

Form5, на которой расположены компоненты Edit1 и Edit2 для фиксации текущего цикла и общего количества циклов.

Клиент

Forml (основная) – меню и таблица "Штатное расписание".

Form2 – таблица "Кадры" и ее составные части.

Form3 – таблица "Объяснения".

Form4 – таблица "Правила".

Формы Delphi Form2 – Form4 – модальные. При их закрытии осуществим переключение доступных элементов головного меню.

В головном меню Forml выделим элементы Главная, Показать, Обработать.

Для элементов головного меню предварительно введем следующее деление.

Главная

Открыть

Выйти

Показать

Штатное расписание

Кадры

Претенденты

Работающие

________________

Принимаемые

________________

Принятые

________________

Уволенные

Обработать

Начать

________________

Запуск правил

________________

Количественный результат

Объяснения Изменение правил

Изменение результата

________________

Принять всех

________________

Продолжить

Замечание. При использовании нескольких форм следует установить необходимые связи между ними. Для этого в модуле unii после заголовка implementation пишется строка

uses unit1, .... uniti, ...unitm;

Без установления связей формы взаимодействовать не будут.

В. АЛГОРИТМ ПРИЛОЖЕНИЯ. Для формирования алгоритма используем шаблоны [19]. Под шаблоном понимается законченная в целевом отношении и повторяющаяся программная часть процедуры (procedure) или функции (function). Шаблон может быть построен из элементарных и комбинированных составляющих.

ВП1. Элементарные составляющие. Простейшими (элементарными) составляющими являются операторы SQL: выборки (SELECT), обновления (UPDATE, DELETE, INSERT), уничтожения (DROP) и построения (CREATE) таблиц (TABLE).

Следует отметить возможность двух способов их реализации.

1. Использование свойства SQL – компонента TQuery:

select * from kadry

Этот способ применяют при многоформном (многооконном) интерфейсе, когда объект Query формы "закреплен" за конкретной таблицей и вид запроса не меняется в течение всей сессии.

2. Составление формируемого запроса, размещаемого в программном коде. Тогда предыдущий пример получит вид

Query1.Close;

Queryl.SQL.Clear;

Query1.SQL.Add('select * from kadry');

Query1.Open;

Этот способ применяется при однооконном варианте интерфейса или в случае частого изменения вида запроса в объекте Queryl.

С точки зрения написания SQL-запроса разница невелика, поэтому дальнейшую процедуру формирования шаблонов иллюстрируем с использованием SQL-свойств.

ВП1.1. Оператор select используется в многочисленных вариантах, определяемых следующими основными признаками:

а) использованием параметров (два класса – обычный и с параметрами);

б) применением функций агрегирования (обычный, агрегированный);

в) возможностью редактирования табличных данных после вызова таблицы на экран (обычный, RequestLive);

г) использованием одной или нескольких исходных таблиц.

Для проектируемой БЗ представляют интерес следующие варианты.

1. Простая выборка (будем называть вариант selecti):

select * from kadry

2. Выборка с параметрами (select2), в которой выделим случаи:

• с одной таблицей (select21):

select dolgnos, count(dolgnos) as fakty from kadry

where (status='pa6o-L)

And(vremja between 1 And :vremja)

group by dolgnos

ParamByName(Vremja').Value:=StrTolnt(Edit1.Text);

• с двумя таблицами (select22):

select K.vremja, K.Familia,

K.Uch_stepen, K.Otkrytie, K.Sr_ball,

K.Stag, K.dolgnos,

P.Objasnenia from kadry K, pravila P

where vremja=;vremja And

P.nomprav=K.nomprav

Vremja') .Value:=StrTolnt( Edit1.Text)

3. Выборка с вычислениями и функциями агрегирования (select3):

select dolgnos, count(dolgnos) as fakty from kadry

where status='работ'

group by dolgnos

4. Выборка с параметрами и возможностями изменения вызванных данных в диалоге:

RequestLive: =Т rue;

select * from kadry

where (status='npm-iMM')

and {vremja=:vremja)

ParamByName(Vremja').Value:=StrTolnt(Edit1 Text);

ВП1.2. Оператор update с гремя разновидностями:

1. С параметрами update1, включающий два подкласса:

• имя изменяемого поля не входит в условия (update11):

Update kadry

set nomprav=:nomprav,

dolgnos=:dolgnos

where (uch_stepen=:uch_stepen)

And (otkrytie=:otkrytie)

And (Sr_ball<:Sr_ball)

And jstag>=:Stag)

And (status='npeTeH')

And (vremja=:vremja)

ParamByName('nomprav').Value:=Query2.FieldByName('nomprav').Value;

• имя изменяемого поля входит в условия (update 12), при этом для переменной используется приставка old_

Update kadry

set status=:status

where (status=:old_status)

And (vremja=:vremja)

ParamByName('status').Value:='принят';

2. С параметрами, вычислениями и использованием цикла (update2):

Update stat_rasp

set fakty=:fakty,

vacanc=plany-fakty

where (dolgnos=:dolgnos)

And (vremja=:vremja)

ParamByName('Vremja').Value :=StrTolnt(Edit1.Text);

3. С параметрами, циклом и ссылкой Datasource на параметры (update3):

update stat_rasp

set plany=:plany, fakty=:fakty,

vacanc=:vacanc, prinimaem=:prinimaem,

nedobor=:nedobor

where vremja=:vremja and dolgnos-:dolgnos

Datasource:=DataSource2;

ВП1.3. Оператор insert 1. Обычный (insert 1):

insert into kadry

values(TleTpOB', 'да',. ..);

ВП1.4. Оператор delete:

1. Обычный (delete 1):

delete from pravila

2. С параметрами:

delete from kadry

where vremja=:vremja and dolgnos='отказать'

ParamByName('Vremja').Value:=StrTolnt(Editl.Text);

ΒΠ1.5. Оператор drop уничтожения таблицы (drop1)

drop table pravila

ВП1.6. Оператор create создания таблицы (crcatel), описанный ранее.

ВП2. Комплексные составляющие, использующие не менее двух элементарных составляющих.

ВП2.1. Составляющая inserti (inserti + selecti):

insert into kadry

select * from kadryjsh

ВП2.2. Составляющая updateI (update 1 + select3):

update stat_rasp

set plany=:plany, fakty=:fakty,

vacanc=:vacanc, prinimaem=:prinimaem,

where (vremja=:vremja) and

dolgnos IN

(select dolgnos, count(dolgnos) as fakty

from kadry

where (status='работ') and

(vremja between 1 and :vremja)

group by dolgnos)

ParamByName('Vremja').Value:=StrTolnt(Edit1.Text);

ВПЗ. На основе этих составляющих формируются шаблоны, показанные в табл. 1.1 и "привязанные" к действиям пользователя – нажатию элементов меню (см. рис. 15.2.).

При построении алгоритма приложения шаблоны связываются с соответствующими элементами меню и апробируются. Однотипные шаблоны могут просто копироваться.

Отметим одно интересное обстоятельство. Формирование программных шаблонов (табл. 15.4) фактически осуществляется во всех СУБД, но в различных вариантах.

В СУБД Access составляющими являются запросы, в которых хранятся и промежуточные результаты. В СУБД Paradox (в рамках Delphi) составляющие связаны с компонентами Query, которые хранят промежуточные данные. В СУБД InterBase контейнерами для шаблонов служат хранимые процедуры, в которых последовательно размещаются необходимые составляющие. Промежуточные результаты хранятся в предложении INTO программы хранимой процедуры в виде параметров.

Схема взаимодействия сервера и клиента в части алгоритма приложения показана на рис. 15.5.

Таблица 15.4

Программные шаблоны алгоритма приложения

Действия пользователя

Шаблон

Начать

А-копирование

Delete 1

Inserti

или

Б-копирование

Selecti

Update3

или

В-копирование

Update}

или

Г-конирование

Drop1

Create1

Insert1

Штатное расписание

Select3

Update2

Select2l

Кадры

Select2l

Работающие

Select2l

Претенденты

Select2l

Запуск правил

Select1

Update11

Update11

Принимаемые

Select2l

Количественный результат

Select3

Update2

Select2l

Объяснение

Select22

Принять всех

Delete2

Updatel2

Принятые

Select2l

Продолжить

Update 12

Б-копирование

Selecti

Selecti

Уволенные

Select4

Select1

Изменение результата

Select4

Изменение правил

Select2l Select4 Update12

В рассматриваемой программной реализации генераторы и триггеры не используются.

Фрагмент-пример программы алгоритма приложения приведен в приложении 3. В ней выделена серверная часть (на вложенном языке SQL) и клиентская часть (интерфейсный язык SQL и Object Pascal с 15 формами).

Клиентская часть достаточно проста. Она в значительной мере представляет собой программу интерфейса пользователя, поскольку почти все select-запросы "спрятаны" в SQL-свойства компонент Query.

Рис. 15.5. Взаимодействие сервера и клиента

Программный код для сервера (код хранимых процедур) соответствует программным шаблонам, рассмотренным в табл. 15.4.

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

Подчеркнем еще раз, что и клиент, и сервер для локального варианта реализуются на одном, основном компьютере.