he recibido el fórmula que quiero discutir hace casi 3 años desde @txnelson , nunca lo solté desde entonces y lo pensé muchas veces hasta ahora, poco a poco afrontando un poco más en serio las secuencias de comandos. Mientras tanto, la fórmula me salvó. mucho de tiempo.
En el siguiente ejemplo, la misma fórmula se agrega 3 veces, cada vez con una pequeña variación. El problema que quiero analizar son los diferentes mensajes de error que aparecen al copiar y ejecutar el script de la tabla, incluidas las columnas de fórmula recién agregadas.
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;
)
)
)
);
Captura de pantalla del mensaje de error para la columna de fórmula "QcParameter [%r rel.]_1]" al volver a ejecutar el script de la tabla con columnas de fórmula adicionales:

Captura de pantalla del mensaje de error para la columna de fórmula "QcParameter [%r rel.]_2]" al volver a ejecutar el script de la tabla con columnas de fórmula adicionales:

Captura de pantalla del mensaje de error para la columna de fórmula "QcParameter [%r rel.]_3]" al volver a ejecutar el script de la tabla con columnas de fórmula adicionales:

La razón por la que hago esta larga pregunta es que asumo Debe haber alguna razón por la cual se utiliza la variable "d0Row" en el enfoque n.º. 2, ¿no?Para la aproximación n°. 3 Simplemente eliminé esta variable (vea la captura de pantalla a continuación) y, como resultado, la fórmula se comporta "mucho mejor", es decir, no aparece ningún mensaje de error cuando se agregan nuevas filas ad hoc apuntando y haciendo clic en la tabla de datos.

Mi pregunta entonces es si estoy haciendo algo mal al eliminar la variable "d0Row". En la vida real, estoy trabajando con tablas de datos más grandes y no podré verificar la precisión de cada fila individualmente.
No estoy completamente seguro de estar siguiendo tu problema, pero lo que veo es que tu referencia a dt es cuando copias la fórmula 1, falta la referencia a dt.En los ejemplos 2 y 3, termina con la referencia de la tabla de datos apuntando a la tabla de datos "ExampleTable" y el nombre de su tabla de datos, como se muestra, es "Example Table 2".Nuevamente, si entiendo su problema, creo que puede resolverlo usando "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;
¡Gracias! Intentaré resumir de nuevo:
- Al agregar las tres columnas de fórmula a la tabla de ejemplo que anteriormente no tenía columnas de fórmula, luego copiar y ejecutar el script de tabla resultante de la tabla que ahora contiene las tres columnas de fórmula, solo los ejemplos 2 y 3 completarán las columnas de fórmula correspondientes con los valores relativos esperados. . La primera columna de fórmula permanece vacía.
- Además, al agregar nuevas filas a la tabla final creada en 1. (es decir, del script de tabla que ahora contiene las 3 columnas de fórmula), solo el tercer ejemplo no arrojará un mensaje de error al agregar filas nuevas y vacías.
Debido a esta observación, eliminé la variable "d0Row" como parte del ejemplo 3. Después de esto, no aparece ningún mensaje de error al agregar nuevas filas a la tabla y reproduce los datos relativos como se esperaba. Por lo tanto, la pregunta es si se requiere "d0Row" . Creé el ejemplo 3 específicamente para probar esta hipótesis. (Eliminar "d0Row" hace que la fórmula sea más corta, pero mi preocupación es que esta variable es esencial o que estoy pasando por alto algo. ¿Lo soy?
No estoy seguro de que esto esté relacionado con el uso o no de la "tabla de datos actual ()" en la fórmula. He usado la "tabla de datos actual ()" como solución alternativa durante mucho tiempo. Esto seguirá generando mensajes de error al agregar nuevas filas a una tabla, pero aún quiero poder agregar nuevas filas a una tabla sin tener que confirmar constantemente mensajes de error para cada columna relativa de una tabla cuando se agrega una nueva fila. Hay decenas de columnas relativas en ellas y lleva tiempo repetir esta operación. Por supuesto, es posible suprimir la evaluación, pero esto también cuesta tiempo. Disculpas si este ejemplo no es claro, pero estoy dispuesto a explicarlo más).
No está exactamente relacionado con esta pregunta, pero puedes "simplificar" la fórmula con algunas magias de función Col. Estas sugerencias deberían funcionar, pero debes verificarlas antes de reemplazar la fórmula anterior.
dt << New Column("FormulaA", Numeric, Continuous, Formula(
100 * :QcParameter / Col Sum(If(:Time == 0, :QcParameter, .),:BatchID, :StorageCondition)
));
Si los datos se ordenan de tal manera que el Tiempo 0 sea siempre el primero para el grupo, puede hacerlo aún más fácil de entender (tal vez)
dt << New Column("FormulaB", Numeric, Continuous, Formula(
100 * :QcParameter / QcParameter[Col Min(Row(), :BatchID, :StorageCondition)]
));