Книга знаний

Инф. технологии / Общие вопросы / Архитектура

Способы подхода к хранению остатков

Рассмотрим основные способы хранения остатков в базе данных, а затем посмотрим, какой из них используется в 1С.Автор статьи:
Последняя редакция №1 от 28.08.06
URL: http://kb.mista.ru/article.php?id=352

Ключевые слова: остатки,СУБД,регистры


Рассмотрим основные способы хранения остатков в базе данных, а затем посмотрим, какой из них используется в 1С.

Формализуем задачу. Пусть есть некоторый набор измерений, и числовых ресурсов по которым могут проходить движения со знаком плюс(приход) или минус(расход).

Например для измерений Склад, Товар есть ресурс Количество.
Нам нужно узнать остаток на любой момент времени.

Всего известно 3 метода хранения остатков. Других пока не придумано.

Во всех SQL-запросах используются:
MotionTable - таблица движений
RestTable - таблица остатков
&Date - дата, на которую нужно получить остатки
BeginOfMonth - функция получения начала месяца из даты
BETWEEN - оператор проверки вхождения даты в интервал А, Б
Все запросы написаны условно, без оператора FROM.

1. Хранение движений, остатки вычисляются


Остатки не хранятся в базе данных.
При необходимости получения остатка на некоторую дату суммируются все движения, произошедшие ранее даты получения остатков.
Достоинства: минимальный объем базы.
Недостатки: низкая скорость чтения остатков.
Степень сложности написания запросов к остаткам: низкая.
Пример SQL запроса:
SELECT Sum(MotionTable.Summ) WHERE MotionTable.Date<&Date

2. Хранение движений и баланса


В каждом движении хранится также и баланс(остаток), который возникает по измерениям после совершения данного движения.
Таким образом остатки получаются чтением одной записи, дата которой максимально близка к дате получения остатков.
Достоинства: максимальный объем базы.
Недостатки: высокая скорость чтения остатков, низкая скорость записи остатков.
Степень сложности написания запросов к остаткам: низкая.
Пример SQL запроса:
SELECT Sum(MotionTable.Summ) WHERE MotionTable.Date=SELECT (Max(MotionTable.Date) WHERE MotionTable.Date<=&Date)

3. Хранение движений и баланса опорных дат


Остатки хранятся обычно в отдельной таблице (хотя возможно и совмещение) и с заданной периодичностью - например, на начало каждого месяца, недели, квартала. П
Остатки получаются путем чтения записи на начало периода и суммированием всех движений за период.
Достоинства: максимальный объем базы.
Недостатки: средняя скорость чтения остатков, средняя скорость записи остатков, высокая степень сложности написания запросов.
Степень сложности написания запросов к остаткам: высокая.
Пример SQL запроса:
SELECT RestTable.Summ+Sum(MotionTable.Summ)  WHERE RestDate.Data=BeginOfMonth(&Date) AND MotionTable.Date BETWEEN (BeginOfMonth(&Date), &Date)



Насчет 1с 77/80 не уверен, поправьте, знатоки, но вроде так:
В 1с версии 77 используется третий метод, где остатки можно было хранить с любой периодичностью - день, неделя, месяц, квартал, год.
В 1с версии 80 используется третий метод, где промежуточные остатки хранятся только на одну дату, обычно близкую к текущей.


Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2025 | Mista.ru

Яндекс.Метрика