Liste des tables : comment mettre à jour de manière interactive et ne pas perdre la sélectionJ'ai vu des discussions sur ce sujet et je n'ai pas trouvé la solution.
Le problème est le suivant:
Je travaille avec la liste des tables qui s'affiche dans une zone de liste. J'utilise la méthode N Table() pour obtenir une liste de noms pour toutes les tables.
Ce que je veux, c'est que si je clique pour sélectionner des lignes dans cette liste - la liste elle-même est mise à jour et vérifiée s'il y a de nouvelles tables ouvertes ou si certaines tables ont été fermées.
La bonne chose à faire est d'utiliser Set Items (openDTs) chaque fois que je clique pour sélectionner. Il met à jour la liste des tables très bien - le problème est qu'il supprime la sélection.
Si j'utilise Append(openDTs) sur la zone de liste, cela ajoute toutes les nouvelles tables ouvertes, mais si je ferme la table, cela ne supprime pas la table fermée.
Quelle est la manière la plus élégante et la plus correcte de mettre à jour la liste des tables, reflétant les tables ouvertes et fermées à chaque clic sur la liste, de sorte que la sélection soit conservée ?
Re : Liste des tables : comment mettre à jour de manière interactive et ne pas perdre la sélectionmiguello,
Kevin Anderson a posté un script de la 2e édition de notre livre, JSL Companion dans la discussion sur ce lien
Comparer des listes mais avec des chaînes partielles
Donc, ma recommandation est de modifier votre première fonction qui renvoie une liste des éléments sélectionnés dans la zone de liste. Utilisez ensuite la fonction Lfunc() avec contains ou utilisez une fonction d'intersection qui trouve une intersection de la liste sélectionnée avec les ctbls, la liste des tables courantes. La liste résultante sera celle que vous devez sélectionner. Le lien décrit une technique simple utilisant des tableaux associatifs pour trouver une intersection, ou regardez le script joint du chapitre 5 : fonction uniq_intersect(ctbls, selliste) .
J'espère que c'est clair. Je n'en ai pas ajouté plus hier, puisque votre autre fonction était si proche.
Re : Liste des tables : comment mettre à jour de manière interactive et ne pas perdre la sélectionMerci, Géorgie !
C'est certainement une façon plus élégante d'avoir une liste de tables à jour. La seule petite question est - quelle est la meilleure façon de mettre à jour la zone de liste avec un élément sélectionné sans perdre la sélection ?
Re : Liste des tables : comment mettre à jour de manière interactive et ne pas perdre la sélectionmiguello,
Si vous utilisez JMP 14, il existe une nouvelle commande Get Data Table List() qui renvoie une liste des tables de données ouvertes. Si vous n'utilisez pas JMP 14, la commande N Table() est requise.
S'abonner également à la liste des tables de données (, OnOpen() | OnClose() | OnRename() ) est disponible sur JMP 12, 13,14.
Vous trouverez ci-dessous un script pour explorer les abonnements aux tables. Notez qu'au lieu d'afficher les ctbls, vous pouvez mettre à jour la liste à chaque modification.
Remarque finale, NTable() "comptera" les tables de données invisibles, mais les tables de données privées ne sont pas comptées.
Names Default To Here( 1 );
//---Use one of these functions
//---- JMP 14 function
//ctbls = Get Window List( Type("DataTables")) << Get Window Title();
// --- User function to returns a list of table names
curtbl_fn = Function({}, {nt, tlist={}, i},
nt= NTable();
If(nt >0,
For(i=1, i<=nt, i++,
Insert into(tlist, Data Table(i) << get name)
);
); // end if
tlist
); //end Function
//------ functions to handle when a new table is created, whe a table is renamed and when a table is closed.
fnew = Function( {dtab},
Insert Into(ctbls, dtab << Get Name );
show(ctbls, NTable())
);
fnnme = Function( {dtab, b},{i},
show(dtab, b);
i = contains(ctbls, b );
If (i>0, ctbls[i] = dtab << get name);
show(ctbls, NTable())
);
fclose = Function( {dtab}, {i},
i = contains(ctbls, dtab<<GET name="">0, remove from(ctbls, i));
show(ctbls, NTable());
);
Open("$Sample_Data/Variability Data/2 Factors Crossed.jmp");
Open("$Sample_Data/Baseball.jmp");
Open("$Sample_Data/Basketball.jmp");
Open("$Sample_Data/Football.jmp");
Open("$Sample_Data/Fishing.jmp");
Open("$Sample_Data/Pogo Jumps.jmp");
//_____________________________________________________________________
//--- Run to here ------------------------
//use the JMP 14 command or the functions
ctbls =curtbl_fn();
show(ctbls, NTable());
//--- Run to here and check the log------------------------
aSub = Subscribe to Data Table List( , OnOpen( fnew ) );
Subscribe to Data Table List( aSub, OnRename( fnnme ) );
Subscribe to Data Table List( aSub, OnClose( fclose ) );
dt = Open( "$SAMPLE_DATA/Iris.jmp" );
Wait( 2 );
dt << setname( "yyy" );
// two printouts: one for OnOpen() and one for OnRename()
//--- Run to here and check the log------------------------
Close(Data Table("Fishing"), NoSave);
//--- Run to here and check the log------------------------
//Check Table manipulations
Data Table("yyy") << Subset (All Rows, All Columns, Output Table Name ("Iris redux") );
//--- Run to here and check the log------------------------
Unsubscribe to Data Table List(asub, All);
print("should not do anything");
Close(Data Table("Baseball"), NoSave);</GET>
Re : Liste des tables : comment mettre à jour de manière interactive et ne pas perdre la sélectionPour l'instant je l'ai résolu de cette façon:
Je me souviens du nom de la table sélectionnée, puis j'utilise Set Items pour réécrire complètement, puis je parcours toute la liste et compare le nom mémorisé avec la nouvelle liste (l'ordre, donc les indices peuvent être différents maintenant !). Dès que j'ai frappé le même nom, je me souviens de cet index et de l'ensemble sécrété à l'aide de cet index.
Voici le code :
listofTablesSelect=Function({this},{selectedIndex},
// This function is called when the List Box selection changes
selectedIndex = this << Get Selected;
selectedTableName = selectedIndex[1];
refreshListofTables();
for (i=1, i<=N Items(listofTablesList = this<<GET items=""></GET>Où refreshListofTables utilise Set Items :
refreshListofTables = Function({},
Show("Trying to refresh list of tables");
openDTs = List();
For( i = 1, i <= N Table(), i++,
Insert Into( openDTs, Data Table( i )<<GET name=""></GET>La seule chose que je n'aime pas : la fenêtre de journal affiche "Récursion JSL empêchée" - où se trouve exactement la récursivité ? Est
this << Set Selected(recallIndex);
appelant efficacement l'ensemble
refreshListofTables
à nouveau, partant en résurrection ?
Un moyen de contourner cela?
Merci,
M