delphisempre Postado Março 9, 2019 Denunciar Share Postado Março 9, 2019 Olá, boa tarde Trabalhando ainda na minha tabela MovimentacaoBancaria, Fiz uma Stored Procedure para fazer um Update na tabela toda vez que o Usuario fizer uma alteração no valor do Débito ou do Crédito a Stored Procedure pega o saldo anterior do registro atual, pega o valor que foi alterado e atualiza o saldo atual. Mas além disso, gostaria que, por exemplo, tiver 15 registros lançados, ele atualizou a linha 5 e tiver mais 10 registros depois, a Procedure atualizasse todos os saldos anteriores e atuais subsequentes até o último registro. Estou postando a Stored Procedure que fiz, pois ela não está atualizando nem o registro atual e nem os saldos subsequentes. Obs: O teste que fiz usando o IBExpert e Firebird 2.5 ao executar a Stored Procedure apresenta a seguinte mensagem: multiple rows in singleton select. multiple rows in singleton select. At procedure 'MOVIMENTACAOBANCARIA_UPD' line: 27, col: 6. Desde já agradeço pela ajuda. SET TERM ^ ; PROCEDURE MOVIMENTACAOBANCARIA_UPD ( P_CON_CODIGO Integer, P_MOV_DATADOLANCAMENTO Date, P_MOV_CREDITO Numeric(15,2), P_MOV_DEBITO Numeric(15,2), P_MOV_DATAALTERACAO Date, P_MOV_DESCRICAO Varchar(40) ) AS DECLARE VARIABLE v_saldo_anterior numeric(15,2); DECLARE VARIABLE v_saldo_atual numeric(15,2); BEGIN begin SELECT MOV_SALDOANTERIOR FROM MOVIMENTACAOBANCARIA WHERE CON_CODIGO =:p_con_codigo And MOV_DATADOLANCAMENTO = :P_MOV_DATADOLANCAMENTO INTO v_saldo_anterior; v_saldo_anterior = coalesce(:v_saldo_anterior, 0); end v_saldo_atual = :v_saldo_anterior + :p_mov_credito - :p_mov_debito; IF (EXISTS(SELECT 1 FROM MOVIMENTACAOBANCARIA WHERE CON_CODIGO = :P_CON_CODIGO AND MOV_DATADOLANCAMENTO = :P_MOV_DATADOLANCAMENTO)) THEN BEGIN UPDATE MOVIMENTACAOBANCARIA SET con_codigo = :p_con_codigo, mov_datadolancamento = :p_mov_datadolancamento, mov_saldoanterior = :v_saldo_anterior, mov_credito = :p_mov_credito, mov_debito = :p_mov_debito, mov_saldoatual = :v_saldo_atual, mov_dataalteracao = 'now', mov_descricao = :p_mov_descricao Where CON_CODIGO = :p_con_codigo And mov_datadolancamento = :p_mov_datadolancamento; END END^ SET TERM ; ^ GRANT EXECUTE ON PROCEDURE MOVIMENTACAOBANCARIA_UPD TO SYSDBA; Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
delphisempre
Olá, boa tarde
Trabalhando ainda na minha tabela MovimentacaoBancaria, Fiz uma Stored Procedure
para fazer um Update na tabela toda vez que o Usuario fizer uma alteração no valor do Débito ou do Crédito
a Stored Procedure pega o saldo anterior do registro atual, pega o valor que foi alterado e atualiza o saldo atual.
Mas além disso, gostaria que, por exemplo, tiver 15 registros lançados, ele atualizou a linha 5 e tiver mais 10 registros depois,
a Procedure atualizasse todos os saldos anteriores e atuais subsequentes até o último registro.
Estou postando a Stored Procedure que fiz, pois ela não está atualizando nem o registro atual e nem os saldos subsequentes.
Obs: O teste que fiz usando o IBExpert e Firebird 2.5
ao executar a Stored Procedure apresenta a seguinte mensagem:
multiple rows in singleton select.
multiple rows in singleton select.
At procedure 'MOVIMENTACAOBANCARIA_UPD' line: 27, col: 6.
Desde já agradeço pela ajuda.
SET TERM ^ ;
PROCEDURE MOVIMENTACAOBANCARIA_UPD (
P_CON_CODIGO Integer,
P_MOV_DATADOLANCAMENTO Date,
P_MOV_CREDITO Numeric(15,2),
P_MOV_DEBITO Numeric(15,2),
P_MOV_DATAALTERACAO Date,
P_MOV_DESCRICAO Varchar(40) )
AS
DECLARE VARIABLE v_saldo_anterior numeric(15,2);
DECLARE VARIABLE v_saldo_atual numeric(15,2);
BEGIN
begin
SELECT MOV_SALDOANTERIOR
FROM MOVIMENTACAOBANCARIA
WHERE CON_CODIGO =:p_con_codigo
And MOV_DATADOLANCAMENTO = :P_MOV_DATADOLANCAMENTO
INTO v_saldo_anterior;
v_saldo_anterior = coalesce(:v_saldo_anterior, 0);
end
v_saldo_atual = :v_saldo_anterior + :p_mov_credito - :p_mov_debito;
IF (EXISTS(SELECT 1 FROM MOVIMENTACAOBANCARIA
WHERE CON_CODIGO = :P_CON_CODIGO
AND MOV_DATADOLANCAMENTO = :P_MOV_DATADOLANCAMENTO)) THEN
BEGIN
UPDATE MOVIMENTACAOBANCARIA SET
con_codigo = :p_con_codigo,
mov_datadolancamento = :p_mov_datadolancamento,
mov_saldoanterior = :v_saldo_anterior,
mov_credito = :p_mov_credito,
mov_debito = :p_mov_debito,
mov_saldoatual = :v_saldo_atual,
mov_dataalteracao = 'now',
mov_descricao = :p_mov_descricao
Where CON_CODIGO = :p_con_codigo And
mov_datadolancamento = :p_mov_datadolancamento;
END
END^
SET TERM ; ^
GRANT EXECUTE
ON PROCEDURE MOVIMENTACAOBANCARIA_UPD TO SYSDBA;
Link para o comentário
Compartilhar em outros sites
0 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.