Партнерка на США и Канаду по недвижимости, выплаты в крипто

  • 30% recurring commission
  • Выплаты в USDT
  • Вывод каждую неделю
  • Комиссия до 5 лет за каждого referral

Например, для таблицы buses триггер события before insert («перед вставкой») имеет вид:

create trigger bus_keys

before insert on buses

for each row

begin

select bus_seq. nextval into :new. cod_bus from dual;

end;

/

Здесь строчка for each row показывает, что триггер будет выполняться каждый раз при вставке новой записи (иначе бы при вставке нескольких строчек одной командой Insert триггер выполнился бы только один раз). Выражение :new представляет собой новую запись, которая после выполнения триггера окажется в таблице buses. Специальная системная таблица dual используется для получения констант в команде Select (нельзя выпустить имя таблицы, т. к. в этом случае нарушится синтаксис команды). Вообще, вместо dual может быть использована любая другая таблица из одной строки.

Триггеры для таблиц models, points, routes и trips пишутся аналогично. Для каждой таблицы создайте последовательности со своими именами.

Ограничения (constraints)

Чтобы предотвратить ввод неверных значений, используются ограничения. В нашем случае необходимо, чтобы значения поля hour таблицы trip лежали между 0 и 23, значения поля minute – между 0 и 59, не повторялись номера автобусов. Для этого можно ввести следующие ограничения:

alter table trips add

constraint r1 check((hour>=0)and(hour<=23));

alter table trips add

constraint r2 check((minute>=0)and(minute<=59));

alter table buses add constraint un1 unique(bus_number);

где r1, r2, un1 – имена ограничений, по которым их можно будет при необходимости удалить.

НЕ нашли? Не то? Что вы ищете?

Попробуйте ввести в таблицу km_prices какие-нибудь значения, используя, например, команды:

Insert into km_prices(class, price) values(1,1.5);

Insert into km_prices(class, price) values(2,1);

а затем вывести данные на экран при помощи запроса:

Select * from km_prices;

Чтобы зафиксировать изменения таблицы km_prices, выполните команду

commit;

Теперь основные объекты базы данных на сервере созданы. С ней уже можно работать, используя команды SQL. Для удобства работы конечных пользователей информационной системы (администратора, кассиров, диспетчера) создадим клиентские приложения.

Имеется много инструментальных средств разработки приложений, содержащих средства доступа к базам данных. Остановимся на среде Delphi.

Лабораторная работа №4

«Создание приложения диспетчера»

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

Предварительные сведения для ознакомления

Этот раздел рекомендуется прочитать перед началом работы, поскольку он содержит основные сведения, которые потребуются для дальнейшей работы.

1. Просмотр и редактирование таблиц с использованием SQL Explorer

Это клиентская утилита, которая устанавливается вместе с Delphi и служит для выполнения различных действий с таблицами и другими объектами баз данных (как альтернатива SQL Plus). Запустить SQL Explorer можно из той же программной группы, что и Delphi, а можно и из самого Delphi.

После запуска Explorer в левом окне вы увидите список псевдонимов различных баз данных. Можно добавлять и удалять псевдонимы из этого списка, и таким образом, обеспечивать возможность работы с базой данных любого формата. Для базы данных Oracle уже сделан и настроен псевдоним Oracle (или другой похожий).

Выберите из списка псевдонимов Oracle (или Orcl) и раскройте его. Появится запрос на ввод имени и пароля. После того, как вы введете свое имя и пароль, вы увидите содержимое своей схемы и сможете просмотреть и отредактировать данные таблиц, а также их структуру.

SQL Explorer можно использовать и для выполнения любых запросов SQL к вашей базе данных, т. е. он может заменить SQL Plus для Oracle. Для этого нужно воспользоваться вкладкой Enter SQL. Введите текст любого запроса (например select * from buses where bus_id=1 - без точки с запятой в конце!) и нажмите кнопку Execute Query (справа). Кстати, все таблицы, последовательности и другие объекты можно было бы создать и из SQL Explorer’а.

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

2. Компоненты Delphi для работы с базами данных.

Имеется несколько способов для связи с базой данных приложения на Delphi. Наиболее часто используемые  — BDE (Borland DataBase Engine) и ADO (ActiveX Data Objects — универсальное средство связи с базой данных из любой среды разработки). Мы будем рассматривать только способ с использованием BDE, при желании использовать ADO необходимые компоненты найдете на одноименной вкладке на палитре компонентов Delphi.

