Page 1 of 1

APORTE - Arbol

Posted: Sat Dec 05, 2020 11:00 pm
by goosfancito
Luego de bastante tiempo logre lo que necesitaba,
les dejo el codigo para que lo usen modifiquen y aporten.

Para probar solamente use un array pero la idea es que ese "array" luego se lo tome desde un mysql.

Code: Select all

METHOD inicializar()
   LOCAL aDatos := { }

   /*
   Transfiero un array, que tiene 4 posiciones,
   la primera es el texto que se va a mostrar en el arbol
   la segunda le paso un numero cualquiera que despues va a ser reemplazado por el hitem()
   la tercera es el INDICE, necesario para luego usarlo al momento de crear las ramas
   la cuarta le indica en que "rama" debe insertarse el item y tiene que estar ORDENADO
   */

   aDatos := { ;
               { "Raiz",   1, 1, 0 }, ;
               { "uno",    1, 2, 1 }, ;
               { "dos",    1, 3, 1 }, ;
               { "tres",   1, 4,  1 }, ;
               { "cuatro", 1, 5,  1 }, ;
               { "cinco",  1, 6, 2 }, ;
               { "seis",   1, 7, 3 }, ;
               { "siete",  1, 8, 3 }, ;
               { "ocho",   1, 9, 3 }, ;
               { "nueve",  1, 10,  5 }, ;
               { "diez",   1, 11,  5 }, ;
               { "once",   1, 12,  10 }, ;
               { "doce",   1, 13,  12 }, ;
               { "trece",  1, 14,  13 } ;
             }

   AAdd( ::aItems, ::oTree:ADD( aDatos[ 1 ][ 1 ] ) )

   aDatos[ 1 ][ 2 ] := ::aItems[ Len( ::aItems ) ]:hitem()
   ::recursivo( ::aItems[ 1 ], aDatos, 2, 1 )

   ::otree:expandall()

   RETURN ( NIL )

//---------------------------------------------------------------------------------------

METHOD recursivo( oItem, aDatos, nInicio, nIdNodo)
   LOCAL nPosicion

   DO WHILE nInicio <= Len( aDatos )
      IF ( nIdNodo == aDatos[ nInicio ][ 4 ] )    // A
         AAdd( ::aItems, oItem:ADD( aDatos[ nInicio ][ 1 ] ) )
         aDatos[ nInicio ][ 2 ] := ::aItems[ Len( ::aItems ) ]:hitem()
      ELSE
         nPosicion := AScan( aDatos, { | x | x[ 3 ] == aDatos[ nInicio ][ 4 ] } ) //B
         ::recursivo( ::aItems[ nPosicion ], aDatos, @nInicio, aDatos[ nInicio ][ 4 ] ) //C
      ENDIF
      nInicio ++
   ENDDO

   RETURN ( NIL )

//------------------------------------------------------------------------------

 

Re: APORTE - Arbol

Posted: Sun Dec 06, 2020 9:01 am
by Antonio Linares