Ola Ivan,

Primeiro vc tem que criar um tipo para o retorno da função

CREATE TYPE "public"."tipo_caixa" AS (
 "emissao" Date,
 "historico" VARCHAR(60),
 "entrada" numeric(12,2),
 "saida" numeric(12,2),
 "saldo" numeric(12,2),
);

mude o tipo dos campos para o que vc usa!

Depois vc cria a função que vai retornar o tipo criado


CREATE OR REPLACE FUNCTION "public"."livrocaixa" (date, date) RETURNS
SETOF "public"."tipo_caixa" AS
$body$
declare
 registros record;
 linha tipo_caixa;
begin
 for registros in
   SELECT cx.emissao, cx.historico, cx.entrada, cx.saida,
   (SELECT sum(x.entrada)-sum(x.saida) FROM caixa AS x WHERE
        x.idcaixa <= cx.idcaixa) as saldo
   FROM caixa as cx where cx.emissao between $1 and $2 ORDER BY
        cx.idcaixa
   loop
     linha.emissao = r.emissao;
     linha.historico = r.emissao;
     linha.entrada = r.entrada;
     linha.saida = r.saida;
     linha.saldo = saldo;
     return next linha;
   end loop;
   return;
end
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;

Espero ter ajudado
Abraços


Em 29/03/07, Adriano Espinoza de Oliveira <[EMAIL PROTECTED]>
escreveu:

Para vocë ter o retorno da função com o tipo public.caixa o registor
criado tem ser igual.
Pergunta: na estrutura de public.caixa vc tem exatametne os campos:
emissao, historico, entrada, saida e saldo?
Deve ser ai o problema.
Adriano

Em 29/03/07, Ivan Guimarães Meirelles <[EMAIL PROTECTED]> escreveu:

