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

arbol jerarquico

Estas en el tema de arbol jerarquico en el foro de PostgreSQL en Foros del Web. Buen dia, aqui tengo unos problemas, soy un poco nuevo usando postgresql y mas en funciones, me dejaron hacer un arbol jerarquico de forma dinamica ...
  #1 (permalink)  
Antiguo 11/04/2010, 00:21
Avatar de calakra  
Fecha de Ingreso: septiembre-2009
Mensajes: 182
Antigüedad: 15 años, 3 meses
Puntos: 0
arbol jerarquico

Buen dia,
aqui tengo unos problemas, soy un poco nuevo usando postgresql
y mas en funciones, me dejaron hacer un arbol jerarquico de forma dinamica mostrando solo el nombre
la tabla (para facilidad) solo tiene estas columnas


id,nombreusuario,idjefe

se me ocurre que se puede empesar buscando a los usuarios que no tengan un idjefe, ya que son los jefes de la empresa y no responden ante nadie.

de forma "estatica" es facil hacerla, pero la quieren en forma dinamica.
espero me puedan ayudar o dar ideas de como se puede hacer.


gracias.
  #2 (permalink)  
Antiguo 11/04/2010, 00:24
Avatar de calakra  
Fecha de Ingreso: septiembre-2009
Mensajes: 182
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: arbol jerarquico

pro cierto, no me dejan agregar otra columna a la base de datos por que no le quieren cargar la mano al programador o por posibles errores en el sistema ya que esta en produccion.
  #3 (permalink)  
Antiguo 11/04/2010, 10:02
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 10 meses
Puntos: 360
Respuesta: arbol jerarquico

Podrías poner lo que quieres con un ejemplo?

No logro entender que es lo que necesitas.

saludos calakra
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #4 (permalink)  
Antiguo 11/04/2010, 20:10
Avatar de calakra  
Fecha de Ingreso: septiembre-2009
Mensajes: 182
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: arbol jerarquico

tengo la siguiente tabla
id nombre idjefe
1 juan
2 omar 1
3 carlos 1
8 ivan 3
10 oscar 2
14 perez 3
20 mau 3
67 jefe
89 rosa 14

la tabla quedaria asi

jefe
juan omar oscar
juan carlos ivan
juan carlos perez rosa
juan carlos mau



los jefes o de mayor jerarquia no responden a nadie por lo tanto su idjefe es null
  #5 (permalink)  
Antiguo 12/04/2010, 07:37
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 10 meses
Puntos: 360
Respuesta: arbol jerarquico

calakra... creo que te entiendo un poco mas.

Te dejo un link muy bueno donde explican las consultas jerarquicas usando mysql.
http://dev.mysql.com/tech-resources/...ical-data.html
De igual forma te sirve, ya que la sintaxis de las consultas usadas en el articulo son hechas en SQL estándar también soportado por postgresql.

saludos y espero te sirva.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #6 (permalink)  
Antiguo 12/04/2010, 09:13
Avatar de calakra  
Fecha de Ingreso: septiembre-2009
Mensajes: 182
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: arbol jerarquico

esta muy bueno lo que me mandaste, pero lo malo es que no me dejan moverle a la base de datos, no quieren crear mas tablas, agregar mas campos por que como lo dije anteriormente no le queiren cargar la mano al programador, esta muy bien lo que me mandaste, pero lo que yo quiero es que con esos tres campos (que de hecho solo se usan dos) hacer el arbol dinamico.


pero gracias, lo que me mandaste ya esta en mis marcadores para un futuro.
  #7 (permalink)  
Antiguo 12/04/2010, 12:12
Avatar de calakra  
Fecha de Ingreso: septiembre-2009
Mensajes: 182
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: arbol jerarquico

bueno, pues voy avanzando un poco a poco con esto del arbol. espero terminarlo y lo pondre por aqui.
mientras me atore con un renglón

digamos que tenemos esto


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

id_responde record; -- s declara el array

criterio text='''';
auxcriterio text='''';

BEGIN
FOR id_responde IN select id_org from org_int where id_parent =prueba::bigint AND id_company=3 AND id_company=3 LOOP
if criterio<>'''' then
criterio:=criterio||'','';
end if;
criterio:=criterio|| RTRIM( LTRIM( id_responde::text , ''('') ,'')'');

END LOOP;

--////////////////////////////
if criterio<>'''' then
ban:=1;
auxcriterio:=criterio;
criterio:='''';
end if;
criterio := ''select id_org from org_int where id_parent in (''||auxcriterio||'') AND id_company=3 AND id_company=3'';

FOR id_responde IN criterio loop
end loop;




return criterio;
END;
' LANGUAGE 'plpgsql';

en la parte de color es donde esta mi error, ya que postgresql no lle lo que tiene la variable criterio, si no que solo la identifica como variable.
io quiero que ahi no vea la variable como tal, sino que lea lo que trae la variable. espero me puedan ayudar
  #8 (permalink)  
Antiguo 12/04/2010, 12:16
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 10 meses
Puntos: 360
Respuesta: arbol jerarquico

Cita:
en la parte de color es donde esta mi error, ya que postgresql no lle lo que tiene la variable criterio, si no que solo la identifica como variable.
io quiero que ahi no vea la variable como tal, sino que lea lo que trae la variable. espero me puedan ayudar
Ya la tienes en una variable, pero debes ejecutarla cuando se la pases al for.
FOR id_responde IN EXECUTE criterio loop
end loop;


Saludos y espero te sirva.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #9 (permalink)  
Antiguo 12/04/2010, 13:31
Avatar de calakra  
Fecha de Ingreso: septiembre-2009
Mensajes: 182
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: arbol jerarquico

muchas gracias.
creo que con esto ya quedo.
ahora solo tengo que hacer bien mi algoritmo para poder hacer bien el arbol. muchas gracias, en cuanto quede el arbol (si esque queda) subo el cofigo para que lo vean.
  #10 (permalink)  
Antiguo 13/04/2010, 11:43
Avatar de calakra  
Fecha de Ingreso: septiembre-2009
Mensajes: 182
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: arbol jerarquico

Que onda, mira ya quedo, ya me genera una cadena la cual es un query. lo unico que me falta es ejecutarlo. como hago eso?? ya para subirlo. gracias!!!
  #11 (permalink)  
Antiguo 15/04/2010, 08:40
Avatar de 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.

Etiquetas: arboles
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 00:31.