Re: Cursores

From: Gabriel Hermes Colina Zambra <hermeszambra(at)yahoo(dot)com>
To: María Lorena Culzoni Estigarribia <lorenaculzoni_2(at)hotmail(dot)com>, Ayuda de postgres <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Cursores
Date: 2008-05-27 03:25:12
Message-ID: 580256.58422.qm@web63709.mail.re1.yahoo.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda


Te mando un ejemplo de como resuelvo este tipo de
problemas

CREATE OR REPLACE FUNCTION
"acreedores"."fnc_inserto_estado_acree" (date,
integer, date) RETURNS date AS
$body$
declare
v_desde alias for $1;
v_id_empresa alias for $2;
v_hasta alias for $3;
curtime date;
nsaldo double precision;
nmoneda integer;
nempresa integer;
restados RECORD;
rmonedas RECORD;
rempresas RECORD;
rsaldo_ant RECORD;
BEGIN
curtime :='now';
nsaldo :=0;
delete from acreedores.estado_acreedores;
if $2 <> 0 then
insert into acreedores.estado_acreedores

(id_moneda,id_corr,id_empresa,empresa,categoria_empresa,

id_documentos,documento,serie,numero,fecha,debe,haber,saldo)
select central.cestados_acreedores.id_moneda,0 as
id_corr,central.cestados_acreedores.id_empresa,
empresa,categoria_empresa,0 as id_documentos,
'Saldo anterior al ' || $1 as documento,'S' as
serie,
0 as numero,$1 as fecha,sum(debe) as
debe,sum(haber) as haber,sum(debe)+sum(haber) as saldo
from central.cestados_acreedores
where fecha<$1 and id_empresa=$2
group by
central.cestados_acreedores.id_moneda,central.cestados_acreedores.id_empresa,
empresa,categoria_empresa;
else
insert into acreedores.estado_acreedores

(id_moneda,id_corr,id_empresa,empresa,categoria_empresa,

id_documentos,documento,serie,numero,fecha,debe,haber,saldo)
select central.cestados_acreedores.id_moneda,0 as
id_corr,central.cestados_acreedores.id_empresa,
empresa,categoria_empresa,0 as id_documentos,
'Saldo anterior al ' || $1 as documento,'S' as
serie,
0 as numero,$1 as fecha,sum(debe) as
debe,sum(haber) as haber,sum(debe)+sum(haber) as saldo
from central.cestados_acreedores
where fecha<$1
group by
central.cestados_acreedores.id_moneda,central.cestados_acreedores.id_empresa,
empresa,categoria_empresa;
end if;

if $2 <> 0 then
for rmonedas IN select id_moneda from
central.cestados_acreedores where id_empresa=$2 group
by id_moneda loop
select saldo INTO rsaldo_ant from
acreedores.estado_acreedores where
id_moneda=rmonedas.id_moneda and id_empresa=$2 and
numero=0;
nsaldo:=coalesce(rsaldo_ant.saldo,0);
for restados in select
id_moneda,cotizacion,id_corr,

id_empresa,empresa,categoria_empresa,id_documentos
,documento,serie,numero,fecha,debe,haber
from central.cestados_acreedores where
fecha>=$1 and id_empresa=$2 and fecha<=$3
and id_moneda=rmonedas.id_moneda order by
id_moneda,id_empresa,fecha,id_corr
loop

nsaldo:=coalesce(nsaldo,0)+coalesce(restados.debe,0)+coalesce(restados.haber,0);
insert into acreedores.estado_acreedores
(id_moneda,cotizacion,id_corr,

id_empresa,empresa,categoria_empresa,id_documentos

,documento,serie,numero,fecha,debe,haber,saldo)

values(restados.id_moneda,restados.cotizacion,restados.id_corr,

restados.id_empresa,restados.empresa,restados.categoria_empresa,restados.id_documentos

,restados.documento,restados.serie,restados.numero,restados.fecha,restados.debe,restados.haber,
nsaldo);
end loop;
end loop;
else
for restados in select
id_moneda,cotizacion,id_corr,
id_empresa,empresa,categoria_empresa,id_documentos
,documento,serie,numero,fecha,debe,haber
from central.cestados_acreedores where fecha>=$1
and fecha<=$3
order by id_moneda,id_empresa,fecha,id_corr
loop
if nempresa<>restados.id_empresa or
nmoneda<>restados.id_moneda then
select saldo INTO rsaldo_ant from
acreedores.estado_acreedores where
id_moneda=restados.id_moneda and
id_empresa=restados.id_empresa and numero=0;
nsaldo:=coalesce(rsaldo_ant.saldo,0);
nempresa:=restados.id_empresa;
nmoneda:=restados.id_moneda;
end if;

nsaldo:=coalesce(nsaldo,0)+coalesce(restados.debe,0)+coalesce(restados.haber,0);
insert into acreedores.estado_acreedores
(id_moneda,cotizacion,id_corr,
id_empresa,empresa,categoria_empresa,id_documentos
,documento,serie,numero,fecha,debe,haber,saldo)

values(restados.id_moneda,restados.cotizacion,restados.id_corr,

restados.id_empresa,restados.empresa,restados.categoria_empresa,restados.id_documentos

,restados.documento,restados.serie,restados.numero,restados.fecha,restados.debe,restados.haber,
nsaldo);
end loop;
end if;

delete from acreedores.estado_acreedores where
fecha>$3;
UPDATE acreedores.estado_acreedores set debe=0,haber=0
where numero=0 and serie='S';
RETURN curtime;
END;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT
SECURITY INVOKER;

Pero planteame tus objetivos y te doy una manito.

Atte.
Gabriel Colina

____________________________________________________________________________________
Yahoo! Deportes Beta
¡No te pierdas lo último sobre el torneo clausura 2008! Entérate aquí http://deportes.yahoo.com

In response to

  • Cursores at 2008-05-26 00:48:09 from María Lorena Culzoni Estigarribia

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Agustin Ignacio Genoves 2008-05-27 11:48:47 Problemas concatenando en un EXECUTE
Previous Message Jaime Casanova 2008-05-26 23:58:39 Re: RV: Consulta Postgres 8.3