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