Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
БД_ресторан_5семестр.doc
Скачиваний:
0
Добавлен:
23.01.2026
Размер:
1.76 Mб
Скачать
    1. Заполнение таблицы «OrderItems» (Позиции заказа)

Запрос для внесения данных в таблицу:

INSERT INTO rest.OrderItems (OrderID, ItemID, Quantity, UnitPrice)

VALUES

(1, 10, 1, 180),

(2, 2, 1, 300),

(2, 12, 2, 150),

(3, 5, 1, 650),

(3, 6, 2, 200),

(4, 3, 1, 1200),

(5, 4, 2, 350),

(5, 11, 2, 180);

Проверим выполнение запроса (рис. 17).

Рисунок 17. Данные в таблице позиций заказов

    1. Заполнение таблицы «Payments» (Платежи)

Запрос для внесения данных в таблицу:

INSERT INTO rest.Payments (OrderID, PaymentMethod, Amount, TipAmount)

VALUES

(1, 'Наличные', 820, 50),

(2, 'Карта', 600, 40),

(3, 'Карта', 1050, 70),

(4, 'Наличные', 1600, 100),

(5, 'Онлайн', 1060, 60);

Проверим выполнение запроса (рис. 18).

Рисунок 18. Данные в таблице категорий меню

Таблица WaiterTables не заполняется вручную, для нее будет создан триггер автоматического заполнения в следующем разделе.

  1. Разработка объектов промежуточного слоя

    1. Хранимые процедуры

  1. Процедура «CreateOrder» для создания нового заказа

В данной процедуре мы указываем стол, официанта и примечания к заказу. Процедура проверяет первые два параметра и в случае корректного ввода создает заказ с новым номером.

Запрос:

CREATE PROCEDURE rest.CreateOrder

@TableID INT,

@WaiterID INT,

@Notes NVARCHAR(500) = NULL,

@NewOrderID INT OUTPUT

AS

BEGIN

SET NOCOUNT ON;

IF NOT EXISTS (SELECT 1 FROM rest.Tables WHERE TableID = @TableID)

BEGIN

PRINT 'Ошибка: стол не найден.';

RETURN;

END

IF NOT EXISTS (SELECT 1 FROM rest.Staff WHERE StaffID = @WaiterID AND Position = 'Официант')

BEGIN

PRINT 'Ошибка: официант не найден или не имеет должности "Официант".';

RETURN;

END

INSERT INTO rest.Orders (TableID, WaiterID, Status, Notes)

VALUES (@TableID, @WaiterID, 'Принят', @Notes);

SET @NewOrderID = SCOPE_IDENTITY();

PRINT 'Заказ успешно создан. OrderID = ' + CAST(@NewOrderID AS NVARCHAR(10));

END

GO

Примеры использования:

  1. Когда стол указан неверно

Напишем запрос, в котором укажем несуществующий стол (всего у нас пять столов, а мы указываем десятый):

DECLARE @OrderID INT;

EXEC rest.CreateOrder

@TableID = 10,

@WaiterID = 2,

@Notes = 'Без соли',

@NewOrderID = @OrderID OUTPUT;

PRINT 'Создан заказ с ID = ' + CAST(@OrderID AS NVARCHAR(10));

В Messages увидим ошибку выполнения процедуры, так как стол будет не найден (рис. 19).

Рисунок 19. Выполнение ошибочного запроса

  1. Когда официант указан неверно

Теперь укажем существующий стол, но впишем сотрудника, не являющегося официантом:

DECLARE @OrderID INT;

EXEC rest.CreateOrder

@TableID = 1,

@WaiterID = 5,

@Notes = 'Без соли',

@NewOrderID = @OrderID OUTPUT;

PRINT 'Создан заказ с ID = ' + CAST(@OrderID AS NVARCHAR(10));

В Messages увидим ошибку выполнения процедуры, так как сотрудник не существует или не является официантом (рис. 20).

Рисунок 20. Выполнение запроса

  1. Правильный запрос

Напишем запрос, где всё указано корректно:

DECLARE @OrderID INT;

EXEC rest.CreateOrder

@TableID = 1,

@WaiterID = 4,

@Notes = 'Без соли',

@NewOrderID = @OrderID OUTPUT;

PRINT 'Создан заказ с ID = ' + CAST(@OrderID AS NVARCHAR(10));

Запрос успешно выполнен, мы видим новый созданный заказ (рис. 21).

Рисунок 21. Выполнение запроса