Column() vs As Column() vs datable:column vs dt:As name("column")JSL a plusieurs façons de faire référence aux colonnes. Ouvrons d'abord une table de données.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Bands data.jmp" );
Maintenant, nous créons un script de table qui a quelque chose comme ça.
dt = current data table();
print(dt:timestamp == Column(dt, "timestamp"));
// 0
print(Column(dt, "timestamp")==As Column(dt, "timestamp"));
//0
Dans les scripts automatisés (par exemple, un graphique), lorsqu'un utilisateur modifie le nom d'une colonne, il semble adapter le script au nouveau nom de colonne. Cela a échoué dans JSL personnalisé, avec quelque chose comme Index() apparaissant.
Comment utiliser toutes ces méthodes pour rendre un script JSL robuste aux changements de nom de colonne ?
Salutations,
ScriptRe : Column() vs As Column() vs datable:column vs dt:As name("column")En fait incroyable qu'un Tableau de bord fonctionne toujours après avoir renommé les colonnes
- s'il est stocké en tant que script de table 
Merci d'avoir implémenté un si bon algorithme de correction automatique.
Re : Column() vs As Column() vs datable:column vs dt:As name("column")Voici le souhait 
https://community.jmp.com/t5/JMP-Wish-List/catch-quot-missing-column-quot-error-and-provide-a-selection/idi-p/556596
Cela devrait être facile à implémenter maintenant pour JSL Editor - car une fonctionnalité similaire vient d'être introduite avec le nouveau générateur de flux de travail de Jmp 17 :
https://community.jmp.com/t5/JMP-Wish-List/catch-quot-missing-column-quot-error-and-provide-a-selection/idc-p/561663/highlight/true#M2949
Re : Column() vs As Column() vs datable:column vs dt:As name("column")Joli tutoriel vidéo sur les différences entre column() et as column() :
Erreurs JSL les plus courantes et comment les éviter (2020-US-30MP-571)
(à partir de 5:18 min)
avec l'exemple
dt << Select Where( Column( colName )[Row()] == 14 );
dt << Select Where( As Column( colName ) == 14 );
Concernant
Comment utiliser toutes ces méthodes pour rendre un script JSL robuste aux changements de nom de colonne ?
Que diriez-vous d'une fonctionnalité de gestion des erreurs qui intercepte les événements de colonne manquants après le changement de nom de colonne - avec une option pour corriger automatiquement le code.
L'idée:
En cas de colonne manquante, au lieu d'afficher un message d'erreur, JMP peut ouvrir une fenêtre avec une liste de colonnes pour choisir la bonne.
Ensuite, l'exécution du code pourrait continuer à s'exécuter - et le code source pourrait être corrigé automatiquement.
Re : Column() vs As Column() vs datable:column vs dt:As name("column")La meilleure référence (en dehors de ma propre expérience et de nombreux essais et erreurs) provient de l'index de script :


