Création dynamique d'une arborescence JSL à partir de données hiérarchiquesQuelqu'un peut-il suggérer une méthode de création d'une arborescence imbriquée dynamique à l'aide de données hiérarchiques. J'ai essayé pendant quelques heures ce soir et ça me déroute 
J'ai quelques données factices ci-dessous pour décrire les relations qui sont profondes à trois niveaux. Évidemment, je ne veux pas coder cela en dur car je ne saurai pas à l'avance combien de niveaux d'imbrication je devrai créer. En réalité, ce sera 10 niveaux ou plus.
Bravo, Troie
C'est par là que je commence (tableau ci-joint)

C'est ce que je veux générer

Automatisation et scriptsRe : Création dynamique d'une arborescence JSL à partir de données hiérarchiquesil semble que le code ait été tronqué
Re : Création dynamique d'une arborescence JSL à partir de données hiérarchiquesMerci d'avoir signalé le problème d'impossibilité de rouvrir un nœud fermé, @Craige_Hales .Le bug a été corrigé dans JMP 17.
Re : Création dynamique d'une arborescence JSL à partir de données hiérarchiquesOui je suis d'accord. Solution très élégante. Je me dirigeais vers le suivi des relations parents/enfants et les choses commençaient à devenir compliquées.
Merci à tous pour les réponses, de nombreux excellents extraits de code.
- Troie
Re : Création dynamique d'une arborescence JSL à partir de données hiérarchiquesLes diagrammes en arête de poisson disposent d'un menu contextuel pour les réorganiser. Ils utilisent tous la même arborescence displaybox. Il est possible d'ajouter d'autres contrôles à l'arborescence, similaires au label. La plateforme se cache sous Analyse->QualitéEtProcess->Diagramme.
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>
NestedNestedImbriqué
FishboneFishboneArête de poisson
HierarchyHierarchy Hiérarchie
edit : il semble que la plate-forme de diagrammes ne puisse pas rouvrir un nœud fermé dans JMP 15/16 (via le menu contextuel). Dans JMP 14, c'est possible. J'ai signalé le problème.
Re : Création dynamique d'une arborescence JSL à partir de données hiérarchiques@ErraticAttack
Excellente solution !
Re : Création dynamique d'une arborescence JSL à partir de données hiérarchiquesJe pense que cela correspond à vos besoins tels que je les comprends :
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 : Création dynamique d'une arborescence JSL à partir de données hiérarchiquesTu pourrais avoir des idées d'ici Arborescence de répertoires : explorer l'espace utilisé par les dossiers ou peut-être à partir de l'indexeur de fichiers sur lequel j'ai travaillé jthi-jmp-tools/file-indexer (github.com) (voir bin/bin/DirectoryTreeHandler.jsl, il n'est pas encore aussi générique que je le souhaiterais, mais j'espère qu'il y arrivera), mon code est actuellement en désordre, car je n'ai pas eu le temps de le terminer et commencez à refactoriser.
Dans mon code, l'entrée (actuelle) est datable comme ceci :

et le résultat final actuel ressemble à ceci :

J'ai modifié la liste des répertoires d'entrée pour inclure un répertoire beaucoup plus profond et cela ne semblait poser aucun problème. Je pense que le mot magique ici pourrait être récursion

J'espère que la fonction get_directory_roots pourra vous donner quelques idées.
Modifier:
Liste des fonctions JSL le complément peut aussi fournir quelques idées, je pense qu'il n'avait pas plus de 1 ou deux niveaux
Re : Création dynamique d'une arborescence JSL à partir de données hiérarchiquesVoici quelque chose que j'ai mis en place à l'aide de votre exemple de tableau, qui pourrait vous aider à arriver là où vous le souhaitez.

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