Компоненты для работы с базами данных размещаются на вкладках BDE, Data Access и Data Controls и делятся на невизуальные (вкладки BDE и Data Access) и визуальные (Data Controls). Невизуальные компоненты можно помещать на те же формы, что и визуальные, а можно поместить на отдельную форму, которая называется модулем данных (Data module).

Из невизуальных компонентов вам понадобятся:

1.  Один компонент Database. Он нужен для создания соединения с сервером. Задайте любое имя вашей базы данных (свойство DataBase Name) и установите свойство Alias name (выберите из списка строку соединения Oracle1). Затем установите свойство Connected в True. При этом появится запрос на ввод имя пользователя и пароля. Введите ваше имя и пароль. Если после этого не появится сообщения об ошибке, значит, соединение выполнено успешно.

2.  Для каждой таблицы на форме нужны 2 невизуальных компонента Table и DataSource(это компонент-связка между Table и визуальными компонентами). Для Table нужно установить свойство DatabaseName – это то имя, которое вы задали для компонента DataBase в свойстве DataBase Name, а затем для свойства TableName выбрать из списка нужное имя таблицы, которую вы хотите отобразить на форме. Для Datasorce задается свойство Dataset – это имя таблицы, к которой будет привязан этот DataSource(например, Table1 или другое имя, если вы переопределите свойство Name для Table).

3.  Невизуальные компоненты можно располагать на любой форме приложения, но рекомендуется использовать для этих целей специальную форму, которая называется Модуль данных. Эта форма не будет отображаться при запуске приложения и служит для удобства разработки.

4.  Чтобы все же показать данные таблицы на форме, нужно поместить на нее визуальные компоненты:

·  или DbGrid, чтобы увидеть данные в виде таблицы,

·  или несколько компонентов DBEdit- по одному для каждого поля. Для перемещения по записям удобно использовать компонент DBNavigator.

5.  Увидеть данные можно только после того, как таблица открыта. Для открытия нужно установить свойство Active компонента Table в True. После этого таблица сразу «оживет» и наполнится данными даже на этапе разработки.

6.  Таким образом, простое приложение для отображения и редактирования данных практически не требует написания программного кода. Поместив на формы все необходимые компоненты и установив их свойства, можно запускать приложение для выполнения (клавиша F9).

Разработка клиентского приложения для администратора на Delphi

Приступаем к созданию проекта приложения администратора

1.  Создание модуля данных

Создайте модуль данных. Для этого выполните File/New/DataModule. Поместите на него компонент Database и создайте соединение. Для каждой таблицы поместите в модуль данных Table и DataSource. Подсоедините все Table к своим таблицам, а Datasours’ы к Tabl’ам. Рекомендуем переименовать стандартные имена типа Table1 или DataSource1 в более осмысленные. Далее для обозначения компонентов будут использоваться имена таблиц с приставкой T к Tabl’ам и D к DataSourc’ам (например, Tkm_prices и Dkm_prices).

Можно установить свойства отдельных полей таблиц. Для этих целей в Delphi есть специальная утилита, которая называется Редактор полей. Войти в нее можно, сделав двойной щелчок на Table. Затем в открывшемся редакторе полей выберите опцию “Add all fields”. Перемещаясь по полям в редакторе полей, можно менять их свойства в Object Inspector. Например, для того чтобы поле не отображалось в DBGrid, нужно установить свойство Visible=false; свойство DisplayLabel устанавливает подпись, которая будет появляться над этим полем в DBGrid. Можно запретить редактирование поля, установив ReadOnly в True.

Важно!!! Для того, чтобы обеспечить заполнение ключевых полей таблиц Models, Buses, Points, Routes и Trips при помощи триггеров, которые мы написали для этих таблиц, необходимо в редакторе полей для ключевых полей таблиц установить свойство Required=False (в этом случае заполнение поля в Delphi станет необязательным). По умолчанию для ключевых полей это свойство установлено в True.

Установите свойство Active таблиц в True.

Не забудьте сохранить проект с помощью команды

File/Save Project as… или Save All

Delphi формирует большое количество файлов проекта, поэтому для каждого проекта нужна отдельная папка. Основная программа проекта – это файл с расширением dpr (например, Project1.dpr). Для каждой формы создается отдельный модуль – файл с расширением. pas, а также двоичный файл с расширением. dfm.

2. Основная форма приложения

