Ver Mensaje Individual
  #11 (permalink)  
Antiguo 15/04/2010, 08:40
Avatar de calakra
calakra
 
Fecha de Ingreso: septiembre-2009
Mensajes: 182
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: arbol jerarquico

que onda, pues lo prometido es deuda aquí les dejo el árbol jerárquico hecho en programación postgresql totalmente dinamico. en primera les mostrare la tabla usada

se tiene una tabla de esta forma
* Tabla «public.org_int»
Columna | Tipo | Modificadores
-----------------+------------------------+---------------
id_org | bigint | not null
name | character varying | not null
id_parent | bigint |
*/
donde el id_org es el ID del usuario y llave primaria,
name, es el nombre del usuario y es lo que se vaa mostrar
el ID_parent es el di del jefe, en este caso a quien la persona responde.

lo primero que hay que saber es que los jefes no responden a nadie por lo tanto ese campo es NULL o '' y por ahi empieza este codigo.

NOTA: ahi puse varios criterios pero esos son personales.


CREATE or replace FUNCTION arbol ( ) RETURNS text AS '
DECLARE

/*se definen el principio del query y la mitade del mismo*/
cab text:=''SELECT jefes1.name Nivel1'';
pie text:='' FROM (select id_org id,name , id_parent responden from org_int where id_parent is null AND id_company=3 AND id_company=3) AS jefes1 '';
/*auxiliar de pie y cab*/
auxpie text:='''';
auxcab text:='''';
/*se declara el record*/
idresponde record;
/*contador de nieveles */
contnivel int:=1;
/*bandera auxiliar para salir de la funcion*/
ban1 int:=0;
ban2 int:=0;
inicio int:=0;--usado para los loops
salida int:=0;--pasa salir del loop

/*se define la variav le que contensdra los idresponde*/
criterio1 text:='''';
criterio2 text:='''';
criterio3 text:='''';
criterio4 text:='''';

BEGIN
LOOP
/*primero reviso si exixte gene debajo del arbol para empezar*/
IF inicio=0 then
FOR idresponde IN select id_org from org_int where id_parent is null AND id_company=3 AND id_company=3 LOOP
ban1:=1;-- es por que contien datos e array
if criterio1<>'''' then
criterio1:=criterio1||'','';
end if;
criterio1:=criterio1|| RTRIM( LTRIM( idresponde::text , ''('') ,'')'');
END LOOP;
inicio=3;

ELSE
criterio3 := ''select id_org from org_int where id_parent in (''||criterio2||'')AND id_company=3 AND id_company=3'';
FOR idresponde IN EXECUTE criterio3 LOOP
ban1:=1;-- es por que contien datos e array
if criterio1<>'''' then
criterio1:=criterio1||'','';-- a la variable tipo record sele concatena una coma para usarlo en el IN
end if;
criterio1:=criterio1|| RTRIM( LTRIM( idresponde::text , ''('') ,'')''); -- de la variable tipo record se le quitan los parentesis
END LOOP;


END if;

IF ban1=1 then --si no viene vacio el criterio1, quiere decir que tiene un nivel
criterio2:=criterio1;
criterio1:='''';
contnivel:=contnivel+1;
ban1=0;
criterio3:='''';

else
EXIT WHEN ban1=0;--salir!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

END IF;
cab=cab||'',jefes''||contnivel||''.name nivel''||contnivel||'''';
pie=pie||'' left join (select o1.id_org id,o1.name , o1.id_parent responden from org_int o1, org_int o2 where o1.id_parent=o2.id_parent AND o1.id_parent in (''||criterio2||'') AND o1.id_company=3 GROUP BY o1.id_org ,o1.name , responden )as jefes''||contnivel||'' on jefes''||contnivel-1||''.id= jefes''||contnivel||''.responden'';


END LOOP;
return cab||pie; --concatena el inicio y el final del query



END;
' LANGUAGE 'plpgsql';


y unicamente para llamarlo se pone


select arbol()



NOTA: esta funcion solo arroja el query (cadena de texto) aun no se como hacer para que mande la busqueda. espero me puedan ayudar con eso.


GRACIAS al HUESOS por echarme la manita. y por aqui seguimos.