powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / начисления за услуги водоснабжения/водоотведения
25 сообщений из 49, страница 1 из 2
начисления за услуги водоснабжения/водоотведения
    #32619727
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ежели есть кто-то, кто занимается такими задачами, был бы рад пообщаться - зашел в тупичок-с, ищу свежих идей.
...
Рейтинг: 0 / 0
начисления за услуги водоснабжения/водоотведения
    #32619755
psj69
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Зашифровался ,земляк !

У меня программа лет семь крутится в двух конторах ( VFP+dbf) по населению
и три года для расчетов с организациями
С организациями- просто : нормы и расход реальный
а вот с населением - мраки :
нормы,льготы ,субсидиии,перерасчеты
...
Рейтинг: 0 / 0
начисления за услуги водоснабжения/водоотведения
    #32619859
Фотография Vladimir M Sklyar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я занимаюсь всей коммуналкой, комплексно

Спецально создали форум, заходите

Hазвание форума: talk.ru.house
Описание: ЖКХ расчеты, алгоритмы, и проблемы при создании ПО
URL: Http://talk.mail.ru/forum/talk.ru.house
...
Рейтинг: 0 / 0
начисления за услуги водоснабжения/водоотведения
    #32619866
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Vladimir M Sklyar. Хорошее дело, форум. Только там всего сотня постов за год. Давайте лучше здесь.
locky. В чем заморочка конкретно?
Ну и тут глянь /topic/104621&pg=-1
...
Рейтинг: 0 / 0
начисления за услуги водоснабжения/водоотведения
    #32619867
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
psj69 а вот с населением - мраки :
нормы,льготы ,субсидиии,перерасчеты
Да, все именно так.
Алгоритм действий примерно таков:
1. Выясняешь на основании каких документов они расчитывают оплату.
2. Внимательно изучаешь их.
3. Идешь к начальнику из этой водоснабжающей организации и выясняешь интересные моменты. Практика показывает, что они всегда находятся (неоднозначности в документах и постановлениях и т.д.). Где он это будет дальше выяснять, в принципе волновать не должно. Важно, чтобы он дал ответ как надо считать.
4. Связываешься с организацией, которая будет компенсировать водоснабжающей организации выпадающий доход. С удивлением узнаешь, что они по-другому рассчитывают начисления. Поэтому и суммы к возмещению у них получаются другие.
5. Идешь к начальнику из этой водоснабжающей организации. Пускай он связывается с организацией из п.4 и урегулирует этот вопрос.
6. После всего этого пишешь процедуру расчета.

Момент касаемый реализации: Пока будут выполняться пункты 1-6 успеют принять пару новых постановлений, которые поменяют порядок учета. Отсюда мораль - процедура расчета должна быть легко модифицируемой, очевидно, отдельно от самой программы. Например, задаваться в виде описания на каком-то своем встроенном языке, в виде хранимой процедуры и т.д. по вкусу.
...
Рейтинг: 0 / 0
начисления за услуги водоснабжения/водоотведения
    #32619870
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Локшин Марк
Правильный подход. Только процедуру лучше писать единую, но со множеством параметров. Кому как нравится. Кому на ХП, кому на сервере приложений.
================
Хотя... Есть и блестящая работа по меняющимся алгоритмам расчета.
/topic/37397
================
Поскольку наши чиновники помнят математику только в объеме 5 классов, то никаких сверх хитрых адгоритмов они придумать не могут
...
Рейтинг: 0 / 0
начисления за услуги водоснабжения/водоотведения
    #32619873
Фотография Vladimir M Sklyar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2Vladimir M Sklyar. Хорошее дело, форум. Только там всего сотня постов за год. Давайте лучше здесь.

Я даже не против. Просто там возникают сообщения когда есть проблемы.

Да и достпуп к sql.ru у меня очень проблемный. NNTP глючит.
...
Рейтинг: 0 / 0
начисления за услуги водоснабжения/водоотведения
    #32619875
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Vladimir M Sklyar. А по-серьезному раскрутить пробовали? Тема-то действительно сложная и актуальная.
...
Рейтинг: 0 / 0
начисления за услуги водоснабжения/водоотведения
    #32619877
