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 Expand view RUN
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 )
//------------------------------------------------------------------------------