Creación de columnas de fórmula en un bucle forTengo una secuencia de comandos que calcula las tasas de no conformidad para los códigos de no conformidad y también crea gráficos de control para cada código en un intervalo de fechas ingresado por el usuario. El usuario puede ingresar hasta cinco códigos individuales y hay más de 50 códigos para elegir. Se ha creado una tabla que tiene la cantidad total no conforme por código por fecha, la suma de las cantidades no conformes de todos los códigos ingresados y la cantidad total fabricada por día (Tasa NC por fecha por código - Original). Luego agrego a la tabla iterando a través de un bucle para agregar una columna para calcular la tasa de no conformidad para cada código y luego un segundo para mostrar la tasa como un porcentaje (Velocidad de NC por fecha por código - Completa). En este momento, todas las columnas de tasa están terminando como idénticas y, al igual que las columnas de porcentaje, no son la versión porcentual correcta de la tasa.
El bucle es básicamente idéntico al creado al final de la secuencia de comandos para resumir los datos de no conformidad en todo el rango de fechas (Tasa NC total por código - Original, Tasa NC total por código - Completa) que se calcula correctamente y no puedo decir qué está mal.
Incluí capturas de pantalla de las tablas mencionadas y las secciones del script (códigos = lista de todos los códigos ingresados como cadenas, SD y NR son referencias de tablas)
//NC Rate By Date Per Code Section
//Calculate NC rates and percentages for entered codes if two or more codes are entered
If(NItems(codes)>=2,
For(c=2, c<=NItems(codes)+1, c++,
//Add NC Rate column for each code
NR<<NEW column="">=2,
For(c=2, c<=NItems(codes)+1, c++,
//Add NC Rate column for each code
SD<<NEW column=""></NEW></NEW>Re: Creando Columnas De Fórmula En Un Bucle For @rfeick ,
Hay una diferencia en las fomulas de las dos últimas columnas y las creadas dentro de su bucle for. Las dos últimas columnas hacen referencia a la columna real para realizar el cálculo.
Debería mirar varias de las fórmulas de columnas creadas por su especificación de bucle for (ver más abajo)
NR<<NEW column=""></NEW>
La fórmula se verá así, no tendrá el valor de c, por lo que el resultado que obtenga será el resultado del valor final de c.
<SPAN class="token function">Round</SPAN><SPAN class="token punctuation">(</SPAN><SPAN class="token punctuation">(</SPAN><SPAN class="token function">Column</SPAN><SPAN class="token punctuation">(</SPAN>c<SPAN class="token punctuation">)</SPAN><SPAN class="token punctuation">[</SPAN><SPAN class="token punctuation">]</SPAN> <SPAN class="token operator">/</SPAN> <SPAN class="token punctuation">:</SPAN>Manufactured Qty<SPAN class="token punctuation">)</SPAN><SPAN class="token punctuation">,</SPAN> <SPAN class="token number">4</SPAN><SPAN class="token punctuation">)</SPAN>
Si guarda esta tabla y luego la abre en una nueva sesión JMP y vuelve a ejecutar las fórmulas, esas columnas estarán vacías, JMP no sabrá el valor de c.
Debe modificar su fórmula para usar una expresión que sustituya el valor de c o cambiar su secuencia de comandos para almacenar los valores calculados en lugar de la fórmula. El siguiente código muestra cómo utilizar Establecer cada valor () para almacenar los valores y no las fórmulas.
tcol = NR<<NEW column=""></NEW>
Re: Creando Columnas De Fórmula En Un Bucle For, gracias por la explicación. Probé el método Establecer cada fila y solucionó el problema que estaba viendo al calcular las tasas de incumplimiento por día. El único punto en el que todavía estoy confundido es cómo funcionó la misma teoría en una sección del guión, pero no en la otra.Re: Crear columnas de fórmula en un bucle For @rfeick ,
Con suerte, el siguiente script lo ayudará a comprender que a partir de JMP14, usar una variable en una columna de fórmula puede producir resultados erróneos porque cuando cambia el valor de la variable, cambian las fórmulas (y sus valores).
Con respecto a las dos últimas fórmulas en su secuencia de comandos:
Ejecute el script a continuación como se describe. Demuestra lo que sucede en las fórmulas de la tabla y, por lo tanto, en los valores. Este script también incluye un método para reemplazar la variable en la fórmula con el valor de las variables usando expresiones. Normalmente uso Establecer cada valor (), por lo que si se elimina la columna de origen, la columna está intacta. También tenga en cuenta que este script usa C El número de columna. Si quisiera la fórmula incrustada, recomiendo crear una nueva variable cnme = Columna (c) << obtener nombre , luego use Column (cnme) y expresiones. Entonces, si la tabla se reorganiza, etc. La fórmula es la esperada (intacta). Se adjunta el script que se muestra a continuación.
Names Default to Here(1);
dt = Open("$Sample_Data/Big Class.jmp");
//will create formula columns for height and weight using a relative column number , c
//c will change, simulating a loop.
//highlight the blocks of code and follow the instructions
//--- Block 0: run this to embed the log window
_cw = Current Window();
_ifb = _cw << Find( If Box( 1 ) );
wait(0);
_ifb << Set( 1 );
//--- end Block 0
//--- Block 1: run it and look at the look at the embedded log
c=4; //height
dt << New Column( (column(c) << get name) ||" per age", Numeric, Continuous, Formula(Round(column(c)[] /:age,2) ) );
nc1 = ncol(dt);
show( c, nc1, (column(nc1) << get formula), column(nc1)[1::5]);
//--- end Block 1
//--- Block 2: run it and look at the look at the embedded log
c=5; //weight
dt << rerun formulas;
nc1 = ncol(dt);
show( c, nc1, (column(nc1) << get formula), column(nc1)[1::5]);
//--- end Block 2 See the log, the formula is the same, but c has changed so the formula is now using column 5 (c=5)
// for its calculation
//--- Block 3: run it and look at the look at the log
c=5; //height
dt << New Column( (column(c) << get name) ||" per age", Numeric, Continuous, Formula(Round(column(c)[] /:age,2) ) );
nc2 = ncol(dt);
show( c, nc2, (column(nc2) << get formula), column(nc2)[1::5]); //same formula as nc1
show(column(nc1)[1::5], column(nc2)[1::5]);
//--- end Block 3
//will use formula columns for weight and height using expressions column number
//--- Block 4: run it and look at the look at the log
c=4; //height
Eval ( Eval Expr(
dt << New Column( (column(c) << get name) ||" per age using expr", Numeric, Continuous, Formula(Round(column(expr(c))[] /:age,2) ) )
));
nc3 = ncol(dt);
show( c, nc3, (column(nc3) << get formula), column(nc3)[1::5]);
//--- end Block 4 - note the formula now has the exact column number, it no longer relies on "c"
//--- Block 5: run it and look at the look at the log
c=5; //height
Eval(EvalExpr(
dt << New Column( (column(c) << get name) ||" per age using expr", Numeric, Continuous, Formula(Round(column(Expr(c))[] /:age,2) ) );
));
nc4 = ncol(dt);
show( c, nc4, (column(nc4) << get formula), column(nc4)[1::5]); //not the same formula as nc3,
show(column(nc3)[1::5], column(nc4)[1::5]);
//--- end Block 5
Re: Crear columnas de fórmula en un bucle ForGracias por la explicación extra!