Saldo anterior

boa tarde…sou inciante e preciso de uma ajuda, como faço para calcular o saldo anterior apartir de entradas e saidas? neste relatorio seria apresnetado o SALDO ANTERIOR, ENTRADAS, SAIDAS e SALDO ARUAL, conforme periodo(data incial e data final) informado por usuario.Seria possível se feito em SQL? obrigado.

por favor, seja mais específico.

sim, é possível fazer isso com sql.

o que você já fez? exatamente em que você tem dúvida?

SELECT
PRODUTO.NOME AS NOME,
(SELECT
(SUM(CASE WHEN(MOV.TIPO = ‘ENTRADA’)THEN MOV.QUANTIDADE ELSE ‘0’ END))
FROM MOV
INNER JOIN PRODUTO
ON (PRODUTO.IDMOV = MOV.IDMOV
WHERE
MOV.DATAEMISSAO <‘2010-08-01’) --data inicio
-
(SELECT
(SUM(CASE WHEN(MOV.TIPO = ‘SAIDA’)THEN MOV.QUANTIDADE ELSE ‘0’ END))
FROM MOV
INNER JOIN PRODUTO
ON (PRODUTO.IDMOV = MOV.IDMOV
WHERE
MOV.DATAEMISSAO <‘2010-08-01’) --data inicio
FROM
MOV
INNER JOIN PRODUTO
ON (PRODUTO.IDMOV = MOV.IDMOV
WHERE

AND MOV.DATAEMISSAO BETWEEN '2010-08-01' AND '2010-08-31'

GROUP BY
PRODUTO.NOME
ORDER BY
PRODUTO.NOME

Coloquei parte do código acima que faz apenas o cálculo do saldo anterior, ou pelo menos deveria retornar os valores do cálculo do SALDO_ANTERIOR para cada produto, mas retorna o erro:
Código do erro 512, estado do SQL 21000: Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
Linha 1, coluna 1

[quote=ajgemeos]SELECT
PRODUTO.NOME AS NOME,
(SELECT
(SUM(CASE WHEN(MOV.TIPO = ‘ENTRADA’)THEN MOV.QUANTIDADE ELSE ‘0’ END))
FROM MOV
INNER JOIN PRODUTO
ON (PRODUTO.IDMOV = MOV.IDMOV
WHERE
MOV.DATAEMISSAO <‘2010-08-01’) --data inicio
-
(SELECT
(SUM(CASE WHEN(MOV.TIPO = ‘SAIDA’)THEN MOV.QUANTIDADE ELSE ‘0’ END))
FROM MOV
INNER JOIN PRODUTO
ON (PRODUTO.IDMOV = MOV.IDMOV
WHERE
MOV.DATAEMISSAO <‘2010-08-01’) --data inicio
FROM
MOV
INNER JOIN PRODUTO
ON (PRODUTO.IDMOV = MOV.IDMOV
WHERE

AND MOV.DATAEMISSAO BETWEEN '2010-08-01' AND '2010-08-31'

GROUP BY
PRODUTO.NOME
ORDER BY
PRODUTO.NOME

Coloquei parte do código acima que faz apenas o cálculo do saldo anterior, ou pelo menos deveria retornar os valores do cálculo do SALDO_ANTERIOR para cada produto, mas retorna o erro:
Código do erro 512, estado do SQL 21000: Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
Linha 1, coluna 1[/quote]

três coisas:

  1. use a tag code para formatar o código.

  2. o código está inacabado

ON (PRODUTO.IDMOV = MOV.IDMOV -- está faltando fechar o parêntese WHERE -- e aqui está faltando alguma coisa AND MOV.DATAEMISSAO BETWEEN '2010-08-01' AND '2010-08-31'
3. não testei, mas acho que o caminho é esse

select produto.nome , movEntrada.quantidade - movSaida.quantidade saldo from produto join (select idMov , sum(quantidade) quantidade from mov where mov.tipo = 'ENTRADA' and dataEmissao between '2010-08-01' and '2010-08-31' group by idMov) movEntrada on produto.idMov = mov.idMov join (select idMov , sum(quantidade) quantidade from mov where mov.tipo = 'SAIDA' and dataEmissao between '2010-08-01' and '2010-08-31' group by idMov) movSaida on produto.idMov = mov.idMov

bom wbdsjunior, valeu pela força, por inexperiência minha, quis postar parte do código, acabei complicando mais, vou passar o código na integra, ele até roda, mas como já mencionado, os valores do SALDO ANTERIOR e SALDO ATUAL saem repetidos para todos os produtos, na verdade há mais um relaciomento entre tabelas, desculpe mais uma vez, agradeço pela força…

SELECT
TPRD.NOMEFANTASIA AS NOME,
(SELECT
(SUM(CASE WHEN(TMOV.CODTMV IN (‘1.2.02’, ‘1.2.03’, ‘1.2.05’))THEN TITMMOV.QUANTIDADE ELSE ‘0’ END))
FROM TMOV
INNER JOIN TITMMOV
ON (TITMMOV.IDMOV = TMOV.IDMOV
AND TITMMOV.CODCOLIGADA = TMOV.CODCOLIGADA)

INNER JOIN TPRD
ON (TPRD.IDPRD = TITMMOV.IDPRD
AND TPRD.CODCOLIGADA = TITMMOV.CODCOLIGADA)
WHERE
TMOV.CODCOLIGADA = '1’
AND TMOV.CODTMV IN (‘1.2.02’, ‘1.2.03’, ‘1.2.05’)
AND tprd.codigoprd NOT like '01%'
AND tprd.codigoprd NOT like '04.002%'
AND tprd.codigoprd NOT like '05%'
AND tprd.codigoprd NOT like '06%'
AND tprd.codigoprd NOT like '07%'
AND tprd.codigoprd NOT like '08%'
AND tprd.codigoprd NOT like '09%'
AND tprd.codigoprd NOT like '10%'
AND tprd.codigoprd NOT like '11%'
AND tprd.codigoprd NOT like '12%'
AND TMOV.STATUS <> ‘C’
– AND TPRD.codigoprd = '03.005.00003’
AND TMOV.DATAEMISSAO <‘2010-08-01’) --data inicio

(SELECT(SUM(CASE WHEN(TMOV.CODTMV IN (‘1.1.04’))THEN TITMMOV.QUANTIDADE ELSE ‘0’ END))
FROM TMOV
INNER JOIN TITMMOV
ON (TITMMOV.IDMOV = TMOV.IDMOV
AND TITMMOV.CODCOLIGADA = TMOV.CODCOLIGADA)

INNER JOIN TPRD
ON (TPRD.IDPRD = TITMMOV.IDPRD
AND TPRD.CODCOLIGADA = TITMMOV.CODCOLIGADA)
WHERE
TMOV.CODCOLIGADA = '1’
AND TMOV.CODTMV IN (‘1.1.04’)
AND tprd.codigoprd NOT like '01%'
AND tprd.codigoprd NOT like '04.002%'
AND tprd.codigoprd NOT like '05%'
AND tprd.codigoprd NOT like '06%'
AND tprd.codigoprd NOT like '07%'
AND tprd.codigoprd NOT like '08%'
AND tprd.codigoprd NOT like '09%'
AND tprd.codigoprd NOT like '10%'
AND tprd.codigoprd NOT like '11%'
AND tprd.codigoprd NOT like '12%'
AND TPRD.CODIGOPRD NOT LIKE '01%'
AND TMOV.STATUS <> ‘C’
– AND TPRD.codigoprd = '03.005.00003’
AND TMOV.DATAEMISSAO <‘2010-08-01’) AS SALDO_ANTERIOR, --data inicio
SUM(CASE WHEN(TMOV.CODTMV IN (‘1.2.02’, ‘1.2.03’, ‘1.2.05’))THEN TITMMOV.QUANTIDADE ELSE ‘0’ END)AS TOT_ENTRADAS,
SUM(CASE WHEN(TMOV.CODTMV IN (‘1.1.04’))THEN TITMMOV.QUANTIDADE ELSE ‘0’ END) AS TOTAL_BAIXAS,

(SELECT(SUM(CASE WHEN(TMOV.CODTMV IN (‘1.2.02’, ‘1.2.03’, ‘1.2.05’))THEN TITMMOV.QUANTIDADE ELSE ‘0’ END))
FROM TMOV
INNER JOIN TITMMOV
ON (TITMMOV.IDMOV = TMOV.IDMOV
AND TITMMOV.CODCOLIGADA = TMOV.CODCOLIGADA)

INNER JOIN TPRD
ON (TPRD.IDPRD = TITMMOV.IDPRD
AND TPRD.CODCOLIGADA = TITMMOV.CODCOLIGADA)
WHERE
TMOV.CODCOLIGADA = '1’
AND TMOV.CODTMV IN (‘1.2.02’, ‘1.2.03’, ‘1.2.05’)
AND tprd.codigoprd NOT like '01%'
AND tprd.codigoprd NOT like '04.002%'
AND tprd.codigoprd NOT like '05%'
AND tprd.codigoprd NOT like '06%'
AND tprd.codigoprd NOT like '07%'
AND tprd.codigoprd NOT like '08%'
AND tprd.codigoprd NOT like '09%'
AND tprd.codigoprd NOT like '10%'
AND tprd.codigoprd NOT like '11%'
AND tprd.codigoprd NOT like '12%'
AND TMOV.STATUS <> ‘C’
– AND TPRD.codigoprd = '03.005.00003’
AND TMOV.DATAEMISSAO <=‘2010-08-31’) --data atual

(SELECT(SUM(CASE WHEN(TMOV.CODTMV IN (‘1.1.04’))THEN TITMMOV.QUANTIDADE ELSE ‘0’ END))
FROM TMOV
INNER JOIN TITMMOV
ON (TITMMOV.IDMOV = TMOV.IDMOV
AND TITMMOV.CODCOLIGADA = TMOV.CODCOLIGADA)

INNER JOIN TPRD
ON (TPRD.IDPRD = TITMMOV.IDPRD
AND TPRD.CODCOLIGADA = TITMMOV.CODCOLIGADA)
WHERE
TMOV.CODCOLIGADA = '1’
AND TMOV.CODTMV IN (‘1.1.04’)
AND tprd.codigoprd NOT like '01%'
AND tprd.codigoprd NOT like '04.002%'
AND tprd.codigoprd NOT like '05%'
AND tprd.codigoprd NOT like '06%'
AND tprd.codigoprd NOT like '07%'
AND tprd.codigoprd NOT like '08%'
AND tprd.codigoprd NOT like '09%'
AND tprd.codigoprd NOT like '10%'
AND tprd.codigoprd NOT like '11%'
AND tprd.codigoprd NOT like '12%'
AND TMOV.STATUS <> ‘C’
– AND TPRD.codigoprd = '03.005.00003’
AND TMOV.DATAEMISSAO <=‘2010-08-31’)as saldo_atual --data atual

FROM
TMOV
INNER JOIN TITMMOV
ON (TITMMOV.IDMOV = TMOV.IDMOV
AND TITMMOV.CODCOLIGADA = TMOV.CODCOLIGADA)

INNER JOIN TPRD
ON (TPRD.IDPRD = TITMMOV.IDPRD
AND TPRD.CODCOLIGADA = TITMMOV.CODCOLIGADA)
WHERE
TMOV.CODCOLIGADA = '1’
AND TMOV.CODTMV IN (‘1.1.04’, ‘1.2.02’, ‘1.2.03’, ‘1.2.05’)
AND tprd.codigoprd NOT like '01%'
AND tprd.codigoprd NOT like '04.002%'
AND tprd.codigoprd NOT like '05%'
AND tprd.codigoprd NOT like '06%'
AND tprd.codigoprd NOT like '07%'
AND tprd.codigoprd NOT like '08%'
AND tprd.codigoprd NOT like '09%'
AND tprd.codigoprd NOT like '10%'
AND tprd.codigoprd NOT like '11%'
AND tprd.codigoprd NOT like '12%'
AND TMOV.STATUS <> ‘C’
– AND TPRD.codigoprd = '03.005.00003’
AND tmov.dataemissao BETWEEN ‘2010-08-01’ AND '2010-08-31’
GROUP BY
TPRD.NOMEFANTASIA
–TPRD.SALDOGERALFISICO,
–TPRD.CODUNDCONTROLE
ORDER BY
TPRD.NOMEFANTASIA