montar un tree desde una DBF con FWH

En el Puchero se usa una clasificación arborescente denominada clasificación francesa y para jugar con ella la monto en un tree. Como he recibido varios correos preguntando la manera de montar el tree desde la dbf, aqui lo explico un poco.

Lo primero es montar una estructura de datos que permita ser representando en forma de arbol. Un arbol no es más que una jerarquía con varios niveles, y lo que tengo en mi dbf son varios campos -hasta 5 – para indicar en que rama del arbol estoy. Los campos se llaman FrN1, FrN2, FrN3, FrN4 y Frn5 de manera que el arbol lo veo así:

(1,0,0,0,0)
···(1,1,0,0,0)
······(1,1,1,0,0)
······(1,1,2,0,0)
···(1,2,0,0,0)

Una vez esto claro el arbol se monta así:

FUNCTION FrTreeLoad( oTree )
LOCAL oDatabase
LOCAL nStep
LOCAL oLink
LOCAL oLink1, oLink2, oLink3, oLink4, oLink5
LOCAL N1	:= 0
LOCAL N2	:= 0
LOCAL N3	:= 0
LOCAL N4	:= 0
oLink := oTree:GetRoot()
SELECT FR
FR->(DbGoTop())
DO WHILE ! FR->(EOF())
···IF FR->FrN2 == 0
······oLink1 := oLink:AddLastChild(FR->FrTipo,IIF(FR->FrHoja,1,2),IIF(FR->FrHoja,1,2),.t.)
······oLink1:Cargo := Str(FR->Frn1,2)+Str(FR->Frn2,2)+Str(FR->Frn3,2)+Str(FR->Frn4,2)+Str(FR->Frn5,2)
···ELSEIF FR->FrN3 == 0
······oLink2 := olink1:AddLastChild(FR->FrTipo,IIF(FR->FrHoja,1,2),IIF(FR->FrHoja,1,2),.t.)
······oLink2:Cargo := Str(FR->Frn1,2)+Str(FR->Frn2,2)+Str(FR->Frn3,2)+Str(FR->Frn4,2)+Str(FR->Frn5,2)
···ELSEIF FR->FrN4 == 0
······oLink3 := olink2:AddLastChild(FR->FrTipo,IIF(FR->FrHoja,1,2),IIF(FR->FrHoja,1,2),.t.)
······oLink3:Cargo := Str(FR->Frn1,2)+Str(FR->Frn2,2)+Str(FR->Frn3,2)+Str(FR->Frn4,2)+Str(FR->Frn5,2)
···ELSEIF FR->FrN5 == 0
······oLink4 := olink3:AddLastChild(FR->FrTipo,IIF(FR->FrHoja,1,2),IIF(FR->FrHoja,1,2),.t.)
······oLink4:Cargo := Str(FR->Frn1,2)+Str(FR->Frn2,2)+Str(FR->Frn3,2)+Str(FR->Frn4,2)+Str(FR->Frn5,2)
···ELSE
······oLink5:= oLink4:AddLastChild(FR->FrTipo,IIF(FR->FrHoja,1,2),IIF(FR->FrHoja,1,2),.t.)
······oLink5:Cargo := Str(FR->Frn1,2)+Str(FR->Frn2,2)+Str(FR->Frn3,2)+Str(FR->Frn4,2)+Str(FR->Frn5,2)
ENDIF
FR->(DbSkip())
ENDDO
oTree:UpdateTV()
oTree:SetFocus()
RETURN NIL

Lo que hago es recorrer el DBF que tengo ordenado por la concatenación de los 5 campos y cuando cambio de nivel añado una rama al nivel inferior.

El resultado:

5 comentarios en «montar un tree desde una DBF con FWH»

  1. Hola Jose Luis
    Este mensaje no es para comentar acerca de la construcción del Tree sino para felicitarte por el resultado de esa implementacion.
    He visto El Puchero, Colossus – creo que se escribe asi 8)- y ahora este ejemplo de clasificación francesa y me he quedado impresionado por el buen gusto en los colores y el diseño, como dice el dicho «Una imagen vale más que mil palabras».
    La verdad que esto de la programación es todo un arte, y hay que ir cada dia aprendiendo un poco más, imitando a los más aventajados.
    Saludos cordiales desde Chile.

  2. Hola:

    Antes de nada enhorabuena por tus programas y por tu blog. Se agradece que alguien español explique como ser un micro-isv.

    Quería hacerte una puntualización sobre tu post: creo que la estructura para almacenar la información no es todo lo buena que podría ser. Me explico: ¿qué ocurre si necesitas más de 5 niveles? ¿qué ocurre si hay incongruencias en el modelo de datos?
    Yo, para resolver el mismo problema, he utilizado la siguiente estructura: cada registro representa un nodo del árbol, con su código y descripción (podría tener más datos como el estado o el icono…). Además se añade un campo llamado «padre» que contiene el código del nodo padre.
    De este modo, puedes «enlazar» unos nodos hijos con el padre (único)
    La algoritmia es un poco más compleja, ya que tienes que ir recorriendo la tabla y buscando el padre, pero la estructura de datos es bastante más flexible.

    Bueno, enhorabuena de nuevo y un saludo

    JM – http://www.lawebdejm.com

Los comentarios están cerrados.