La jointure virtuelle via JSL ne fonctionne pasChère communauté JMP,
Je lie 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 tableaux et dans les informations sur la 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 ?
Mélange et nettoyage des donnéesPersonnalisation de masseIngénierie Qualité et ProcédésRe : La jointure virtuelle via JSL ne fonctionne pasSemble être corrigé avec Jmp 17.
Re : La jointure virtuelle via JSL ne fonctionne pasMerci @Féli et @hogi pour avoir enquêté à ce sujet.
La question clé ici est la suivante :
Comment créer un lien fonctionnel 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 sauvegardés".
Question complémentaire :
Pourquoi est-il possible de créer un lien vers des tables non enregistrées en cliquant mais pas via un seul script ?
Ce problème (je pense que c'est un bug) est-il résolu et sur la table quelque part ? Pour moi, la question initiale de @Féli n’est pas résolu.
Re : La jointure virtuelle via JSL ne fonctionne pasQuestion interessante.
La sauvegarde de la table est-elle « juste » nécessaire pour obtenir un nom de fichier unique pour le lien ?
serait-il possible d'utiliser le nom datatable à 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 sauvegarder.
Sans enregistrer aucune des tables, il m'a parfois été utile de simplement 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é ainsi, serait-il possible d'afficher un message d'avertissement du type "la liaison vers 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 en 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 ? Est-ce que les deux font 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 la 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 garantir que cela fonctionne toujours est de faire ce qui est suggéré ci-dessus et de toujours sauvegarder 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 en Zip J'ai également dû sauvegarder les fichiers ; 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 tableau.
La ligne 4 enregistre la table sous forme de fichier JMP ou la ligne 7 se 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, cela devrait fonctionner.
Il interroge deux tables à partir des 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 la table, nom de la colonne) sont-elles correctes ?
- ...
Les touches des deux côtés doivent être saturées de couleurs et non pâles. Pâle signifie ne pas travailler.
J'ai aussi eu quelques soucis avec ça, 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 les rejoindre.
Re : La jointure virtuelle via JSL ne fonctionne pasJe ne fais que deviner 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 par rapport à lorsque vous l'avez écrit sans succès ?
Je crains que l'argument de la table de référence attend un argument littéral, pas une variable. Consultez cette entrée d'aide à propos de scripter une jointure virtuelle .