![]() |
| ||
|
|
Новости |
Поиск |
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
Данные об оплате вводятся д оданных по табелю.. Т.е. мы не знаем, в какую группу ребенок ходил.. Он может вообще не посещать д/с(приболел, или уехал к бабушке в деревню), но родители сделали оплату/предоплату.. А может несколько раз переходить из группы в группу... Если часто мотается - нужно в оборотке показать, что да, такой то был в этой группе, столько дней..Цена дня - такая то.. Должен значит ПО ЭТОЙ ГРУППЕ СТОЛЬКО ТО.. Так - по следующей группе... При ЭТОМ № Л/С НЕ МЕНЯЕТСЯ !!!
Mike Kouzmine (2005-06-08 20:28:00) [1]вп (08.06.05 09:59) [23] Да причем тут хп. Сделай из одной две таблицы. В одной заголовки, в другой движение. И хп не понадобиться.
вп (2005-06-08 09:59:00) [2]
> Mike Kouzmine © (07.06.05 21:53) [22]
> вп (07.06.05 15:11) [21] Так сделай так.
> лс 100
> группа 2 вх=10 20.01.01 25.01.01 расх=5 опл=3 исх=8
> группа 1 вх=8 26.01.01 27.02.01 расх=15 опл=0 исх=-7
> группа 3 вх=-7 01.03.01 20.03.01 расх=30 опл=37 исх=0
А ты сам попробуй такое сделать запросом или ХП... Тем более, если таких л/с - энное количество..У меня винтиков не хватает.. :-)
Mike Kouzmine (2005-06-07 21:53:00) [3]вп (07.06.05 15:11) [21] Так сделай так.
лс 100
группа 2 вх=10 20.01.01 25.01.01 расх=5 опл=3 исх=8
группа 1 вх=8 26.01.01 27.02.01 расх=15 опл=0 исх=-7
группа 3 вх=-7 01.03.01 20.03.01 расх=30 опл=37 исх=0
вп (2005-06-07 15:11:00) [4]
> Mike Kouzmine © (07.06.05 13:22) [19]
> вп (07.06.05 12:57) [16] Так у тебя при закрытии периода
> все пишеться. Исходящий остаток и будет входящим для нового
> периода.
"Ты меня не путай... "(с) Кот Базилио.. :-).. Я о входящем в ОБОРОТКЕ имею ввиду... Вы опять "за рыбу - гроши"... Я пытаюсь добиться, как мне получить оборотку определенного вида...
Чтобы не было при остатке вх. на л/с № 100 = 10,00 так:
Группа 1
л/с № 100 вх=10,00
Группа 2
л/с № 100 вх=10,00
Итого по организации 20,00
вместо
Группа 1
л/с № 100 вх=10,00
Группа 2
л/с № 100 вх=0,00
Итого по организации 10,00
Ведь реально на остатке лежит 10,00, а не 20,00.. Но если обьединить, то получим, что для КАЖДОЙ группы, где мелькал л/с № 100 вх. у него будет = 10,00.. И тогда ФастРепорт так мне правильно и посчитает (он ведь не такой чудак, как я) 10* количество вхождений по всем группам...
Mike Kouzmine (2005-06-07 15:03:00) [5]вп (07.06.05 12:57) [16] Тем более, ты сначала должен открыть период, туда и пишется начальное сальдо.
Mike Kouzmine (2005-06-07 13:22:00) [6]вп (07.06.05 12:57) [16] Так у тебя при закрытии периода все пишеться. Исходящий остаток и будет входящим для нового периода.
stud (2005-06-07 13:07:00) [7]коунтерс
stud (2005-06-07 13:06:00) [8]сколько человек должен заплатить получается выборкой по табелю (дни *на цену), сколько заплатили выборкой из кустомерс, остальное сложением вычитанием
вп (2005-06-07 12:57:00) [9]
> ЮЮ © (07.06.05 11:18) [12]
> в COUNTERS не должно быть никаких ссылок на группу, для
> этого есть табель, именно там и отражается "плавание по
> группам"
А как быть с входящим остатком ?
stud (2005-06-07 12:05:00) [10]кроме того, чтобы не придумывать ничего нового, нужно ЗНАТЬ за какие услуги выписана платежка и произведена оплата. тогда в дальнейшем можно сказать ЧТО И СКОЛЬКО не оплачено а не СКОЛЬКО не оплачено.
и каждый платеж будет связан с конкретными услугами - запускаеш селект с суммированием и наслаждаешся скоростью работы))
Mike Kouzmine (2005-06-07 11:54:00) [11]вп (07.06.05 11:05) [11] Уже сказано. Неправильно сконструирована база. См. stud © (07.06.05 10:12) [9], ЮЮ © (07.06.05 11:18) [12]
ЮЮ (2005-06-07 11:21:00) [12]А все, что есть во "вредной" таблице можно получить чуть ли не одним запросом
ЮЮ (2005-06-07 11:18:00) [13]в COUNTERS не должно быть никаких ссылок на группу, для этого есть табель, именно там и отражается "плавание по группам"
вп (2005-06-07 11:05:00) [14]
> stud © (07.06.05 10:12) [9]
> так на кой расшифровка по группам????
> тогда достаточно посчитать сколько родители должны заплатить,
> сколько заплатили, а ребенка оставить в текущей на данный
> момент группе и не размазывать его по всем, если очень нужно
> посещения по группам можно показать отдельно в виде табеля.
> в противном случае я так понимаю ты имееш например 10 переходов
> ребенка по группам и один факт оплаты
:-) А есть такое понятие - бухжокументы.. :-).. "Им положенно быть !.."... Размазывать по группам нужно для контроля.. По оборотке видно, сколько ребенок посещал, цену дня по этой группе, %% льготы...Я так думаю, это нужно для сверки по группам.. В итоге бухгалтерия сверяется с воспитателем группы О НАЧИСЛЕНИИ...
Опять мы отвлеклись.. Я спрашивал, как создать такой запрос или ХП, чтобы она возвращала указанную структуру(набор данных)... но ни в запросе, ни в ХП (я так думаю) нет возможности узнать, выдал я уже данные об этом л/с или нет...
stud (2005-06-07 10:17:00) [15]или несколько фактов оплаты, и по какому принципу их разносить?
stud (2005-06-07 10:12:00) [16]
> Когда вводим оплаты, мы даже не имем представления,
> где, в какой группе был ребенок с конкретным Лицевым
> Счетом..
так на кой расшифровка по группам????
тогда достаточно посчитать сколько родители должны заплатить, сколько заплатили, а ребенка оставить в текущей на данный момент группе и не размазывать его по всем, если очень нужно посещения по группам можно показать отдельно в виде табеля.
в противном случае я так понимаю ты имееш например 10 переходов ребенка по группам и один факт оплаты
вп (2005-06-06 18:05:00) [17]
> stud © (06.06.05 17:49) [7]
> т.е.истории платежей у тебя нету? хранится только текущая
> ситуация?
Есть. я ее тут не показал.. После закрытия периода туда все переносится.. Но при чем здесь это ?!. в ТЕКУЩЕЙ(за рабочий период) истории есть: № пачки, Дата пачки, № л/с, сумма оплаты
stud (2005-06-06 17:49:00) [18]т.е.истории платежей у тебя нету? хранится только текущая ситуация?
вп (2005-06-06 17:18:00) [19]
> stud © (06.06.05 16:45) [3]
> а где у тебя фиксируется факт оплаты?
На PACKSDATA висит триггер, который обновляет поле PAY_SUM таблицы COUNTERS
вп (2005-06-06 17:12:00) [20]:-) вы путаете грешное с праведным... Да, в COUNTERS ЕСТЬ ВСЕ.. При чем ВСЕ ПРАВИЛЬНО.. НО ! Мне нужна ОБОРОТКА.. Вот такого вида (я начало только записал... Еще нужно не забыть о: ИСХОДЯЩИХ ОСТАТКАХ, СУММЕ ОПЛАТЫ, СУММЕ ПРЕДОСТАВЛЕННЫХ ЛЬГОТ... Если опять же использовать обьединение, то у меня в оборотке будет N - раз встречаться и оплата, и исходлящий остаток)
> Группа 1
> л/с № 100 вх=10,00
> Группа 2
> л/с № 100 вх=10,00
> Итого по организации 20,00
> вместо
> Группа 1
> л/с № 100 вх=10,00
> Группа 2
> л/с № 100 вх=0,00
> Итого по организации 10,00