Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2005.07.18;
Скачать: [xml.tar.bz2];

Вниз

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

 
вп   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.04 c
14-1119507902
ntman
2005-06-23 10:25
2005.07.18
Закачка файла


14-1119606881
хм
2005-06-24 13:54
2005.07.18
486 корпус


1-1119715476
Stas_on
2005-06-25 20:04
2005.07.18
Просмотреть Exe-file


3-1117696945
ike
2005-06-02 11:22
2005.07.18
ADO - Access - Как получить значение сгенеренного ID - counter


14-1119611191
serko
2005-06-24 15:06
2005.07.18
Программное создание TJpegImage и работа с ним!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский