Академический Документы
Профессиональный Документы
Культура Документы
2
БАЗА ДАННЫХ............................................................................................................................................................2
ПЕРВИЧНЫЙ КЛЮЧ....................................................................................................................................................4
ВНЕШНИЙ КЛЮЧ........................................................................................................................................................4
ССЫЛОЧНАЯ ЦЕЛОСТНОСТЬ......................................................................................................................................5
РАЗРАБОТКА БАЗ ДАННЫХ И ПРИЛОЖЕНИЙ...............................................................................................................5
ПОСТАНОВКА ЗАДАЧИ..........................................................................................................................................6
ОПИСАНИЕ ПРЕДМЕТНОЙ ОБЛАСТИ...........................................................................................................................6
МОДЕЛЬ ПРЕДМЕТНОЙ ОБЛАСТИ...............................................................................................................................7
ЛОГИЧЕСКАЯ МОДЕЛЬ ДАННЫХ................................................................................................................................9
ФИЗИЧЕСКАЯ МОДЕЛЬ ДАННЫХ..............................................................................................................................10
ОПИСАНИЕ СЕМАНТИКИ ПОЛЕЙ..............................................................................................................................11
ИНТЕРФЕЙС ПРОГРАММЫ........................................................................................................................................12
СРЕДА APEX.............................................................................................................................................................13
ЯЗЫК SQL..................................................................................................................................................................14
ЛАБОРАТОРНАЯ РАБОТА 1. ВЫБОРКИ ИЗ ОДНОЙ ТАБЛИЦЫ.....................................................................................14
ЛАБОРАТОРНАЯ РАБОТА 2. ПОИСК ПО ШАБЛОНУ....................................................................................................16
ЛАБОРАТОРНАЯ РАБОТА 2. СОЕДИНЕНИЕ ТАБЛИЦ..................................................................................................17
ЛАБОРАТОРНАЯ РАБОТА 3. ФУНКЦИИ......................................................................................................................18
ЛАБОРАТОРНАЯ РАБОТА 4. ПОДЗАПРОСЫ...............................................................................................................20
ЛАБОРАТОРНАЯ РАБОТА 5. ГРУППИРОВКИ..............................................................................................................21
ЛАБОРАТОРНАЯ РАБОТА 6. DML-КОМАНДЫ (ОПЕРАЦИИ ИЗМЕНЕНИЯ ДАННЫХ)...................................................22
ЛАБОРАТОРНАЯ РАБОТА 7. ОПЕРАЦИИ С ТАБЛИЦАМИ............................................................................................25
ЛАБОРАТОРНАЯ РАБОТА 8. ЭЛЕМЕНТЫ PL/SQL. ПРОЦЕДУРЫ, ФУНКЦИИ, ТРИГГЕРЫ...........................................28
РАЗРАБОТКА ПРИЛОЖЕНИЙ В СРЕДЕ APEX...............................................................................................33
СОЗДАНИЕ ПРИЛОЖЕНИЯ.........................................................................................................................................33
СОЗДАНИЕ ФОРМЫ...................................................................................................................................................36
ДОБАВЛЕНИЕ ЭЛЕМЕНТА НА СТРАНИЦУ..................................................................................................................37
Лабораторная работа 9...........................................................................................................................................40
Введение и основные определения.
База данных
Любая таблица реляционной базы данных состоит из строк (называемых также записями)
и столбцов (называемых также полями). В данном цикле мы будем использовать обе пары
терминов.
Строки таблицы содержат сведения о представленных в ней фактах (или документах, или
людях, одним словом, — об однотипных объектах). На пересечении столбца и строки
находятся конкретные значения содержащихся в таблице данных.
Пример
Тарифы на горячую и холодную воду
Дата введения Номер Тариф на горячую воду Тариф на холодную воду
01.01.2007 1 1.80 1.10
15.05.2007 2 2.23 1.87
01.11.2007 3 3.40 2.90
01.06.2008 4 5.40 3.20
Абоненты
Лицевой счет Фамилия Имя отчество Адрес
4857894758 Иванов Сергей Викторович Челябинск,
Чичерина 40-12
7867678868 Круглов Андрей Иванович Шершни,
Ленина 12-40
Абоненты
Лицевой счет Фамилия Имя отчество Город(Поселок) Ул. дом Кв.
4857894758 Иванов Сергей Викторович 1 89 40 12
7867678868 Круглов Андрей Иванович 2 34 12 40
Поселки и города
Название Номер
Челябинск 1
Шершни 2
Мельзавод 3
Улицы
Название Номер
Чичерина 89
Ленина 34
Шоссе металлургов 3
Поскольку строки в таблице неупорядочены, нам нужна колонка (или набор из нескольких
колонок) для уникальной идентификации каждой строки. Такая колонка (или набор
колонок) называется первичным ключом (primary key). Первичный ключ любой таблицы
обязан содержать уникальные непустые значения для каждой строки.
Другие определения
Первичный ключ - это атрибут (или группа атрибутов), которые единственным образом
идентифицируют каждую строку в таблице.
Внешний ключ
Один абонент платит за воду как правило каждый месяц. Значит, в таблице оплат будет
присутствовать не одна, а много записей для данного лицевого счета. Эти две таблицы
связаны соотношением один-ко-многим (one-to-many relationship) или соотношением
master-detail (один абонент – много оплат). Подобные соотношения между таблицами
используются наиболее часто. В этом случае таблица, содержащая внешний ключ,
называется detail—таблицей, а таблица, содержащая первичный ключ, определяющий
возможные значения внешнего ключа, называется master-таблицей.
Ссылочная целостность
Первичный ключ любой таблицы должен содержать уникальные непустые значения для
данной таблицы. Это утверждение является одним из правил ссылочной целостности
(referential integrity). Некоторые (но далеко не все) СУБД могут контролировать
уникальность первичных ключей. Если две таблицы связаны соотношением master-detail,
внешний ключ detail-таблицы должен содержать только те значения, которые уже имеются
среди значений первичного ключа master-таблицы
При разработке базы данных обычно выделяется несколько уровней моделирования, при
помощи которых происходит переход от предметной области к конкретной реализации
базы данных средствами конкретной СУБД. Можно выделить следующие уровни:
Предметная область - это часть реального мира, данные о которой мы хотим отразить в
базе данных. Например, в качестве предметной области можно выбрать бухгалтерию
какого-либо предприятия, отдел кадров, банк, магазин и т.д.
Физическая модель данных. На еще более низком уровне находится физическая модель
данных. Физическая модель данных описывает данные средствами конкретной СУБД.
Физическая структура базы данных реализуется в виде таблиц, состоящих из атрибутов и
записей
Постановка задачи.
Описание предметной области
У многих людей в квартирах стоят счетчики горячей и холодной воды.
Счетчики отмеряют потребление воды абонентом в кубометрах.
АО «Теплосети» вводит тарифы на стоимость одного кубометра воды в рублях, отдельно
на горячую и холодную воду.
На данный момент технология расчетов абонентов с АО «теплосети» следующая
Абонент 1 числа каждого месяца снимает показания счетчиков, установленных у него в
квартире.
Звонит по определенному телефону в АО теплосети , называет свой адрес и свои новые
показания счетчиков.
Расчетчик из АО «Теплосети» поднимает информацию по абоненту, находит старые
показания, вписывает новые. Получает объем потребления воды.
Умножает объем на на тариф и получает сумму, которую должен оплатить абонент.
Если у абонента был долг по оплате, то этот долг прибавляется, и в счет вписывается
итоговая сумма.
Абоненту в итоге выставляется счет следующего вида :
Долг вычисляется как разница между тем что было начислено и тем, сколько оплачено.
Формулировка задачи.
Написать программу, которая бы позволила пользователю через Интернет вводить
показания своих счетчиков по холодной и горячей воде, формировать счет для
оплаты и также просмотреть всю историю своих начислений и оплат.
Формирование счета
Декомпозируем этот процесс более подробно
Алгоритм формирования Итоговой суммы
1. Считываем показания счетчиков из последнего начисления
2. Из текущих показаний вычитаем последние, получаем объем потребления
3. Объем потребления умножаем на текущие тарифы - получаем сумму начисления в
рублях
4. Из предыдущей квитанции берем сумму «Всего к оплате»
5. Из таблицы оплат вычисляем, сколько абонент заплатил за текущий период
6. «Всего к оплате» = «Всего к оплате из пред. квитанции» - «оплачено за период» +
Начислено
Печать счета
Вывод счета на принтер при необходимости.
1 N
Оплата
Тарифы
Примечание: первая буква в названии поля обозначает тип данных этого поля
N – NUMBER, D – DATE, C – CHAR (VARCHAR2)
Интерфейс программы
Регистрация в программе пользователя
Среда APEX.
Вход в систему
http://bruteforce.csu.ac.ru:8080/apex/
Примеры
Задания:
1. Вывести список лицевых счетов тех абонентов, у которых нет долга.
2. Вывести список лицевых счетов тех абонентов, которые внесли новые показания
счетчиков 1 мая 2008 года.
3. Вывести список лицевых счетов абонентов, у которых за последний период
израсходовано более 100м3 горячей и 200м3 холодной воды.
4. Вывести список ФИО тех абонентов, у которых нет телефонов и не указано в каких
городах они живут.
5. Вывести список ФИО тех абонентов, которые проживают в собственных домах
(нет номеров квартир).
6. Вывести список ФИО тех абонентов, которые проживают в городе с
идентификатором 21 и на улице с идентификатором 22.
7. Вывести абонентов мужского пола (использовать идентификатор пола равный 1), не
имеющих телефонов
Лабораторная работа 2. Поиск по шаблону.
Пример
Вывести список абонентов, фамилии которых начинаются на букву А.
Задания:
1. Вывести список абонентов с именем Иван.
2. Вывести список улиц, название которых начинается на ОКТ.
3. Вывести список улиц, название которых заканчивается на АЯ
4. Вывести список абоненток с отчествами на АЛЕКС.
5. Вывести список городов начинающихся на МИ.
6. Вывести список городов, названия которых начинаются на Ч и заканчиваются на К.
7. Вывести всех абонентов, проживающих в домах с номерами начинающимися на 25.
8. Вывести всех абонентов и их лицевые счета, у которых фамилия Иванов.
Использование подмножеств.
SELECT column
FROM table
WHERE column IN (va1ue1, value2, …)
Задания:
1. Вывести адреса всех клиентов.
2. Вывести адреса и телефоны клиентов, не указывая остальные данные по самим
клиентам.
3. Вывести список клиентов с указанием пола, полного адреса проживания и
телефона.
4. Вывести список всех клиентов из Челябинска, вносивших больше 500 рублей за
оплату единовременно после 25 июня 2008 года.
5. Вывести все платежи за воду в период с 5 апреля по 30 августа 2008 года. Указать,
кем был совершен платеж.
6. Вывести всех клиентов, фамилия которых начинается на букву «А», имеющих долг
на сентябрь 2008 года.
7. Вывести список клиентов, проживающих в Челябинске и не имеющих долгов по
оплате за сентябрь 2008 года.
8. Найти всех абонентов г. Троицка вывести последнею сумму долга, с указанием
адреса и фамилии
9. Найти абонентов, которые не платили ни разу.
10. Найти абонентов, которые не пользуются горячей водой (все показания по горячей
воде нулевые)
Лабораторная работа 3. Функции.
Пример:
Посчитать количество клиентов, зарегистрированных системой:
Задания:
1. Найти клиента, зарегистрировавшегося первым.
2. Найти клиента, зарегистрировавшегося последним.
3. Найти средний рост потребления воды за февраль 2008 года в сравнении с
предыдущим месяцем.
4. Посчитать сумму долга клиента Александра Иванова за январь, февраль, март и
апрель 2008 года.
5. Найти минимальный и максимальный платеж, принятые системой за все время ее
эксплуатации.
6. Посчитать количество мужчин и количество женщин, пользующихся системой.
7. Посчитать средний расход горячей воды клиентами из Челябинска.
8. Найти сколько всего было недоплачено клиентами из Троицка
9. Сколько мы получим прибыли за последний месяц, если увеличим тариф на 50
копеек? По сравнению со старым тарифом.
10. Сколько мы потеряем денег, если перестанем поставлять воду абонентам, у которых
долг больше 1000?
Лабораторная работа 4. Подзапросы.
Подзапрос применяется тогда, когда для выполнения одного запроса сначала надо
выполнить другой.
Пример:
Вывести список всех клиентов, проживающих в городе, в котором живет самый злостный
неплательщик.
SELECT *
FROM client
WHERE n_city =
(SELECT n_city
FROM client cl, computation com
WHERE com.n_debt=
(SELECT max(n_debt)
FROM computation)
AND com.n_client=cl.n_client)
Задания:
1. Вывести все платежи, с указанием даты и долга на указанную дату самого
злостного неплательщика.
2. Посчитать, сколько в среднем тратит на оплату горячей и холодной воды 10 самых
крупных потребителей холодной воды.
3. Найти улицу, на которой проживает больше всего зарегистрированных в системе
клиентов, и вывести ее название (их может быть несколько).
4. Найти Адреса 10 самых крупных потребителей холодной воды
5. Вывести сумму платежей по месяцам, поступившим после даты самого большого
платежа.
6. Найти адреса людей с максимальной переплатой.
7. Кем и когда был выполнен самый большой платеж?
Лабораторная работа 5. Группировки
Например, команда:
INSERT INTO client (c_first_name, c_last_name,
c_second_name, n_city, n_street, c_house, n_flat, n_phone)
SELECT ‘Иван’, ‘Иванов’, ‘Иванович Бюль-Бюль Оглы’,
city.n_city, street.n_street, ‘129д’, 422, 0
FROM city, street
WHERE city.c_city like ‘ЧЕЛЯБИНСК’
AND street.c_street like ‘КАШИРИНЫХ’;
добавит в таблицу запись о старом админе, прописанном в аудитории 422 в ЧелГУ.
В жизни такой запрос не применяется, т.к. может быть несколько строк,
удовлетворяющих условиям запроса, и тогда зарегистрируется несколько людей.
Задания:
1. Добавить какую-нибудь улицу в справочник. Информация должна соответствовать
общему формату данных.
2. Добавить какой-нибудь город или село в справочник. Информация должна
соответствовать общему формату данных.
3. Добавить новый тариф расчета платежей на дату ровно на месяц раньше самого
первого тарифа.
4. Добавить новый тариф на сегодняшнюю дату (дату вводить не руками).
5. Добавить себя в базу как клиента.
6. Добавить столько записей в таблицу начислений, сколько различных дат в ней есть,
и поставить показатели счетчиков во все записи (использовать среднее значение
показаний за все периоды). В качестве идентификатора клиента использовать
n_client, который система присвоит Вам, как клиенту.
Например, команда:
UPDATE tariff SET n_tariff_hot = 9.99
WHERE n_tariff_hot = 10;
изменит цену 1 кубометра горячей воды с 10 рублей на 9.99 рублей, во всех тарифах,
где он раньше стоил 10 рублей.
Условие WHERE ограничивает число изменяемых строк, так что можно критическим
образом изменить записи во всей таблице, если неправильно указать условие.
exists означает условие что указанный подзапрос возвращает хотя бы одну строку.
Задания:
1. В самый последний тариф закралась ошибка: цена 1 кубометра холодной воды
оказалась на 10% выше. Исправьте ситуацию.
2. Изменить символьное значение пола в таблице sex: «М» заменить на «МУЖ»,
«Ж» заменить на «ЖЕН».
3. Во всех записях таблицы computation, которые относятся к Вам, пересчитать
данные полей n_difference_hot и n_difference_cold по формуле:
новое значение = текущий показатель – показатель прошлого месяца.
4. Изменить стоимость израсходованной горячей и холодной воды в условиях
пункта 3.
Например, команда:
DELETE FROM street WHERE c_street like ‘ЧУГУЕ%’;
удалит из списка улиц все улицы, начинающиеся с «Чугуе».
Часто задаваемый вопрос: как удалить записи из одной таблицы, основываясь на
данных из другой? Ответ: если не использовать EXISTS, то никак.
Например:
DELETE FROM client
WHERE NOT EXISTS
(select payment.n_pay
from payment
where payment.n_client = client.n_client);
Такой запрос используется, чтобы удалять «клиентов-призраков», т.е.
зарегистрированных пользователей, которые не пользовались системой.
Задания:
1. Удалить самый старый тариф.
2. Удалить дублирующиеся записи о клиентах (сначала написать SELECT-запрос,
находящий близнецов, отладить его, а потом использовать в DELETE-команде).
Указания к выполнению.
Клиентов считать одинаковыми если у них совпадает пол и ФИО. для того чтобы удалить
дублирующихся клиентов нужно удалить подчиненные записи на них из других таблиц
Лабораторная работа 7. Операции с таблицами.
CREATE TABLE
Создать таблицу с описанием полей можно командой CREATE TABLE.
Формат вызова:
CREATE TABLE table_name
( column1 datatype null/not null,
column2 datatype null/not null,
...
table_constraints
);
datatype = один из типов данных, специфичных для Oracle (VARCHAR2, CHAR,
NUMBER, DATE и т.д.).
Спецификатор null/not null показывает, может ли поле принимать значение NULL.
Например, команда:
CREATE TABLE CLIENT
(
N_CLIENT NUMBER not null,
C_FIRST_NAME VARCHAR2(100) not null,
C_SECOND_NAME VARCHAR2(100) not null,
C_LAST_NAME VARCHAR2(100) not null,
N_SEX NUMBER,
N_CITY NUMBER,
N_STREET NUMBER,
C_HOUSE VARCHAR2(20),
N_FLAT VARCHAR2(10),
N_PHONE NUMBER(20)
);
создает таблицу клиентов в таком виде, в каком она есть в учебной базе.
Создать таблицу можно на основе уже существующей. При этом копируются все
ограничения и внешние ключи. Синтаксис такого вызова:
CREATE TABLE new_table
AS (SELECT column_1,…, column_n | * FROM old_table);
Создание ограничения.
Ограничение (constraint) служат средствами поддержки целостности. Совершенно
необходимо создавать ограничения на первичный ключ. Ограничения внешнего ключа не
позволяют удалить записи при наличии подчиненных записей в других таблицах.
Ограничения создаются добавлением в вызов CREATE TABLE выражения
CONSTRAINT constraint_name constraint_type
(constraint_column_name);
constraint_name – тип ограничения. PRIMARY KEY – ограничение типа «первичный
ключ». UNIQUE – ограничение типа «уникальное значение».
DROP TABLE
Удалить таблицу можно командой DROP TABLE.
Формат вызова:
DROP TABLE table_name;
Например, команда:
DROP TABLE city;
удалит старый справочник городов.
При наличии ограничений целостности в данной таблице в виде внешних ключей,
данная команда не будет выполнена, поскольку у таблицы city есть подчиненные
записи в таблице client. Для правильного выполнения команды надо
вначале изменить констранты (внешние ключи) в подчиненной
таблице – на новую таблицу, после чего выполнять команду DROP.
Пример.
alter table client
drop constraint <имя констранта>;
ALTER TABLE
Изменить некоторые свойства таблицы можно с помощью команд ALTER TABLE.
Переименование таблицы:
ALTER TABLE table_name RENAME TO new_table_name;
Добавление полей:
ALTER TABLE table_name ADD
(column_1 column-definition,
column_2 column-definition,
...
column_n column_definition
);
Здесь column-definition – тип данных с указанием длины поля.
Пример:
ALTER TABLE client ADD n_mobile_phone number(20);
Удаление полей:
ALTER TABLE table_name DROP COLUMN column_name;
Изменение полей:
ALTER TABLE table_name MODIFY
(column_1 column_type_1 null/not null,
column_2 column_type_2 null/not null,
...
column_n column_type_n null/not null
);
Эта команда приводит поле column_x к типу column_name_x. Если был указан
модификатор null, то после изменения поле не может содержать NULL-значений.
Задание: Только что созданная таблица не имеет счетчика для первичного ключа, т.ч.
любые DML-операции с ней приведут к рассогласованию данных. В последствии будет
изучен механизм триггеров для формирования первичного ключа, однако он будет
использовать последовательность.
Создайте последовательность для новой таблицы. Начать последовательность с числа,
на единицу большего самого большого значения поля n_street (первичного ключа).
Лабораторная работа 8. Элементы PL/SQL. Процедуры,
функции, триггеры.
variable_type это обычно один из трех типов: Number, Date, Varchar2 (числа, даты и
строки). Например:
City varchar2(100); (вторым параметром указывается размерность строки)
Пример:
CREATE OR REPLACE PROCEDURE set_payment_value
IS
hot_cost number;
cold_cost number;
BEGIN
END;
При этом нельзя поместить в переменную за раз больше одного значения. Например, в
указанном примере, если есть несколько разных тарифов с одной максимальной датой, то
запрос вернет несколько строк и сгенерируется исключение (ошибка при попытке
сохранить несколько значений в переменную). Аналогично, если в таблице tariff еще не
заведено ни одного тарифа запрос вернет 0 строк и сгенерируется исключение (не найдено
значений которые можно сохранить в переменную)
Задания:
1. Создать процедуру для вычисления разницы новых и старых показаний.
2. Создать процедуру для вычисления долга.
3. Создать процедуру для вычисления суммы «к оплате».
trigger_event – триггерное событие. Может принимать значение INSERT, UPDATE, DELETE или их
комбинацию через OR. Определяет, какой оператор должен быть применен к таблице для срабатывания
триггера.
Если присутствует ключевая фраза FOR EACH ROW, то триггер выполнится для каждой строки
таблицы. Если нет, то триггер сработает только один раз.
Пример:
create or replace trigger "BI_STREET"
before insert on "STREET"
for each row
begin
select "STREET_SEQ".nextval into :NEW.N_STREET from
dual;
end;
Этот триггер срабатывает до вставки следующей записи в таблицу и заносит в поле
n_street следующее значение последовательности street_seq, формируя первичный ключ
для вставляемой строки. «For each row» означает, что при вставке нескольких строк,
триггер выполнится для каждой строки.
Задания:
1. Для нового справочника городов создать триггер на вставку (формирование
первичного ключа).
2. Для таблицы computation создать триггер, автоматически рассчитывающий поля
n_difference_x при ставке новых записей, а также выполняющий расчет
стоимости по последнему тарифу. Использовать функции и процедуры (тело
триггера не должно содержать DDL-операций). Тариф получить из функции из
предыдущей лабораторной работы.
Указание: 2 задание делается без предиката «for each row» в триггере, поскольку
есть ограничение: для триггера с for each row нельзя делать запросы к самой
изменяющейся таблице (на которую делается триггер).
Дополнительно:
Оператор IF-THEN-ELSE.
IF condition THEN
{...statements...}
[ELSIF condition THEN
{...statements...}]
[ELSE
{...statements...}]
END IF;
Пример:
DECALRE tmp varchar2(2);
BEGIN
select sysdate into tmp from dual;
if to_char(tmp,’MM’)<=’05’ or to_char(tmp,’MM’)>=’09’
then dbms_output.put_line(‘учиться, студент!’);
else dbms_output.put_line(‘расслабься, каникулы!’);
end if;
END;
Попробуйте создать такой запрос. Комментарии излишни.
Цикл с постусловием.
LOOP
statements
[EXIT [WHEN exit_condition] ]
END LOOP;
Выход из цикла осуществляется по команде EXIT или при выполнении условия EXIT
WHEN. Это самый коварный цикл, который может повесить сервер. Пример:
DECLARE
i number;
BEGIN
i:=1;
LOOP
dbms_output.put_line(to_char(i));
i:=i*1.1;
EXIT WHEN i>39;
END LOOP;
END;
Цикл со счетчиком.
FOR loop_counter IN [REVERSE] lowest_number..highest_number
LOOP
statements
END LOOP;
Цикл с предусловием.
WHILE condition
LOOP
statements
END LOOP;
Пример (вывод четных цифр от 1 до 30):
DECLARE
i number;
BEGIN
i:=1;
WHILE (i<50)
LOOP
if mod(i,2)=0 then
dbms_output.put_line(to_char(i));
end if;
i:=i+1;
END LOOP;
END;
Создание приложения
В главном окне (Home) выберите иконку Application Builder.
Потом нажмите кнопку Create>
В следующем окне нажмите кнопку NEXT>
В следующем окне сначала нажмите кнопку ADD PAGE, потом кнопку NEXT>
В следующем окне вы определяете, будет ли приложение с вкладками или без.
Создание формы.
Для измения или добавления элементов в форму, нажмите на иконку с этой формой
(Page1)
Экран дизайнера
Вам потребуются следующие элементы:
Regions – определение регионов страницы, в разном регионе может быть разная
информация, например, в одном – таблица, в другом меню
SELECT *
FROM client
WHERE C_LAST_NAME = :P1_Y
AND N_CLIENT = :P1_X
Лабораторная работа 9.
1. Создать на форме ввода показаний все необходимые элементы, как указано выше.
2. Для расчета и внесения в базу новой квитанции написать хранимые процедуры.
3. Процедуры вызывать как процессы при нажатии на кнопку «Расчет»
4. Самостоятельно сделать просмотр предыдущих начислений как простой отчет.
5. Самостоятельно (очень важно самостоятельно) сделать табуляторную форму для
редактирования информации о клиенте (таблица client) и форму-отчет для просмотра
платежей клиентов (таблица payment).
4. Остальное по умолчание.