j'ai reçu le formule dont je veux discuter il y a presque 3 ans @txnelson , ne l'a jamais lâché depuis et y a réfléchi à plusieurs reprises auparavant, s'attaquant lentement un peu plus sérieusement aux scripts. En attendant, la formule m'a sauvé beaucoup de temps.
Dans l’exemple ci-dessous, la même formule est ajoutée 3 fois, avec à chaque fois un peu de variation. Le problème dont je souhaite discuter concerne les différents messages d'erreur générés lors de la copie et de l'exécution du script de table de la table, y compris les colonnes de formule nouvellement ajoutées.
Names Default To Here( 1 );
// first, we need an example table
dt = New Table( "ExampleTable",
Add Rows( 24 ),
New Column( "BatchId",
Character,
"Nominal",
Set Values(
{"A", "A", "A", "A", "A", "A", "B", "B", "B", "C", "C", "C", "D", "D",
"D", "E", "E", "E", "F", "F", "F", "G", "G", "G"}
)
),
New Column( "StorageCondition",
Character,
"Nominal",
Set Values(
{"25°C/60%RH", "25°C/60%RH", "25°C/60%RH", "5°C", "5°C", "5°C",
"25°C/60%RH", "25°C/60%RH", "25°C/60%RH", "25°C/60%RH", "25°C/60%RH",
"25°C/60%RH", "25°C/60%RH", "25°C/60%RH", "25°C/60%RH", "25°C/60%RH",
"25°C/60%RH", "25°C/60%RH", "25°C/60%RH", "25°C/60%RH", "25°C/60%RH",
"25°C/60%RH", "25°C/60%RH", "25°C/60%RH"}
)
),
New Column( "Time",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values(
[0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2]
)
),
New Column( "QcParameter",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values(
[0.2, 0.3, 0.4, 0.2, 0.21, 0.22, 0.3, 0.9, 1.2, ., 0.2, 0.4, 0.1, ., 0.1,
0, 0, 0, 0.1, 0, 0, 0, 0.1, 0]
)
)
);
// adding formula column via approach nr. 1<BR />// this adds the formula alright, but when copying and executing the resulting table script will leave the formula column empty<BR />// no need to discuss this, because this obviously missing the 'eval(eval expr(expr()))' wrapping (see screenshot below)
dt << New Column( "QcParameter [% rel.]_1",
numeric,
formula(
curBatch = :BatchId;
curCondition = :StorageCondition;
theRows = dt << get rows where(
:BatchId == curBatch & :StorageCondition == curCondition & :Time == 0
);
d0Row = theRows[1];
d0Time = :QcParameter[d0Row];
(100 * :QcParameter / d0Time);
)
);
// adding formula column via approach nr. 2<BR />// this will fill the formula column as desired when copying and running the table script with the added formula columns<BR />// but it will also throw an error message when new rows are added to the table then (see screenshot below)
Eval(
Eval Expr(
dt << New Column( "QcParameter [% rel.]_2",
numeric,
formula(
curBatch = :BatchId;
curCondition = :StorageCondition;
theRows = Expr( dt ) << get rows where(
:BatchId == curBatch & :StorageCondition == curCondition & :Time == 0
);
d0Row = theRows[1]; // removed from approach nr. 3
d0Time = :QcParameter[d0Row];
(100 * :QcParameter / d0Time);
)
)
)
);
// adding formula column via approach nr. 3
// this will fill the formula column as desired when copying and running the table script with the added formula columns<BR />// and it will NOT throw an error message when new rows are added to the table then (see screenshot below)
Eval(
Eval Expr(
dt << New Column( "QcParameter [% rel.]_3",
numeric,
formula(
curBatch = :BatchId;
curCondition = :StorageCondition;
theRows = Expr( dt ) << get rows where(
:BatchId == curBatch & :StorageCondition == curCondition & :Time == 0
);
d0Time = :QcParameter[theRows];
(100 * :QcParameter) / d0Time;
)
)
)
);
Capture d'écran du message d'erreur pour la colonne de formule "QcParameter [%r rel.]_1]" lors de la réexécution du script de table avec des colonnes de formule supplémentaires :

Capture d'écran du message d'erreur pour la colonne de formule "QcParameter [%r rel.]_2]" lors de la réexécution du script de table avec des colonnes de formule supplémentaires :

Capture d'écran du message d'erreur pour la colonne de formule "QcParameter [%r rel.]_3]" lors de la réexécution du script de table avec des colonnes de formule supplémentaires :

