![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Создание запроса или ХП как альтернатива временной таблице [D5, D6, FireBird]
вп © (2005-06-06 13:09:00)Вот, все-таки не могу понять, как решить такую задачу без временной таблицы..."*" отмечены ключевые поля. Сама задача - учет начислений и оплаты родительской платы в детском саду... За основу берется цена дня * количествое дней посещений - льготы
Таблица л/с:
CREATE TABLE COUNTERS (
COUNTER_NUMBER INTEGER NOT NULL,* - № л/с
GRP_ID INTEGER NOT NULL,
GRP_REGIM TGROUPREGIM,
NEXT_GRP_ID INTEGER NOT NULL,
NEXT_GRP_REGIM TGROUPREGIM,
FIO TNAMESTR NOT NULL,
LGOTA_ID INTEGER NOT NULL,
NEXT_LGOTA_ID INTEGER NOT NULL,
SALDO_IN TCURRENCY, -вх.остаток
PAY_SUM TCURRENCY, - оплачено
PLATA_SUM TCURRENCY, - оплата 100%
LGOTA_PLATA_SUM TCURRENCY, - сумма по льготе к оплате LAST_DATE DATE,
LGOTA_SUM COMPUTED BY (plata_sum - lgota_plata_sum),-сумма льготы
SALDO_OUT COMPUTED BY (saldo_in + lgota_plata_sum - pay_sum) - исх. остаток
);
Таблица групп
CREATE TABLE GROUPS (
GRP_ID INTEGER NOT NULL,*
GRP_REGIM TGROUPREGIM, - режим (в часах)
GRPTP_ID INTEGER NOT NULL, - тип группы
GRP_NAME TNAMESTR NOT NULL,
GRP_PRICEDAY TCURRENCY, - цена дня
GRP_PRICENEXTDAY TCURRENCY, - цена дня на следующий период
GRP_USE TBOOLEAN,
GRP_PRNT TBOOLEAN
);
Тип группы
CREATE TABLE GROUPSTYPES (
GRPTP_ID INTEGER NOT NULL,*
GRPTP_NAME TNAMESTR NOT NULL
);
Льготы, в %%
CREATE TABLE LGOTA (
LGOTA_ID INTEGER NOT NULL,*
LGOTA_NAME TNAMESTR NOT NULL,
LGOTA_PROC NUMERIC(4,2) default 0 NOT NULL
);
Пачки об оплате
CREATE TABLE PACKS (
PACK_ID INTEGER NOT NULL,*
PACK_NUM INTEGER NOT NULL, - № пачки
PACK_DATE DATE NOT NULL - дата пачки
);
Данные об оплате по пачке
CREATE TABLE PACKSDATA (
ID INTEGER NOT NULL,*
PACK_ID INTEGER NOT NULL,
COUNTER_NUMBER INTEGER NOT NULL, - № л/с
DOC_SUM TCURRENCY - сумма оплаты
);
Табель посещений
CREATE TABLE TABEL (
GRP_ID INTEGER NOT NULL,* - ИД группы
GRP_REGIM TGROUPREGIM,* - Режим группы
COUNTER_NUMBER INTEGER NOT NULL,* - № л/с
KOLVO_DAY SMALLINT NOT NULL - количество дней посещения
);
А это "вредная" временная таблица
CREATE TABLE TMPOB (
GRP_ID INTEGER NOT NULL,* - ИД группы
GRP_REGIM TGROUPREGIM,* - Режим
COUNTER_NUMBER INTEGER NOT NULL,* - № л/с
SALDO_IN TCURRENCY, Вх. осаток
KOLVO_DAY SMALLINT default 0 NOT NULL, -Дни посещения
PAY_SUM TCURRENCY, - Уплачено
LGOTA_SUM TCURRENCY, - Предоставленно льгот, сумма
TOTAL_SUM TCURRENCY, - Всего начисленно
SALDO_OUT COMPUTED BY (saldo_in + total_sum - pay_sum - lgota_sum) - Исходящий остаток
);
В триггерах идет пересчет соответсвующих полей таблицы COUNTERS по данным таблиц PACKSDATA и TABEL
( PAY_SUM TCURRENCY, - оплачено
PLATA_SUM TCURRENCY, - оплата 100%
LGOTA_PLATA_SUM TCURRENCY, - сумма по льготе к оплате LAST_DATE DATE,
LGOTA_SUM COMPUTED BY (plata_sum - lgota_plata_sum),-сумма льготы
SALDO_OUT COMPUTED BY (saldo_in + lgota_plata_sum - pay_sum) - исх. остаток
)
Как видно из таблицы ТАБЕЛЬ, л/с уникальен ТОЛЬКО В ПРЕДЕЛАХ ОДНОЙ ГРУППЫ.. Т.е. л/с может "плавать" по группам.
Нужно получить оборотку из таблиц COUNTERS, PACKSDAAT, TABEL в виде:
Название Группы
№ л/с ФИО %% льготы Вх. остаток Дней Начисленно Льготы Исх
Итого по группе
И так по следующей группе..
Итого по организации
При чем № л/с может появлятся В РАЗЛИЧНЫХ группах.. При этом надо, чтобы вх. и исходящие остатки по ОБОРОТКЕ, соотвествовали (суммарно) таким же данным из таблицы COUNTERS.
Т.е. ИТОГО по ОРГАНИМЗАЦИИ Вх. остаток=SELECT SUM(SALDO_IN) FROM COUNTERS и Исх. остаток=SELECT SUM(SALDO_OUT) FROM COUNTERS
Данные об оплате вводятся д оданных по табелю.. Т.е. мы не знаем, в какую группу ребенок ходил.. Он может вообще не посещать д/с(приболел, или уехал к бабушке в деревню), но родители сделали оплату/предоплату.. А может несколько раз переходить из группы в группу... Если часто мотается - нужно в оборотке показать, что да, такой то был в этой группе, столько дней..Цена дня - такая то.. Должен значит ПО ЭТОЙ ГРУППЕ СТОЛЬКО ТО.. Так - по следующей группе... При ЭТОМ № Л/С НЕ МЕНЯЕТСЯ !!!
stud (2005-06-06 16:48:00) [21]если я правильно понимаю. то по структуре COUNTERS
полностью удовлетворяет твоим потребностям. достаточно сделать по ней сумму с группировкой
stud (2005-06-06 16:45:00) [22]а где у тебя фиксируется факт оплаты?
вп (2005-06-06 16:07:00) [23]
> DSKalugin © (06.06.05 13:59) [1]
> Что такое "л/с"?
Л/С - Лицевой Счет... На счет ваше структуры. Как узнать сумму предоставленных льгот ? Как узнать статистику посещения по группам ? Ребенок В ТЕЧЕНИИ РАСЧЕТНОГО периода может переводится из одной группы в другую, третью... В итоге я должен "выдать на гора" плтежку на сумму, равную: (Вх. остаток по Л/С) + (Начисленно по группе 1 - Льготы по группе 1) + (Начисленно по Группе 2 - Льготы по группе2) +.. В добавок к этому должен выдать оборотку по КАЖДОЙ ГРУППЕ и ИТОГО ПО ОРГАНИЗАЦИИ
> Название Группы
> № л/с ФИО %% льготы Вх. остаток Дней Начисленно Льготы Исх
> Итого по группе
> И так по следующей группе..
> Итого по организации
Т.е. в следствии того, что л/с может "плавать" по разным группам (табеля дают из разных групп, не знаю, кто.. Может, воспитатели :-)). НО опять же, если воспользоваться обьединение, то ПО КАЖДОЙ ГРУППЕ будем иметь ДЛЯ ОДНОГО И ТОГО ЖЕ Л/С, КОТОРЫЙ БЫЛ В ДВИЖЕНИИ ПО РАЗНЫМ ГРУППАМ, ОДИН И ТОТ ЖЕ ВХОДЯЩИЙ ОСТАТОК НЕСКОЛЬКО РАЗ !.. НО ДОЛЖНО БЫТЬ -ОДИН.. Точнее, СУММА должна учитываться ОДИН РАЗ.. ПРИ ЧЕМ НЕ ВАЖНО, ГДЕ БУДЕТ УЧЕТ ВХОДЯЩЕГО ОСТАТКА, А ГДЕ - ОПЛАТЫ... Ведь в итоге все пойдет на одну запись таблицы COUNTERS(ОБОРОТЫ)... Но для оборотки важно, что для этой группы с ценой дня 2,00 было 10 дней посещения для л/с № 100, занчит имеем 2,00 * 10 = 20,00 ... Для следующей: 3,00 и 20 дней = 60,00.. и на л/с № 100 "ляжет" 80,00 на исходящий остаток... Но я в начале месяца заплатил за это л/с 40,00.. значит, они отнимутся от 80,00 и получим 40,00 .. Когда вводим оплаты, мы даже не имем представления, где, в какой группе был ребенок с конкретным Лицевым Счетом.. При чем если ребенок вообще не посещал д/с, его нужно в оборотке показать в группе "Не посещали"..И при этом там может быть оборот по оплате за рпедыдущий период... Как в запросе или ХП можно проанализировать, что такой л/с я уже получил, обнули мне входящий остаток, дабы не было
Группа 1
л/с № 100 вх=10,00
Группа 2
л/с № 100 вх=10,00
Итого по организации 20,00
вместо
Группа 1
л/с № 100 вх=10,00
Группа 2
л/с № 100 вх=0,00
Итого по организации 10,00
DSKalugin (2005-06-06 13:59:00) [24]Что такое "л/с"?
Думаю лучше фиксировать пропуски, а не посещения.
Это менее трудоемко для пользователей.
Каждый месяц в расчетный день(например 1е число) генерировать общий счет в котором будут
----------
фамилии,
группа ,
колво дней в расчетном периоде (общее для всего документа можно в заголовке 1 раз пропечатать)
колво пропусков
колво посещений
цена за день
всего по каждому ребенку
--------
итого в конце
и хранить эту ведомость на ряду с другими такими же в отдельной таблице ведомостей. Каждая будет иметь свой номер.
А временные вообще тут не нужны