Creazione dinamica di riquadri ad albero JSL da dati gerarchiciQualcuno può suggerire un metodo per creare un riquadro ad albero nidificato dinamico utilizzando i dati gerarchici. Stasera ho provato per un paio d'ore e mi confonde 
Di seguito sono riportati alcuni dati fittizi per rappresentare le relazioni che sono profonde tre livelli. Ovviamente non voglio codificarlo in modo rigido poiché non saprò in anticipo quanti livelli di "annidamento" dovrò creare. In realtà saranno 10 o più livelli.
Saluti, Troia
Questo è ciò con cui comincio (tabella allegata)

Questo è ciò che voglio generare

Automazione e scriptingRi: Creazione di un riquadro dell'albero JSL dinamico da dati gerarchicisembra che il codice sia stato troncato
Ri: Creazione di un riquadro dell'albero JSL dinamico da dati gerarchiciGrazie per aver segnalato il problema con l'impossibilità di riaprire un nodo chiuso, @Craige_Hales .Il bug è stato risolto in JMP 17.
Ri: Creazione di un riquadro dell'albero JSL dinamico da dati gerarchiciSi, sono d'accordo. Soluzione molto elegante. Stavo seguendo la strada del monitoraggio delle relazioni genitore/figlio e le cose cominciavano a diventare confuse.
Grazie a tutti per le risposte, molti ottimi frammenti di codice.
- Troia
Ri: Creazione di un riquadro dell'albero JSL dinamico da dati gerarchiciI diagrammi a lisca di pesce dispongono di un menu contestuale per riorganizzarli. Usano tutti lo stesso albero displaybox. E' possibile aggiungere altri controlli all'albero, simili all'etichetta. La piattaforma si nasconde in Analizza->QualitàEProcesso->Diagramma.
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>
NestedNestedNidificato
FishboneFishbonelisca di pesce
HierarchyHierarchy Gerarchia
modifica: sembra che la piattaforma del diagramma potrebbe non essere in grado di riaprire un nodo chiuso in JMP 15/16 (tramite menu popup). In JMP 14 è possibile. Ho segnalato il problema.
Ri: Creazione di un riquadro dell'albero JSL dinamico da dati gerarchici@ErraticAttack
Ottima soluzione!
Ri: Creazione di un riquadro dell'albero JSL dinamico da dati gerarchiciPenso che questo si adatti alle tue esigenze per come le ho comprese:
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>
Ri: Creazione di un riquadro dell'albero JSL dinamico da dati gerarchiciPotresti prendere qualche idea da qui Albero delle directory: esplora lo spazio utilizzato dalle cartelle o forse dall'indicizzatore di file su cui ho lavorato jthi-jmp-tools/file-indexer (github.com) (vedi bin/bin/DirectoryTreeHandler.jsl, non è ancora così generico come vorrei, ma spero che ci arrivi), il mio codice è attualmente un disastro, perché non ho avuto il tempo di finirlo e iniziare il refactoring.
Nel mio codice l'input (corrente) è databile in questo modo:

e il risultato finale attuale è qualcosa del genere:

Ho modificato l'elenco delle directory di input per includere una directory molto più profonda e sembrava non avere problemi. Penso che la parola magica qui potrebbe essere ricorsione

Speriamo che la funzione get_directory_roots possa darti qualche idea.
Modificare:
Elenco funzioni JSL addin può anche fornire alcune idee, penso che non avesse più di 1 o due livelli
Ri: Creazione di un riquadro dell'albero JSL dinamico da dati gerarchiciEcco qualcosa che ho messo insieme utilizzando la tua tabella di esempio, che potrebbe aiutarti ad arrivare dove vuoi

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) ) )
)
)