Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по Ораклу.doc
Скачиваний:
1
Добавлен:
10.08.2019
Размер:
467.46 Кб
Скачать

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. Нумерация позиций должна начинаться с 1.

  2. Товар должен быть только тот, который есть в прайс-листе.

  3. Цена и количество товара не должны быть отрицательными значениями.

  4. Ставка налога может быть либо 18%, либо 10%.

В правилах заполнения документов может быть оговорено, какую часть документа должен заполнять пользователь, а какие величины должна рассчитывать программа. Например, вспомним, расчёт суммы в строке с товаром или алгоритм расчёта стоимости услуг.

Вот ещё правила. В счёте должна быть хотя бы одна позиция с товаром. Услуги можно выставлять только вместе с товарами.

Все эти требования накладывают определенные ограничения на данные, которые будут храниться в таблицах. Программисту нужно предусмотреть соблюдение этих требований в программе.