--- 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:< http://espanol.sports.yahoo.com/ -- TIP 4: No hagas 'kill -9' a postmaster
RE: [pgsql-es-ayuda] Recorrer un Refcursor
Gabriel Hermes Colina Zambra Wed, 26 Nov 2008 06:47:29 -0800
- [pgsql-es-ayuda] Recorrer un Refcursor Fernando Siguenza
- Re: [pgsql-es-ayuda] Recorrer un Refcurs... Agustin Ignacio Genoves
- RE: [pgsql-es-ayuda] Recorrer un Ref... Fernando Siguenza
- Re: [pgsql-es-ayuda] Recorrer un... Fernando Fontana
- RE: [pgsql-es-ayuda] Recorre... Fernando Siguenza
- Re: [pgsql-es-ayuda] Re... Javier Chávez B.
- RE: [pgsql-es-ayuda] Re... Gabriel Hermes Colina Zambra
- RE: [pgsql-es-ayuda] Recorrer un Refcurs... Fernando Hevia
- RE: [pgsql-es-ayuda] Recorrer un Ref... Fernando Siguenza
- Re: [pgsql-es-ayuda] Recorrer un... Alvaro Herrera
- RE: [pgsql-es-ayuda] Recorrer un... Fernando Hevia