Наиболее удобна для работы с многотабличными базами данных форма с вкладками. Для удобной работы предлагается создать отдельные вкладки для редактирования расценок (Цены) и списка пунктов назначения (Пункты). Таблицы марок и автобусов можно редактировать совместно как главную и подчиненную таблицы (назовем вкладку Автобусы), таблицы маршрутов, их промежуточных пунктов и рейсов тоже удобно разместить на одной вкладке, поскольку они часто будут редактироваться совместно (назовем вкладку Маршруты-Рейсы).

Для создания вкладок можно воспользоваться компонентом PageControl (вкладка Win32). Установите его свойство Align (выравнивание) в AlClient (т. е. каждая вкладка будет занимать всю клиентскую часть формы). Каждая новая вкладка создается при помощи команды New Page контекстного меню (щелчок правой кнопкой в любом месте PageControl). Создайте 4 вкладки, перечисленные выше.

Чтобы связать форму с модулем данных, выполните команду File/Use Unit (модуль данных будет автоматически вписан в предложение uses раздела implementation основной формы).

3. Вкладки Цены и Пункты

Эти вкладки могут выглядеть примерно одинаково. Поместите на вкладку DBGrid и DBNavigator и установите их свойства DataSource.

Для вкладки Пункты вместо DBGrid поместите на форму 3 DBEdit (в этом случае надо заполнить свойства DataSource и DataField.) для редактирования каждого поля по отдельности. Для перемещения между строками используйте компонент DBNavigator. Для того, чтобы видеть весь список пунктов, можно поместить на форму дополнительно DBGrid.

Запустите приложение и заполните таблицы. Введите несколько названий пунктов так, чтобы из них можно было сформировать 2-3 маршрута.

4. Вкладка Автобусы

Поместим на вкладку 2 компонента DBGrid и два DBNavigator. Одну пару свяжем с Dmodels, а другую с Dbuses.

Подчиним таблицу Buses таблице Models, чтобы видеть только автобусы одной марки, соответствующей активной записи в таблице марок.

Для этого переключимся в модуль данных и установим 2 свойства для таблицы TBuses: MasterSource и MasterField. Эти свойства устанавливают связь с главной таблицей, в качестве которой выбираем таблицу Models (DataSource DModels). В диалоге для задания MasterField указывается поле cod_model, по которому связаны таблицы.

Запустите приложение и заполните таблицы Models и Buses.

4. Вкладка Маршруты-Рейсы

Эта вкладка служит для редактирования и отображения данных трех таблиц: маршруты, пункты-маршруты и рейсы (routes, points-routes, trips).

Сценарий занесения нового маршрута такой – сначала в таблицу Routes заносится имя нового маршрута и ему автоматически присваивается определенный код, затем в таблицу Points_routes заносятся остановки данного маршрута (т. е. пункты, через которые проходит маршрут), затем в таблицу Trips заносятся все рейсы этого маршрута за неделю, при этом на каждый рейс назначается определенный автобус.

Ясно, что пункты, через которые проходит маршрут (остановки автобуса), удобнее выбирать из списка пунктов, чем вводить вручную. В этом случае для удобства ввода используют поля подстановки (LookUp Fields). Создадим такое поле подстановки для таблицы связки Пункты-Маршруты, чтобы выбирать пункты из списка.

Переключимся в модуль данных. Входим в редактор полей (двойной щелчок по TPounts_Routes). Если его окно пустое, выполните Add All Fields из контекстного меню. Для создания поля подстановки выполните New Field. В открывшемся диалоговом окне введите имя поля, его тип (т. е. тип поля, которое будет отображаться в TDBGrid – String), размер (по умолчанию используется 20). Свойство ‘Field type’ установите в ‘Lookup.

Из списка ‘Dataset выберите таблицу Points,

из списка Result Field выберите поле, которое будет отображаться в списке (название пункта name_point),

из списка Lookup Keys выберите поле, значения которого будут действительно использоваться при подстановке (поле cod_point),

из списка Key Fields – поле, куда будет заноситься выбранное значение (тоже cod_point, но уже таблицы Points_Routes).

Создайте самостоятельно еще одно поле подстановки для таблицы Trips, которое позволит назначать автобус на рейс, выбирая его из списка номеров автобусов. При создании этого поля возникнет такая проблема: таблица Buses, в которой хранятся номера автобусов, подчинена таблице Models. Все таблицы открыты при работе приложения, поэтому в таблице Buses будут отображаться только строки, связанные с какой-то одной маркой. В таком случае для обслуживания поля подстановки создается дополнительный Table для таблицы Buses (например, назовем его TBuses1). Datasource к нему не нужен. TBuses1 выберите в качестве DataSet при создании поля подстановки.

