--- El mié 26-nov-08, Fernando Siguenza <[EMAIL PROTECTED]> escribió:

> De: Fernando Siguenza <[EMAIL PROTECTED]>
> Asunto: RE: [pgsql-es-ayuda] Recorrer un Refcursor
> A: [EMAIL PROTECTED]
> Cc: "Foro Postgres" <pgsql-es-ayuda@postgresql.org>
> Fecha: miércoles, 26 noviembre, 2008, 10:54 am
> No el update 
> CURRENT OF cursor_name, 
> Lo que hace es actualizar una tabla y yo lo que necesito es
> 
>  actualizar los datos que tengo en un cursor, esto es lo
> que necesito a ver si me ayudan de pronto a encontrar otra
> solucion,
> 
> Tengo una tabla de asientos donde ago el siguiente select,
>  
> open rfcursor for 
>      select asidoc,' ' as
> documento,asinum,asidebe,asihaber,0.00 as saldo from
> asientos
> algo asi
>     CD,'',1,10,0,0.0
>     CD,'',2,15,0,0.0
>     CD,'',3,0,3,0.0
>     FA,'',1,17,0,0.0
> 
> ahora este resultado me retona la columna documento en
> blanco y la columna saldo todo en cero,
> entonces quiero recorrer este cursor para hacer el select
> del nombre del documento que esta en otra tabla y ponerlo en
> el cursor y a la columna del saldo poner la resta del debe -
> haber. Necesitando tener algo asi
> 
>     CD,'COMPROBANTE DIARIO',1,10,0,10.0
> 
>     CD,'COMPROBANTE DIARIO',2,15,0,15.0
> 
>     CD,'COMPROBANTE DIARIO',3,0,3,-3.0
> 
>     FA,'FACTURA VENTA',1,17,0,17.0
> 
> Y finalmente retornar este cursor
> Entonces como digo necesito es poder recorrer el cursor y
> actualizar los datos del mismo, o hay alguna otra forma de
> hacer esto con cursores????
> Gracias de antemano
> 
> Date: Tue, 25 Nov 2008 23:23:23 -0200
> From: [EMAIL PROTECTED]
> To: [EMAIL PROTECTED]
> Subject: Re: [pgsql-es-ayuda] Recorrer un Refcursor
> CC: pgsql-es-ayuda@postgresql.org
> 
> Hola,
> creo que lo que estás buscando es el "update ...
> where current of nombrecursor". fijate en
> http://www.postgresql.org/docs/8.3/static/sql-update.html
> 
> 
> saludos
> 
> El 25 de noviembre de 2008 21:33, Fernando Siguenza
> <[EMAIL PROTECTED]> escribió:
> 
> 
> 
> 
> 
> 
> Si lo lei pero no me dice nada de como actualizar un campo
> de un registro del cursor, estoy buscando parec ser algo
> como 
> 
>  
> 
> select
> asicab.asiagecod,asicab.asifec,asicab.asidoc,asicab.asinum,0.00000
> as saldo
>  from asicab for update 
> 
>  
> 
> o algo asi 
> 
> lyego con una sentencia update actualizo los datos del
> cursor, pero todavia no doy con la respuesta
> 
>  
> 
> Gracias por responder
> 
> > Date: Tue, 25 Nov 2008 21:13:48 -0200
> > From: [EMAIL PROTECTED]
> > To: [EMAIL PROTECTED]
> 
> > Subject: Re: [pgsql-es-ayuda] Recorrer un Refcursor
> > CC: pgsql-es-ayuda@postgresql.org
> > 
> > Creo que aca esta todo lo que necesitas, no se si lo
> viste
> 
> >
> http://www.postgresql.org/docs/8.3/static/plpgsql-cursors.html
> > 
> > 2008/11/25 Fernando Siguenza
> <[EMAIL PROTECTED]>:
> 
> > > Amigos como estan, sigo molestandoles con
> preguntitas, necesito que me
> > > ayuden con un problemita,
> > >
> > > como hago para recorrer y manipular un refcursor,
> tengo algo como esto
> > >
> 
> > > CREATE OR REPLACE FUNCTION prueba(agencia
> varchar) RETURNS refcursor AS $$
> > > DECLARE
> > > cMayor refcursor;
> > >
> > > BEGIN
> > > open cMayor for
> > > select
> 
> > >
> asicab.asiagecod,asicab.asifec,asicab.asidoc,asicab.asinum,0.00000
> as saldo
> > > from asicab;
> > > aqui como hago para recorrer el refcursor y
> cambiar el valor de la
> > > columna saldo por algun valor
> 
> > > RETURN NEXT cMayor;
> > > END;
> > > $$
> > > LANGUAGE 'plpgsql';
> > >
> > > Gracias
> > >
> > > ________________________________
> > > See how Windows(R) connects the people,
> information, and fun that are part of
> 
> > > your life
> 
> 
> Get 5 GB of storage with Windows Live Hotmail. Sign up
> today.
> 
> 
> 
> _________________________________________________________________
> Windows Live Hotmail now works up to 70% faster.
> http://windowslive.com/Explore/Hotmail?ocid=TXT_TAGLM_WL_hotmail_acq_faster_112008

Mira no es tan dificil
Igualmente yo solucione con otro metodo, incluso podes usar una tabla temporal 
y no auxiliar como yo y el rendimiento es buenisimo

formula numero 1

CREATE OR REPLACE FUNCTION "deudores"."fnc_inserto_estado" (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;
nmoneda :=0;
nempresa := 0;
delete from deudores.estado_deudores;
if $2 <> 0 then
   insert into deudores.estado_deudores
   (id_moneda,id_corr,id_empresa,empresa,categoria_empresa,
   id_documentos,documento,serie,numero,fecha,debe,haber,saldo)
   select  central.cestados_deudores.id_moneda,0 as 
id_corr,central.cestados_deudores.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_deudores
   where fecha<$1 and id_empresa=$2
   group by 
central.cestados_deudores.id_moneda,central.cestados_deudores.id_empresa,
   empresa,categoria_empresa;
else
   insert into deudores.estado_deudores
   (id_moneda,id_corr,id_empresa,empresa,categoria_empresa,
   id_documentos,documento,serie,numero,fecha,debe,haber,saldo)
   select  central.cestados_deudores.id_moneda,0 as 
id_corr,central.cestados_deudores.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_deudores
   where fecha<$1
   group by 
central.cestados_deudores.id_moneda,central.cestados_deudores.id_empresa,
   empresa,categoria_empresa;
end if;

if $2 <> 0 then
   for rmonedas IN select id_moneda from central.cestados_deudores where 
id_empresa=$2 group by id_moneda loop
       select saldo INTO rsaldo_ant from deudores.estado_deudores 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_deudores 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 deudores.estado_deudores
            (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_deudores 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 deudores.estado_deudores 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 deudores.estado_deudores
    (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 deudores.estado_deudores  where fecha>$3;
UPDATE deudores.estado_deudores set debe=0,haber=0 where numero=0 and serie='S';
RETURN curtime;
END;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;


Bueno espero te sirva, incluso para acreedores probe recientemente otra forma 
que fue mas rapida aun por que no abuso de los insert.

Un abrazo



      ¡Todo sobre la Liga Mexicana de fútbol! Estadisticas, resultados, 
calendario, fotos y más:&lt;
http://espanol.sports.yahoo.com/
--
TIP 4: No hagas 'kill -9' a postmaster

Responder a