¿Cómo funciona la fórmula de aprobado/reprobado?Tengo un problema en el que las fórmulas devuelven valores nulos.
La tabla sin procesar contiene los datos sin procesar y existe una tabla de especificaciones que determina si los datos sin procesar cumplen o no con los requisitos de la tabla. He creado un JSL; por favor, ayúdenme a identificar el problema. Gracias.
Names Default To Here( 1 );
//raw data
dt = Data Table( "raw data001" );
dt1 = dt << subset( all rows, all columns );
//spec table
dtbz = Data Table( "Spec" );
LSL = dtbz[0, 3];
USL = dtbz[0, 4];
dtbz << New Column( "combine", formula( :Project || :Item ) );
// Create separate judgment columns for the columns to be judged
items = Design( dtbz:Item << get values(), <
<LEVELS>
0, dtbz:LSL[Loc( dtbz:combine << get as matrix(), "A" || it )[1]] <= Column( dt1, items[i] ) <= dtbz:USL[ Loc( dtbz:combine << get as matrix(), "A" || it )[1]], :Project == "B" & N Items( Loc( dtbz:combine << get as matrix(), "B" || it ) ) > 0, dtbz:LSL[Loc( dtbz:combine << get as matrix(), "B" || it )[1]] <= Column( dt1, items[i] ) <= dtbz:USL[ Loc( dtbz:combine << get as matrix(), "B" || it )[1]], :Project == "C" & N Items( Loc( dtbz:combine << get as matrix(), "C" || it ) ) > 0, dtbz:LSL[Loc( dtbz:combine << get as matrix(), "C" || it )[1]] <= Column( dt1, items[i] ) <= dtbz:USL[ Loc( dtbz:combine << get as matrix(), "C" || it )[1]], :Project == "D" & N Items( Loc( dtbz:combine << get as matrix(), "D" || it ) ) > 0, dtbz:LSL[Loc( dtbz:combine << get as matrix(), "D" || it )[1]] <= Column( dt1, items[i] ) <= dtbz:USL[ Loc( dtbz:combine << get as matrix(), "D" || it )[1]], ) ) ) );
</LEVELS>
Automatización y scriptingRe: ¿Cómo funciona la fórmula de aprobado/reprobado?Aquí hay una revisión de su script que creo que lo simplifica y aún le proporciona sus rendimientos

