Comment savoir si une table est un sous-ensemble lié ?Bonjour tout le monde,
Je voudrais déterminer (en utilisant JSL) si la table de données actuelle est liée à une table principale ou non.
J'ai essayé "<< Get Table Variable Names" mais cela n'a pas fonctionné.
Avez-vous une idée de comment nous pouvons obtenir ces informations ?
Merci d'avance pour votre aide!
Re : Comment savoir si une table est un sous-ensemble lié ?Merci encore une fois pour votre réponse très rapide Ian!
Je vais combiner les deux parties et faire quelques tests mais j'espère que ça devrait faire l'affaire ! 
Re : Comment savoir si une table est un sous-ensemble lié ?Non testé (comme d'habitude . . . 
NamesDefaultToHere(1);
ClearLog();
// See if a table is a summary of another table
isSummary =
Function({dt}, {Default Local},
ts = dt << Get Table Script Names;
if (Contains(ts, "Source"),
ss = dt << getProperty("Source");
if (Head(Arg(ss, 2)) == Expr(Summary), 1, 0),
0
);
);
// Make a summary table
dt1 = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt2 = dt1 << Summary(Mean( :height ));
Print(isSummary(dt1));
Print(isSummary(dt2));Re : Comment savoir si une table est un sous-ensemble lié ?Bonjour Ian,
Merci pour le code ! Je pense que je peux utiliser quelque chose comme ça pour résoudre mon problème. J'ai juste besoin d'ajouter un contrôle supplémentaire pour le tableau récapitulatif. Peut-être que quelque chose comme ça pourrait fonctionner : essayer d'obtenir le script "Source" d'une table et vérifier s'il contient le mot "résumé".
Je dois faire des tests...
Merci encore pour votre aide.
Re : Comment savoir si une table est un sous-ensemble lié ?Vous pouvez tester ceci (dans le sens que j'ai mentionné plus tôt):
NamesDefaultToHere(1);
// Function to determine if two tables are linked
rLinked = Function({dt1, dt2}, {Default Local},
dt1 << selectAllRows;
if(NRow(dt2 << getSelectedRows) > 0, linked = 1, linked = 0);
dt1 << clearSelect;
dt2 << clearSelect;
linked;
);
// Look at the open tables in the session and see which pairs are linked
linkedTables = Function({}, {Default Local},
nt = NTable();
linkMat = J(nt, nt, .);
tblNames = {};
for(t1=1, t1<=nt, t1++,
InsertInto(tblNames, DataTable(t1) << getName);
for(t2=t1+1, t2<=nt, t2++,
if(rLinked(DataTable(t1), DataTable(t2)), linkMat[t1, t2] = 1, linkMat[t1, t2] = 0);
);
);
EvalList({linkMat, tblNames});
);
// Make some active tables
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
// Unlinked subset
dt << selectRandomly(0.1);
dt2 = dt << Subset(LinkToOriginalDataTable( 0 ) );
dt2 << setName("Unlinked");
// Linked subset
dt << selectRandomly(0.1);
dt3 = dt << Subset(LinkToOriginalDataTable( 1 ) );
dt3 << setName("Linked");
// Get the 'link matrix'
linkedOrNot = linkedTables();
dt4 = AsTable(linkedOrNot[1], << setName("Linked Tables"), << columnNames(linkedOrNot[2]));
dt4 << NewColumn("Column", Character, Values(linkedOrNot[2]));
dt4 << moveSelectedColumns({"Column"}, ToFirst);
Re : Comment savoir si une table est un sous-ensemble lié ?Merci pour le complément d'information Ian.
Vous avez tout à fait raison, un comportement "correct" dépend de la situation. Je ne disais pas que l'un est meilleur qu'un autre mais j'essayais juste d'expliquer pourquoi parfois les choses tournent mal avec mon script.
Je conviens également que la création d'un sous-ensemble lié n'est pas toujours la meilleure façon de se concentrer sur certaines lignes spécifiques. Cependant, comme mon script peut être utilisé par d'autres personnes, je ne peux pas contrôler ce qu'ils ont fait auparavant et avec quel type de table ils travaillent. L'idée est donc simplement de trouver un moyen de détecter si une table est liée (c'est-à-dire non compatible avec mon script). Dans ce cas, je pourrais afficher un avertissement et arrêter le script.
Eh bien, si ce n'est pas faisable, je peux peut-être trouver un autre moyen de traiter ce cas particulier.
Re : Comment savoir si une table est un sous-ensemble lié ?Je suppose que le comportement "correct" dans ce cas est sujet à interprétation, mais si vous voyez quelque chose que vous considérez comme indésirable, veuillez envoyer un e-mail à support@jmp.com.
Dans ce cas cependant, si vous avez l'intention d'utiliser les tableaux de sous-ensembles liés pour "isoler" certaines lignes pour l'analyse, une approche plus conventionnelle pourrait consister à utiliser le filtre de données, ou sa version locale. Si vous enregistrez des formules qui ont été générées à l'aide d'une partie seulement des données, vous aurez peut-être besoin de code supplémentaire pour les conserver.
Re : Comment savoir si une table est un sous-ensemble lié ?En fait, si je travaille avec un sous-ensemble lié à une table et si je sauvegarde les résidus du Fit Model, ils sont stockés dans la première table principale. Cependant, je viens de remarquer que les formules de prédiction sont enregistrées dans les deux tables ! C'est assez étrange...
NamesDefaultToHere(1);
// Open a table
dt1 = Open("$SAMPLE_DATA/Big Class.jmp");
// Create a subset
dt2=dt1 << Subset(
Selected Rows( 0 ),
Rows( [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] ),
Selected columns only( 0 ),
link to original data table(1)
);
// Direct the analysis to the subset table
fml = dt2 << Fit Model(
Y( :height ),
Effects( :weight )
);
fm = fml << Run;
// Prediction formula are saved in both dt1 and dt2 and residulas are saved only in dt1
fm << prediction formula;
fm << residuals;Dans cet exemple, je voudrais avoir des résidus et une formule de prédiction uniquement dans dt2.
Re : Comment savoir si une table est un sous-ensemble lié ?Concernant " En particulier, il enregistre les résidus et les autres colonnes de la plateforme Fit Model, dans la table de données actuelle " alors j'ai peut-être mal compris. Mais vous devriez toujours être en mesure d'obtenir les prédictions "Fit Model" pour aller dans la bonne table :
NamesDefaultToHere(1);
// Open a table
dt1 = Open("$SAMPLE_DATA/Big Class.jmp");
// Open another table
dt2 = Open("$SAMPLE_DATA/Bands Data.jmp");
// Direct the analysis to the first table
fml = dt1 << Fit Model(
Y( :height ),
Effects( :weight )
);
fm = fml << Run;
// Prediction formula goes to the first, not the current table
Print(CurrentDataTable());
fm << predictionFormula;
Re : Comment savoir si une table est un sous-ensemble lié ?En fait, j'utilise un script qui exécute plusieurs analyses. En particulier, il enregistre les résidus et les autres colonnes de la plate-forme Fit Model, dans la table de données actuelle. Si cette table est liée à une autre, les colonnes sont enregistrées dans la table d'origine et non dans la table courante et cela fait échouer mon script.
Ainsi, lorsqu'un utilisateur lance le script, je voudrais d'abord vérifier si la table en cours n'est pas liée à une autre. Et comme je ne suis pas au courant de ce que l'utilisateur a fait auparavant, c'est la raison pour laquelle je ne suis pas en mesure de savoir ce qui pourrait être lié à quoi.
Faites-moi savoir si vous avez besoin de plus d'explications ou si quelque chose n'est pas clair!
D'ailleurs pour répondre au dernier post de Ian, je vois comment on pourrait construire cette matrice de liens mais si on a un tableau récapitulatif, je ne suis pas sûr que le script précédent fonctionnera. Si je ne me trompe pas lorsque vous sélectionnez des lignes dans le tableau d'origine, rien n'est sélectionné dans le tableau récapitulatif.
Donc, malheureusement, ce cas est toujours problématique.
Re : Comment savoir si une table est un sous-ensemble lié ?Je vais avec la réponse de Ian alors.
Pourquoi avez-vous besoin des informations de la table liée ? Il y a peut-être une autre approche.
Re : Comment savoir si une table est un sous-ensemble lié ?Oui, le scénario "tableau récapitulatif" est celui que j'ai essayé - D'où mes réponses ci-dessus. Mais je suis toujours en train de réfléchir à la façon dont votre session JMP peut entrer dans un état où vous ne savez pas ce qui est lié à quoi. Mais ça va.
Vous pouvez facilement construire une 'matrice de liaison' en utilisant 'NTable()' et ce que j'ai donné ci-dessus.
Re : Comment savoir si une table est un sous-ensemble lié ?Merci pour la suggestion Craige!
J'ai essayé "Get Table Variable Names" mais pas "Get Table Variable" !
J'ai fait quelques tests et ça a l'air de bien fonctionner !
Jusqu'à présent, il n'y a qu'un seul cas particulier où cela ne fonctionne pas. Si je crée un tableau récapitulatif lié au tableau d'origine, aucune variable de tableau n'est créée.
Une idée pour ce dernier point ?
Re : Comment savoir si une table est un sous-ensemble lié ?vous pourrez peut-être utiliser la variable table ; il faudra quelques tests car je ne sais pas s'il est toujours défini (mise à jour : j'ai essayé plusieurs façons de créer un sous-ensemble et il semble que la variable de table soit toujours créée) :
dt<<GETTABLEVARIABLE></GETTABLEVARIABLE>
This linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableCe sous-ensemble lié a une variable de table
Re : Comment savoir si une table est un sous-ensemble lié ?Merci Ian, c'est en effet un moyen très pratique de résoudre le problème !
J'ai juste besoin d'aller plus loin. Comment pouvons-nous faire cela si nous ne savons pas quelle est la table principale potentielle (dt dans votre code) ?
Doit-on tester toutes les tables d'ouverture ou existe-t-il une solution plus rapide ?
Re : Comment savoir si une table est un sous-ensemble lié ?Non, j'ai compris, mais cela sous-entendait que vous pouviez éviter le "problème". Mais si vous voulez dire rétrospectivement, vous pouvez faire quelque chose comme :
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
// Unlinked subset
dt << selectRandomly(0.1);
dt2 = dt << Subset(LinkToOriginalDataTable( 0 ) );
dt2 << setName("Unlinked");
// Linked subset
dt << selectRandomly(0.1);
dt3 = dt << Subset(LinkToOriginalDataTable( 1 ) );
dt3 << setName("Linked");
// Function to determine if two tables are linked
rLinked = Function({dt1, dt2}, {Default Local},
dt1 << selectAllRows;
if(NRow(dt2 << getSelectedRows) > 0,
linked = 1,
linked = 0
);
dt1 << clearSelect;
linked;
);
Print(rLinked(dt, dt2), rLinked(dt, dt3));Re : Comment savoir si une table est un sous-ensemble lié ?Merci pour ta réponse Ian.
Cependant mon objectif n'est pas de créer un sous-ensemble lié mais de déterminer si une table existante est liée à une autre ou non.
Désolé si je n'ai pas été assez clair !
Re : Comment savoir si une table est un sous-ensemble lié ?FWIW, en supposant que votre code crée les tables, vous pouvez créer des sous-ensembles liés ou non liés selon vos besoins :
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
// Unlinked subset
dt << selectRandomly(0.1);
dt2 = dt << Subset(LinkToOriginalDataTable( 0 ) );
dt2 << setName("Unlinked");
// Linked subset
dt << selectRandomly(0.1);
dt3 = dt << Subset(LinkToOriginalDataTable( 1 ) );
dt3 << setName("Linked");Re : Comment savoir si une table est un sous-ensemble lié ?Il est étrange qu'un utilisateur doive configurer un arbre de décision pour savoir si une table est liée ou non.
Je suppose que Jmp sait quelles tables sont liées.
Alors, pourquoi une telle information n’est-elle pas accessible via JSL ?
Est-ce que c'est vrai ?
edit : merci d'avoir fourni la fonctionnalité avec JMP18 : )
(voir ci-dessous)
Re : Comment savoir si une table est un sous-ensemble lié ?Une requête JSL pour demander à une table s'il s'agit d'un sous-ensemble lié n'existait pas auparavant. Cependant, cette conversation a attiré l'attention de JMP Development, et maintenant un message JSL a été ajouté dans la prochaine version majeure de JMP (JMP 18).
dt << est un sous-ensemble lié ; // retournera 1 ou 0
Re : Comment savoir si une table est un sous-ensemble lié ?@hogi - Maintenant, c'est une demande différente.
D'après ce que j'ai compris, le lien est créé (ou non) au moment de la création de la table. Celui-là fait toujours l'objet d'une enquête.
Re : Comment savoir si une table est un sous-ensemble lié ?Couper le lien signifie cloner les lignes que la table de sous-ensemble partage à partir de la table principale. La demande de dissociation de dtA pourrait être prototypée avec
- utilisez tables->subset pour faire une copie complète de dtA dans dtB
- fermer dtA
- renommer dtB en dtA
ce qui est imparfait car toutes les plateformes ouvertes sur dtA perdent leur connexion aux données. Cela peut s'avérer être un peu de code C++ pour un ensemble assez restreint de cas d'utilisation.@anne_sa explique un cas d'utilisation qui pourrait en bénéficier. Mais cela semble ouvrir une boîte de vers différente : tout à coup, la table liée de add-in_1 n'est plus liée car add-in_2 l'a dissociée. Je suis enclin à penser que pouvoir poser des questions sur l'état du lien pour décider si un clone est nécessaire pourrait être le point idéal ici.
Re : Comment savoir si une table est un sous-ensemble lié ?Merveilleux 
Allez-vous ajouter une fonctionnalité pour couper le lien ?
fonctionnalité pour couper la connexion entre une table liée et la table principale
Re : Comment savoir si une table est un sous-ensemble lié ?Si j'essaie de concaténer des tables avec l'option Ajouter au premier tableau,
le script s'arrête avec le message :
Cannot append to table: Big Class. Possible reasons for this include: the table is locked, the table is in a platform with a by group, or there is a linked subset of the table. in access or evaluation of 'Concatenate' , Concatenate(/*###*/Data Table( "Subset of Big Class" ), Append to first table)
Le message d'erreur a été très utile pour identifier le problème.
Mais comment rendre le script robuste contre les sous-ensembles liés ?
Une fonction d'addition :
dt << obtenir la liste des sous-ensembles liés()
aidera. Ensuite, je peux fermer les sous-ensembles via JSL.
Alternatives :
- Jmp met à jour les tables de données liées
- Jmp coupe le lien automatiquement
- concaténer obtenir une nouvelle option : Jmp_is_allowed_to_close_linked_data_tables_if_this_is_needed_to_run_this_concatenate(1)
Re : Comment savoir si une table est un sous-ensemble lié ?Il n’est pas facile de garder tous les sous-ensembles liés et les rapports « vivants » lorsque les données sont triées ou ajoutées.
La solution la plus simple : empêcher un utilisateur de trier un tableau, d'ajouter des lignes ou de concaténer des tableaux lorsque des sous-ensembles ou des rapports liés sont ouverts.*)
Du point de vue de l'utilisateur :
J'espère qu'il pourra être optimisé dans une future version de JMP.
Votre script a planté ou avez-vous été bloqué par des messages d'erreur tels que

... alors s'il vous plaît votez :
Trier un tableau de données + ajouter des lignes + concaténer -> rendre cela possible
*)
avec un sous-ensemble encré :
trier → non
ajouter des lignes → non
concaténer → non
avec un rapport ouvert :
chance → non
ajouter des lignes → oui (!)
concaténer → oui (!)
avec des tableaux récapitulatifs liés :
trier → non [pourquoi SORT ne « coupe pas le lien » ?!?]
ajouter des lignes → oui²
concaténer → oui²
² JMP coupe automatiquement le lien :
