Здавалка
Главная | Обратная связь

Серверная часть приложения



Пояснения

Примерный вид формы для продажи билетов показан на рисунке.

 

Продажа происходит так.

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

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

При этом должно измениться поле «количество свободных мест» и появиться сообщение, какую сумму нужно заплатить за билеты. Если запрошенное число билетов превышает число свободных мест, выводится сообщение о том, что продажа невозможна.

Серверная часть приложения

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

Create view punct_rais

as

select punct_route.cod_punct as cod_punct,

rais.cod_rais as cod_rais,

route.name_route as name_route,

rais.week_day as week_day,

rais.hour||’:’||rais.minute as time,

mark.klass as klass,

mark.places-rais.tickets as free_places

from punct_route, route, rais, bus, mark

where punct_route.cod_route=route.cod_route and

route.cod_route=rais.cod_route and

rais.bus_id=bus.bus_id and

bus.cod_mark=mark.cod_mark

 

Обратите внимание на то, как в Oracle обозначается операция конкатенации — ||. Преобразование из числового типа в строковый для столбцов hour и minute при этом будет выполнено автоматически.

Если представление создано без ошибок, проверьте выдаваемую им виртуальную таблицу при помощи команды

Select * from punct_rais

Представление на основе нескольких таблиц в Oracle всегда является необновляемым, поэтому кассиры при работе с ним не будут иметь возможности вносить изменения в базу данных. Для изменения одного единственного поля, доступного кассирам, напишем хранимую процедуру с параметрами, которая будет запускаться из приложения при помощи кнопки «Продажа». Хранимые процедуры записываются по правилам языка PL/SQL и хранятся как отдельные объекты базы данных.

Назовем процедуру Sale, ее входными параметрами будут Код рейса (cod_r), Код пункта (cod_p) и необходимое количество билетов (n_ticket), выходными — признак, выполнена ли продажа или нет такого количества мест (err), а также стоимость всех купленных билетов (sum). Примерный текст этой процедуры может иметь вид:

 

Create or replace procedure sale (cod_r rais.cod_rais%type,

cod_p punct.cod_punct%type,

n_ticket number,

err out number, s out number

)

as

free_pl number;

begin

select free_places into free_pl from punct_rais

where cod_punct=cod_p and cod_rais=cod_r;

if n_ticket>free_pl then

err:=1;

else

err:=0;

update rais set tickets=tickets+n_ticket

where cod_rais=cod_r;

select km_price.price*punct.distance*n_ticket into s

from km_price, punct_rais, punct

where km_price.klass=punct_rais.klass and punct_rais.cod_punct=punct.cod_punct

and punct_rais.cod_punct=cod_p and punct_rais.cod_rais=cod_r;

end if;

exception

when TOO_MANY_ROWS then

err:=2;

when NO_DATA_FOUND then

err:=3;

when OTHERS then

err:=4;

end;

Теоретически при правильном функционировании системы исключительные ситуации произойти не должны. Но все-таки раздел exception принято включать в текст хранимой процедуры. Исключение TOO_MANY_ROWS могло бы возникнуть при исполнении запроса на выборку, если бы он возвратил более одной записи, исключение NO_DATA_FOUND — если бы select вообще не возвратил записей, OTHERS — любые другие сбойные ситуации.

Если процедура создана без ошибок компиляции, то ее можно проверить непосредственно в SQL Plus, запустив на выполнение. Для выходных параметров определим две переменные:

var err number

var sum number

Запустить процедуру из SQL Plus можно, например, так:

begin

sale(1,1,3,:err,:sum);

end;

/

Входные параметры обозначают, что мы продаем 3 билета на рейс с кодом 1 до пункта тоже с кодом 1. Если на этот рейс имеется не менее трех свободных мест, то параметр err должен получиться равным 0, а параметр sum должен иметь значение стоимости 3 билетов на тот автобус, который назначен на рейс с кодом 1. Двоеточие перед выходными параметрами обязательно!

Проверить значения переменных в SQL Plus можно просто:

print err

print sum

Проверьте процедуру на различных сочетаниях входных параметров.

Основа серверной части приложения готова. Но окно SQL Plus не закрываем, при разработке клиентской части все запросы, посылаемые на сервер из приложения на Delphi, рекомендуется сначала проверить в SQL Plus. В принципе для этих целей можно использовать и другие средства (SQL Navigator, DataBase Explorer). При желании можно попробовать запустить хранимую процедуру sale из SQL Navigator, чтобы сравнить возможности SQL Plus и SQL Navigator.

 







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.