desculpe,
onde tem r é registros! ficaria assim

     linha.emissao = registros.emissao;
     linha.historico = registros.emissao;
     linha.entrada = registros.entrada;
     linha.saida = registros.saida;
     linha.saldo = registros.saldo;

Em 30/03/07, Tiago Athayde <[EMAIL PROTECTED]> escreveu:

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