Contruir Sql em FireBird 1.5

Firebird

23/01/2006

Caros amigos,


Estou com um problema aqui, tenho uma tabela em FireBird 1.5
Com a seguinte estrutura:

CON_CODIGO : Código da Contas
SAL_DATASALDO : Data do Saldo
SAL_SALDO : Valor do Saldo
LOJA : Empresa do Saldo

Esta tabela e utilizada para armazenar o Saldo Anterior de um sistema de caixa, sempre que tem uma movimentação eu verifico se naquele dia e naquela conta já existe um lançamento caso exista só atualizo ou se não crio um novo.

Listar o Saldo anterior informando a conta e muito fácil, pois coloco a conta e peço a ultima data menor que a data informada.

O problema e o seguinte agora eu preciso acumular o saldo anterior de todas as contas, vou passar uma data base e o saldo que tiver a data menor e o saldo anterior.

Como faço para pegar apenas a ocorrência mais próxima da data informada de toas às contas e somar?

Processo que estou usando para uma unica conta :
SELECT SAL_SALDO, SAL_DATASALDO FROM CAX_SALDOS
WHERE CON_CODIGO = :CODCONTA
AND SAL_DATASALDO = (SELECT MAX(SAL_DATASALDO) FROM
CAX_SALDOS WHERE SAL_DATASALDO < :DT AND CON_CODIGO
= :CODCONTA)
INTO :VALOR, :DTSALDO;



Desde já agradeço

Hugo Fabrício


Hugofab

Hugofab

Curtidas 0

Respostas

Emerson Nascimento

Emerson Nascimento

23/01/2006

tente assim:
SELECT
  CX1.SAL_SALDO, CX1.SAL_DATASALDO 
FROM
  CAX_SALDOS CX1
WHERE
  CX1.SAL_DATASALDO = (SELECT
                         MAX(CX2.SAL_DATASALDO)
                       FROM 
                         CAX_SALDOS CX2
                       WHERE
                         CX2.SAL_DATASALDO <= :_DT
                         AND CX2.CON_CODIGO = CX1.CON_CODIGO)
INTO :VALOR, :DTSALDO



GOSTEI 0
Hugofab

Hugofab

23/01/2006

emerson.en,

Não estou conseguindo rodar o código que vc me passou fiz a alteração na procedure mas quando executo pelo sistema esta dando um erro:
´Multiple rowns in Select´

e não retorna nada tentei rodar o Sistema e no Ib Expert e não funcionou !

Desde já agradeço


Hugo Fabrício


GOSTEI 0
Rodolpho123

Rodolpho123

23/01/2006

No lugar de ´=´, tente colocar uma cláusla [b:6633cb958f]IN[/b:6633cb958f]
tente assim:
SELECT
  CX1.SAL_SALDO, CX1.SAL_DATASALDO 
FROM
  CAX_SALDOS CX1
WHERE
  CX1.SAL_DATASALDO IN (SELECT
                         MAX(CX2.SAL_DATASALDO)
                       FROM 
                         CAX_SALDOS CX2
                       WHERE
                         CX2.SAL_DATASALDO <= :_DT
                         AND CX2.CON_CODIGO = CX1.CON_CODIGO)
INTO :VALOR, :DTSALDO



GOSTEI 0
Hugofab

Hugofab

23/01/2006

Rodolpho,


Fiz a alteração, mas a mensagem continua a mesma!

Outra duvida esta sentença vai acumular o saldo pois não tem nenhuma função sum !

desde já agradeço a atenção


Hugo Fabrício


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

23/01/2006

CON_CODIGO : Código da Contas SAL_DATASALDO : Data do Saldo SAL_SALDO : Valor do Saldo LOJA : Empresa do Saldo

sua tabela tem somente esses campos?


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

23/01/2006

se você fizer algo desse tipo e utilizar o sum() não poderá ser exibida a data.
eu testei essa instrução e funcionou:
  SELECT 
    SUM(CX1.SAL_SALDO)
  FROM 
    CAX_SALDOS CX1 
  WHERE 
    CX1.SAL_DATASALDO = (SELECT 
                           MAX(CX2.SAL_DATASALDO) 
                         FROM 
                           CAX_SALDOS CX2 
                         WHERE 
                           CX2.SAL_DATASALDO <= :_DT 
                           AND CX2.CON_CODIGO = CX1.CON_CODIGO) 

ela retorna o valor acumulado de todas as contas, assumindo a data mais próxima da data informada.
como explicado antes, dessa forma não será possível retornar uma data precisa na instrução. o máximo que poderia ser feito nesse sentido seria retornar um max(CX1.SAL_DATASALDO), que retornaria a maior data avaliada na instrução (mas pelo que você precisa, não vejo como essa informação seria relevante)


GOSTEI 0
Hugofab

Hugofab

23/01/2006

emerson.en


Utilizando o exemplo que vc me passou funcionou perfeitamente,
muito obrigando !


Hugo Fabrício


GOSTEI 0
POSTAR