Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
курсовая Автосалон.doc
Скачиваний:
116
Добавлен:
14.02.2023
Размер:
6.14 Mб
Скачать

3.4 Разработка отчетов

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

Создадим отчет, где отобразим всю информацию по покупкам, где будут отображаться имена вместо идентификаторов(Рисунок 21)

Рисунок 21-Отчет покупок

Далее создадим второе отчет, где покажем количество продаж джипов(Рисунок 22)

Рисунок 22- Отчет продаж джипов

Так же создадим представление отображающее покупателей оформивших кредит (Рисунок 23)

Рисунок 23- Кредиты и покупатели

3.5 Реализация ограничений, автоматизация обработки данных в бД

При создании нового клиента в таблице clients создаем проверку, есть ли этот клиент уже в базе данных. Для этого создаем процедуру

CREATE OR REPLACE PROCEDURE public.new_client(

IN newid integer,

IN newfio character,

IN newtel character,

IN newpass character)

LANGUAGE 'plpgsql'

AS $BODY$

DECLARE

rowcount int;

BEGIN

SELECT Count(*) INTO rowcount

FROM clients

WHERE tel = newtel OR pass = newpass;

IF rowcount > 0 THEN

BEGIN

raise notice 'Клиент уже есть в базе данных - никаких действий не предпринято';

RETURN;

END;

END IF;

INSERT INTO clients(id, fio, tel, pass)

VALUES(newid, newfio, newtel, newpass);

raise notice 'Новый клиент успешно добавлен в базу';

END;

$BODY$;

ALTER PROCEDURE public.new_client(integer, character, character, character)

OWNER TO postgres;

Проверка работы процедуры(Рисунок 24)

Рисунок 24- Проверка процедуры new_client

Если в таблицу сделок добавляется новая сделка, тов таблице manager, для определенного менеджера указанного в сделке прибавляется 1 заключенная сделка. Для этого создаем завершающи триггер incl_deals().

CREATE OR REPLACE FUNCTION public.incl_deals()

RETURNS trigger

LANGUAGE 'plpgsql'

COST 100

VOLATILE NOT LEAKPROOF

AS $BODY$

DECLARE

rowcount smallint;

begin

if new.managerid = 1 Then

UPDATE manager

SET incl_deals_num = incl_deals_num + 1

WHERE new.managerid = id;

elseif new.managerid = 2 Then

UPDATE manager

SET incl_deals_num = incl_deals_num + 1

WHERE new.managerid = id;

elseif new.managerid = 3 Then

UPDATE manager

SET incl_deals_num = incl_deals_num + 1

WHERE new.managerid = id;

END IF;

RETURN NULL;

end;

$BODY$;

ALTER FUNCTION public.incl_deals()

OWNER TO postgres;

Проверим роботоспособность триггера, для этого добавим в таблицу сделок новую сделку с участием 2 менеджера(Рисунок 26), и в такой ситуации кол-во сделок заключенных 2 менеджером должно увеличиться(Рисунок 25 и 27)

Рисунок 25- Таблица manager до

Рисунок 26-Добавление сделки

Рисунок 27- Таблица manager после

При изменении ФИО в представлении cheque, автоматически изменяется значение FIO в таблице clients. Для этого создадим замещающий триггер new_name.

create or replace function new_name_rav()

returns trigger as $$

BEGIN

/* Ничего не делаем, кроме случая,

когда обновляется столбец name */

IF new.fio = old.fio THEN

RETURN NULL;

END IF;

UPDATE clients

SET fio = new.fio

WHERE fio = old.fio;

RETURN NULL;

END;

$$ language plpgsql;

CREATE OR REPLACE TRIGGER new_name

INSTEAD OF UPDATE ON cheque

FOR EACH ROW execute procedure new_name_rav();

Проверим роботоспособность триггера. Для этого изменим представление cheque(Рисунок 28) и автоматически изменится таблица clients(Рисунок 29).

Рисунок 28-Изменение представления cheque

Рисунок 29- Таблица

При изменении суммы сделки в таблице deal, автоматически изменяется сумма кредита привязанного в этой сделке(если связь есть). Для этого создаем предварительный триггер.

CREATE OR REPLACE FUNCTION public.creditck_raw()

RETURNS trigger

LANGUAGE 'plpgsql'

COST 100

VOLATILE NOT LEAKPROOF

AS $BODY$

DECLARE

rowcount int;

begin

UPDATE credit

SET cr_amount = new.trams_amount

WHERE new.id = credit.dealid;

return new;

end;

$BODY$;

ALTER FUNCTION public.creditck_raw()

OWNER TO postgres;

Для проверки роботоспособности триггера вносим изменения в таблицу deal(Рисунок 31) в сделку к которой привязано кредитование, Автоматически изменяется сумма кредита привязанного к этой сделке в таблице credit(Рисунок 30 и 32)

Рисунок 30- Таблица credit до

Рисунок 31- Изменение таблицы deal

Рисунок 32- Таблица credit после