La jointure virtuelle via JSL ne fonctionne pasChère communauté JMP,
Je relie deux tables de données via JSL pour une jointure virtuelle :
dt1:Link_Column<< Set Property( "Link ID", 1 );
dt2:Link_Column << Set Property( "Link Reference", Reference table(dt1 ));
Je vois les symboles clés dans les deux tables et dans les informations de colonne, donc la liaison semble fonctionner, mais les colonnes virtuellement jointes n'apparaissent pas dans ma table de données jointe.
Si je fais exactement la même chose à la main et que je clique dans JMP, cela fonctionne et les colonnes jointes apparaissent.
Existe-t-il un moyen de forcer une mise à jour après avoir rejoint virtuellement ?
ScriptRe : La jointure virtuelle via JSL ne fonctionne pasSemble être corrigé avec Jmp 17.
Re : La jointure virtuelle via JSL ne fonctionne pasMerci @Feli et @hogi pour enquêter à ce sujet.
La question clé ici est :
Comment créer un lien de travail entre deux tables de données non enregistrées via un seul script ?
C'est effectivement possible avec deux scripts différents, mais pas avec un seul script : https://community.jmp.com/t5/Discussions/Setting-link-ID-in-jsl-seems-not-to-work-what-is-wrong/mp/598505
Le principal point à retenir de ce fil est "ils doivent être sauvés".
Question de suivi :
Pourquoi est-il possible de créer un lien vers des tables non enregistrées via un clic mais pas via un seul script ?
Ce problème (je pense que c'est un bogue) est-il résolu et sur la table quelque part ? Pour moi, la question initiale de @Feli n'est pas résolu.
Re : La jointure virtuelle via JSL ne fonctionne pasQuestion interessante.
L'enregistrement de la table est-il "juste" nécessaire pour obtenir un nom de fichier unique pour le lien ?
serait-il possible d'utiliser le nom de la table de données à la place (sans le chemin complet) ?
Dans cet exemple, pour lier correctement la table de référence (dt2) à dt1, il faut d'abord la sauvegarder
- pour dt3 c'est bien sans enregistrer.
Sans enregistrer aucune des tables, il m'a parfois été utile de supprimer l'ID de lien (généré par le script JSL) de la table de référence et de l'ajouter à nouveau manuellement.
Si le comportement de jmp est conservé comme ceci, serait-il possible d'afficher un message d'avertissement tel que "la liaison à des tables de données non enregistrées ne fonctionne pas"
// 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 )
);
Re : La jointure virtuelle via JSL ne fonctionne pasMaintenant, je suis un peu confus - donc le gros problème pour lequel la jointure virtuelle ne fonctionne pas dans JSL est qu'elle n'est pas enregistrée?
Y a-t-il une raison technique à cela ? - la liaison virtuelle fonctionne pour les tables de données non enregistrées lorsque je le fais à la main, mais pas en JSL ? Les deux font-ils des choses différentes ?
Mon dt1 a été créé en important des données et en les manipulant - pourquoi la variable dt1 est-elle différente si j'utilise, par exemple, l'assistant d'importation json pour le créer, qu'en utilisant Open() sur une table de données existante lorsque les deux pointent vers une table de données ouverte dans JMP ?
Re : La jointure virtuelle via JSL ne fonctionne pasdt1 = 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 ) ) ) ) ) )
);
voici un exemple qui fonctionnera - ce sont des exemples de tables de données, utilisant le concept de script dt1, dt2. Une bonne pratique pour s'assurer que cela fonctionne toujours est de faire ce qui est suggéré ci-dessus et de toujours enregistrer les tables avant de créer les liens. Dans cet exemple, puisqu'il s'agit d'échantillons, il n'y a pas de sauvegarde ici.
Re : La jointure virtuelle via JSL ne fonctionne pasSuper!
dans Inverser le géocodage Lat-Lon vers Zip J'ai dû enregistrer les fichiers aussi; vous pouvez utiliser le handle plutôt que le nom du fichier disque, mais le fichier disque doit exister.
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 ligne 3 ouvre un fichier non JMP sous forme de table.
La ligne 4 enregistre la table en tant que fichier JMP, ou la ligne 7 rouvre à partir du disque.
La ligne 10 crée la référence de lien à partir du handle dtdbf sans utiliser explicitement le nom $desktop.
Le fichier dtshp pourrait être réenregistré avec le lien en place, mais je ne l'ai pas fait. Cela serait utile si le fichier était utilisé en dehors de ce script.
Re : La jointure virtuelle via JSL ne fonctionne pasLe secret était a) de sauvegarder les deux tables de données et b) Set Property ("Link Reference", Reference table() doit être une référence de nom de fichier, comme mentionné dans les réponses.
Je ne sais pas pourquoi, mais je vais le prendre...
Re : La jointure virtuelle via JSL ne fonctionne pasVoici un exemple, qui devrait fonctionner.
Il interroge deux tables à partir d'exemples de tables JMP et les joint ensuite.
Comme d'autres l'ont mentionné, il peut y avoir des problèmes de dépannage, vous pouvez probablement trouver quelque chose dans le journal
- la table référencée doit être enregistrée
- la table référencée ne doit pas avoir de doublons
- les références (nom de table, nom de colonne) sont-elles correctes ?
- ...
Les touches des deux côtés doivent être saturées de couleur et non pâles. Pâle signifie ne pas travailler.
J'ai eu quelques problèmes avec ça aussi, mais ça marche.
// 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"));
Re : La jointure virtuelle via JSL ne fonctionne pasEn outre, il peut être utile de sauvegarder les tables avant de rejoindre.
Re : La jointure virtuelle via JSL ne fonctionne pasJe ne fais que deviner pour une réponse rapide, mais avez-vous comparé la définition résultante de la propriété de colonne pour dt2:LinkColumn lorsque vous l'avez définie de manière interactive avec succès et lorsque vous l'avez écrite sans succès ?
Je crains que l'argument de la table de référence attende un argument littéral, pas une variable. Voir cette entrée d'aide sur scripter une jointure virtuelle .