Les pages d'aide sont un autre endroit Colonne(- , "nom", "formaté") et
Comme colonne (nom) . Cela a aussi quelques informations Guide de script > Blocs de construction JSL > Règles pour la résolution de noms > Foire aux questions sur la résolution de noms et Guide de script > Tables de données > Colonnes > Envoyer des messages aux objets de colonne de données aussi Itérer sur les lignes d'un tableau , donc essentiellement la documentation (en particulier le Scripting Guide).
Re : Column() vs As Column() vs datable:column vs dt:As name("column")Pourriez-vous s'il vous plaît inclure dans votre réponse une référence qui explique ce bit?
"As Column() "accède" à une colonne ( ce que cela signifie dépend du cas... )."
Re : Column() vs As Column() vs datable:column vs dt:As name("column")Je n'aime généralement pas les messages +1, mais @jthi c'est exactement la même méthodologie que je fais pour les scripts de production.J'y pense généralement comme
Names default to here( 1 );
dt = open("$SAMPLE_DATA\Big Class.jmp");
col_name = "age";
show(ismissing(AsColumn(dt, col_name)) & ismissing(dt:age)); // these are both the same as far as I know
cols = dt << get column references; // these are the actual references
show(cols[2] == Column(dt, col_name)); // these are references
Re : Column() vs As Column() vs datable:column vs dt:As name("column")C'est un peu long et je saute ici et là, désolé pour ça..
Comme Column(), Column(), :colname, ... n'est pas simple en JSL et celui à utiliser dépend du cas. Ma méthode préférée est de toujours use (sauf quand je ne peux pas ou si je veux un look un peu plus propre dans le script) Column(datatable_reference, "chaîne du nom de la colonne"). :colname a ses avantages qui peuvent parfois être utilisés pour les scripteurs (certains sont mentionnés ici Guide de script > Blocs de construction JSL > Règles de résolution de noms > Règles de résolution de noms dans la section Exceptions).
J'aime aussi utiliser des chaînes de noms de colonnes au lieu de la syntaxe :colname pour éviter certains problèmes qui pourraient survenir ici et là. Par exemple << Get Column Names("String") au lieu de simplement << Get Column Names() puis j'obtiens la référence avec Column(string) si nécessaire.
Colonne(- , "nom", "formaté") et
Comme colonne (nom) ne sont pas les mêmes. Column() vous renvoie une référence à la colonne et As Column "accède" à une colonne (ce que cela signifie dépend du cas...). Lorsque vous exécutez ce script pour la première fois, dt:timestamp renverra la valeur manquante, car Row() n'a pas été correctement défini pour l'indexation de JMP (il est initialisé à 0).
Voir plus...
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
//Row() = 0;
Show(Row(), dt:name, Column(dt, "name"), As Column(dt, "name"));
Row() = 1;
Show(Row(), dt:name, Column(dt, "name"), As Column(dt, "name"), Column(dt, "name")[], Column(dt, "name")[Row()]);
Print(dt:name == Column(dt, "name"));
// 0
Print(Column(dt, "name") == As Column(dt, "name"));
//0
Print(dt:name == As Column(dt, "name"));
//1
stop();
//
Show(Column("name") << get values);
Show(As Column("name") << get values);
Show(:name << get values);
stop();
col1 = "name";
gb = dt << Graph Builder(
Size(529, 466),
Show Control Panel(0),
Variables(X(col1), Y(:height)),
Elements(Points(X, Y, Legend(6)))
);
gb = dt << Graph Builder(
Size(529, 466),
Show Control Panel(0),
Variables(X(Eval(col1)), Y(:height)),
Elements(Points(X, Y, Legend(6)))
);
gb = dt << Graph Builder(
Size(529, 466),
Show Control Panel(0),
Variables(X(As Column(col1)), Y(:height)),
Elements(Points(X, Y, Legend(6)))
);
gb = dt << Graph Builder(
Size(529, 466),
Show Control Panel(0),
Variables(X(Column(col1)), Y(:height)),
Elements(Points(X, Y, Legend(6)))
);
gb = dt << Graph Builder(
Size(529, 466),
Show Control Panel(0),
Variables(X(Column(dt, col1)), Y(:height)),
Elements(Points(X, Y, Legend(6)))
);
@ih a quelques bonnes suggestions sur la façon de gérer les changements de nom dans les colonnes. De plus, lors de l'insertion de colonnes dans Graph Builder, par exemple, vous pouvez utiliser Insérer une expression dans une autre en utilisant Eval Insert, Eval Expr, Parse et Substitute et parfois Eval(). << Get Name peut également être utile de temps en temps ou pour créer une interface utilisateur avec Filter Col Selector / Col List Box par exemple (comme @pauldeen suggéré).
Re : Column() vs As Column() vs datable:column vs dt:As name("column")Tu veux dire quelque chose comme ca?
Après avoir exécuté le code, les deux premières entrées du SCRIPT TABLE ont été automatiquement remplacées par le nouveau nom.
Cela a même fonctionné pour le :"name"n
Même comportement pour n'importe quel graphique etc. : automatiquement ajusté au nouveau nom de colonne.
Mais pour As column() et Column() cela n'a pas fonctionné.
Ni l'un ni l'autre n'a fait pour n'importe quel nom de colonne dans le manuscrit original 
avant:

après:

dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt << New Script(
"script",
:name;
:"name"n;<BR /> As Column( "name" );
Column("name");
);
dt:name << Set Name( "name_2" );
dt:name[1]
Re : Column() vs As Column() vs datable:column vs dt:As name("column")Comment serait toi savoir à quelle colonne le script doit faire référence ?Si vous avez vraiment besoin de surveiller les changements de nom de colonne, vous pouvez le faire en vous abonnant aux changements dans le tableau et en enregistrant ces noms de colonne quelque part, mais je pense que ce serait assez complexe.Pourriez-vous plutôt définir une propriété de colonne et la rechercher ?
Exemple d'abonnement du guide de script :
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
f = Function( {dtab, col, oldname},
Print( dtab << getname() );
Print( "new column name", (col << getname()) );
Print( "old name", oldname );
);
sub = dt << Subscribe( "", OnRenameColumn( f ) );
Column( dt, 1 ) << set name( "test" );
Wait( 1 );
dt << unsubscribe( sub, on rename column );
Utiliser la propriété de colonne
Names Default To Here( 1 );
dt = Open( "$Sample_data/big class.jmp" );
dt:height << Set Property( "My Script Identifier", X );
XVar = Filter Each({c}, dt << Get Column References,
ident = char(c << Get Property( "My Script Identifier" ));
if( is empty(ident), 0, ident == "X", 1, 0)
)[1];Re : Column() vs As Column() vs datable:column vs dt:As name("column")Indexez la colonne par numéro de colonne (dt, 1) ou invitez l'utilisateur à sélectionner une colonne ou à entrer un nom de colonne. Regardez dans New Window() dans les fichiers d'aide.