Virtual Join über JSL funktioniert nichtLiebe JMP-Community,
Ich verknüpfe zwei Datentabellen über JSL für einen virtuellen Join:
dt1:Link_Column<< Set Property( "Link ID", 1 );
dt2:Link_Column << Set Property( "Link Reference", Reference table(dt1 ));
Ich sehe die Schlüsselsymbole in beiden Tabellen und in der Spalteninfo, also scheint die Verknüpfung zu funktionieren, aber die virtuell verbundenen Spalten erscheinen nicht in meiner verbundenen Datentabelle.
Wenn ich genau dasselbe von Hand mache und in JMP klicke, funktioniert es und die verbundenen Spalten werden angezeigt.
Gibt es eine Möglichkeit, ein Update nach dem virtuellen Beitritt zu erzwingen?
SkripterstellungBetreff: Virtual Join über JSL funktioniert nichtScheint mit Jmp 17 behoben zu sein.
Betreff: Virtual Join über JSL funktioniert nichtDanke @Feli Und @Hogi um dies zu untersuchen.
Die Kernfrage hier lautet:
Wie erstelle ich mit einem einzigen Skript eine funktionierende Verknüpfung zwischen zwei nicht gespeicherten Datentabellen?
Es geht eigentlich mit zwei verschiedenen Skripten, aber nicht mit einem einzigen Skript: https://community.jmp.com/t5/Discussions/Setting-link-ID-in-jsl-seems-to-work-what-is-wrong/mp/598505
Die Hauptaussage dieses Threads lautet: „Sie müssen gerettet werden“.
Zusatzfrage:
Warum ist es möglich, auf nicht gespeicherte Tabellen per Klick zu verlinken, aber nicht über ein einziges Skript?
Ist dieses Problem (ich denke, es ist ein Fehler) behoben und irgendwo auf dem Tisch? Für mich die Eingangsfrage von @Feli ist nicht gelöst.
Betreff: Virtual Join über JSL funktioniert nichtInteressante Frage.
Wird die Tabelle "nur" gespeichert, um einen eindeutigen Dateinamen für den Link zu erhalten?
wäre es möglich, stattdessen den Datentabellennamen zu verwenden (ohne den vollständigen Pfad)?
In diesem Beispiel Um die Referenztabelle (dt2) korrekt mit dt1 zu verknüpfen, muss sie zuerst gespeichert werden
- für dt3 geht es ohne speichern.
Ohne eine der Tabellen zu speichern, hat es mir manchmal geholfen, einfach die Link-ID (generiert durch JSL-Skript) aus der Referenztabelle zu entfernen und manuell wieder hinzuzufügen.
Wenn das jmp-Verhalten so beibehalten wird, wäre es möglich, eine Warnmeldung wie „Das Verknüpfen mit nicht gespeicherten Datentabellen funktioniert nicht“ anzuzeigen.
// Open Data Table: Big Class.jmp
// → Data Table( "Big Class" )
dt1 = Open( "$SAMPLE_DATA/Big Class.jmp" );
// Data table summary
// → Data Table( "Big Class By (sex)" )
dt 2 = Data Table( "Big Class" ) << Summary(
Group( :sex ),
Median( :height ),
Freq( "None" ),
Weight( "None" ),
Link to original data table( 0 )
);
// Change column link ID: sex
dt2:sex << Set Property( "Link ID", 1 );
// uncomment this line to make the virtual link work table d1
//dt2 << save( "$desktop/summaryTable.jmp" );
// Change column link reference: sex
dt1:sex << Set Property(
"Link Reference",
Reference Table( dt2 )
);
dt3 = Eval(dt1 << getScript);
dt3:sex << Set Property(
"Link Reference",
Reference Table( dt2 )
);
Betreff: Virtual Join über JSL funktioniert nichtJetzt bin ich etwas verwirrt - das große Problem, warum der virtuelle Join in JSL nicht funktioniert, ist also, dass er nicht gespeichert wird?
Gibt es dafür einen technischen Grund? - Virtuelle Verknüpfung funktioniert für nicht gespeicherte Datentabellen, wenn ich es von Hand mache, aber nicht in JSL? Machen beide unterschiedliche Sachen?
Mein dt1 wurde durch Importieren und Bearbeiten von Daten erstellt - warum unterscheidet sich die Variable dt1, wenn ich sie z. B. mit dem json-Importassistenten erstelle, als wenn ich Open() für eine vorhandene Datentabelle verwende, wenn beide auf eine offene Datentabelle zeigen im JMP?
Betreff: Virtual Join über JSL funktioniert nichtdt1 = Open( "$SAMPLE_DATA\Pizza Profiles.jmp" );
dt2 = Open( "$SAMPLE_DATA\Pizza Responses.jmp" );
dt1:ID << Set Property( "Link ID", 1 );
dt2:Choice << Set Property( "Link Reference", Reference Table( dt1 ) );
dt2:Choice1 << Set Property( "Link Reference", Reference Table( dt1 ) );
dt2:Choice2 << Set Property( "Link Reference", Reference Table( dt1 ) );
dist1 = dt2 << Distribution(
Nominal Distribution( Column( Referenced Column( "Cheese[Choice]", Reference( Column( :Choice ), Reference( Column( :Cheese ) ) ) ) ) ),
Nominal Distribution( Column( Referenced Column( "Cheese[Choice1]", Reference( Column( :Choice1 ), Reference( Column( :Cheese ) ) ) ) ) ),
Nominal Distribution( Column( Referenced Column( "Cheese[Choice2]", Reference( Column( :Choice2 ), Reference( Column( :Cheese ) ) ) ) ) )
);
Hier ist ein Beispiel, das funktionieren wird – dies sind Beispieldatentabellen, die das Skriptkonzept dt1, dt2 verwenden. Eine gute Vorgehensweise, um sicherzustellen, dass es immer funktioniert, besteht darin, das oben vorgeschlagene zu tun und die Tabellen immer zu speichern, bevor Sie die Links erstellen. Da es sich in diesem Beispiel um Beispiele handelt, wird hier nicht gespeichert.
Betreff: Virtual Join über JSL funktioniert nichtGroßartig!
In Reverse Geocode Lat-Lon zu Zip Ich musste die Dateien auch speichern; Sie können das Handle anstelle des Namens der Datenträgerdatei verwenden, aber die Datenträgerdatei muss vorhanden sein.
1 blobdbf = za << read( "cb_2019_us_zcta510_500k.dbf", Format( blob ) );
2 tempfile = Save Text File( "$temp/cb_2019_us_zcta510_500k.dbf", blobdbf );
3 zipcodeNS:dtdbf = Open( tempfile, Add to Recent Files( 0 ), invisible );
4 zipcodeNS:dtdbf << save( "$desktop/cb_2019_us_zcta510_500kdbf.jmp" );
5 , //
6 zipcodeNS:dtshp = Open( "$desktop/cb_2019_us_zcta510_500kshp.jmp", Add to Recent Files( 0 ), invisible );
7 zipcodeNS:dtdbf = Open( "$desktop/cb_2019_us_zcta510_500kdbf.jmp", Add to Recent Files( 0 ), invisible );
8 );
9 zipcodeNS:dtdbf:shape << Set Property( "Link ID", 1 );
10 zipcodeNS:dtshp:shape << Set Property( "Link Reference", Reference Table( zipcodeNS:dtdbf ) );
Zeile 3 öffnet eine Nicht-JMP-Datei als Tabelle.
Zeile 4 speichert die Tabelle als JMP-Datei, oder Zeile 7 wird erneut von der Festplatte geöffnet.
Zeile 10 erstellt die Linkreferenz aus dem dtdbf-Handle, ohne explizit den Namen $desktop zu verwenden.
Die dtshp-Datei konnte mit dem vorhandenen Link erneut gespeichert werden, aber ich habe das nicht getan. Das wäre hilfreich, wenn die Datei außerhalb dieses Skripts verwendet würde.
Betreff: Virtual Join über JSL funktioniert nichtDas Geheimnis war a) Speichern beider Datentabellen und b) Set Property( "Link Reference", Reference table() muss eine Dateinamenreferenz sein, wie in den Antworten erwähnt.
Keine Ahnung warum, aber ich nehme es...
Betreff: Virtual Join über JSL funktioniert nichtHier ist ein Beispiel, das sollte funktionieren.
Es fragt zwei Tabellen aus JMP-Beispieltabellen ab und verbindet sie anschließend.
Wie andere bereits erwähnt haben, kann es einige Probleme bei der Fehlerbehebung geben, wahrscheinlich finden Sie etwas im Protokoll
- die referenzierte Tabelle muss gespeichert werden
- die referenzierte Tabelle darf keine Duplikate haben
- sind die Referenzen (Tabellenname, Spaltenname) korrekt?
- ...
Die Tasten auf beiden Seiten müssen mit Farbe gesättigt und nicht blass sein. Blass bedeutet nicht arbeitend.
Ich hatte auch ein paar Probleme damit, aber es funktioniert.
// User Dialog for query from datatable (database)
/***************************************************************************/
// Initialization
/***************************************************************************/
Names Default To Here( 1 );
Clear Log();
// Query 1st table with filter conditions
dt_filter = New SQL Query(
Version( 130 ),
Connection( "JMP" ),
JMP Tables( ["Big Class" => "\C:\Program Files\SAS\JMPPRO\15\Samples\Data\Big Class.jmp"] ),
QueryName( "filter" ),
CustomSQL( "SELECT distinct t1.name, t1.age, t1.sex, t1.weight, t1.height FROM \!"Big Class\!" t1 where t1.sex = 'M' and t1.age<=13;" )
) << Run;
Summarize( name_lst = by( dt_filter:name ) );
dt_filter:name << set property("Link ID", 1);
dt_filter << save("$TEMP\dt_filter.jmp");
// (2) assign custom SQL,
Assign(
custom_sql,
"\[
SELECT t1.picture, t1.name, t1."sibling ages",
t1.sports, t1."countries visited", t1."family cars", t1."reported illnesses",
t1."age vector"
FROM "Big Class Families" t1
where t1.name in __NAMELIST__
;
]\"
);
// (3) Put namelist into custom_sql
Substitute Into( custom_sql, "__NAMELIST__", Substitute( Char( name_lst ), "{", "(", "}", ")" ) );
// (4) execute Query
dt_result = New SQL Query( Version( 130 ), Connection( "JMP" ),
, JMP Tables( ["Big Class Families" => "\C:\Program Files\SAS\JMPPRO\15\Samples\Data\Big Class Families.jmp"] ),
QueryName( "dt_result" ), CustomSQL( custom_sql ) )
<< Run;
dt_result << save("$TEMP\dt_result.jmp");
// (5) Connect both tables by symbolic link
dt_result:name << set property("Link Reference", Reference Table("$TEMP\dt_filter.jmp"));
Betreff: Virtual Join über JSL funktioniert nichtAußerdem kann es hilfreich sein, die Tabellen vor dem Beitritt zu speichern.
Betreff: Virtual Join über JSL funktioniert nichtIch vermute nur für eine schnelle Antwort, aber haben Sie die resultierende Definition der Spalteneigenschaft für dt2:LinkColumn verglichen, als Sie sie erfolgreich interaktiv definiert haben, und wenn Sie sie nicht erfolgreich per Skript erstellt haben?
Ich mache mir Sorgen, dass das Argument der Referenztabelle ein wörtliches Argument erwartet, keine Variable. Siehe diesen Hilfeeintrag über Erstellen eines Skripts für einen virtuellen Join .