[firebase-br] Ajudem-me por favor
Andrei Luís
compuvale.software em gmail.com
Sáb Fev 6 09:59:57 -03 2010
Jose, do jeito que está não vai funcionar.
Você está passando vários registros como parâmetro para a procedure,
enquanto que nos where você compara id=:id, é aí que o erro está aparecendo.
Minha sugestão é que você utilize duas procedures, uma para quando quiser
filtrar um cliente (que já está pronta) e outra para todos os clientes,
colocando um FOR SELECT ID FROM CLIENTES do... para dentro da procedure.
Outra sugestão é fazer uma só procedure, transformando o select id from
clientes para dentro da procedure, transformando-o em um for select, e
usando execute statement. Como parâmetro você passa o ID quando quiser
consultar somente um cliente, e passa por exemplo 0 quando quiser todos.
Dentro da SP, a primeira coisa é testar o parâmetro passado, e baseado nisso
montar a string que será utilizada no execute statement, mais ou menos
assim:
CREATE PROCEDURE SP_CALCULACD (id integer)
returns (apagar numeric(12,2), areceber numeric(12,2), situacao
numeric(12,2))
as
declare variable debito numeric(12,2);
declare variable credito numeric(12,2);
declare variable xsql varchar(1000);
declare variable wid integer;
declare variable wnome varchar(50);
begin
if id=0 then xsql = 'Select id, nome from clientes where id=:id into :wid,
:wnome';
if id>0 then xsql = 'Select id, nome from clientes into :wid, :wnome';
for execute statement do
begin
for select sum(d.valor_parcela)
from contasreceber d
where d.id_cliente = :wid
into :debito
do
begin
apagar = :debito;
end
--aqui somo os créditos de cada cliente
for select sum(c.valor)
from caixa c
where c.id_cliente = :id
into :credito
do
begin
areceber = :credito;
end
apagar = :debito + :debito2;
areceber = :credito;
situacao = areceber - apagar;
suspend;
end
end
Tem que dar uma olhada melhor como funciona o execute statement, não lembro
se o into pode estar dentro ou deve estar fora, mas já dá pra você começar
por aí.
E... concordo com o que os colegas falaram, utilize sempre um assunto
pertitente ao... assunto :-).
[]
Andrei
Em 5 de fevereiro de 2010 21:28, Jose Luiz de Medeiros <
joseluiz em medeirosinfor.com> escreveu:
> Colegas..
>
>
>
>
>
> Me ajudem por favor, ja tentei varias dicas dos colegas e não funciona.
>
>
>
> Preciso saber a situação de todos os meus clientes de uma vez, fiz essa
> procedure com a ajuda dos colegas:
>
>
>
> CREATE PROCEDURE SP_CALCULACD (
>
> id integer)
>
> returns (
>
> apagar numeric(12,2),
>
> areceber numeric(12,2),
>
> situacao numeric(12,2))
>
> as
>
> declare variable debito numeric(12,2);
>
> declare variable credito numeric(12,2);
>
> begin
>
>
>
> for select sum(d.valor_parcela)
>
> from contasreceber d
>
> where d.id_cliente = :id
>
> into :debito
>
> do
>
> begin
>
> apagar = :debito;
>
> end
>
> //aqui somo os créditos de cada cliente
>
> for select sum(c.valor)
>
> from caixa c
>
> where c.id_cliente = :id
>
> into :credito
>
> do
>
> begin
>
> areceber = :credito;
>
> end
>
>
>
> apagar = :debito + :debito2;
>
> areceber = :credito;
>
> situacao = areceber - apagar;
>
> suspend;
>
> end
>
>
>
>
>
> Se eu executar assim funciona 100%:
>
> EXECUTE PROCEDURE SP_CALCULACD(100);
>
> Tenho a situação do cliente ID =100.
>
>
>
> Mas o que eu quero e de todos de uma vez, tento assim:
>
> EXECUTE PROCEDURE SP_CALCULACD(SELECT ID FROM CLIENTES);
>
>
>
> TENHO ESSE ERRO:
>
> multiple rows in singleton select
>
>
>
> Alguem por favor pode me ajudar?
>
> Uso firebird 2.1
>
>
>
>
>
> Grato:
>
> Jose Luiz
>
>
>
Mais detalhes sobre a lista de discussão lista