AND Flights.AircraftID=Aircrafts.AircraftID
ELSE
SELECT @count=Aircrafts.Count1
FROM Flights,Aircrafts WHERE Flights.FlightID=@flightID
RETURN @count
END
CREATE FUNCTION [dbo].[CountEmptyPlaces2cl]
(
@flightID int
)
RETURNS int
BEGIN
DECLARE @count int;
IF EXISTS (SELECT OrderID FROM Orders WHERE FlightID=@flightID
AND Number2cl>0)
SELECT @count=Aircrafts.Count2
-(SELECT SUM(Number2cl) FROM Orders WHERE FlightID=@flightID)
Для получения информации по рейсам было создано представление FlightView:
CREATE VIEW [dbo].[FlightView] AS
SELECT
FlightID,
DateDeparture,
DateArrival,
dbo.timeFlight(DateArrival,DateDeparture) AS TimeFlight,
CityDepartureID,
CityArrivalID,
DepartureCities.CityName AS CityDeparture,
ArrivalCities.CityName AS CityArrival,
CompanyName,
AircraftModel,
Price1,
Price2,
dbo.CountEmptyPlaces1cl(FlightID) AS EmptyPlace1cl,
dbo.CountEmptyPlaces2cl(FlightID) AS EmptyPlace2cl
FROM dbo.Flights
INNER JOIN dbo.Companies
ON Group0703b.dbo.Flights.CompanyID = Group0703b.dbo.Companies.CompanyID
INNER JOIN Group0703b.dbo.Aircrafts
ON Group0703b.dbo.Flights.AircraftID = Group0703b.dbo.Aircrafts.AircraftID
LEFT OUTER JOIN Group0703b.dbo.Cities AS DepartureCities
ON Group0703b.dbo.Flights.CityDepartureID = DepartureCities.CityID
LEFT OUTER JOIN Group0703b.dbo.Cities AS ArrivalCities
ON Group0703b.dbo.Flights.CityArrivalID = ArrivalCities.CityID
Благодаря созданию перечисленых серверных сущностей мы оптимизируем выполнение данных видов запросов, тем самым получая выигрышь в производительности. Кроме того использование представление, позволяет упростить наисание клиентского приложения, делает запросы более компактными и наглядными.
3.2 Поиск рейсов по определенным критериям
Система позволяет выполнять отбор рейсов с заданными параметрами.
Критериями поиска являются:
- пункт назначения;
- дата (критерий - равенство) и время вылета (критерий - до/после включительно);
- дата (критерий - равенство) и время прибытия (критерий - до/после включительно).
Ни один из критериев не является обязательным для задания при выполнении поиска. Все критерии опциональны. Если ни один из критериев поиска не заполнен, то выводится полный список рейсов.
При задании критерия «дата», время вылета/прибытия может отсутствовать. В случае отсутствия даты, но указания времени выдается ошибка.
Эти критерии учитываются путем добавления необходимых условий к представлению FlightView в секцию WHERE. Формирование и выполнение данного запроса происходит в слое доступа к данным методом SearchFlights().
3.3 Получение списка заказов
Система предоставляет возможность просмотра заказов пользователя на выбранный рейс. В этом случае запрос осуществляется по идентификатору пользователя и рейса.
Если текущий пользователь имеет администраторские права, то он может просмотреть как заказы конкретного пользователя, так и все заказы на определенный рейс. В этом случае запрос осуществляется по идентификатору рейса.
3.4 Заказ билетов на выбранный рейс
После выбора пользователем рейса, имеется возможность заказать определенное количество мест выбранного класса на данный рейс. Количество заказанных билетов вводится пользователем.
Система контролирует, чтобы количество заказанных билетов не превышало количество мест данного класса на рейсе. При количестве свободных мест равном нулю система запрещать бронировать билеты данного класса на данный рейс.
3.5 Удаление заказа
Пользователь может удалить свой заказ. Администратор имеет возможность удалить любой выбранный заказ. Билеты, забронированные данным заказом, переходят в разряд свободных.
Удаление заказа осуществляется посредством хранимой процедуры Delete_Order:
CREATE PROCEDURE [dbo].[Delete_Order]
@orderID int
AS
DELETE FROM Orders WHERE [OrderID]=@orderID
3.6 Добавление рейса
Добавление рейса осуществляется хранимой процедурой Insert_FlightString:
CREATE PROCEDURE [dbo].[Insert_FlightString]
@dateDeparture datetime,
@dateArrival datetime,
@price1 decimal(18,0),
@price2 decimal(18,0),
@company int,
@aircraft int,
@cityDeparture int,
@cityArrival int
INSERT INTO [Flights]
([DateDeparture],[DateArrival],
[Price1],[Price2],
[CompanyID],[AircraftID],
[CityDepartureID],[CityArrivalID])
VALUES (
@dateDeparture,@dateArrival,
@price1,@price2,
@company,@aircraft,
@cityDeparture,@cityArrival)
Перед передачей в неё параметров осуществляется контроль их корректности. В частоности проверяется, чтобы город вылета и прибытия не совпадали. Цены за билеты должны быть положительными числами. Дата прилета должна быть больше даты вылета. Эти условия проверяются на клиентской стороне.
3.7 Редактирование рейса
Обновление информации о рейсе обеспечивается хранимой процедурой Update_FlightString:
CREATE PROCEDURE [dbo].[Update_FlightString]
@FlightID int,
@companyID int,
@aircraftID int,
@cityDepartureID int,
@cityArrivalID int
UPDATE Flights SET
dateDeparture = @dateDeparture,
dateArrival = @dateArrival,
price1 = @price1,
price2 = @price2,
cityDepartureID = @cityDepartureID,
cityArrivalID = @cityArrivalID,
companyID = @companyID,
aircraftID = @aircraftID
WHERE FlightID = @FlightID
При внесении изменений в рейс, на передаваемые параметры накладываются те же ограничении, как и при добавлении рейса.
3.8 Удаление рейса
При удалении рейса срабатывает триггер TR_Flights_Delete:
CREATE TRIGGER [TR_Flights_Delete] ON [dbo].[Flights] INSTEAD OF DELETE
DELETE FROM Orders
WHERE Orders.FlightID= (SELECT top(1) deleted.FlightID FROM deleted)
DELETE FROM Flights
WHERE Flights.FlightID= (SELECT top(1) deleted.FlightID FROM deleted)
RETURN
Так как в базе данных существует связь FK_Orders_Flights между таблицами Flight и Orders, то невозможно удалить рейс, пока есть хотя бы одна заявка на него. Поэтому сначала должны быть удалены все связанные заявки, а уже потом - сам рейс. Эту логику и осуществляет даный триггер.
3.8 Добавление пользователя
При добавлении пользователя применяется хранимая процедура Insert_User:
CREATE PROCEDURE [dbo].[Insert_User]
@login nvarchar(20),
@password nvarchar(20),
@email nvarchar(50)
INSERT Users
(UserLogin, Password, Email)
VALUES
(@login, @password, @email)
3.9 Удаление пользователя
Удаление пользователя осуществляется хранимой процедурой Delete_User:
CREATE PROCEDURE [dbo].[Delete_User]
@UserID int
DELETE FROM Orders WHERE [UserID]=@UserID
DELETE FROM Users WHERE [UserID]=@UserID
Так как существует ограничение FK_Orders_Users, то перед удалением пользователя необходимо удалить все сделанные им заказы.
4. Описание работы приложения
К работе с системой допускаются только зарегистрированные пользователи.
В системе хранится список зарегистрированных пользователей. При входе в систему у пользователя запрашивается имя и пароль, если введенные данные присутствуют в списке, то пользователь допускается к работе с системой. Форма аутентификации приведена на рисунке 3.
Рисунок 3 - Форма аутентификации
Определение роли текущего пользователя происходит следующим образом: существует только один администратор в системе, его логин имеет определенное значение. После успешной проверки регистрационных данных пользователя происходит сравнение логина пользователя с логином администратора, при их равенстве, пользователь считается администратором.
Страницы: 1, 2, 3, 4