Skip site navigation (1) Skip section navigation (2)

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 (view raw or flat)
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 =?iso-8859-1?Q?Mar=EDa_Lorena_Culzoni_Estigarribia?=

pgsql-es-ayuda by date

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

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group