Visual Basic, VB .NET, ASP, Active X, Access, SQL Server

Consultas SQL Para Gerar Extratos

Se você tiver uma tabela de lançamentos e tenha a previsão de gerar extratos rotineiramente, recomendo que você armazene o saldo em algum lugar após cada lançamento, pois o cálculo dos saldos de cada conta em tempo de execução através de SQL pode ser muito lento para grandes tabelas. No entanto, você pode aqui ou alí precisar de criar uma consulta eventual que exiba a somatória de um campo para todos os registros de uma tabela de modo que, para cada registro, você tenha a somatória do campo até o momento da inclusão do registro. Isto se assemelha a um extrato, onde o saldo da conta tem que ser exibido para cada lançamento até, e incluindo, o próprio lançamento. Veja abaixo como ficaria uma consulta parametrizada no Access para realizar esta tarefa numa tabela de nome "Lancamentos":

PARAMETERS [DataFinal] DateTime;
SELECT L.*, S.Soma AS Saldo FROMLancamentos AS L INNER JOIN 

(SELECT L2.Id, SUM(L1.Valor) As Soma FROM Lancamentos As L1 INNER JOIN Lancamentos As L2 ON (L1.DataReferencia<=L2.DataReferencia And L1.Id<=L2.Id AND L2.DataReferencia <=[DataFinal]) GROUP BY L2.DataReferencia,L2.Id). AS S 
ON L.Id = S.Id
ORDER BY L.DataReferencia, L.Id;

Acima, usamos a técnica de cruzar a tabela Lancamentos com ela mesma usando diferentes "aliases". Agrupamos a somatória por DataReferencia e por Id já que dentro de uma mesma data podemos ter diferentes lançamentos ordenados pelo campo Id de auto-numeração crescente. Para poder retornar todos os campos da tabela "Lancamentos", ainda fizemos, na consulta mais externa, um cruzamento da tabela que retorna a somatória com a tabela Lancamentos de modo a retornar o campo da soma e todos os campos de "Lancamentos As L". Em razão deste último cruzamento, tivemos que acrescentar a cláusula ORDER BY para garantir a correta ordenação dos registros. Se nomearmos esta consulta como "ParExtratos" e quisermos criar uma consulta que retorne o extrato num intervalo específico, podemos chamar esta mesma consulta de dentro de outra. Veja abaixo:

PARAMETERS [DataInicial] DateTime, [DataFinal] DateTime;
SELECT *
FROM ParExtratos
WHERE DataReferencia Between [DataInicial] And [DataFinal];

Este tipo de consulta pode ser necessária em aplicações de contas a pagar e contas a receber, estoque e outras em que a informação de saldos agrupados por lançamentos seja importante.