La raison pour laquelle je pose cette longue question est que je suppose il doit y avoir une raison pour laquelle la variable "d0Row" est utilisée dans l'approche n°. 2, non ?Pour l'approche nr. 3 J'ai simplement supprimé cette variable (voir capture d'écran ci-dessous) et la formule se comporte "beaucoup plus bien" en conséquence, c'est-à-dire qu'il n'y a pas de message d'erreur lorsque de nouvelles lignes sont ajoutées ad hoc par pointer-cliquer sur la table de données.

Ma question est donc la suivante : si je fais quelque chose de mal en supprimant la variable "d0Row". Dans la vraie vie, je travaille avec des tableaux de données plus volumineux et je ne pourrai pas vérifier l'exactitude de chaque ligne individuellement.
Je ne suis pas complètement sûr de suivre votre problème, mais ce que je vois, c'est que votre référence à dt est que lorsque vous copiez la formule 1, la référence à dt est manquante.Dans les exemples 2 et 3, vous vous retrouvez avec la référence de table de données pointant vers la table de données "ExampleTable" et le nom de votre table de données, comme indiqué, est "Example Table 2".Encore une fois, si je comprends votre problème, je pense que vous pouvez résoudre le problème en utilisant "Current Daa Table()".
curBatch = :BatchId;
curCondition = :StorageCondition;
theRows = Current Data Table() << get rows where(
:BatchId == curBatch & :StorageCondition == curCondition & :Time == 0
);
d0Row = theRows[1];
d0Time = :QcParameter[d0Row];
If( Row() == 11,
Show( therows, d0Time )
);
(100 * :QcParameter) / d0Time;
Merci! Je vais essayer de résumer à nouveau :
- Lors de l'ajout des trois colonnes de formules à l'exemple de table auparavant sans colonnes de formules, puis de la copie et de l'exécution du script de table résultant de la table contenant maintenant les trois colonnes de formules, seuls les exemples 2 et 3 rempliront les colonnes de formules correspondantes avec les valeurs relatives attendues. . La première colonne de formule reste vide.
- De plus, lors de l'ajout de nouvelles lignes au tableau final créé sous 1. (c'est-à-dire à partir du script de table contenant désormais les 3 colonnes de formule), seul le troisième exemple ne générera pas de message d'erreur lors de l'ajout de nouvelles lignes vides.
En raison de cette observation, j'ai supprimé la variable "d0Row" dans le cadre de l'exemple 3. Suite à cela, aucun message d'erreur n'apparaît lors de l'ajout de nouvelles lignes au tableau et il reproduit les données relatives comme prévu. La question est donc de savoir si "d0Row" est nécessaire . J'ai créé l'exemple 3 spécifiquement pour tester cette hypothèse. (La suppression de "d0Row" rend la formule plus courte, mais mon souci est que cette variable soit essentielle ou que j'oublie quelque chose. Suis-je?
Je ne suis pas sûr que cela soit lié à l'utilisation ou à la non-utilisation de "table de données actuelle ()" dans la formule. J'utilise depuis longtemps la "table de données actuelle ()" comme solution de contournement. Cela entraînera toujours des messages d'erreur lors de l'ajout de nouvelles lignes à une table, mais je souhaite toujours pouvoir ajouter de nouvelles lignes à une table sans avoir à confirmer constamment les messages d'erreur pour chaque colonne relative d'une table lorsqu'une nouvelle ligne est ajoutée. Il y a des dizaines de colonnes relatives et cela prend du temps de répéter cette opération. Il est bien sûr possible de supprimer l’évaluation, mais cela prend aussi du temps. Toutes mes excuses si cet exemple n'est pas clair, mais je suis prêt à expliquer davantage.)
Pas exactement lié à cette question, mais vous pouvez "simplifier" la formule avec quelques magies de la fonction Col. Ces suggestions devraient fonctionner, mais vous devez les vérifier avant de remplacer l'ancienne formule de travail
dt << New Column("FormulaA", Numeric, Continuous, Formula(
100 * :QcParameter / Col Sum(If(:Time == 0, :QcParameter, .),:BatchID, :StorageCondition)
));
Si les données sont triées de telle manière que le temps 0 soit toujours le premier pour le groupe, vous pouvez les rendre encore plus faciles à comprendre (peut-être)
dt << New Column("FormulaB", Numeric, Continuous, Formula(
100 * :QcParameter / QcParameter[Col Min(Row(), :BatchID, :StorageCondition)]
));