- •Глава 1. Анализ предметной области асу «Автосалон» 5
- •Глава 2. Проектирование базы данных для объекта автоматизации автосалон «Lexus» 16
- •Глава 3. Программная реализация бд автосалона «Lexus» 27
- •Введение
- •Глава 1. Анализ предметной области асу «Автосалон»
- •1.1. Анализ объекта автоматизации ооо «Lexus»
- •Информационная модель
- •1.2. Обзор информационных технологий, подходящих для разработки бд
- •1.3. Обзор продуктов аналогов
- •Функциональные возможности:
- •1.4. Требования к разрабатываемой базе данных
- •Глава 2. Проектирование базы данных для объекта автоматизации автосалон «Lexus»
- •2.1. Разработка инфологической модели бд
- •2.2. Обоснование выбора модели данных
- •Сетевая модель
- •Иерархическая модель
- •Объектно-ориентированная модель
- •Реляционная модель
- •2.3. Даталогическое проектирование бд
- •2.4 Нормализация
- •Глава 3. Программная реализация бд автосалона «Lexus»
- •3.1 Анализ и выбор субд
- •3.2. Физическое проектирование бд
- •3.3 Разработка представлений
- •3.4 Разработка отчетов
- •3.5 Реализация ограничений, автоматизация обработки данных в бД
- •3.7. Безопасность и контроль
- •Заключение
- •Список литературы
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 после
