SP com problema na atualização
begin
saldo = 0;
for select data_mov, historico,entrada, saida
from mov_caixa
into :data_mov, :historico, :entrada, :saida do begin
saldo = saldo + entrada-saida;
suspend;
end
end
Se eu dou um select * from sp, beleza, funciona como eu quero, mas se eu dou um select * from sp where data_mov between :data1 and :data2, o select vem, mas o saldo que deveria ser somente no periodo selecionado não vem, vem o saldo total, de toda a tabela. Sei que eu deveria reescrever minha SP, mas não sei como.
saldo = 0;
for select data_mov, historico,entrada, saida
from mov_caixa
into :data_mov, :historico, :entrada, :saida do begin
saldo = saldo + entrada-saida;
suspend;
end
end
Se eu dou um select * from sp, beleza, funciona como eu quero, mas se eu dou um select * from sp where data_mov between :data1 and :data2, o select vem, mas o saldo que deveria ser somente no periodo selecionado não vem, vem o saldo total, de toda a tabela. Sei que eu deveria reescrever minha SP, mas não sei como.
Paulo
Curtidas 0
Respostas
Firekiller
29/10/2005
Colega, posso estar enganado (na verdade nem sei se dará certo, pois nunca fiz e não testei), mas se você criar uma view, que traga os dados da procedure e filtrar essa view, você não precisa reescrever sua procedure. Ficaria algo assim:
1. Sua SP ficaria a mesma.
2. Você criaria uma view assim:
CREATE VIEW MYVIEW (data_mov, historico,entrada, saida, saldo)
as
SELECT data_mov, historico,entrada, saida, saldo from sp;
3. Utilizaria a view em seus SQL´s:
select * from MYVIEW where data_mov between :data1 and :data2
1. Sua SP ficaria a mesma.
2. Você criaria uma view assim:
CREATE VIEW MYVIEW (data_mov, historico,entrada, saida, saldo)
as
SELECT data_mov, historico,entrada, saida, saldo from sp;
3. Utilizaria a view em seus SQL´s:
select * from MYVIEW where data_mov between :data1 and :data2
GOSTEI 0
Paulo
29/10/2005
Fire, pelo que eu sei, as view não podem ser chamadas de uma SP, mas de uma tabela.
GOSTEI 0
Firekiller
29/10/2005
realmente... depois fui testar e não funcionou mesmo!
Mas sendo assim, creio eu que não será o suficiente você alterar sua procedure, pois o valor de saldo inicia zerado, portanto creio eu que ele não irá bater ao tentar pegar esse valor. O que poderia ser feito, pelo menos na minha opinião, é aproveitarmos a idéia que eu tinha utilizado anteriormente, só que, ao invés de criar uma view, criar uma outra procedure, e então fazer o filtro nessa procedure. Não sei se irá funcionar. Mas qualquer coisa, entra em contato com o AFarias, que ele manja muito de IB/FB.
Mas sendo assim, creio eu que não será o suficiente você alterar sua procedure, pois o valor de saldo inicia zerado, portanto creio eu que ele não irá bater ao tentar pegar esse valor. O que poderia ser feito, pelo menos na minha opinião, é aproveitarmos a idéia que eu tinha utilizado anteriormente, só que, ao invés de criar uma view, criar uma outra procedure, e então fazer o filtro nessa procedure. Não sei se irá funcionar. Mas qualquer coisa, entra em contato com o AFarias, que ele manja muito de IB/FB.
GOSTEI 0
Gandalf.nho
29/10/2005
Em vez de SP, veja se essa simples SQL funciona como vc quer
select historico, (sum(entrada) - sum(saida)) as saldo from mov_caixa where data_mov between :data1 and :data2 group by historico
GOSTEI 0
Paulo
29/10/2005
gandalf.nho, eu prefiro SP. Ele já está funcionando sem SP. Eu como estou mudando a minha aplicação para rodar todas as consultas em SP, então é por isso que eu estou tentando via SP. Fora da SP, ela já está funcionando. O problema é com SP. O programa está funcionando de uma forma, via IBX. O que eu estou é passando tudo para DBEXpress, claro aproveitando e fazendo umas mudanças e tal. A minha opção foi em trabalhar com SP, Views, Triggers e etc... Mas obrigado pela ajuda de qualquer forma.
GOSTEI 0
Gandalf.nho
29/10/2005
Se vc quiser usar como SP, basta vc declarar as duas datas que serão usadas como intervalo da consulta como parâmetros de entrada da SP.
GOSTEI 0
Paulo
29/10/2005
Já fiz assim, e está vindo o saldo total. O escopo da minha SP, está na primeira pergunta, suprimi apenas o cabeçalho da SP. Aquela é a minha SP. Eu sei q tenho que reescrevê-la, mas nãom sei como, pois não gostaria de fazer 3,4 SP, para o mesmo fim. Gostaria de reaproveitar a que tenho, ou seja, alterando a sua SQL. Porem se não tiver outra forma, terei que criar uma SP, para inserção, outra para atualizar Saldo(Atual) e outra para fazer consultas por período, tudo isso na mesma tabela, multiplicado por 10, terei umas 30 SP sómente para Inseri,atualizar e pesquisar em 10 tabelas. Acho um contra-censo terrível.
GOSTEI 0
Firekiller
29/10/2005
O saldo continuará vindo o total, porque, a coluna saldo de sua procedure, é um valor acumulativo, ou seja, para ser calculado ele depende do valor do registro anterior. Por isso eu disse pra usar uma outra SP.
Uma forma de você sair desse problema, sem ter que usar uma segunda procedure, seria você ter um campo na tabela chamado saldo. E utilizar uma trigger (before insert or update), para calcular esse valor. Dessa forma você não terá que ficar criando 2, 3, 4 ou 30 procedures.
Uma forma de você sair desse problema, sem ter que usar uma segunda procedure, seria você ter um campo na tabela chamado saldo. E utilizar uma trigger (before insert or update), para calcular esse valor. Dessa forma você não terá que ficar criando 2, 3, 4 ou 30 procedures.
GOSTEI 0
Paulo
29/10/2005
Valeu killer, não vejo outra opção a não ser essas postadas aí.
GOSTEI 0