Names Default To Here( 1 );
//raw data
dt = Data Table( "raw data001" );
dt1 = dt << subset( all rows, all columns );
//spec table
dtbz = Data Table( "Spec" );
LSL = dtbz[0, 4];
USL = dtbz[0, 5];
//dtbz << New Column( "combine", formula( :Project || :Item ) );
dtbz << New Column( "combine", character, formula( :Project || :Item ) );
// Create separate judgment columns for the columns to be judged
// items = Design( dtbz:Item << get values(), <<LEVELS> 0,
dtbz:USL[Loc( dtbz:combine << get as matrix(), "A" || it )[1]] <= Column( dt1, items[i] )
<= dtbz:USL[Loc( dtbz:combine << get as matrix(), "A" || it )[1]],
:Project == "B" & N Items( Loc( dtbz:combine << get as matrix(), "B" || it ) ) > 0,
dtbz:USL[Loc( dtbz:combine << get as matrix(), "B" || it )[1]] <= Column( dt1, items[i] )
<= dtbz:USL[Loc( dtbz:combine << get as matrix(), "B" || it )[1]],
:Project == "C" & N Items( Loc( dtbz:combine << get as matrix(), "C" || it ) ) > 0,
dtbz:USL[Loc( dtbz:combine << get as matrix(), "C" || it )[1]] <= Column( dt1, items[i] )
<= dtbz:USL[Loc( dtbz:combine << get as matrix(), "C" || it )[1]],
:Project == "D" & N Items( Loc( dtbz:combine << get as matrix(), "D" || it ) ) > 0,
dtbz:USL[Loc( dtbz:combine << get as matrix(), "D" || it )[1]] <= Column( dt1, items[i] )
<= dtbz:USL[Loc( dtbz:combine << get as matrix(), "D" || it )[1]],
)
)
);*/
Eval(
Substitute(
Expr(
dt1 << New Column( it || "—yield",
formula(
curProject = :Project;
Try( dtbzRow = (dtbz << get rows where( dtbz:Project == curProject & dtbz:item == __it__ ))[1], 0 );
If( dtbzRow > 0,
If( dtbz:LSL[dtbzRow] <= As Column( dt1, __it__ ) <= dtbz:USL[dtbzRow],
1,
0
)
);
)
)
),
Expr( __it__ ), it
)
);
);</LEVELS>
Re: ¿Cómo funciona la fórmula de aprobación/rechazo?Muchas gracias por tu rápida respuesta, funciona.
Re: ¿Cómo funciona la fórmula de aprobación/rechazo?Hola Jim , otro pequeño problema es que cuando la USL y la LSL correspondientes no se encuentran en la tabla de especificaciones, se debe devolver el valor nulo, pero este código se ejecuta y devuelve 0. No sé que está pasando.
Re: ¿Cómo funciona la fórmula de aprobado/reprobado?La modificación original que proporcioné asumía que todos los límites de especificaciones estarían disponibles.Para permitir la posibilidad de que falten Límites, las fórmulas deben cambiarse para manejar esos casos.El JSL a continuación se ajusta a un par de casos posibles, pero es posible que deba agregar otros, como:
La USL es menor que la LSL
Names Default To Here( 1 );
//raw data
dt = Data Table( "raw data001" );
dt1 = dt << subset( all rows, all columns );
//spec table
dtbz = Data Table( "Spec" );
// Create separate judgment columns for the columns to be judged
// items = Design( dtbz:Item << get values(), <<LEVELS> 0 & Is Missing( dtbz:LSL[dtbzRow] ) == 0 & Is Missing( dtbz:USL[dtbzRow] ) == 0,
If( dtbz:LSL[dtbzRow] <= As Column( dt1, __it__ ) <= dtbz:USL[dtbzRow],
1,
0
),
.
);
)
)
),
Expr( __it__ ), it
)
);
);</LEVELS>Re: ¿Cómo funciona la fórmula de aprobado/reprobado?Gracias, pero tengo una pregunta, ¿por qué el código anterior tenía este problema? Veo que la lógica del código anterior es: si se encuentra en la tabla SPEC, entonces el juicio, no encontrado y no hay código, debe ser el valor vacío ah, ¿por qué todavía se juzga?
Re: ¿Cómo funciona la fórmula de aprobación/rechazo?Los valores calculados persisten de una fila a otra, por lo que si una condición en la fila 2 no cambia el valor calculado, entonces el valor que se calculó para la fila 1 permanece sin cambios.
Re: ¿Cómo funciona la fórmula de aprobado/reprobado?¡Gracias! Lo probé y, de hecho, bajo la ejecución del código anterior, si no se encuentra en la tabla SPEC, irá por el dtbzRow de la fila anterior. Claramente no se encuentra, pero aún presiona el valor de la fila anterior. No encuentro esto en las fórmulas de rutina, ¿solo sucede cuando uso una búsqueda de otra tabla?
Re: ¿Cómo funciona la fórmula de aprobado/reprobado?Las variables de memoria en JMP permanecen persistentes hasta que se modifican.Aquí hay una secuencia de comandos que crea una nueva columna y fórmula que establece una variable "a" en la fila 1 y luego la cambia en la fila 10. Puede ver que el valor de "a" no cambia hasta la fila 10, pero permanece en el valor establecido inicial hasta entonces.
Names Default To Here( 1 );
dt =
// Open Data Table: Big Class.jmp
// → Data Table( "Big Class" )
Open( "$SAMPLE_DATA/Big Class.jmp" );
// New column: Column 6
Data Table( "Big Class" ) << New Column( "test",
Numeric,
"Continuous",
Format( "Best", 12 )
);
dt:test << set formula(
If( Row() == 1, a = 1 );
If( Row() == 10, a = a + 1 );
:test = a;
);
Re: ¿Cómo funciona la fórmula de aprobado/reprobado?Ya veo, es porque si no se puede encontrar en la declaración de prueba, no se le asignará, lo que dará como resultado el valor original, pero no se puede encontrar en la primera línea al principio, entonces, ¿cómo es? asignó?
Re: ¿Cómo funciona la fórmula de aprobado/reprobado?Anoté el guión en un esfuerzo por facilitar su lectura.También realicé un cambio menor en la función Try(), moviéndola para proporcionar un resultado a dtbzRow.
A ver si esto ayuda en la comprensión
Names Default To Here( 1 );
//raw data
dt = Data Table( "raw data001" );
dt1 = dt << subset( all rows, all columns );
//spec table
dtbz = Data Table( "Spec" );
// Create separate judgment columns for the columns to be judged
// items = Design( dtbz:Item << get values(), <<LEVELS> 0 & Is Missing( dtbz:LSL[dtbzRow] ) == 0 &
Is Missing( dtbz:USL[dtbzRow] ) == 0,
// If the column's value is between the LSL and USL
// the value is set to 1, if outside one of the
// limits it is set to 0
If(
dtbz:LSL[dtbzRow] <= As Column( dt1, __it__ ) <= dtbz
:USL[dtbzRow],
1,
0
),
.
);
)
)
),
Expr( __it__ ), it
)
);
);</LEVELS>Re: ¿Cómo funciona la fórmula de aprobado/reprobado?Entiendo, gracias por su paciencia!