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] <mailto:[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 <mailto:[EMAIL PROTECTED]>
        *To:* Grupo de Usuários do PostgreSQL no Brasil
        <mailto:[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/
        <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

Responder a