В остальном создание вкладки аналогично созданию вкладки Автобусы. С главной таблицей Routes (маршруты) связываем две подчиненных  — Points_Routes (пункты, через которые проходит маршрут) и Trips (все рейсы этого маршрута за неделю). Связь устанавливаем с помощью свойств Master Source и Master Field. Для заполнения таблицы маршрутов удобнее использовать компоненты DBEdit, чтобы видеть на форме название и код только одного маршрута.

Запустите приложение и введите не менее двух маршрутов с несколькими остановками и несколькими рейсами.

Остался последний штрих. Таблице Buses в приложении соответствует два компонента Table. При работе с вкладкой Автобусы обновляется только один из них (TBuses), который связан с соответствующим DBGrid. Для того, чтобы изменения в автобусном парке немедленно отображались в списке автобусов, которые назначаются на рейсы, достаточно своевременно обновлять компонент TBuses1. Например (как один из вариантов), можно написать такой обработчик события OnEnter (на вход) для страницы Маршруты-Рейсы компонента PageControl (этой странице соответствует компонент TabSheet4 – 4 страница).

procedure TForm1.TabSheet4Enter(Sender: TObject);

begin

datamodule2.Tbuses1.Refresh;//обновить Table Tbuses1

end;

Приложение готово. Ведите 2-3 маршрута, для каждого несколько остановок и несколько рейсов в разные дни недели и разные часы.

Лабораторная работа №5

«Создание приложения кассира»

Цель работы: научиться создавать представления и хранимые процедуры в базе данных, работать с ними в клиентском приложении, научиться посылать запросы к серверу из клиентского приложения.

Пояснения

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

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

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

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

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

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

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

Назовем представление points_trips (пункты-рейсы).

Create view points_trips

as

select points_routes. cod_point as cod_point,

trips. cod_trip as cod_trip,

routes. name_route as name_route,

trips. week_day as week_day,

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

models. class as class,

models. places - trips. tickets as free_places

from points_routes, routes, trips, buses, models

where points_routes. cod_route=routes. cod_route and

routes. cod_route= trips. cod_route and

trips. cod_bus=buses. cod_bus and

buses. cod_model=models. cod_model

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

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

Select * from points_ trips

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

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

Create or replace procedure sale (cod_r trips. cod_trip%type,

cod_p points. cod_point%type,

n_ticket number,

err out number, s out number

)

as

free_pl number;

begin

select free_places into free_pl from points_trips

where cod_point=cod_p and cod_trip=cod_r;

if n_ticket>free_pl then

err:=1;

else

err:=0;

update trips set tickets=tickets+n_ticket

where cod_trip=cod_r;

select km_prices. price*points. distance*n_ticket into s

from km_prices, points_trips, points

where km_prices. class=points_trips. class and

points_trips. cod_point=points. cod_point and

points_trips. cod_point=cod_p and points_trips. cod_trip=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 s number

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

begin

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

end;

/

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

Двоеточие перед выходными параметрами обязательно! Это признак того, что мы используем переменные.

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

print err

print s

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

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

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

Клиентская часть приложения

Это отдельный проект Delphi, для которого нужно создать свою папку.

Модуль данных. Компонент DataBase настраиваем как обычно. Для поддержки списка пунктов необходим компонент Table, связанный с таблицей Points (Tpoints), и DataSource (Dpoints), настроенный на этот Table. Остальные невизуальные компоненты будем создавать по мере их надобности.

Основная форма приложения. Для выбора пункта назначения можно использовать компонент DBLookupComboBox. Это раскрывающийся список на основе какой-либо таблицы или представления. Установите его свойство ListSource равным DPoints , свойство ListField равным имени поля Name_point, свойство KeyField - имени cod_point.. Список будет показывать названия всех пунктов, при этом выбираться будут коды пунктов.

Для того, чтобы показать на форме расстояние до выбранного пункта, можно воспользоваться стандартными компонентами Label (допустим, мы дали метке имя Label_dictance). Тогда можно написать простой обработчик события OnClick для списка DBLookupComboBox.:

procedure TForm1.DBLookupComboBox1Click(Sender: TObject);

begin

Label_distance. caption:=DataModule2.Tpoints. FieldByName('distance').asstring;

end;

Функция FieldByName позволяет получить значение заданного поля для текущей записи (строки) Table. При движении по списку текущая запись изменяется автоматически, поэтому в момент наступления события OnClick текущей является выбранная запись. Свойство AsString обозначает преобразование значения поля к типу string.

