您好,我有两个文件(Limits 和 wat_combined)。Limit 文件中包含我想在 wat_combined 文件中设置的限制,以便进行相同的测试。我的 Jsl 脚本运行正常,但列的规格限制区域存在问题。请告诉我如何解决这个问题。
跳转版本:18.2.0
txnelson 注:我编辑了@Pranadeep 的初始消息,将 JSL 移到 JSL Box 中,将日志移到 Code Box 中
我的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 ---");
日志:
"--- 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 ---"
问题:
您好,我有两个文件(Limits 和 wat_combined)。Limit 文件中包含我想在 wat_combined(column) 文件中设置的限制,用于相同的测试。我的 Jsl 脚本运行正常,但列的规范限制区域未添加。请告诉我该如何解决这个问题。

快速浏览 JSL 后,我发现有 2 项可能会导致问题。
- 我不知道有一个名为 Next() 的函数。代码中你用了几次。我猜你可能需要用到 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
你好,
如果您遇到脚本问题或只是喜欢现成的解决方案,那么有一个带有 JMP 插件的简短教程,展示如何在不编写 JSL 的情况下处理规格限制和产量分析:
https://www.youtube.com/watch?v=Nx5jWKAl7Z0
YieldOptiX 专为测试数据工作流程而设计,它利用 JMP 的管理规格限制功能,同时还增加了根据分布参数自动查找最佳限制的能力——无论是在预定义的约束之内还是之外。
如果您正在寻找更简化的方法,这可能会有所帮助。