Фотография Vladimir M Sklyar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2Vladimir M Sklyar. А по-серьезному раскрутить пробовали? Тема-то действительно сложная и актуальная.

Что раскрутить ?
Чтобы лишний раз не захломлять здесь - вылези в аську (моя есть в профиле)
Заодно о поговорим.
...
Рейтинг: 0 / 0
начисления за услуги водоснабжения/водоотведения
    #32619879
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Vladimir M Sklyar. Я аськой не пользуюсь - дорого. По мылу.
...
Рейтинг: 0 / 0
начисления за услуги водоснабжения/водоотведения
    #32619896
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как здорово что все мы здесь сегодня собрались.. (С) митяев (?)
по существу
в приведенных топиках - пасибо, был, читал, даже кое-где писал.
по поводу - Http://talk.mail.ru/forum/talk.ru.house - обязательно посмотрю, спасибо, не знал о таком, хотя и искал нечто подобное.
Теперь о проблеме.
у меня есть система, занимающаяся расчетами с населением за услуги водоотведения. Начисления, перерасчеты, оплата, задолженность и т.д.
в топике
округление сумм я приводил скелетный вид метода начислений, который я применяю
locky
если допустить, что у нас есть перечень услуг с нормами расход услуги на единицу людей и ценой этой услуги, что все лицевые счета всегда пользуются следующими услугами, то алгоритм начислений выглядит вот так:
Код: plaintext
set nocount on\n /*опорная таблица дат*/ \ndeclare @date table(date datetime primary key)\ndeclare @df datetime,@dt datetime,@d datetime\n /*период начислений*/ \nset @df = \'20000101\' set @dt = \'20000201\'\nset @d = @df while @d < @dt begin insert into @date(date) values(@d) set @d = @d+ 1  end\n /*таблица услуг*/ \ndeclare @service table(id int,df datetime,dt datetime /*период дейтсвия нормы и цены*/ \n,norm float /*норма услуги*/ ,price float /*цена услуги*/  primary key(df,dt,id))\ninsert into @service values ( 1 ,\'19000101\',\'21000101\', 10 , 2 )\ninsert into @service values ( 2 ,\'19000101\',\'21000101\', 5 , 4 )\n /*лицевые счета*/ \ndeclare @accs table(acc int /*номер счета*/ ,Amount int /*к-во проживающих*/ ,df datetime,dt datetime  /*период проживания*/ \nprimary key(acc,df))\ninsert into @accs values( 1 , 2 ,\'20000101\',\'20000115\')\ninsert into @accs values( 1 , 1 ,\'20000116\',\'20000201\')\ninsert into @accs values( 2 , 3 ,\'20000101\',\'20000201\')\n /*проводим начисления*/ \nselect\tAcc,S.ID as Service,D.date,A.Amount,ServiceAmount=S.Norm*A.Amount/(datediff(day,@df,@dt))\nfrom\t@accs a join @date D on A.df <= D.date and D.date <= A.dt\n\tjoin @service S on S.df <= D.date and D.date <= S.Dt\n
на выходе получаем подневный расчет каждой услуги на каждый лицевой счет. просуммировав данные в пределах неизменности параметров получаем собственно начисления.
Аналогичным образом считается льгота, только в качестве услуги используется регистрация льгот, а в качестве опорной суммы - проведенные ранее начисления.
Добавляя по вкусу разные дополнительные таблицы связи (не забывая при этом о периоде наличия связи) между ЛС и услугой, ЛС и графиком подачи воды, ЛС и показаниями счетчика - можно изменять начисленную сумму.

