Criando Stored Procedures que retornam um select
Oi amigos, blz!?
Tenho uma Tabela de Mov. de Caixa com os seguintes campos:
Essa tabela controla todo o movimento de entrada e saída de caixa diariamente onde o campo TIPOMOV pode ser 'E' para entradas no caixa e 'S' para saídas no caixa.
Eu vi alguns exemplos em fóruns de Stored Procedures que retornam um select onde me mostram o saldo do caixa por movimento. Eu na verdade informaria o saldo inicial e a Stored Procedure se encarregaria de alimentar os campos baseado no saldo inicial.
Por exemplo, eu quero todos os movimentos de caixa do mês de dezembro de 2017.
Eu simplesmente chamaria a SP informando o saldo inicial e o período e me retornasse um select de todos esses movimentos e o último campo seria o saldo somando e subtraindo o valor de acordo com o tipo de movimento.
Alguém tem alguma dica pra me dar uma luz?
Grato desde já
Essa dúvida foi gerada a partir de um comentário no artigo 3. Usando Stored Procedures com Firebird e InterBase
Tenho uma Tabela de Mov. de Caixa com os seguintes campos:
CODIGO INTEGER DTMOV DATE TIPOMOV VARCHAR(1) VLRMOV NUMERIC(12,2)
Essa tabela controla todo o movimento de entrada e saída de caixa diariamente onde o campo TIPOMOV pode ser 'E' para entradas no caixa e 'S' para saídas no caixa.
Eu vi alguns exemplos em fóruns de Stored Procedures que retornam um select onde me mostram o saldo do caixa por movimento. Eu na verdade informaria o saldo inicial e a Stored Procedure se encarregaria de alimentar os campos baseado no saldo inicial.
Por exemplo, eu quero todos os movimentos de caixa do mês de dezembro de 2017.
Eu simplesmente chamaria a SP informando o saldo inicial e o período e me retornasse um select de todos esses movimentos e o último campo seria o saldo somando e subtraindo o valor de acordo com o tipo de movimento.
Alguém tem alguma dica pra me dar uma luz?
Grato desde já
Essa dúvida foi gerada a partir de um comentário no artigo 3. Usando Stored Procedures com Firebird e InterBase
Rodrigo Cardilo
Curtidas 0
Respostas
Ricardo Pestana
12/01/2018
boa tarde Rodrigo,
Não sei se entendi bem o que vc escreveu, mas vê se assim não te dá uma direção...
CREATE DEFINER=`root`@`localhost` PROCEDURE `contacorrente`(saldo numeric)
BEGIN
declare tipomov_aux varchar(1);
declare done int default 0;
declare vl_saldo_final_aux, vl_aux numeric;
DECLARE meu_cursor CURSOR FOR (
select tipomov, vlrmov from testes.testenf order by dtmov, codigo
);
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN meu_cursor;
set vl_saldo_final_aux = saldo;
repeat
fetch meu_cursor into tipomov_aux, vl_aux;
if not done then
if tipomov_aux = 'E' then
set vl_saldo_final_aux = vl_saldo_final_aux + vl_aux;
else
set vl_saldo_final_aux = vl_saldo_final_aux - vl_aux;
end if;
end if;
until done end repeat;
select 0 as codigo, null as dtmov, 'saldo' as tipomov, saldo
union all
select codigo, dtmov, tipomov, vlrmov from testes.testenf
union all
select 0 as codigo, null as dtmov, 'saldo final' as tipomov, vl_saldo_final_aux;
END
GOSTEI 0
Rodrigo Cardilo
12/01/2018
OI Ricardo,
Eu na verdade preciso dessa procedure para o Firebird. Acho que a linguagem que você usou não funciona no firebird.
Mesmo assim obrigado desde já.
Eu na verdade preciso dessa procedure para o Firebird. Acho que a linguagem que você usou não funciona no firebird.
Mesmo assim obrigado desde já.
GOSTEI 0
Emerson Nascimento
12/01/2018
veja se esta SP te ajuda:
create or alter procedure saldomov (
datainicial date,
datafinal date,
saldoinicial numeric(15,2))
returns (
datamov date,
descricao varchar(50),
entradas numeric(15,2),
saidas numeric(15,2),
saldo numeric(15,2))
as
begin
select max(dtmov) from movcaixa
where dtmov <= :datainicial
into datamov;
descricao = 'SALDO INICIAL';
entradas = 0;
saidas = 0;
saldo = saldoinicial;
suspend;
descricao = '';
for select dtmov,
sum(case when tipomov='E' then vlrmov else 0 end) valore,
sum(case when tipomov='S' then vlrmov else 0 end) valors
from movcaixa
where dtmov between :datainicial and :datafinal
group by dtmov
order by dtmov
into :datamov, :entradas, :saidas
do begin
saldo = (saldo + entradas - saidas);
suspend;
end
datamov = null;
descricao = 'SALDO FINAL';
entradas = 0;
saidas = 0;
suspend;
end
create or alter procedure saldomov (
datainicial date,
datafinal date,
saldoinicial numeric(15,2))
returns (
datamov date,
descricao varchar(50),
entradas numeric(15,2),
saidas numeric(15,2),
saldo numeric(15,2))
as
begin
select max(dtmov) from movcaixa
where dtmov <= :datainicial
into datamov;
descricao = 'SALDO INICIAL';
entradas = 0;
saidas = 0;
saldo = saldoinicial;
suspend;
descricao = '';
for select dtmov,
sum(case when tipomov='E' then vlrmov else 0 end) valore,
sum(case when tipomov='S' then vlrmov else 0 end) valors
from movcaixa
where dtmov between :datainicial and :datafinal
group by dtmov
order by dtmov
into :datamov, :entradas, :saidas
do begin
saldo = (saldo + entradas - saidas);
suspend;
end
datamov = null;
descricao = 'SALDO FINAL';
entradas = 0;
saidas = 0;
suspend;
end
GOSTEI 0