Bonjour, j'ai deux fichiers (Limits et wat_combined). Le fichier Limit contient les limites que je souhaite définir pour le même test dans le fichier wat_combined. Mon script JSL fonctionne comme prévu, mais la zone de limite de spécification de la colonne est incorrecte. Veuillez me dire comment résoudre ce problème.
Version Jmp : 18.2.0
Remarque : j'ai modifié le message initial de @Pranadeep , en déplaçant le JSL dans une boîte JSL et le journal dans une boîte de code
mon code 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 ---");
Enregistrer:
"--- 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 ---"
problème:
Bonjour, j'ai deux fichiers (Limits et wat_combined). Le fichier Limit contient les limites que je souhaite définir pour le même test dans le fichier wat_combined(column). Mon script JSL fonctionne comme prévu, mais la zone de limite de spécification de la colonne n'est pas ajoutée. Merci de me dire comment résoudre ce problème.

Après un rapide coup d'œil sur le JSL, j'ai observé 2 éléments qui peuvent poser problème.
- Je ne connais aucune fonction appelée Next(). Vous l'utilisez plusieurs fois dans le code. Je suppose que vous cherchez à utiliser la fonction Break().
- 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
Salut,
Si vous rencontrez des problèmes de script ou préférez simplement une solution prête à l'emploi, il existe un court didacticiel avec un module complémentaire JMP montrant comment gérer les limites de spécifications et l'analyse de rendement sans écrire de JSL :
https://www.youtube.com/watch?v=Nx5jWKAl7Z0
YieldOptiX est conçu pour les flux de travail de données de test et exploite la fonctionnalité de gestion des limites de spécifications de JMP en ajoutant également la possibilité de trouver automatiquement les meilleures limites en fonction des paramètres de distribution, soit dans les limites, soit au-delà des contraintes prédéfinies.
Cela peut être utile si vous recherchez une approche plus rationalisée.