Как видим, применен подход «От услуги», который достаточно хорошо описан в топике Система с изменяющимися алгоритмами расчета. .
Подход «От ЛС» дает значительно более худшие результаты по скорости расчета.
К тому же, в моем подходе есть масса дополнительных преимуществ, типа возможности достаточно просто модифицировать алгоритмы расчета, добавлять туда новые условия и т.д.
А теперь о грустном. Как видно из алгоритма, на выходе получается табличка с промежуточными данными. Объем этой таблички порядка (К-во ЛС)*(К-во услуг на одном ЛС)*(К-во дней в месяце), что для 500000 ЛС с холодной и горячей водой составляет около 3*10^7 строк. По сути своей табличка – временная, но из-за организации пофазовой методики начисления создается как постоянная. Ессно, перед расчетом и после него табличку надо чистить. Это- порядочный кусок времени (14% от общего времени расчета).
В топике выполнить truncate table я также привел несколько побочных проблем, а также то, как я считаю нужным их решать.
Но закрадывается в голову сомнение: а правильно ли я думаю? Может, в консерватории что-то надо менять? Т.е. может быть мне нужно менять архитектуру расчетов?
...
Рейтинг: 0 / 0
начисления за услуги водоснабжения/водоотведения
    #32619902
Фотография Vladimir M Sklyar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чем обусловлен подневный расчет ?
Человеку ведь предьявляеться сумма начисления за месяц в разрезе услуг или может есть какие-то хитрые требования ? (я тоже занялся переработкой своего ПО, может чего упустили)

To: Cat2
Отписал Вам пару писем. На форуме Вы быстрее отвечаате
...
Рейтинг: 0 / 0
начисления за услуги водоснабжения/водоотведения
    #32619909
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подневный расчет вызван следующей причиной: любая из характеристик объектов начислений (к-во проживающих, норма, тариф, категория льготы, к-во льготников) может изменится в любой день. к тому же, в любой день человек может быть покдлючен/отключен к индивидуальному/коллективному счетчику (или и к тому и к другому одновременно). На каждый день есть график с указанием, была или не была горячая/холодная вода.
Далее, как видно из примера расчет провизводится для нескольких счетов одновременно, а в этом случае минимальный период неизменности всех параметров - 1 день.
...
Рейтинг: 0 / 0
начисления за услуги водоснабжения/водоотведения
    #32619967
Фотография Vladimir M Sklyar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я предполагал другие требования для формирования такого подхода к начислению (орг. вопросы, хитрая постановка задачи)

В любом случае какая бы не была таблица с данными о начислениях (суммарная, по дням) ее все равно необходимо будет чистить перед началом процесса начисления.
Была бы возможность отключить логирование данных для опр. таблиц - но увы, MSSQL пока этого вроде не позволяет (может в будущем и сделают). Для меня эта тема тоже открыта.
...
Рейтинг: 0 / 0
начисления за услуги водоснабжения/водоотведения
    #32619973
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Самое главное - не задавай в форуму вопрос, а нельзя ли отключить логгирование.
Популярно объяснять, что с точки зрения теории - это не есть правильно, а значит не есть правильно и с точки зрения практики. А сам ты... в общем, учите матчасть и читайте BOL, маладой человек! :-))
когда то подымался мною вопрос "о ненужных возможностях", мы там чуток покусались.
Причем с точки зрения Sybase, если не ошибаюсь, выключение логгирования - полезная весчь, с точки зрения Informix - тоже (только там есть нескоко ограничений, которые практически на нет сводят преимущества).
Вооот...
дык а подход то возникает из постановки задачи - учет параметров объекта начисления с точностью до 1-го дня.
Не так, чтобы - льгота - на весь месяц, проживающие - тоже, а так чтобы "С-по"...
...
Рейтинг: 0 / 0
начисления за услуги водоснабжения/водоотведения
    #32620933
VadimS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
locky
А теперь о грустном. Как видно из алгоритма, на выходе получается табличка с промежуточными данными. Объем этой таблички порядка (К-во ЛС)*(К-во услуг на одном ЛС)*(К-во дней в месяце), что для 500000 ЛС с холодной и горячей водой составляет около 3*10^7 строк. По сути своей табличка – временная, но из-за организации пофазовой методики начисления создается как постоянная. Ессно, перед расчетом и после него табличку надо чистить. Это- порядочный кусок времени (14% от общего времени расчета).

