Hola, tengo dos archivos (Límites y wat_combined). El archivo de límites contiene los límites que quiero establecer para la misma prueba en el archivo wat_combined. Mi script JSL funciona correctamente, pero el área de límite de especificación de la columna... Por favor, indíquenme cómo solucionarlo.
Versión de Jmp: 18.2.0
txnelson Nota: edité el mensaje inicial de @Pranadeep , moviendo el JSL a un JSL Box y el registro a un Code Box
mi código jsl:
// --- Configuration ---
limitsFilePath = "C:\\Users\\saipranadeep\\Desktop\\JMP_Data\\script check\\Limits.jmp";
dataFilePath = "C:\\Users\\saipranadeep\\Desktop\\JMP_Data\\script check\\wat_combined.jmp";
// --- Script ---
Print("--- Script Start ---");
Print("Attempting to close any existing tables...");
Try( Close( Data Table( "Limits" ), NoSave ) );
Try( Close( Data Table( "wat_combined" ), NoSave ) );
Print("Existing tables closed (if any).");
Print("Opening Limits file: " || limitsFilePath);
dtLimits = Open( limitsFilePath );
Print("Opening Data file: " || dataFilePath);
dtData = Open( dataFilePath );
Print("Checking if tables opened successfully...");
If( Is Empty( dtLimits ), Throw( "Failed to open Limits JMP file: " || limitsFilePath ) );
If( Is Empty( dtData ), Throw( "Failed to open wat_combined JMP file: " || dataFilePath ) );
Print("Limits table opened successfully: " || Char(!Is Empty( dtLimits )) || " (1=Yes, 0=No)");
Print("Data table opened successfully: " || Char(!Is Empty( dtData )) || " (1=Yes, 0=No)");
colName_Test = "Test"; // From Limits file
colName_USL = "USL"; // From Limits file
colName_LSL = "LSL"; // From Limits file
Print("Column names defined: Test='" || colName_Test || "', USL='" || colName_USL || "', LSL='" || colName_LSL || "'");
// --- Ensure 'Test' column is Character type ---
Column( dtLimits, colName_Test ) << Set Data Type( Character );
// --- Create limit maps ---
lslMap = Associative Array();
uslMap = Associative Array();
rowCountLimits = N Row( dtLimits );
Print("Associative maps 'lslMap' and 'uslMap' created.");
// Populate limit maps with valid data from the Limits table
Print( "--- Start Populating Limit Maps (" || Char(rowCountLimits) || " rows total) ---" );
For( i = 1, i <= rowCountLimits, i++,
testNameKey_val = Column( dtLimits, colName_Test )[i];
usl_val = Column( dtLimits, colName_USL )[i];
lsl_val = Column( dtLimits, colName_LSL )[i];
If( Is Missing( usl_val ) | Is Missing( lsl_val ) | Is Missing( testNameKey_val ) | testNameKey_val == "",
Print( "Skipping Row " || Char(i) || " (Missing Data)" );
Next();
);
testNameKey = Char( testNameKey_val ); // Convert to string
lsl_num = Num( lsl_val );
usl_num = Num( usl_val );
If( Is Missing( lsl_num ) | Is Missing( usl_num ),
Print( "Skipping Row " || Char(i) || " (Invalid Numeric Conversion)" );
Next();
);
// Add to maps if valid
lslMap[testNameKey] = lsl_num;
uslMap[testNameKey] = usl_num;
Print( "Added LSL=" || Char(lsl_num) || ", USL=" || Char(usl_num) || " for test '" || testNameKey || "' to maps" );
);
Print( "--- Finished Populating Limit Maps ---" );
// --- Applying Spec Limits ---
Print("--- Applying Spec Limits to Columns ---");
dataCols = dtData << Get Column Names( String );
limitTestNames = lslMap << Get Keys;
appliedCount = 0;
For( i = 1, i <= N Items( dataCols ), i++,
dataColName = dataCols[i];
longestMatchName = ""; // Track the best matching test name
matchFound = 0; // Flag to check if any match is found
For( j = 1, j <= N Items( limitTestNames ), j++,
limitTestName = limitTestNames[j];
If( Contains( Lowercase( Trim( dataColName ) ), Lowercase( Trim( limitTestName ) ) ),
longestMatchName = limitTestName;
matchFound = 1;
);
);
If( matchFound,
lsl = lslMap[longestMatchName];
usl = uslMap[longestMatchName];
If( Is Number(lsl) & Is Number(usl),
// Apply Spec Limits and ensure Graph Reference Lines are shown
Column( dtData, dataColName ) << Set Property(
"Spec Limits",
{LSL( lsl ), USL( usl ), Show Limits( 1 )}
);
appliedCount++;
Print( "Applied limits from [" || longestMatchName || "] to column: [" || dataColName || "] (LSL=" || Char( lsl ) || ", USL=" || Char( usl ) || ")" );
);
);
);
Print( "Applied limits to " || Char(appliedCount) || " columns." );
// --- Save Data Table ---
dtData << Save( "$DESKTOP/JMP_Data/script check/wat_combined_with_limits.jmp" ); // Save table with changes
// --- Final Check ---
Print("Spec limits should now be applied to columns.");
Print("--- Script End ---");
Registro:
"--- Script Start ---"
"Attempting to close any existing tables..."
"Existing tables closed (if any)."
"Opening Limits file: C:\\Users\\saipranadeep\\Desktop\\JMP_Data\\script check\\Limits.jmp"
"Opening Data file: C:\\Users\\saipranadeep\\Desktop\\JMP_Data\\script check\\wat_combined.jmp"
"Checking if tables opened successfully..."
"Limits table opened successfully: 1 (1=Yes, 0=No)"
"Data table opened successfully: 1 (1=Yes, 0=No)"
"Column names defined: Test='Test', USL='USL', LSL='LSL'"
"Associative maps 'lslMap' and 'uslMap' created."
"--- Start Populating Limit Maps (4 rows total) ---"
"Added LSL=25, USL=83 for test 'Vtl_P3uL' to maps"
"Added LSL=30, USL=88 for test 'Vtl_P3S' to maps"
"Added LSL=30, USL=36 for test 'Vtl_P3L' to maps"
"Added LSL=26, USL=32 for test 'Vtl_P3eL' to maps"
"--- Finished Populating Limit Maps ---"
"--- Applying Spec Limits to Columns ---"
"Applied limits from [Vtl_P3uL] to column: [Vtl_P3uL] (LSL=25, USL=83)"
"Applied limits from [Vtl_P3S] to column: [Vtl_P3S] (LSL=30, USL=88)"
"Applied limits from [Vtl_P3L] to column: [Vtl_P3L] (LSL=30, USL=36)"
"Applied limits from [Vtl_P3eL] to column: [Vtl_P3eL] (LSL=26, USL=32)"
"Applied limits to 4 columns."
"Spec limits should now be applied to columns."
"--- Script End ---"
asunto:
Hola, tengo dos archivos (Limits y wat_combined). El archivo Limit contiene los límites que quiero establecer para la misma prueba en el archivo wat_combined(column). Mi script JSL funciona correctamente, pero no se agrega el área de límite de especificación de la columna. Por favor, indíquenme cómo solucionarlo.