Запустите приложение и убедитесь, что список работает правильно и в метке показывается правильное расстояние.

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

Можно было бы назначить для него компонент Table и воспользоваться уже известным приемом с установкой свойств MasterSource и MasterField на таблицу пунктов, но нам нужны не все рейсы, а только те, на которые есть билеты. Из этого положения тоже можно найти выход, воспользовавшись свойством Filter (фильтр).

Все же лучшим способом кажется явный запрос на выборку по представлению points_trips, параметром которого является код пункта. Стандартное средство обозначения параметра запроса — двоеточие перед его именем. Текст запроса будет выглядеть так:

select * from points_trips

where cod_point=:cod_point

and free_places>0

Проверьте запрос в SQL Plus, подставив вместо параметра конкретные значения cod_point.

Для выполнения запросов и отображения результатов запросов на выборку в Delphi существует специальный компонент Query. Он очень похож на Table (у них общий предок DataSet), но у Query отсутствует свойство TableName, зато есть основное свойство SQL, которое должно содержать текст запроса на языке SQL (без ; на конце!).

Поместите в модуль данных компоненты Query (назовем его Qpoints_trips), DataSource, а на форму — DbGrid, свяжите их друг с другом. В свойство SQL для Qpoints_trips поместите текст отлаженного запроса на выборку рейсов. Не забудьте устанавливать для компонента Query свойство DataBaseName, как вы это делали для компонентов Table. Для Query, как и для Table, имеется редактор полей. Установите для служебных полей видимость false, для остальных полей displaylabel.

Задать значение для параметра запроса в Delphi можно разными способами, например, у Query есть свойство ParamByName (имя параметра), которому можно присвоить выбранный из списка код пункта. Но есть совсем простой способ.

Установите свойство DataSource объекта Qpoints_trips равным dpoints (DataSource, соответствующий таблице points). При этом параметр cod_point запроса будет получать значение поля cod_point таблицы points, и запрос будет автоматически обновляться при смене текущего пункта назначения. Таким способом можно воспользоваться, только если у запроса всего один параметр. Для того, чтобы запрос активизировался первый раз при первом выборе пункта из списка, не устанавливайте его свойство Active=True на этапе разработки. Лучше добавьте в обработчик OnClick списка такую строку:

Qpoints_trips. Active:=true;// или Qpoints_trips. open;

Запустите приложение и убедитесь, что запрос работает правильно. Осталось оформить продажу билетов, для чего запустить на сервере хранимую процедуру.

Для вызова хранимых процедур и функций есть еще один компонент - StoredProc. Его основное свойство - StoredProcName – имя хранимой процедуры, а основной метод – ExecProc — запуск хранимой процедуры.

Чтобы воспользоваться этой функцией в нашем приложении, потребуется объект TStoredProc. Установите его свойство DatabaseName равным псевдониму базы данных, свойство StoredProcName – равным имени хранимой процедуры (Sale).

Найдите свойство Params и в диалоговом окне установите типы всех параметров, кроме s, в Integer.

Поместите на форму компонент TEdit, куда будет вводиться требуемое число билетов. На событие OnClick кнопки “Продажа” поместите обработчик, который задаст значения входных параметров хранимой процедуры, запустит эту процедуру и обработает ее выходные параметры err и s.

Текст процедуры-обработчика, например, такой:

procedure TForm1.Button1Click(Sender: TObject);

var err:integer; sum:double;

begin

StoredProc1.ParamByName('cod_r').AsInteger:=

Qpunct_rais. FieldByName('cod_trip').AsInteger;

StoredProc1.ParamByName('cod_p').AsInteger:=

Qpunct_rais. FieldByName('cod_point').AsInteger;

StoredProc1.ParamByName('n_ticket').AsInteger:=

strtoint(edit1.Text);

StoredProc1.ExecProc;

err:=StoredProc1.ParamByName('err').AsInteger;

if err>0 then

ShowMessage('Нет такого количества билетов')

else

begin

sum:=StoredProc1.ParamByName('s').AsFloat;

ShowMessage('Сумма: '+floattostr(sum));

end;

end;

Запустите приложение и протестируйте.

Лабораторная работа №6

«Создание приложения диспетчера»

Цель работы: закрепить навыки, полученные при выполнении предыдущих работ.

Обязанность диспетчера — отправлять рейсы, обнуляя при этом поле «Количество билетов». В простейшем случае основная форма приложения может иметь вид:

