Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.07.18;
Скачать: CL | DM;

Вниз

Создание запроса или ХП как альтернатива временной таблице   Найти похожие ветки 

 
вп   (2005-06-06 13:09) [0]

Вот, все-таки не могу понять, как решить такую задачу без временной таблицы..."*" отмечены ключевые поля. Сама задача - учет начислений и оплаты родительской платы в детском саду... За основу берется цена дня * количествое дней посещений - льготы

Таблица л/с:
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

Данные об оплате вводятся д оданных по табелю.. Т.е. мы не знаем, в какую группу ребенок ходил.. Он может вообще не посещать д/с(приболел, или уехал к бабушке в деревню), но родители сделали оплату/предоплату.. А может несколько раз переходить из группы в группу... Если часто мотается - нужно в оборотке показать, что да, такой то был в этой группе, столько дней..Цена дня - такая то.. Должен значит ПО ЭТОЙ ГРУППЕ СТОЛЬКО ТО.. Так - по следующей группе... При ЭТОМ № Л/С НЕ МЕНЯЕТСЯ !!!


 
DSKalugin ©   (2005-06-06 13:59) [1]

Что такое "л/с"?
Думаю лучше фиксировать пропуски, а не посещения.
Это менее трудоемко для пользователей.
Каждый месяц в расчетный день(например 1е число) генерировать общий счет  в котором будут
----------
фамилии,
группа ,
колво дней в расчетном периоде (общее для всего документа можно в заголовке 1 раз пропечатать)
колво пропусков
колво посещений
цена за день
всего по каждому ребенку
--------
итого в конце

и хранить эту ведомость на ряду с другими такими же в отдельной таблице ведомостей. Каждая будет иметь свой номер.
А временные вообще тут не нужны


 
вп   (2005-06-06 16:07) [2]


> 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


 
stud ©   (2005-06-06 16:45) [3]

а где у тебя фиксируется факт оплаты?


 
stud ©   (2005-06-06 16:48) [4]

если я правильно понимаю. то по структуре COUNTERS
полностью удовлетворяет твоим потребностям. достаточно сделать по ней сумму с группировкой


 
вп   (2005-06-06 17:12) [5]

:-) вы путаете грешное с праведным... Да, в COUNTERS ЕСТЬ ВСЕ.. При чем ВСЕ ПРАВИЛЬНО.. НО ! Мне нужна ОБОРОТКА.. Вот такого вида (я начало только записал... Еще нужно не забыть о: ИСХОДЯЩИХ ОСТАТКАХ, СУММЕ ОПЛАТЫ, СУММЕ ПРЕДОСТАВЛЕННЫХ ЛЬГОТ... Если опять же использовать обьединение, то у меня в оборотке будет N - раз встречаться и оплата, и исходлящий остаток)

> Группа 1
> л/с № 100 вх=10,00
> Группа 2
> л/с № 100 вх=10,00
> Итого по организации 20,00
> вместо
> Группа 1
> л/с № 100 вх=10,00
> Группа 2
> л/с № 100 вх=0,00
> Итого по организации 10,00


 
вп   (2005-06-06 17:18) [6]


> stud ©   (06.06.05 16:45) [3]
> а где у тебя фиксируется факт оплаты?

На PACKSDATA висит триггер, который обновляет поле PAY_SUM таблицы COUNTERS


 
stud ©   (2005-06-06 17:49) [7]

т.е.истории платежей у тебя нету? хранится только текущая ситуация?


 
вп   (2005-06-06 18:05) [8]


> stud ©   (06.06.05 17:49) [7]
> т.е.истории платежей у тебя нету? хранится только текущая
> ситуация?

Есть. я ее тут не показал.. После закрытия периода туда все переносится.. Но при чем здесь это ?!. в ТЕКУЩЕЙ(за рабочий период) истории есть: № пачки, Дата пачки, № л/с, сумма оплаты


 
stud ©   (2005-06-07 10:12) [9]


> Когда вводим оплаты, мы даже не имем представления,
> где, в какой группе был ребенок с конкретным Лицевым  
> Счетом..

так на кой расшифровка по группам????
тогда достаточно посчитать сколько родители должны заплатить, сколько заплатили, а ребенка оставить в текущей на данный момент группе и не размазывать его по всем, если очень нужно посещения по группам можно показать отдельно в виде табеля.
в противном случае я так понимаю ты имееш например 10 переходов ребенка по группам и один факт оплаты


 
stud ©   (2005-06-07 10:17) [10]