Después de una mirada rápida al JSL, he observado 2 elementos que pueden causar problemas.
- No conozco ninguna función llamada Next(). La usas un par de veces en el código. Supongo que podría ser la función Break() la que buscas usar.
- Around line 110 you are attempting to set the Spec Limits column property. In it you reference the memory variables of usl and lsl. The issue is that the references are within a JMP list {}. JMP lists are not evaluated prior to execution. Therefore, usl and lsl will not be evaluated. The easiest way to get the values evaluated is to use Eval( Evalexpr ())
Eval(
Eval Expr(
Column( dtData, dataColName ) << Set Property(
"Spec Limits",
{LSL( Expr( lsl ) ), USL( Expr( usl ) ), Show Limits( 1 )}
)
)
);
This will force the evaluation prior to actually executing the Set Property
Hola,
Si tiene problemas con los scripts o simplemente prefiere una solución lista para usar, hay un breve tutorial con un complemento JMP que muestra cómo manejar los límites de especificaciones y el análisis de rendimiento sin escribir JSL:
https://www.youtube.com/watch?v=Nx5jWKAl7Z0
YieldOptiX está diseñado para flujos de trabajo de datos de prueba y aprovecha la función de administración de límites de especificaciones de JMP al agregar también la capacidad de encontrar automáticamente los mejores límites en función de los parámetros de distribución, ya sea dentro o más allá de las restricciones predefinidas.
Podría ser útil si buscas un enfoque más simplificado.