- •1. Создадим таблицу для шапки счетов. Вводим команду.
- •Удаление таблицы
- •Подготовка скрипта для создания всех таблиц
- •Р исунок 1. Таблица exdoc с дубликатами.
- •Язык манипулирования данными
- •Команда select
- •Тестовый набор данных
- •Добавление записи в таблицу exdoc
- •Расчёт суммы за товар
- •Расчёт стоимости услуг упаковки
- •4. Можно на калькуляторе сложить все полученные значения и записать в таблицу услуг. Но…
- •5. Рассчитываем сумму услуг упаковки для всех позиций счёта. Отредактируем команду следующим образом.
- •6. Напишем команду, которая запишет рассчитанное значение в таблицу с услугами.
- •Расчёт услуг доставки
- •3. Запишем стоимость доставки в таблицу.
- •Расчёт общих сумм по счёту
- •Типы правил проверки данных
- •Практическая польза от уникальности записей
- •Обязательные для заполнения колонки
- •Дублирование записей
- •Создание первичного ключа
- •Пересоздание таблицы с позициями счетов
- •Добавим проверку значений
- •Правка таблицы с услугами
- •Создание последовательности
- •Начало и завершение транзакции
- •Проверка команды rollback
- •Выполнение команд с ошибками
- •Язык pl/sql
- •Команды программы sql*Plus
3. Запишем стоимость доставки в таблицу.
edit
update exsvc
set cost =
(
select case
when 0 <= v.weight and v.weight < 100 then 1.8
when 100 <= v.weight and v.weight < 200 then 4.7
when 200 <= v.weight then 6
else 0
end as cost
from (
select sum( DECODE( good_n
, 'Банки стеклянные', quant * 0.1
, 'Горшки цветочные', quant * 1.2
, 'Пробка медицинская', ROUND( quant / 10) * 0.85
, 'Грунт для цветов', quant)
) as weight
from expos
) v
)
where service_n like '%доставки%';
Выполняем. Одна строка изменена.
4. Записываем в файл.
save upd_svc2
5. Проверяем.
select * from exsvc;
6. Осталось рассчитать стоимость налога и общую стоимость услуг. Вводим команды.
edit
update exsvc set sum_tax = cost * tax / 100
/
update exsvc set sum_svc = cost + sum_tax
/
7. Записываем в файл.
save upd_svc3
8. Выполняем.
@upd_svc3
9. Проверяем.
select * from exsvc;
Команды UPDATE не содержат конструкции WHERE и они пересчитали суммы сразу по двум записям. Сравним результат с данным в форме учебного примера. Должны совпадать.
Расчёт общих сумм по счёту
Переходим к расчёту общих сумм по документу. В процессе добавления записи в таблицу exdoc, колонки doc_cost, doc_tax, doc_total заполнили значениями из формы счёта. В команду INSERT написали константы. Теперь рассчитаем эти значения, используя данные из таблицы с позициями товаров и таблицы с услугами.
1. Рассчитываем итоги по товарам. Вводим и выполняем команду.
update exdoc
set (total_cost, total_tax, total_doc)=
(
select sum( cost)
, sum( sum_tax)
, sum( sum_pos)
from expos
);
Изменена одна запись.
В этой команде подзапрос изменяет сразу несколько колонок. Они перечислены через запятую и заключены в круглые скобки. Подзапрос тоже содержит три колонки и для каждой используется функция накопительного суммирования SUM.
2. Сохраним команду в файл.
save upd_exdoc1
3. Проверим.
select * from exdoc;
Суммы рассчитаны. Сравним с итогами по товарам в форме счёта из учебного примера.
4. По аналогии пишем команду для расчёта общей стоимости услуг по счёту. Вводим и выполняем команду.
update exdoc
set (total_cost, total_tax, total_doc) =
(
select total_cost + sum( cost)
, total_tax + sum( sum_tax)
, total_doc + sum( sum_svc)
from exsvc
);
Особенность команды в том, что в подзапросе используются значения, которые уже хранятся в таблице exdoc. Это те итоговые суммы за товар, которые рассчитали предыдущей командой UPDATE. Подзапрос рассчитает накопительные суммы по записям в таблице exsvc, добавит их к существующим суммам в таблице exdoc, результат запишет обратно таблицу exdoc.
5. Запишем команду в файл.
save upd_exdoc2
6. Проверим.
select * from exdoc;
Суммы общих итогов совпадают с данными формы из учебного примера.
Скрипт очистки таблиц
Итак. Мы подготовили набор команд для ввода тестового примера. Напишем скрипт для очистки таблиц учебного примера, а затем скрипт для ввода тестового набора данных.
1. Готовим скрипт для удаления данных из таблиц. Открываем текстовый редактор и вводим команды.
edit
delete from exsvc
/
delete from expos
/
delete from exdoc
/
2. Выполняем "/".
3. Записываем в файл.
save del_ex
Скрипт для очистки таблиц готов.
Скрипт загрузки тестового набора данных
4. Готовим скрипт для добавления данных тестового примера. В текстовом редакторе вводим команды SQL*Plus. В процессе работы мы каждую команду записывали в файл. Пусть скрипт последовательно выполняет сохраненные команды.
edit
@ins_exdoc
@ins_expos1
@ins_expos2
@ins_expos3
@ins_expos4
@upd_expos
@ins_exsvc1
@ins_exsvc2
@upd_svc1
@upd_svc2
@upd_svc3
@upd_exdoc1
@upd_exdoc2
5. Сохраним скрипт в файле.
save ins_ex
6. Выполним.
@ins_ex
Скрипт для ввода тестового примера готов.
Скрипт просмотра счетов
7. Готовим скрипт для просмотра таблиц. Перечислим все команды форматирования SQL*Plus. Прочитаем данные из трех таблиц. Обращаю внимание. В команде SELECT используем конструкцию ORDER BY. Она позволяет задать порядок вывода записей.
edit
set linesize 120
col doc_nd for 9999
col address for a36
col customer_n for a16
col pos_no for 99
col good_n for a18
col price for 990.00
col service_n for a16
select * from exdoc order by doc_nd, doc_dd;
select * from expos order by doc_nd, doc_dd, pos_no;
select * from exsvc order by doc_nd, doc_dd, service_n;
8. Запишем скрипт в файл.
save show_ex
Проверим работу скриптов. Удаляем, добавляем, смотрим.
9. @del_ex
10. @ins_ex
11. @show_ex
Теперь знаем
Язык управления данными DML:
INSERT
запись констант
арифметические выражения
значение NULL
DELETE
UPDATE
UPADTE нескольких колонок подзапросом SELECT
SELECT * FROM
SELECT FROM
SELECT FROM (SELECT …)
алиас колонки as
алиас представления
WHERE уcловия с LIKE
ORDER BY
стандартные функции ROUND, DECODE
выражение CASE
функция накопительного суммирование SUM
Команды SQL*Plus:
save с опцией replace
set linesize
column с опицией format
@ - start сокращенно
get
Лекция 7: Проверка вводимых данных.
Правила заполнения формы счёта
Рассмотрим форму счёта в учебном примере. Это типовая форма и её заполнение регламентировано оперативным учетом и правилами документооборота в организации.
В форме есть поля, обязательные для заполнения, а есть поля, которые допускается оставлять пустыми. Например. Поля "Счёт", "Покупатель" должны быть обязательно заполненными. Поле "Адрес доставки" в нашем случае заполнено, но если услуги доставки не требуются, то продавец может оставить поле незаполненным.
Тоже можно сказать и про позиции с товарами. Например. Продавец должен обязательно указать наименование товара, количество, цену и налоговую ставку. Эти значения будут использованы для расчёта стоимости товара, суммы налога и общей суммы по строке. Скорее всего, нельзя указывать отрицательные значения для количества и цены.
Столь очевидные правила заполнения программист может сформулировать самостоятельно. Но есть более специфичные. Как правило, их выдвигают представители заказчика или конечные пользователи. Например, бухгалтерия выдвинула следующие требования по заполнению табличной части счёта:
Нумерация позиций должна начинаться с 1.
Товар должен быть только тот, который есть в прайс-листе.
Цена и количество товара не должны быть отрицательными значениями.
Ставка налога может быть либо 18%, либо 10%.
В правилах заполнения документов может быть оговорено, какую часть документа должен заполнять пользователь, а какие величины должна рассчитывать программа. Например, вспомним, расчёт суммы в строке с товаром или алгоритм расчёта стоимости услуг.
Вот ещё правила. В счёте должна быть хотя бы одна позиция с товаром. Услуги можно выставлять только вместе с товарами.
Все эти требования накладывают определенные ограничения на данные, которые будут храниться в таблицах. Программисту нужно предусмотреть соблюдение этих требований в программе.