|
Подчет наличия или остатков
|
|||
---|---|---|---|
#18+
Я прошу прощения, что тема не совсем относится к Sybase, но СУБД, на которой надо это реализовать ASE. Существует склад, на склад приходит груз(приход) и уходит со склада(расход). Есть документы прихода и расхода. Задача состоит в том чтоб реализовать механизм получения наличия(остатков) на складе на любое время(сейчас, вчера, год назад и.т.д). Сейчас все делается убого, берется весь (все что есть в базе) приход минус весь расход до нужной даты и времени. Я считаю это плохо, так как база растет, и каждый раз шерстить все данные не совсем хорошо. Т.е аналог остатка на счете в банковских системах. Но в банке есть такое понятие "закрытие операционного (оперативного) дня" и там можно в конце каждого дня все подсчитать. У нас все в online, 24 на 7. Можно конечно тоже придумать типа "закрытие рабочей смены", но это потребует дополнительные административные ресурсы, поэтому этот вариант я рассматриваю как запасной (если больше не чего не придумаю, или вы не подскажите). Поделитесь своим опытом в этом вопросе! ЗАРАНЕЕ СПАСИБО!!! ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2008, 19:14 |
|
Подчет наличия или остатков
|
|||
---|---|---|---|
#18+
cherrex_Den пишет: > Существует склад, на склад приходит груз(приход) и уходит со > склада(расход). Есть документы прихода и расхода. Задача состоит в том > чтоб реализовать механизм получения наличия(остатков) на складе на любое > время(сейчас, вчера, год назад и.т.д). Сейчас все делается убого, > берется весь (все что есть в базе) приход минус весь расход до нужной > даты и времени. Я считаю это плохо, так как база растет, и каждый раз > шерстить все данные не совсем хорошо. Тогда веди историю операций. На каждый приход/расход пиши, например, начальное состояние и дельту (или дельту и конечное состояние). Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2008, 19:55 |
|
Подчет наличия или остатков
|
|||
---|---|---|---|
#18+
Я бы предпочел повнимательнее посмотреть на индексы. Если ASE уже 15, то можно включить разрезку таблиц. Это хорошо добавляет производительности. А можно повесить триггер(ы) на таблицы с приходом/расходом и обновлять отдельную табличку типа: Код: plaintext 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2008, 20:02 |
|
Подчет наличия или остатков
|
|||
---|---|---|---|
#18+
Под разрезкой таблицы вы понимаете семантические партиции? Но у нас их нет! ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2008, 20:11 |
|
Подчет наличия или остатков
|
|||
---|---|---|---|
#18+
Спросите лучше в топике по ERP-системам или Разработка информационных систем. Я тоже зашорен банковской спецификой, но насколько я встречал в других форумах, то в бизнесе тоже присутсвует понятие аналогичное банковскому дню, только это период больше чем один день (не то неделя, не то месяц и как-то связан с ребованиями к учету). В любом случае время отсечки какое-то должно быть иначе быть и не может. Why CORBA is DEAD? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2008, 20:14 |
|
Подчет наличия или остатков
|
|||
---|---|---|---|
#18+
cherrex_Den пишет: > Существует склад, на склад приходит груз(приход) и уходит со > склада(расход). Есть документы прихода и расхода. Задача состоит в том > чтоб реализовать механизм получения наличия(остатков) на складе на любое > время(сейчас, вчера, год назад и.т.д). Сейчас все делается убого, > берется весь (все что есть в базе) приход минус весь расход до нужной > даты и времени. Вы будете может быть удивлены, но так делают наверное 80 процентов бухгалтерий и складов. Можно сказать, паттерн. Но только там ещё вводятся промежуточные периоды с начальным и конечным сально, и за базу для прогона прихода и расхода берётся не начало времён, а ближайший закрытый период раньше данной даты. > операционного (оперативного) дня" и там можно в конце каждого дня все > подсчитать. У нас все в online, 24 на 7. И что ? что, в онлайне нельзя закрыть период что ли ? Ну, подождут немного все, ничего, счёт не час закрывается. > Поделитесь своим опытом в этом вопросе! ЗАРАНЕЕ СПАСИБО!!! Вот у нас тот же 24 на 7, ещё и 365 дней в году, и ничего, закрывают периоды, и живут нормально. Это в банковских системах принято закрытие дня делать эксклюзивно блокирующей БД операцией, но это скорее от дурости, чем от реальной надобности. Нужно конечно же что-то блокировать, но не всю БД. Posted via ActualForum NNTP Server 1.4 Модератор: Топик не имеет никакого отношения к специфике ASE, так что я его перенесу завтра в "Разработку информационных систем", если нет возражений. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2008, 22:18 |
|
Подчет наличия или остатков
|
|||
---|---|---|---|
#18+
МодераторМодератор: Топик не имеет никакого отношения к специфике ASE, так что я его перенесу завтра в "Разработку информационных систем", если нет возражений. возражений нет! переносите! Модератор: Тема перенесена из форума "Sybase ASA, ASE, IQ". ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2008, 22:35 |
|
Подчет наличия или остатков
|
|||
---|---|---|---|
#18+
cherrex_Den, +1 к предложению ввести таблицу "остатков за день", предложенному White Owl Рассматривайте это просто как уже вычисленные значения прихода и расхода за предыдущие дни. Что еще надо учесть: если Вам требуется заносить приход и расход не только текущей датой, но и за предыдущие даты, надо предусмотреть пересчет этих "per_day" остатков. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2008, 08:26 |
|
Подчет наличия или остатков
|
|||
---|---|---|---|
#18+
cherrex_DenСейчас все делается убого, берется весь (все что есть в базе) приход минус весь расход до нужной даты и времени. Я считаю это плохо, так как база растет, и каждый раз шерстить все данные не совсем хорошо. Т.е аналог остатка на счете в банковских системах. Но в банке есть такое понятие "закрытие операционного (оперативного) дня" и там можно в конце каждого дня все подсчитать. У нас все в online, 24 на 7. Можно конечно тоже придумать типа "закрытие рабочей смены", но это потребует дополнительные административные ресурсы, поэтому этот вариант я рассматриваю как запасной (если больше не чего не придумаю, или вы не подскажите). Ничего убогого в этом варианте нет, и он используется во многих системах. Да, он требует много ресурсов, и он, конечно, не единственно возможный. Например, в некоторых системах остаток может фиксироваться на каждую единичную операцию движения (как вариант, на отдельную дату). Можно супер быстро находить остаток на любую дату, но возникают ньюансы по разруливанию ввода данных не в хронологическом порядке. То есть, нагрузка на ресурсы смещается с процесса получения остатка, а на процесс ввода данных в систему. Есть система, где по результатам операции движения модифицируется "текущий" остаток. Остаток на дату вычисляется как текущий остаток минус операции, начиная с нужной даты, то есть в обратном порядке. Этот вариант похож на ваш, но дает выигрыш в скорости, если чаще обращаться не за древними остатками, что, в среднем, происходит чаще. Еще в системе с полным пересчетом видел операцию "сжатия" старых остатков. Это когда в результате некой регламентной операции все движение за какой-то из старых периодов группируется по разрезам и сжимается до одной операции. Но это,на мой взгляд, от беса. Понятия "Закрытия банковского дня" в бухучете нет, но есть понятие закрытие финансового периода, который обычно - месяц. Одно НО. В банке никто не даст править вчерашнее движение, а в среднестатистической бухгалтерии очень легко могут залезть и в прошлый месяц, чтобы, например, поменять разрез движения, поэтому "закрытие" может быть очень условным. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2008, 09:35 |
|
Подчет наличия или остатков
|
|||
---|---|---|---|
#18+
авторЗадача состоит в том чтоб реализовать механизм получения наличия(остатков) на складе на любое время(сейчас, вчера, год назад и.т.д). Под временем понимается дата (нужно получить остаток на первое ноября прошлого года) или часы-минуты (нужно получить остаток на два часа дня первого ноября прошлого года)? Остаток на день - это входящий остаток (на утро этого дня) или исходящий (на конец дня)? авторМожно конечно тоже придумать типа "закрытие рабочей смены" Можно. Но это имеет смысл только тогда, когда у вас нет записей задним числом. Если такие есть и проводятся в штатном режиме, тогда надо предусмотреть: а) процедуру пересчет остатков б) блокировку внесения записей задним числом в) процедуру для внесения записей задним числом, после которой должна вызываться процедура (а), вручную или автоматически - как решите. Посчитать остатки можно тоже по разному. Можно при "закрытии дня", можно по требованию. Запросил кто-то остаток на дату - если его нет в базе, посчитали, выдали и одновременно записали. Если у вас периоды в которые нагрузка маленькая - можно job поставить на расчет остатков за вчерашний день. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2008, 10:39 |
|
Подчет наличия или остатков
|
|||
---|---|---|---|
#18+
я пробовал много разных вариантов учёта остатков и в конечном итоге остановился на следующем варианте. т.к. остатки по своей природе могут быть разными, например в ценных бумагах у меня одна операция может менять остатки в различных местах хранения или по нескольким счетам одновременно а в складском учёте - фактические и плановые. и т.д. то остатки я всегда храню в варианте с .. по.. т.е. получается диаграмма изменения остатков во времени. это очень удобно для получения сводных значений на нужную дату всего лишь одним запросом. можно получать различные комбинации. т.к. остатки меняются только в момент совершения операции, то что-либо считать в дальнейшем уже не надо. у нас всегда есть значение на любую дату. + к этому отдельно храним обороты. лишние таблицы приводят к усложнению в сопровождении, но при грамотной реализации они минимальны. в крайнем случае всегда можно провести полный пересчёт статков на основе первоисточника (рееста операций). ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2008, 12:47 |
|
Подчет наличия или остатков
|
|||
---|---|---|---|
#18+
Vladimir_...в крайнем случае всегда можно провести полный пересчёт статков на основе первоисточника (рееста операций). в том числе и в закрытом финансовом периоде что-ли? ))) Одним словом, вся основная нагрузка на систему у вас ложится на момент проведения операции. Почему бы нет. Зато при извлечении остатков все должно летать. Тут нужно выбирать вариант реализации, наверное, в зависимости от того, где актуальнее быстродействие: при извлечении остатков или при их формировании. То, что у автора идет работа в режиме 24х7 еще ни о чем не говорит. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2008, 16:09 |
|
Подчет наличия или остатков
|
|||
---|---|---|---|
#18+
to Coolibin: пересчёт остатков - крайний случай (не все работают в режиме защиты от сбоев) и происходит редко. естественно сделать это может человек с правами работы в архивной дате, предварительно открыв её для операций (и только для себя). как правило проблема существует только в текущем дне, т.к. при закрытии дня есть туева хуча проверок на косистентность. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2008, 17:30 |
|
Подчет наличия или остатков
|
|||
---|---|---|---|
#18+
Спасибо большое за помощь! Я тут на досуге, придумал(верней подсказали) такой способ! Он может строго адаптирован под нашу предметную область, но расскажу, чтоб выслушать вашу критику! У нас есть приходный документ(ПД) и расходный документ(РД). Делаем следуюшее: ПД: дата прихода,наименование,вес груза(приходный), вес груза(списанный). В ПД добавляем еще дату списания, но эта дата всегда максимальная(типа 31.12.9999г) и меняем ее( допустим триггером) на фактическую дату списания только когда произошло полное списание (т.е. "вес приходный" - "вес списанный" = 0). Делаем два индекса: 1. составной по полям "дата прихода" и "дата списания" 2. по "дате списания" Теперь жонглируя этими полями("дата прихода" и "дата списания") можно добиться практически чего угодно! Любые комбинации с интервалами дат....В любом случае работая с индексами мы затрагиваем только те записи которые нам нужны для расчета. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2008, 21:40 |
|
|
start [/forum/moderation_log.php?user_name=lorins]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
143ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
others: | 490ms |
total: | 739ms |
0 / 0 |