Зачем же эту таблицу постоянно чистить перед расчетом?
В том же топике Система с изменяющимися алгоритмами расчета. . хорошо описанна технология кэширования, если по данному лицевому расчет уже произведен, то он при расчете уже не участвует. При изменение данных по лицевому (изменени льгот, даты подключения, кол-ва прописанных), удаляются в таблице расчетов только записи по этому лицевому.
Полностью таблица очищается только при закрытие месяца.
...
Рейтинг: 0 / 0
начисления за услуги водоснабжения/водоотведения
    #32620984
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Зачем же эту таблицу постоянно чистить перед расчетом?
Уж больно велик получается размер кэш-таблицы - для 7 лет около 672Gb.
...
Рейтинг: 0 / 0
начисления за услуги водоснабжения/водоотведения
    #32621241
VadimS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VadimSПолностью таблица очищается только при закрытие месяца.


locky>Зачем же эту таблицу постоянно чистить перед расчетом?
Уж больно велик получается размер кэш-таблицы - для 7 лет около 672Gb.
Я так понял, что расчет производится только за текущий месяц+ сторнирование при необходимости за предыдущие (но сумма кидается в текущий). Вот после закрытия расчетного месяца и очищается расчетная таблица.
...
Рейтинг: 0 / 0
начисления за услуги водоснабжения/водоотведения
    #32621421
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Боюсь, что подход с кэшированием, предложенный ASCRUS подходит для задач во первых, с относительно небольшим объемом кэшированных данных, во вторых для задач, в которых в течении текущей работы конечный результат формируется более чем на 70%.
К примеру в той же зарплате каждый табельный номер практически гарантированно будет обработан в отчетном месяце.
В моем случае изменения происходят по 2-5% ЛС в месяц - их я могу положить в кэш. но по всем остальным надо будет затем определить - есть они в кэше или нет, и если их там нет - посчитать. вот это момент "определить есть или нет" - достаточно тяжел. в 95% выгоднее просто посчитать.
Кста, а вообще кто-нибудь еще применяет подобных подход - расчет не ЛС счета по всем услугам а расчет услуги по всем ЛС?
...
Рейтинг: 0 / 0
начисления за услуги водоснабжения/водоотведения
    #32621660
