Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Projeto de banco de dados:Calculando o saldo da conta


Um problema antigo que nunca foi resolvido com elegância.

Todos os pacotes bancários com os quais trabalhei armazenam o saldo na entidade da conta. Calculá-lo em tempo real a partir do histórico de movimentos é impensável.

A forma correta é:
  • A tabela de movimento tem uma transação 'openingbalance' para cada conta. Você precisará disso daqui a alguns anos quando precisar mover movimentos antigos da tabela de movimento ativa para uma tabela de histórico.
  • A entidade da conta tem um campo de saldo
  • Existe um gatilho na tabela de movimentação que atualiza os saldos das contas creditadas e debitadas. Obviamente, tem controle de compromisso. Se você não pode ter um acionador, então deve haver um exclusivo módulo que grava movimentos sob controle de confirmação
  • Você tem um programa de 'rede de segurança' que pode ser executado offline, que recalcula todos os saldos e exibe (e, opcionalmente, corrige) os saldos incorretos. Isso é muito útil para testar.

Alguns sistemas armazenam todos os movimentos como números positivos e expressam o crédito/débito invertendo os campos de/para ou com um sinalizador. Pessoalmente, prefiro um campo de crédito, um campo de débito e um valor assinado, isso facilita muito o acompanhamento das reversões.

Observe que esses métodos se aplicam tanto a dinheiro quanto a títulos.

As transações de títulos podem ser muito mais complicadas, especialmente para ações corporativas, você precisará acomodar uma única transação que atualize um ou mais saldos de caixa de compradores e vendedores, seus saldos de posições de títulos e possivelmente o corretor/depositário.