или несколько фактов оплаты, и по какому принципу их разносить?


 
вп   (2005-06-07 11:05) [11]


> stud ©   (07.06.05 10:12) [9]


> так на кой расшифровка по группам????
> тогда достаточно посчитать сколько родители должны заплатить,
> сколько заплатили, а ребенка оставить в текущей на данный
> момент группе и не размазывать его по всем, если очень нужно
> посещения по группам можно показать отдельно в виде табеля.
> в противном случае я так понимаю ты имееш например 10 переходов
> ребенка по группам и один факт оплаты

:-) А есть такое понятие - бухжокументы.. :-).. "Им положенно быть !.."... Размазывать по группам нужно для контроля.. По оборотке видно, сколько ребенок посещал, цену дня по этой группе, %% льготы...Я так думаю, это нужно для сверки по группам.. В итоге бухгалтерия сверяется с воспитателем группы О НАЧИСЛЕНИИ...
Опять мы отвлеклись.. Я спрашивал, как создать такой запрос или ХП, чтобы она возвращала указанную структуру(набор данных)... но ни в запросе, ни в ХП (я так думаю) нет возможности узнать, выдал я уже данные об этом л/с или нет...


 
ЮЮ ©   (2005-06-07 11:18) [12]

в COUNTERS не должно быть никаких ссылок на группу, для этого есть табель, именно там и отражается "плавание по группам"


 
ЮЮ ©   (2005-06-07 11:21) [13]

А все, что есть во "вредной" таблице можно получить чуть ли не одним запросом


 
Mike Kouzmine ©   (2005-06-07 11:54) [14]

вп   (07.06.05 11:05) [11] Уже сказано. Неправильно сконструирована база. См. stud ©   (07.06.05 10:12) [9], ЮЮ ©   (07.06.05 11:18) [12]


 
stud ©   (2005-06-07 12:05) [15]

кроме того, чтобы не придумывать ничего нового, нужно ЗНАТЬ за какие услуги выписана платежка и произведена оплата. тогда в дальнейшем можно сказать ЧТО И СКОЛЬКО не оплачено а не СКОЛЬКО не оплачено.
и каждый платеж будет связан с конкретными услугами - запускаеш селект с суммированием и наслаждаешся скоростью работы))


 
вп   (2005-06-07 12:57) [16]


> ЮЮ ©   (07.06.05 11:18) [12]
> в COUNTERS не должно быть никаких ссылок на группу, для
> этого есть табель, именно там и отражается "плавание по
> группам"

А как быть с входящим остатком ?


 
stud ©   (2005-06-07 13:06) [17]

сколько человек должен заплатить получается выборкой по табелю (дни *на цену), сколько заплатили выборкой из кустомерс, остальное сложением вычитанием


 
stud ©   (2005-06-07 13:07) [18]

коунтерс


 
Mike Kouzmine ©   (2005-06-07 13:22) [19]

вп   (07.06.05 12:57) [16] Так у тебя при закрытии периода все пишеться. Исходящий остаток и будет входящим для нового периода.


 
Mike Kouzmine ©   (2005-06-07 15:03) [20]

вп   (07.06.05 12:57) [16] Тем более, ты сначала должен открыть период, туда и пишется начальное сальдо.


 
вп   (2005-06-07 15:11) [21]


> 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 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


 
вп   (2005-06-08 09:59) [23]


> 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-08 20:28) [24]

вп   (08.06.05 09:59) [23] Да причем тут хп. Сделай из одной две таблицы. В одной заголовки, в другой движение. И хп не понадобиться.



Страницы: 1 вся ветка

Текущий архив: 2005.07.18;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.039 c
1-1119924813
AndyK
2005-06-28 06:13
2005.07.18
Как узнать имя колонки


8-1108111231
Fenix
2005-02-11 11:40
2005.07.18
Работа с кадрами в AVI


1-1119785199
Igor_thief
2005-06-26 15:26
2005.07.18
Впорос с одного зарубежного форума (copy open file)


11-1103113734
Valet
2004-12-15 15:28
2005.07.18
EditBox не редактируется ручками в W2K SP3 Eng


1-1120241397
FANAT
2005-07-01 22:09
2005.07.18
Фреймы