>  Com a ajuda do colega Adriano Espinoza, construi essa Função:
>
> CREATE OR REPLACE FUNCTION "public"."livrocaixa" (date, date) RETURNS
> SETOF "public"."caixa" AS
> $body$
> declare
>        registros record;
> begin
>      for registros in
>          SELECT cx.emissao, cx.historico, cx.entrada, cx.saida,
>          (SELECT sum(x.entrada)-sum(x.saida) FROM caixa AS x WHERE
> x.idcaixa <= cx.idcaixa) as saldo
>          FROM caixa as cx where cx.emissao between $1 and $2 ORDER BY
> cx.idcaixa
>      loop
>          return next registros;
>      end loop;
>      return;
> end
> $body$
> LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;
>
> Porém ao chamar essa função o seguinte erro ocorre:
>
> ERROR:  wrong record type supplied in RETURN NEXT
> CONTEXT:  PL/pgSQL function "livrocaixa" line 9 at return next
>
> Alguém pode me ajudar ??
>
>
>
> Adriano Espinoza de Oliveira escreveu:
>
> Ivan veja se isto te ajuda:
>
> -- consulta
> select
>   q1.*,
>   saldo_cliente(q1.cliente,  q1.codigo)
> from
>   (
>   select
>     codigo, data, credito, debito, cliente
>   from
>     atc_saldo_clientes
>   where
>     cliente = 100
>   order by
>     movimento
>   ) q1
>
> --função
>
> CREATE OR REPLACE FUNCTION "public"."saldo_cliente" (integer, integer)
> RETURNS numeric AS
> $body$
> declare
>   v_cliente alias for $1;
>   v_codigo alias for $2;
>   v_saldo numeric;
> begin
>   v_saldo :=
>     (
>      select
>        cast(cast(sum(debito)-sum(credito) as numeric(12,2)) as
> numeric(12,2)) as total
>      from
>        <sua tabela>
>      where
>        cliente = v_cliente and
>        codigo <= v_codigo
>      );
>
>   return v_saldo;
> end;
> $body$
> LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;
>
>
>
> Em 29/03/07, Ivan Guimarães Meirelles <[EMAIL PROTECTED] > escreveu:
> >
> > Olá Gustavo...
> > Agradeço pela atenção...
> >
> > A função que vc me passou não retorna o saldo como esperado, o que eu
> > desejo é que a cada linha me traga o resultado de (entrada - saida +
> > saldo_anterior).
> > Observe a as tabelas que postei abaixo....
> >
> > Gustavo Garay (Lista) escreveu:
> >
> >
> > CREATE FUNCTION calcula_saldo(INTEGER, INTEGER)
> > RETURNS INTEGER AS $$
> > SELECT $1 - $2;
> > $$
> > LANGUAGE 'SQL';
> >
> >
> > en la consulta vas a llamar asi
> >
> > select campo1, campo2, calcula_saldo(entrada,salida) as saldo from
> > tutable
> >
> >
> > Gustavo
> >
> >
> >
> > ----- Original Message -----
> >  *From:* Ivan Guimarães Meirelles <[EMAIL PROTECTED]>
> > *To:* Grupo de Usuários do PostgreSQL no 
Brasil<[email protected]>
> > *Sent:* Thursday, March 29, 2007 10:49 AM
> > *Subject:* Re: [PostgreSQL-Brasil] Função para calcular saldo do
> > Caixa.
> >
> >  Sebastian Selau Webber Colombo escreveu:
> >
> > jah que vc está começando com o pg, este artigo deve servir:
> > http://www.imasters.com.br/artigo/2065/postgresql/stored_procedures/
> >
> >
> >
> > Obrigado Sebastian pela atenção...
> >
> > Muito legal esses artigos, porém não resolvem a minha dúvida. Tenho
> > uma tabela CAIXA com dados a seguir:
> >
> >   *historico
> > * *entrada
> > * *saida
> > *  Venda de Pneus
> >  1.800,00
> >  0,00
> >   Pagamento de Telefone
> >  0,00
> >  328,00
> >   Aquisição de máquinas
> >  0,00
> >  750,00
> >
> > Gostaria de escrever uma função que ao ser executada me retorne o
> > seguinte resultado:
> >
> >   *historico
> > * *entrada
> > * *saida
> > * *saldo
> > *  Venda de Pneus
> >  1.800,00
> >  0,00
> >  1.800,00
> >   Pagamento de Telefone
> >  0,00
> >  328,00
> >  1.472,00
> >   Aquisição de Máquinas
> >  0,00
> >  750,00
> >  722,00
> >
> > Ou seja, a função executaria um select na tabela CAIXA e para cada
> > linha retornada me informar o saldo.
> >
> > Eu domino bem esse tipo de função (stored procedure) no firebird, mas
> > não achei nada que mostre o caminho de como manipular as linhas retornadas
> > de um select, uma-a-uma, no PostgreSQL.
> > Se alguém puder me passar alguma dica, ficarei muito grato.
> >
> > Um abraço a todos...
> >
> >  ------------------------------
> >
> >
>
> _______________________________________________
> Grupo de Usuários do PostgreSQL no Brasil
> Antes de perguntar consulte o manual
> http://pgdocptbr.sourceforge.net/
>
> Para editar suas opções ou sair da lista acesse a página da lista em:
> http://pgfoundry.org/mailman/listinfo/brasil-usuarios
>


_______________________________________________
Grupo de Usuários do PostgreSQL no Brasil
Antes de perguntar consulte o manual
http://pgdocptbr.sourceforge.net/

Para editar suas opções ou sair da lista acesse a página da lista em:
http://pgfoundry.org/mailman/listinfo/brasil-usuarios

_______________________________________________
Grupo de Usuários do PostgreSQL no Brasil
Antes de perguntar consulte o manual
http://pgdocptbr.sourceforge.net/

Para editar suas opções ou sair da lista acesse a página da lista em:
http://pgfoundry.org/mailman/listinfo/brasil-usuarios

Responder a