Est-ce un bug ou il me manque quelque chose ?J'ai une table (ici simplifiée et appelée « TestBug.jsl » ci-jointe) qui est utilisée pour générer des nombres aléatoires, puis effectuer un calcul basé sur la variable de la table, appelons cela ma « table de simulation » car chaque fois que je la recalcule, ce serait une simulation que je veux répéter plusieurs fois.
alors j'ai le script suivant pour automatiser l'exécution de la même simulation plusieurs fois avec des entrées différentes et concaténer les tables résultantes dans une table "résultat".
Pour tester, exécutez simplement le script avec TestBug.jsl comme table de données actuelle,
Names Default To Here(1);
VarList={1,2,3,4};
New Namespace(
"MyNS"
);
MyNS:Simulator = Current Data Table();
MyNS:FinalT=MyNS:Simulator<
<SUBSET></SUBSET>
<P>Fondamentalement, le script itère et modifie les variables de la table dans la table du simulateur en fonction d'une liste d'entrée et des nombres résultants concaténés dans une « table de résultats » (sans transporter les formules mais juste les nombres)</P> <BR /> <P>Donc, ce que fait initialement le script est de créer une table de résultats vide qui a les mêmes colonnes que mon « simulateur », puis de modifier de manière itérative la variable de table dans le « simulateur » et de la concaténer à la table « résultat »</P> <BR /> <P>Cependant, pour une raison quelconque, chaque fois que je modifie la valeur de la variable « simulateur », une nouvelle colonne est créée à partir de la deuxième itération dans la table « résultat » avec le même nom de la variable et la remplissant avec la valeur selon un modèle étrange (voir image)</P> <BR /> <P>Fondamentalement, il ajoute la valeur de la variable à l’itération précédente dans les colonnes actives pour les nouvelles lignes concaténées et la valeur de l’itération finale à toutes les autres lignes…</P> <P>Cela n'est ennuyeux que pendant quelques itérations, mais rend l'ensemble du processus très lent/plantant pendant de nombreuses itérations.</P> <P>si je saute le « concaténer » ou le « définir la variable de table », les colonnes ne sont pas ajoutées.</P> <P>Je ne comprends pas ce que je fais de mal.</P>
<LINGO-LABS id="lingo-labs-906674" slang="en-US" mode="CREATE">
<LINGO-LABEL>Automatisation et scripts</LINGO-LABEL>
</LINGO-LABS>
Re : Est-ce un bug ou il me manque quelque chose ?Ces éléments sont ajoutés grâce à la variable table. Vous pouvez par exemple supprimer la variable table de votre table de sous-ensembles après sa création, puis après chaque concaténation.
Voir plus...
Names Default To Here(1);
VarList = {1, 2, 3, 4};
New Namespace(
"MyNS"
);
MyNS:Simulator = Datatable("TestBug");
MyNS:FinalT = MyNS:Simulator << subset(
Output Table("final table"),
Copy formula(0),
All rows,
Selected columns only(0)
);
MyNS:FinalT << Select All Rows;
MyNS:FinalT << Delete Rows;
Try(MyNS:FinalT << Delete Table Variable("myvar"));
advancementWin = New Window("Progress", TBsizes = Text Box(), );
For(is = 1, is <= Length(VarList), is++,
myVarVal = VarList[is];
TBsizes << set text(
"Simulating:" || Char(myVarVal) || "(" || Char(is) || "/" || Char(Length(VarList)) ||
")"
);
MyNS:Simulator << Suppress Formula Eval(1); //i need this as in the final version i make more changes and i want to avoid recalc of the random each change
MyNS:Simulator << set table variable("myvar", myVarVal);
MyNS:Simulator << Suppress Formula Eval(0);
MyNS:Simulator << Rerun Formulas();
MyNS:FinalT << Concatenate(MyNS:Simulator, Append to first table);
Try(MyNS:FinalT << Delete Table Variable("myvar"));
);
advancementWin << Closewindow();
Re : Est-ce un bug ou il me manque quelque chose ?Merci. Cela résout mon problème.
Si je comprends bien
Si vous concaténez deux tables avec des valeurs différentes pour les variables, une nouvelle colonne est ajoutée pour « suivre la valeur qu'elle avait dans les tables d'origine »
je peux comprendre pourquoi on veut faire ça, mais c'est un comportement étrange qui est déroutant
Votre astuce résout le problème, mais pour être complet, j'ai dû déplacer le
Try(MyNS:FinalT << Delete Table Variable("myvar"));
avant la concaténation