[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