cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 
The Discovery Summit 2025 Call for Content is open! Submit an abstract today to present at our premier analytics conference.
See how to use to use Text Explorer to glean valuable information from text data at April 25 webinar.
Choose Language Hide Translation Bar
Pranadeep
Level I

jsl script error

Hi, I have 2 files(Limits and wat_combined). Limit file has the limits that i want to set to the same test in wat_combined file. My Jsl script is working as expected but the spec limit area of the column Please let me know how to fix that.
Jmp version: 18.2.0

 

txnelson Note:  I edited @Pranadeep  initial message, moving the JSL into a JSL Box, and the log into a Code Box
my jsl code:

// --- 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 ---");



Log:

"--- 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 ---"
1 ACCEPTED SOLUTION

Accepted Solutions
txnelson
Super User

Re: jsl script error

After a quick look through the JSL, I have observed 2 items that may cause issue.

  1. I am not aware of any function called Next().  You use it a couple of times in the code.  It is a guess that it may be the function Break() that you are looking to use.
  2. 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  
Jim

View solution in original post

3 REPLIES 3
Pranadeep
Level I

Re: jsl script error

issue:
Hi, I have 2 files(Limits and wat_combined). Limit file has the limits that i want to set to the same test in wat_combined(column) file. My Jsl script is working as expected but the spec limit area of the column is not being added. Please let me know how to fix that.

Pranadeep_0-1744324498781.png

 

 

txnelson
Super User

Re: jsl script error

After a quick look through the JSL, I have observed 2 items that may cause issue.

  1. I am not aware of any function called Next().  You use it a couple of times in the code.  It is a guess that it may be the function Break() that you are looking to use.
  2. 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  
Jim

Re: jsl script error

Hi,
If you're running into scripting issues or just prefer a ready-to-use solution, there's a short tutorial with a JMP add-in showing how to handle spec limits and yield analysis without writing JSL:

https://www.youtube.com/watch?v=Nx5jWKAl7Z0
YieldOptiX is designed for test data workflows and it leverages JMP’s manage spec limits feature by also adding the ability to automatically find the best limits based on distribution parameters — either within or beyond predefined constraints.
Might be helpful if you're looking for a more streamlined approach.

Watch this tutorial to learn test limits setting and yield simulation in JMP with YieldOptiX. This includes a completely new function "Adaptive Limits Rounding" (a new ML feature developed by SilTest). It shows all the different scenarios where this feature can be applied using the dedicated ...

Recommended Articles