В таблице отображаются только рейсы на текущий день недели (на рисунке приложение было запущено в субботу), причем в порядке возрастания их времени отправления, чтобы диспетчеру было удобнее перемещаться по рейсам. Кнопка «Отправить» вызывает запрос на обнуление количества билетов в таблице Рейсы (или хранимую процедуру, аналогичную процедуре sale).

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

Для того, чтобы получить в Delphi номер дня недели, соответствующий текущей дате, используйте, например, функции dayoftheweek(date), где date возвращает текущую дату. Эти функции находятся в модуле dateutils (впишите это имя во фразу uses модуля формы).

Для открытия запроса на выборку используется метод Open (или Active=true). Если эти действия поместить в обработчик OnCreate формы, то при открытии приложения все необходимые данные будут отображены.

Теперь осталось написать обработчик на кнопку «Отправить». Для этого следует сначала отладить запрос на обновление или хранимую процедуру (параметром должен быть код рейса).

Для выполнения запроса на обновление в Delphi используется компонент Query и его метод ExecSQL. Если вы написали хранимую процедуру, то используйте компонент StoredProc и его иетод ExecProc.

Лабораторная работа №7

«Совершенствование приложения кассира»

Цель работы: получение навыков самостоятельной разработки элементов приложений баз данных

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

Возможны следующие предложения по улучшению интерфейса:

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

2.  В поле, где вводится количество билетов, должна быть исключена возможность для введения нечисловых данных. Возможно, есть смысл использовать спинер, в котором ограничить максимально возможное количество билетов.

3.  После выполнения продажи количество свободных мест на данный рейс в таблице должно немедленно измениться.

Добавление функциональности:

Добавьте на форму приложения кассира кнопку «Возврат билетов», для этого предварительно напишите и отладьте соответствующий запрос на обновление.

Лабораторная работа №8

«Запросы к базе данных Автовокзал»

Цель работы: доведение до автоматизма навыков разработки SQL-запросов на выборку, умения отлаживать запросы

Для автоматической проверки запросов будет использована проверяющая система кафедры АВТ.

Запросы к базе данных “Автовокзал”

1.  Названия всех пунктов, расстояние до которых не более 20 км, в алфавитном порядке.

2.  Номера всех автобусов марки Икарус в лексикограическом порядке

3.  Названия всех пунктов маршрута Вологда-Череповец в порядке следования.

4.  Названия всех маршрутов, которые проходят через Шексну, в алфавитном порядке

5.  Время отправления всех рейсов по маршруту Вологда-Череповец в понедельник по возрастанию

6.  Названия всех пунктов, которые начинаются с буквы А в алфавитном порядке

7.  Названия всех пунктов, которые состоят из пяти букв в алфавитном порядке

8.  Названия всех пунктов, в которых есть хотя бы одна буква О в алфавитном порядке

9.  Номера всех автобусов, которые задействованы в выходные дни (суббота и воскресенье) в лексикографическом порядке

10.  Коды рейсов с указанием маршрутов и времени отправления в воскресенье до 12 часов, в порядке возрастания времени

11.  Названия и коды всех маршрутов, которые проходят через Сокол, в алфавитном порядке

12.  Время отправления всех рейсов в понедельник, которые проходят через Сокол (с указанием названий маршрутов) в порядке возрастания времени

13.  Сколько свободных мест имеется на рейс с конкретным кодом (возьмите любой рейс, который у вас есть)

14.  Цена билета на рейс с конкретным кодом (возьмите любой рейс, который у вас есть)

15.  Количество автобусов марки Икарус.

16.  Количество автобусов 1 класса.

17.  Общее количество маршрутов

18.  Общее количество рейсов в неделю

19.  Общее количество рейсов в понедельник

20.  Общее количество рейсов в неделю по определенному маршруту (например, Вологда-Череповец)

21.  Количество пунктов, расстояние до которых не более 20 км.

22.  Количество пунктов, которые начинаются с буквы А

23.  Количество пунктов, названия которых состоят из пяти букв

24.  Кол-во пунктов, в названии которых есть хотя бы одна буква О

25.  Количество рейсов в понедельник по маршруту Вологда-Череповец

26.  Общее количество рейсов в понедельник между 9 и 10 часами

27.  Количество автобусов вместимостью более 40 мест

28.  Общее количество рейсов в выходные дни (суббота и воскресенье)

29.  Количество рейсов, которые проходят через Сокол в понедельник.

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3