Re: Подсчет остатков
От: EXELENS Россия  
Дата: 12.10.04 14:37
Оценка:
Здравствуйте, Fox007,

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

Я предложил бы вам следующюю архитектуру:

1. Создать сущность СЧЁТ в ней описать необходимые реквизиты счёта(указать его тип, возможные ограничения ну и другие.., в том числе текущий остаток) только по этой сущности можно получить текущие остатки !

2. Создать сущность документов на основании которых будут изменяться остатки по счетам, основные реквизиты документов:
— счёт по дебету (связь с таблицей счетов)
— счёт по кредиту (связь с таблицей счетов)
— сумма в валюте учёта
— дата проводки
— состояние (характеризует текущее состояние документа например: не обработан, проведён, ликвидирован.. и др.)

3. Создать сущность ВЫПИСКА ПО СЧЁТУ эта сущность должна быть связана с сущностью СЧЁТ и хранить детальную выписку по счёту. основные реквизиты здесь будут:
— счёт (связь с таблицей счетов)
— документ (связь с таблицей документов) отсюда мы легко вытянем сумму и другие реквизиты проводки..
— сальдо до проводки и после проводки
— для удобства можно хранить прямо в этой таблице и сумму причём развёрнуто по дебету и кредиту..

4. Создать сущность, назовём её так АРХИВ УЧЁТНЫХ СЧЕТОВ где будем хранить остатки по счетам на определённые даты например на начало каждого учётного периода. Познее по этой сущности можно будет легко получать отчёты при минимальной загрузке системы.

теперь основное внимание стоит уделить такому понятию как "проводка" документа и "ликвидация" проведённого документа, варианты реализации различны: клиентское приложение с прямым редактированием таблиц, хранимые процедуры, пакеты ORACLE; последние с моей точки зрения более предпочтительны. Операции реализовать в рамках транзакции, в операции соответствующим образом изменять вышеуказанные таблицы, при проводке:
— дебетуем один счёт и кредитуем другой (изменяем таблицу СЧЁТ)
— добавляем запись в таблицу ВЫПИСКА ПО СЧЁТУ
— устанавливаем дату проводки документа
— изменяем реквизит документа СОСТОЯНИЕ на проведён
расчёт архива производить периодически при закрытии периода
ну и ликвидация в обратном порядке:
— дебетуем один счёт и кредитуем другой (изменяем таблицу СЧЁТ в обратном порядке)
— удаляем запись в таблице ВЫПИСКА ПО СЧЁТУ
— изменяем реквизит документа СОСТОЯНИЕ на ликвидирован
— если необходимо то пересчитываем архив

вот такая примерная структура учётного ядра системы, которая опробована и успешно работает
примерные характеристики системы:
количество пользователей ~1000 из них постоянно находящихся в рабочее время в системе ~500-600
количиство активных сессий ~15-20
количество документов за месяц ~350 000
количество открытых счетов ~130 000
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.