Virtual Join tramite JSL non funzionaGentile comunità JMP,
Sto collegando due tabelle di dati tramite JSL per un virtual join:
dt1:Link_Column<< Set Property( "Link ID", 1 );
dt2:Link_Column << Set Property( "Link Reference", Reference table(dt1 ));
Vedo i simboli chiave in entrambe le tabelle e nelle informazioni sulla colonna, quindi il collegamento sembra funzionare, ma le colonne virtualmente unite non vengono visualizzate nella mia tabella di dati unita.
Se faccio esattamente la stessa cosa a mano e faccio clic su JMP, funziona e vengono visualizzate le colonne unite.
C'è un modo per forzare un aggiornamento dopo l'adesione virtuale?
ScriptingRi: Virtual Join tramite JSL non funzionaSembra essere risolto con Jmp 17.
Ri: Virtual Join via JSL non funzionaGrazie @Feli E @hogi per aver indagato su questo.
La domanda chiave qui è:
Come creare un collegamento funzionante tra due tabelle di dati non salvate tramite un singolo script?
In realtà è possibile con due script diversi, ma non con un singolo script: https://community.jmp.com/t5/Discussions/Setting-link-ID-in-jsl-seems-not-to-work-what-is-wrong/mp/598505
L'asporto principale di questo thread è "devono essere salvati".
Domanda successiva:
Perché è possibile collegarsi a tabelle non salvate facendo clic ma non tramite un singolo script?
Questo problema (penso che sia un bug) è stato risolto e sul tavolo da qualche parte? Per me la domanda iniziale di @Feli non è risolto.
Ri: Virtual Join tramite JSL non funzionaDomanda interessante.
Il salvataggio della tabella è "solo" necessario per ottenere un nome file univoco per il collegamento?
sarebbe possibile utilizzare invece il nome datatable (senza il percorso completo)?
In questo esempio, per collegare correttamente la tabella di riferimento (dt2) a dt1, deve prima essere salvata
- per dt3 va bene senza salvare.
Senza salvare nessuna delle tabelle, a volte mi è stato utile rimuovere l'ID collegamento (generato dallo script JSL) dalla tabella di riferimento e aggiungerlo di nuovo manualmente.
Se il comportamento di jmp viene mantenuto in questo modo, sarebbe possibile mostrare un messaggio di avviso come "il collegamento a tabelle di dati non salvate non funziona"
// 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 )
);
Ri: Virtual Join tramite JSL non funzionaOra sono un po 'confuso, quindi il grosso problema per cui il virtual join non funziona in JSL è che non viene salvato?
C'è una ragione tecnica per questo? - il collegamento virtuale funziona per le tabelle di dati non salvate quando lo faccio a mano, ma non in JSL? Entrambi fanno cose diverse?
Il mio dt1 è stato creato importando i dati e manipolandoli: perché la variabile dt1 è diversa se utilizzo, ad esempio, la procedura guidata di importazione json per crearla, rispetto all'utilizzo di Open () su una tabella di dati esistente quando entrambi puntano a una tabella di dati aperta in JMP?
Ri: Virtual Join tramite JSL non funzionadt1 = 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 ) ) ) ) ) )
);
ecco un esempio che funzionerà: queste sono tabelle di dati di esempio, utilizzando il concetto di scripting dt1, dt2. Una buona pratica per assicurarsi che funzioni sempre è fare quanto suggerito sopra e salvare sempre le tabelle prima di creare i collegamenti. In questo esempio, dato che si tratta di campioni, non c'è un salvataggio qui.
Ri: Virtual Join tramite JSL non funzionaGrande!
In Geocodifica inversa Lat-Lon a Zip Ho dovuto salvare anche i file; puoi usare l'handle piuttosto che il nome del file su disco, ma il file su disco deve esistere.
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 ) );
La riga 3 sta aprendo un file non JMP come tabella.
La riga 4 salva la tabella come file JMP oppure la riga 7 si riapre dal disco.
La riga 10 crea il riferimento al collegamento dall'handle dtdbf senza utilizzare esplicitamente il nome $desktop.
Il file dtshp potrebbe essere salvato nuovamente con il collegamento in atto, ma non l'ho fatto. Sarebbe utile se il file fosse utilizzato al di fuori di questo script.
Ri: Virtual Join tramite JSL non funzionaIl segreto era a) salvare entrambe le tabelle di dati e b) Set Property( "Link Reference", Reference table() deve essere un riferimento al nome file, come menzionato nelle risposte.
Non so perché, ma lo prendo...
Ri: Virtual Join via JSL non funzionaEcco un esempio, dovrebbe funzionare.
Interroga due tabelle dalle tabelle di esempio di JMP e le unisce successivamente.
Come altri hanno già detto, potrebbero esserci alcuni problemi per la risoluzione dei problemi, probabilmente puoi trovare qualcosa nel registro
- la tabella di riferimento deve essere salvata
- la tabella di riferimento non deve avere duplicati
- i riferimenti (nome tabella, nome colonna) sono corretti?
- ...
I tasti su entrambi i lati devono essere saturi di colore e non pallidi. Pallido significa non lavorare.
Anch'io ho avuto qualche problema, ma funziona.
// 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"));
Ri: Virtual Join via JSL non funzionaInoltre, può essere utile salvare le tabelle prima di unirsi.
Ri: Virtual Join via JSL non funzionaSto solo indovinando per una risposta rapida, ma hai confrontato la definizione risultante della proprietà della colonna per dt2: LinkColumn quando l'hai definita correttamente e in modo interattivo rispetto a quando l'hai scritta senza successo?
Sono preoccupato che l'argomento della tabella di riferimento preveda un argomento letterale, non una variabile. Vedi questa voce della Guida su creare script per un virtual join .