- •Лабораторная №1 Проектирование структуры базы данных. Нормализация таблиц.
- •О бозначение таблиц и полей
- •Лабораторная №2 Создание серверной части приложения: алиас, файл базы данных, таблицы.
- •Лабораторная №3, №4 Визуальное проектирование структуры базы данных: таблицы, индексы, условия ссылочной целостности, взаимосвязи.
- •Примечание
- •Лабораторная №5, №6 Клиентская часть: размещение не визуальных компонентов, соединение с бд. Клиентская часть: размещение визуальных компонентов, отображение таблиц.
- •Лабораторная №7, №8 Запросы на добавление данных. Запросы на редактирование и удаление данных.
- •Лабораторная №9 Создание генераторов и триггеров. Каскадные воздействия.
- •Лабораторная №10 Создание хранимых процедур.
- •Лабораторная №11 Сортировка, поиск, фильтрация данных: в базе данных и выборках.
- •Лабораторная №12, №13 Работа с транзакциями. Кэширование изменений при работе с транзакциями.
- •Лабораторная №14 Обеспечение достоверности данных и перехват исключительных ситуаций.
- •Лабораторная №15 Работа с отчетами.
- •Лабораторная №16 Установление привилегии доступа.
- •Лабораторная №17 Копирование и восстановление данных.
- •Лабораторная №18 Копирование клиентской части
- •Список рекомендуемых баз данных
Лабораторная №14 Обеспечение достоверности данных и перехват исключительных ситуаций.
Цель работы: .научится определять место и причину возникновения исключительной ситуации; создавать обработчик исключительной ситуации; организовывать мягкий выход из исключительной ситуации.
Исключения — механизм сообщения об ошибках, которые возникают в процессе исполнения хранимых процедур и триггеров.
Исключение создают оператором: CREATE EXCEPTION ИмяИсключения "Сообщение"!;]
Примечание Длина сообщения не должна превышать 78 символов.
Для генерации исключения в процедуре или триггере используют команду: EXCEPTION ИмяИсключения
Когда исключение сгенерировано:
завершается процедура (триггер), в которой оно было возбуждено, и отменяются все действия, которые были ею выполнены непосредственно или косвенно;
возвращается сообщение об ошибке в вызывающее приложение;
его можно обработать командой when. Если оно обрабатывается, то его проведение отличается от выше описанного.
Ход работы:
Запустите утилиту Interactive SQL.
Исполните SQL-команду:
CREATE EXCEPTION IMPOSSIBLE_Rn "Арендная плата д.б. > О"
Совет : Не пытайтесь просмотреть результат, чтобы убедиться, что исключение создано. Как показано на рис. 18.8, проблемы IBConsole с русской кодировкой вам этого не позволят.
Ошибка вывода русскоязычного сообщения IBConsole
Создайте процедуру update__rn. Ее код приведен ниже:
CREATE PROCEDURE UPDATE_RN(inpRn NUMERIC(6, 2)}
AS
BEGIN
IF(:inpRn < 0) THEN EXCEPTION IMPOSSIBLE_Rn;
WHEN EXCEPTION IMPOSSIBLE_Rn DO EXIT;
/* вместо WHEN…DO можно ELSE */
UPDATE Rent SET Rn = :inpRn;
SUSPEND;
END
Примечание: Как видите, данная процедура позволяет изменить значение поля Rn таблицы Rent. Если вводимое значение Rn отрицательное число, то процедура генерирует исключение impossible_rn.
Убедитесь в ее работоспособности, исполнив следующую SQL-команду: EXECUTE PROCEDURE UPDATE_RN (-33)
Сообщение о генерации исключения
Контрольное задание: Выполнить обработку события проверки существования таблиц базы данных EXMPL.gdb.
Лабораторная №15 Работа с отчетами.
Цель работы: .научится форматировать отчеты разных видов.
Разработка меню
Начните новый Delphi-проект.
Измените СВОЙСТВО формы Name на fmMenu, a Caption на Аренда.
Поместите на форму компонент TMainMenu.
Откройте Menu Designer, для чего выберите компонент меню на форме, щелкните на нем дважды мышью и создайте меню.
Чтобы убедиться в работоспособности меню, откомпилируйте его модуль.
Сохраните проект как Exmpl.dpr, а модуль — Menu.pas.
Форма меню информационной системы "Аренда Minus"
Печать договора
Пусть текст договора будет таким, как показано на рисунке.
Здесь в фигурных скобках указаны имена полей таблиц базы данных.
Текст договора
Прежде чем печатать договор, найдем соответствующие ему данные. Для этого:
Используя скрипт GET_LEASE_DATS.sql создайте процедуру выбора.
Код скрипта GET_LEASE_DATS.sql
SET TERM ^;
CREATE PROCEDURE GET_LEASE_DATS (TN_Name CHAR(10))
RETURNS (L_Tn CHAR(10), 0_0w CHAR(10), L_LDate TIMESTAMP, Rl_Typ CHAR(20),
L_AdR CHAR(20), Rl_Rn NUMERIC(6, 2), L_AdT CHAR(20), 0_AdO CHAR(20))
AS
BEGIN
FOR SELECT DISTINCT L.Tn, O.Ow, L.LDate, Rl.Тур, L.Adr, Rl.Rn, L.AdT, O.AdO
FROM Lease L, Owner 0, Realty R, Rent Rl
WHERE (L.Tn = :Tn_Name) AND (O.Non = L.Non) AND (R.AdR = L.AdR)
AND (Rl.Typ = R.Typ)
INTO :L_Tn, :0_0w, :L_LDate, :Rl_Typ, :L_Adr, :Rl__Rn, :L_AdT, :0_AdO
DO SUSPEND;
END ^
commit;
Примечание Для поиска и печати данных договоров, которые будут возвращены процедурой GET_LEASE_DATS используем компонент TIBQuery.
Н
ачните
новый Delphi-проект.Поместите на форму компоненты TLabel, TEdit, TButton и TDBGrid,
Присвойте СВОЙСТВУ Name формы значение fmFindLease.
Форма поиска
Создайте модуль данных и назначьте свойства компонентов
Модуль данных
-
Компонент
Свойство
Значение
TDatabase
DatabaseName
C:\dbApp\clSRV\Exmpl\ Exmpl.gdb
Name
dbExmpl
Params
User Name=SYSDBA
PASSWORD=masterkey
LoginPrompt
False
Connected
True
TQuery
Name
quLsQwRRn
DatabaseName
dbExmpl
SQL
Select *
from GET_Lease_Dats(:NameTn)
TDataSourse
DataSet
quLsQwRRn
Name
dsLsQwRRn
TIBTransaction
Name
Tr_actExmpl
DefaultDatabase
dbExmpl
Создайте папку Print и сохраните в ней (File/Save As) модуль данных dmPrn и форму fmFindLease под именами dmPrnU.pas и Find.pas, соответственно.
Добавьте имя модуля данных в секцию implementation модуля Find (File/Use Unit).
Назначьте значение свойства DataSource компонента TDBGrid равным dmPrn.dsLsOwRRn.
Определите значение свойства Name кнопки Поиск равным btFind и поставьте в соответствие ее событию OnClick процедуру:
procedure TfmFindLease.btFindClick(Sender: TObject);
begin
with dmPrn.quLsOwRRn do begin
Close;
ParamByName('NameTn').AsString := Editl.Text;
Open ;
end;
end;
Сохраните проект в папке Print (File/Save Project As), откомпилируйте его и проверьте работоспособность.
Результат поиска
Совет: Для отображения всех цифр года в дате создайте постоянный набор quLsOw-RRnL_LDATE, используя Fields Editor, и определите свойство DisplayFormat набора как dd.mm.yyyy.
Теперь, когда данные договора извлечены, реализуем его печать. Поставим в соответствие событию Onclick кнопки Печать (btPrint) процедуру:
procedure TfmFindLease.btPrintClick(Sender: TObject);
begin
PrintLease(True);
end;
При таком значении параметра процедура
procedure TfmFindLease.PrintLease(Preview: Boolean);
begin
if Preview then
PrnLease.QuickRepl.Preview
else
PrnLease.QuickRepl.Print;
end;
печатает отчет. PrnLease — форма отчета.
Объявите процедуру PrintLease в разделе private модуля Find.pas.
Создадим форму отчета. Добавьте новую форму и назовите ее PrnLease (File/New/Form).
Результат поиска
Поместите на нее компонент TQuickRep.
Поместите в отчет компонент TQRBand, и определите его свойство BandType как rbDetail.
Расположите на полосе компонент TQRExprMemo.
Используя свойство Lines, вызовите окно String List Editor и введите туда текст договора аренды.
Окно String List Editir
Закройте редактор и увеличьте размеры полосы и компонента TQRExprMemo так, чтобы было видно весь текст договора.
Теперь щелкните правой кнопкой мыши в поле отчета и выберите из контекстного меню пункт Report settings.
Выберите из раскрывающегося списка Paper size значение Custom Size и установите требуемую ширину и высоту листа, которая на ширину полей превышает текст договора.
Сохраните в папке Print разработанный модуль печати договора , PrnLease под именем PrnLeaseLJ.pas.
Результат печати отчета
Добавьте имя модуля в секцию implementation модуля Find (File/Use Unit).
Добавьте имя модуля данных в секцию implementation модуля PrnLeaseUjB
Объявите значение свойства Dataset компонента TQuickRep равным dmPrn.quLsOwRRn.
Сохраните проект в папке Print, откомпилируйте его и проверьте работоспособность.