VadimS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TO locky.
У нас тоже расчет за коммунальные услуги. Пока еще крутится задача на
фоксе по DOS. В ней реализовон расчет по лицевым счетам.
Моя задача перевести все это на sqlServer. Естественно нужно переписать все алгоритмы расчета. В методику расчетов пока еще только въезжаю. Но делаю расчет по услугам. Получается примерно как у тебя, с точностью до дня.
А определяю посчитан - или нет лицевой за текущий месяц так:
Есть кэш - состояние лицевого счета за текущий месяц. В нем поле - признак посчитан или нет. При расчете ставится признак - посчитан. При изменени данных по лицевому счету через триггеры удаляю записи в расчетном кэше и в кэше-списке лицевых снимаю признак расчета.
Перед вызовом процедуры расчета, заполняется временная таблица- кого хотят считать: один лицевой, либо какой то жэу, либо всех. Эта таблица сравнивается с кешем-списком лицевых и далее считаются только тех, кто еще не посчитан.
...
Рейтинг: 0 / 0
начисления за услуги водоснабжения/водоотведения
    #32621783
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати, только-только обратил внимание: и в моем варианте с "временным" кэшем, и в варианте ASCRUS с "постоянным" кэшем есть одна и та же операция: очистка части кэша :-( Вот её-то и хочеться избежать.
Наверное, для меня наилучшим выходом всё-же будет разведение расчетов по разным промежуточным таблицам с truncate'ом их в конце расчета. это ко всему прочему повысить конкурентность системы.
...
Рейтинг: 0 / 0
начисления за услуги водоснабжения/водоотведения
    #32621861
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
locky кстати, только-только обратил внимание: и в моем варианте с "временным" кэшем, и в варианте ASCRUS с "постоянным" кэшем есть одна и та же операция: очистка части кэша :-( Вот её-то и хочеться избежать.
Т.е. у вас проблема только в том, что долго удаляются строки из таблицы? Эта операция занимает основную часть времени при расчете?
...
Рейтинг: 0 / 0
начисления за услуги водоснабжения/водоотведения
    #32621897
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Т.е. у вас проблема только в том, что долго удаляются строки из таблицы? Эта операция занимает основную часть времени при расчете?
Ну, не основную часть времени, а, как я уже писал, 14% от времени расчетов.
просто столкнулся с тем что достаточно сложно соптимизировать
Код: plaintext
1.
delete from SomeTable where SomeCondition
при наличии подходящих индексов :-)
Вот и закралось в голову сомнение: может проблема не в этом, а в подходе к расчетам в целом? Может, не следствие надо лечить, а причину? И если причину, то как её лечить?
...
Рейтинг: 0 / 0
начисления за услуги водоснабжения/водоотведения
    #32623317
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу кэшей:
В зп действительно удобно все посчитать, положить, чистить по триггерам только изменившиеся и заново их считать. По коммуналке такое не прокатит по причине больших обьемов. Однако расчеты там идут тоже постоянно, поэтому тут выгоднее получается использовать промежуточные расчетные данные. Можно рассмотреть следующие варианты:
1. Организовать кэш готовности расчетов лицевых счетов. В нем выставляются флаги для тех лицевых счетов, которые были рассчитаны и при изменении входящей информации они сбрасываются. Естественно флаги хранятся для каждого лицевого счета за каждый расчетный месяц. В итоге изменение задним числом приводит к сбросу флагов предыдущих месяцев и уже служит основанием для сторнирования этих месяцев. Думаю обьяснять преимущества не нужно - нет смысла пересчитывать все по предыдущему месяцу из за одного изменившегося задним числом лицевого счета.
2. Организовать расчет и хранение промежуточных данных расчета. Например если рассмотреть коммуналку, то все льготы, субсидии и т.д. в конце концов выливаются в некие коэффициенты, на основе которых и идет расчет. В итоге расчет делиться на 2 этапа: расчет коэффициентов и окончательный расчет. В итоге тоже изменение ставки не затрагивает изменение коэффициентов лицевых счетов и остается только взять уже готовые коэффициенты и пересчитать их по новой ставке или норме потребления.
3. Для тех услуг, которые имеют постоянный обьем потребления можно организовать хранение только точек отклонения. Например пока не изменилась ставка на отопление и условия лицевого счета, то ежемесячно ему выставляется одна и та же сумма. Гораздо выгоднее получается один раз зафиксировать эту сумму по отоплению на ее последнюю дату расчета и пока не произошло изменений условий входящих данных ссылаться на нее, чем каждый раз в БД писать ее на каждый месяц. В итоге имеем уменьшение обьема данных в БД (причем по идее не маленькое), ускорение работы при выполнение запросов и пропуск расчетов по таким услугам для тех лицевых счетов, у которых ничего не поменялось.

Идеи эти конечно сыроваты, я в свое время консультировал одну контору, которая делала ПО под ЖКХ на MSSQL2000, они ими воспользовались, довели до ума, наложили естественно свое видение структуры БД и вроде как сейчас у них расчет 50-100 тысяч лицевых счетов вполне нормальное явление, без лишнего геммора.
...
Рейтинг: 0 / 0
начисления за услуги водоснабжения/водоотведения
    #32623897
VadimS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
< ASCRUS
А можно немного подробнее о 3-е пункте.
Т.е. изначально сделали расчет по всем лицевым. Затем в следующем месяце делаем расчет только у тех, у кого поменялись параметры? А у остальных берем последнее начисление?
...
Рейтинг: 0 / 0
25 сообщений из 49, страница 1 из 2
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / начисления за услуги водоснабжения/водоотведения
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]