JSL ne fonctionne pas correctement dans la version 19 mais fonctionne dans la version 17.Je viens de passer de JMP 17 à JMP 19. J'ai une routine longue et complexe qui fonctionne correctement avec JMP 17, mais qui échoue avec JMP 19. Il pourrait y avoir d'autres erreurs, mais la première que je rencontre concerne la sélection des lignes à modifier pour corriger des erreurs connues dans les données importées. Lors du débogage, je constate que la commande « Obtenir les lignes où » renvoie une matrice vide. J'ai vérifié que la ligne cible est bien présente dans la table de données et je peux forcer la sélection en saisissant les critères dans les menus.
row_to_update = newContrib << Get Rows Where(:"request_id" == 263496 & :"line_no" == 0);
La commande suivante ne parvient pas à effectuer la correction souhaitée sur cette ligne car row_to_update renvoie ceci : [](0, 1)
La variable newContrib a été définie précédemment comme un tableau de données. Lorsque je survole son nom, le tableau correspondant s'affiche correctement.
En me basant sur la documentation, j'ai essayé de modifier la ligne pour utiliser Where à la place, mais j'ai obtenu le même résultat.
row_to_update = newContrib[Where(:"request_id" == 263496 & :"line_no" == 0)];
Je n'ai rien trouvé dans les notes de version. Ma syntaxe semble pourtant correcte d'après la documentation.
Quelqu'un pourrait-il m'expliquer ce qui a changé pour que cela ne fonctionne plus, et peut-être comment y remédier ?
Merci beaucoup !
Nancy
Automatisation et scriptageRe : JSL ne fonctionne pas correctement dans la version 17 mais ne fonctionne pas dans la version 19<< La fonction Get Rows Where fonctionne toujours de cette manière dans JMP 19. Votre deuxième commande (utilisant Where()) devrait être légèrement modifiée.
Names Default To Here( 1 );
dt= Open( "$SAMPLE_DATA/Big Class.jmp" );
row_to_update = dt<< Get Rows Where( :"name" == "JANE" & :"age" == 12 ); //[3]
row_to_update2 = Where( dt, :name == "JANE" & :age == 12 ); //[3]
row_to_update = Where( newContrib, :request_id == 263496 & :line_no == 0 );
Quant à l'origine du problème ? Vérifiez que les types de données sont corrects. JMP 19 importe-t-il ces colonnes comme des caractères, alors que JMP 17 les importait comme des nombres ? Il s'agit probablement d'un problème aussi simple, car la syntaxe de << Get Rows Where n'a pas changé.
Re : JSL ne fonctionne pas correctement dans la version 17 mais ne fonctionne pas dans la version 19Salut Nancy,
Le symbole [](0,1) indique que row_to_update est une liste vide, donc qu'il n'y a aucune ligne correspondante dans la table de données. Étant donné que Get Rows Where() renvoie une liste, il serait peut-être plus judicieux d'utiliser l'approche différente décrite dans le script ci-dessous :
names default to here (1);
newContrib = New Table( "newContrib",
Add Rows( 3 ),
New Column( "request_id",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [263496, 263496, 263496] )
),
New Column( "line_no",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [0, 0, 1] )
)
);
row_to_update = newContrib << Get Rows Where(:"request_id" == 263496 & :"line_no" == 0);
//row_to_update is [1,2]
row_to_update = newContrib << Get Rows Where(:"request_id" == 263497 & :"line_no" == 0);
//row_to_update is empty: [](0, 1)
row_to_update = (newContrib << Get Rows Where(:"request_id" == 263496 & :"line_no" == 0))[1];
//row_to_update is 1
//a different approach:
rows_to_update = newContrib << Get Rows Where(:"request_id" == 263496 & :"line_no" == 0);
if (n items(rows_to_update) > 0, row_to_update = rows_to_update[1]);
Re : JSL ne fonctionne pas correctement dans la version 17 mais ne fonctionne pas dans la version 19Merci pour l'explication concernant la syntaxe correcte de la clause WHERE, pour la confirmation que la syntaxe de « Get Rows Where » n'avait pas changé, et surtout pour m'avoir suggéré de vérifier les types de données ! C'était effectivement le problème (les entiers étaient importés comme des chaînes de caractères). En fait, toutes mes données, réparties sur une douzaine de feuilles, sont maintenant importées comme des chaînes de caractères, alors qu'elles étaient auparavant automatiquement reconnues comme différents types. Il s'agit d'un changement tellement fondamental dans le comportement d'importation que je n'y avais même pas pensé. Je vous remercie donc de me l'avoir rappelé ! De plus, ajouter des lignes pour modifier les types de données des colonnes ou revoir les paramètres de ma commande ouverte est une solution bien plus simple que de modifier la syntaxe des centaines de lignes de code qui utilisent « Get Rows Where » !
Merci beaucoup,
Nancy
Re : JSL ne fonctionne pas correctement dans la version 17 mais ne fonctionne pas dans la version 19Je suis content que cela fonctionne pour vous. J'ajouterais simplement qu'il pourrait être judicieux de mettre à jour votre script pour utiliser Where(). Le gain de performance est considérable. Par exemple, j'ai exécuté ce code sur une table contenant un million de lignes. Where() était environ dix fois plus rapide que <
Names Default to Here( 1 );
dt = Current Data Table();
now = HP Time();
row_to_update = dt << Get Rows Where( :request_id == 220681 & :line_no == 70 );
then = HP Time();
elapsed = then - now;
Show( elapsed ); //119053
Wait( 2 );
now = HP Time();
row_to_update = Where( dt, :request_id == 220681 & :line_no == 70 );
then = HP Time();
elapsed = then - now;
Show( elapsed ); //11777