Dynamische JSL-Baumbox-Erstellung aus hierarchischen DatenKann jemand eine Methode zum Erstellen einer dynamischen verschachtelten Baumbox mithilfe hierarchischer Daten vorschlagen? Ich habe es heute Abend ein paar Stunden lang versucht und es verwirrt mich 
Ich habe unten einige Dummy-Daten, um die Beziehungen darzustellen, die drei Ebenen tief sind. Offensichtlich möchte ich dies nicht hart codieren, da ich nicht im Voraus weiß, wie viele Verschachtelungsebenen ich vornehmen muss. In Wirklichkeit werden es 10 oder mehr Level sein.
Prost, Troy
Damit fange ich an (Tabelle beigefügt)

Das ist es, was ich generieren möchte

Automatisierung und SkripterstellungBetreff: Dynamische JSL-Baumbox-Erstellung aus hierarchischen DatenEs scheint, dass der Code abgeschnitten wurde
Betreff: Dynamische JSL-Baumbox-Erstellung aus hierarchischen DatenVielen Dank, dass Sie das Problem gemeldet haben, dass ein geschlossener Knoten nicht wieder geöffnet werden kann. @Craige_Hales .Der Fehler wurde in JMP 17 behoben.
Betreff: Dynamische JSL-Baumbox-Erstellung aus hierarchischen DatenJa, ich stimme zu. Sehr elegante Lösung. Ich war auf dem Weg, die Eltern-Kind-Beziehungen zu verfolgen, und die Dinge begannen, chaotisch zu werden.
Vielen Dank an alle für die Antworten, viele ausgezeichnete Codeausschnitte.
- Troja
Betreff: Dynamische JSL-Baumbox-Erstellung aus hierarchischen DatenDie Fischgrätendiagramme verfügen über ein Rechtsklick-Menü, um sie neu anzuordnen. Sie verwenden alle denselben Displaybox-Baum. Es ist möglich, dem Baum weitere Steuerelemente hinzuzufügen, ähnlich wie bei der Beschriftung. Die Plattform versteckt sich unter Analyze->QualityAndProcess->Diagram.
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>
NestedNestedVerschachtelt
FishboneFishboneGräten
HierarchyHierarchy Hierarchie
Bearbeiten: Es sieht so aus, als ob die Diagrammplattform möglicherweise nicht in der Lage ist, einen geschlossenen Knoten in JMP 15/16 erneut zu öffnen (über das Popup-Menü). In JMP 14 ist das möglich. Ich habe das Problem gemeldet.
Betreff: Dynamische JSL-Baumbox-Erstellung aus hierarchischen Daten@ErraticAttack
Tolle Lösung!
Betreff: Dynamische JSL-Baumbox-Erstellung aus hierarchischen DatenIch denke, dass dies Ihren Bedürfnissen entspricht, so wie ich sie verstehe:
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>
Betreff: Dynamische JSL-Baumbox-Erstellung aus hierarchischen DatenVielleicht bekommen Sie hier ein paar Anregungen Verzeichnisbaum: Erkunden Sie den von Ordnern verwendeten Speicherplatz oder möglicherweise vom Dateiindexer, an dem ich gearbeitet habe jthi-jmp-tools/file-indexer (github.com) (Siehe bin/bin/DirectoryTreeHandler.jsl, es ist noch nicht so generisch, wie ich es gerne hätte, aber hoffentlich kommt es dort an.) Mein Code ist derzeit ein Chaos, weil ich keine Zeit hatte, ihn fertigzustellen und beginnen Sie mit dem Refactoring.
In meinem Code ist die (aktuelle) Eingabe wie folgt datierbar:

und aktuelles Endergebnis etwa so:

Ich habe die Eingabeverzeichnisliste so geändert, dass sie ein viel tieferes Verzeichnis enthält, und es schien keine Probleme zu geben. Ich denke, das Zauberwort hier könnte Rekursion sein

Hoffentlich kann Ihnen die Funktion get_directory_roots einige Anregungen geben.
Bearbeiten:
JSL-Funktionsliste Addin kann auch einige Ideen liefern, ich glaube, es hatte nicht mehr als ein oder zwei Ebenen
Betreff: Dynamische JSL-Baumbox-Erstellung aus hierarchischen DatenHier ist etwas, das ich anhand Ihrer Beispieltabelle zusammengestellt habe, das Ihnen helfen könnte, an Ihr Ziel zu gelangen

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