Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » PostgreSQL »

Crear función que se recorra a ella misma

Estas en el tema de Crear función que se recorra a ella misma en el foro de PostgreSQL en Foros del Web. Hola amigos de FDW, vengo nuevamente pidiendo de su ayuda, ya que necesito orientación sobre lo que tengo que realizar. Resulta que tengo que crear ...
  #1 (permalink)  
Antiguo 09/04/2013, 15:53
Avatar de jlct  
Fecha de Ingreso: abril-2012
Ubicación: Venezuela
Mensajes: 148
Antigüedad: 12 años
Puntos: 19
Crear función que se recorra a ella misma

Hola amigos de FDW, vengo nuevamente pidiendo de su ayuda, ya que necesito orientación sobre lo que tengo que realizar.

Resulta que tengo que crear una función en PostgreSQL para sumar el valor en 3 columnas según la ID que envie de parametro (Eso es lo fácil), lo complicado esta que esa ID se encuentra en una tabla que manejo como árbol. es decir que necesito que el trigger me recorra todo el árbol y me vaya acumulando hasta que llegue al final.

Explico lo del árbol:

en una tabla tengo la ID que es huérfano, pero en la misma tabla esa ID es padre de otros registros, y esos registros tienen sus hijos, así sucesivamente. Necesito la suma de las 3 columnas segun todos esos registros, y la manera que se me ocurre es crear una función que recorra todo el árbol.

Esta algo complicado, pero no se si me puedan ayudar.

Nota: la ID que voy a capturar de la tabla del árbol es la que usare como filtro para sumar los valores de las 3 columnas, no es en la misma tabla.
  #2 (permalink)  
Antiguo 16/04/2013, 07:16
Avatar de jlct  
Fecha de Ingreso: abril-2012
Ubicación: Venezuela
Mensajes: 148
Antigüedad: 12 años
Puntos: 19
Respuesta: Crear función que se recorra a ella misma

Hola Buenos días, ya encontré la solución a lo que buscaba y quiero compartirla por si a alguien le sirve.

Código:
CREATE OR REPLACE FUNCTION cust_fact_acct_summary(p_account_id numeric,p_ad_client_id numeric) RETURNS SETOF RECORD AS 
$BODY$
DECLARE 
rs record;
recor record;
rsl record;
sumary char(1);
BEGIN
    IF $1 is null THEN 
        FOR rsl IN Select rsu.c_elementvalue_id, rsu.pa_reportline_id from c_elementvalue ev inner join pa_reportsource rsu on ev.c_elementvalue_id = rsu.c_elementvalue_id where ev.ad_client_id = $2
        LOOP 
            FOR rs IN Select Distinct rsl.pa_reportline_id, rsl.c_elementvalue_id,DATEACCT, AmtSourceDR, AmtSourceCR, AmtSourceN from cust_fact_acct_summary(rsl.c_elementvalue_id,$2) AS (Account_ID numeric, DATEACCT timestamp, AmtSourceDR numeric, AmtSourceCR numeric, AmtSourceN numeric)
            LOOP 
                return next rs;
            END LOOP;
        END LOOP;
    ELSE 
        sumary := (Select issummary from c_elementvalue where c_elementvalue_id = $1);
        IF sumary = 'Y' THEN
            FOR recor IN Select node_id from ad_treenode tn inner join ad_tree t on tn.ad_tree_id = t.ad_tree_id where parent_id = $1 and t.treetype = 'EV' 
            LOOP
                FOR rs IN Select * from cust_fact_acct_summary(recor.node_id,$2) AS (Account_ID numeric, DATEACCT timestamp, AmtSourceDR numeric, AmtSourceCR numeric, AmtSourceN numeric)
                LOOP 
                    return next rs;
                END LOOP;
            END LOOP;
        ELSE 
            FOR rs in Select Account_ID, DATEACCT, Sum(AmtSourceDR) as AmtSourceDR,Sum(AmtSourceCR) As AmtSourceCR,Sum(AmtSourceDR-AmtSourceCR) as AmtSourceN From FACT_ACCT where Account_ID = $1 Group By Account_ID,DATEACCT
            LOOP 
                return next rs;
            END LOOP;
        END IF;
    END IF;
END;
$BODY$
LANGUAGE 'plpgsql'

Etiquetas: funcion
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:40.