Создание структуры таблиц
Структура таблиц создается через программу, написанную на вложенном языке 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, в которых имена таблиц заменены на имена хранимых процедур.
Подчеркнем еще раз, что и клиент, и сервер для локального варианта реализуются на одном, основном компьютере.