Серверная часть приложенияСтр 1 из 2Следующая ⇒
Пояснения Примерный вид формы для продажи билетов показан на рисунке.
Продажа происходит так. Кассир выбирает из списка нужный покупателю пункт назначения, после чего в таблице появляются все рейсы, которыми можно добраться до этого пункта и на которые есть свободные места. В качестве дополнительной справочной информации выводится расстояние до нужного пункта и стоимость одного билета для автобуса первого и второго классов. Двигаясь по таблице рейсов, кассир выбирает нужный рейс. Остановив маркер на нужной записи, кассир вводит требуемое количество билетов и нажимает кнопку «Продажа». При этом должно измениться поле «количество свободных мест» и появиться сообщение, какую сумму нужно заплатить за билеты. Если запрошенное число билетов превышает число свободных мест, выводится сообщение о том, что продажа невозможна. Серверная часть приложения Для удобства разработки клиентской части и для повышения скорости работы всего приложения создадим на сервере представление (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 Все права принадлежат авторам размещенных материалов.
|