Creación dinámica de cuadros de árbol JSL a partir de datos jerárquicos¿Alguien puede sugerir un método para crear un cuadro de árbol anidado dinámico utilizando datos jerárquicos? Lo intenté durante un par de horas esta noche y me confunde 
Tengo algunos datos ficticios a continuación para representar las relaciones que tienen tres niveles de profundidad. Obviamente, no quiero codificar esto porque no sabré de antemano cuántos niveles de "anidamiento" necesitaré realizar. En realidad serán 10 o más niveles.
Saludos, Troya.
Esto es con lo que estoy empezando (Tabla adjunta)

esto es lo que quiero generar

Automatización y secuencias de comandosRe: Creación dinámica de cuadros de árbol JSL a partir de datos jerárquicosparece que el código se truncó
Re: Creación dinámica de cuadros de árbol JSL a partir de datos jerárquicosGracias por informar el problema con la imposibilidad de reabrir un nodo cerrado. @Craige_Hales .El error se solucionó en JMP 17.
Re: Creación dinámica de cuadros de árbol JSL a partir de datos jerárquicosSí estoy de acuerdo. Solución muy elegante. Me dirigía por el camino del seguimiento de las relaciones entre padres e hijos y las cosas empezaban a complicarse.
Gracias a todos por las respuestas, muchos fragmentos de código excelentes.
- Troya
Re: Creación dinámica de cuadros de árbol JSL a partir de datos jerárquicosLos diagramas de espina de pescado tienen un menú contextual para reorganizarlos. Todos usan el mismo árbol de displaybox. Es posible agregar otros controles al árbol, similares a la etiqueta. La plataforma se esconde en Analizar->CalidadYProceso->Diagrama.
dt = Open("/Z:/DummyTable.csv");
diagram = dt << diagram(parent(MGR_ID),child(EMP_ID),label(FULL_NAME));
// fishbone is the default, change it like this:
(report(diagram)[hierbox(1)])<<CHANGETYPE></CHANGETYPE>
NestedNestedAnidado
FishboneFishboneEspina
HierarchyHierarchy Jerarquía
Editar: parece que es posible que la plataforma de diagramas no pueda reabrir un nodo cerrado en JMP 15/16 (a través del menú emergente). En JMP 14 puede hacerlo. He informado del problema.
Re: Creación dinámica de cuadros de árbol JSL a partir de datos jerárquicos@ataqueerrático
¡Gran solución!
Re: Creación dinámica de cuadros de árbol JSL a partir de datos jerárquicosCreo que esto se ajusta a tus necesidades tal como yo las entiendo:
Names Default to Here( 1 );
dt = Data Table( "DummyTable" );
relations = [=>];
For Each Row( dt,
relations[:FULL_NAME] = Tree Node( :FULL_NAME );
relations[:FULL_NAME] <<SET data="https://community.jmp.com/"></SET>
Re: Creación dinámica de cuadros de árbol JSL a partir de datos jerárquicosPuede que obtengas algunas ideas de aquí. Árbol de directorios: explore el espacio utilizado por las carpetas o posiblemente desde el indexador de archivos en el que he estado trabajando jthi-jmp-tools/file-indexer (github.com) (ver bin/bin/DirectoryTreeHandler.jsl, todavía no es tan genérico como me gustaría, pero espero que llegue allí), mi código actualmente es un desastre porque no he tenido tiempo de terminarlo. y comenzar a refactorizar.
En mi código, la entrada (actual) es una tabla de datos como esta:

y el resultado final actual es algo como esto:

Modifiqué la lista de directorios de entrada para incluir un directorio mucho más profundo y parecía no tener problemas. Creo que la palabra mágica aquí podría ser recursividad.

Esperemos que la función get_directory_roots pueda darte algunas ideas.
Editar:
Lista de funciones JSL El complemento también puede proporcionar algunas ideas, creo que no tenía más de 1 o dos niveles.
Re: Creación dinámica de cuadros de árbol JSL a partir de datos jerárquicosAquí hay algo que preparé usando tu tabla de muestra, que podría ayudarte a llegar a donde deseas.

Names Default To Here( 1 );
dt = Current Data Table();
maxLevels = Col Max( :EMPLEVEL );
dt << select where( :EMPLEVEL == 1 );
dtJoined = dt << subset( columns( :EMP_ID, :FULL_NAME ), selected rows( 1 ) );
For( m = 1, m <= N Cols( dtJoined ), m++,
Column( dtJoined, m ) << set name( Column( dtJoined, m ) << get name || "1" )
);
For( i = 2, i <= maxLevels, i++,
dt << select where( :EMPLEVEL == i );
dtTemp = dt << subset( columns( :EMP_ID, :FULL_NAME, :MGR_ID ), selected rows( 1 ) );
For( m = 1, m <= N Cols( dtTemp ), m++,
Column( dtTemp, m ) << set name( Column( dtTemp, m ) << get name || Char( i ) )
);
Eval(
Substitute(
Expr(
dtTemp2 = dtJoined << Join(
With( dtTemp ),
Merge Same Name Columns,
Match Flag( 0 ),
By Matching Columns( __emp__ = __mgr__ ),
Drop multiples( 0, 0 ),
Include Nonmatches( 0, 0 ),
Preserve main table order( 1 )
)
),
Expr( __emp__ ), parse(":EMP_ID" || Char( i - 1 )),
Expr( __mgr__ ), Parse(":MGR_ID" || Char( i ))
)
);
Close( dtTemp, nosave );
Close( dtJoined, nosave );
dtJoined = dtTemp2;
);
theNameList={};
for(i=1,i<=maxLevels,i++,
insert into(theNameList, parse(":FULL_NAME" || char(i)))
);
Tabulate(
Show Control Panel( 0 ),
Add Table(
Row Table( Grouping Columns( eval(theNameList) ) )
)
)