こんにちは。2つのファイル(Limitsとwat_combined)があります。Limitファイルには、wat_combinedファイル内の同じテストに設定したい制限値が含まれています。JSLスクリプトは期待通りに動作しているのですが、列のスペック制限領域が制限値を超えています。修正方法を教えてください。
Jmpバージョン: 18.2.0
txnelson 注: @Pranadeep の最初のメッセージを編集し、JSL を JSL ボックスに、ログをコード ボックスに移動しました。
私の 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 ---"
問題:
こんにちは。2つのファイル(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
こんにちは、
スクリプト作成で問題が発生している場合や、すぐに使用できるソリューションを好む場合は、JSL を記述せずに仕様制限と歩留まり分析を処理する方法を示す JMP アドインを使用した短いチュートリアルがあります。
https://www.youtube.com/watch?v=Nx5jWKAl7Z0
YieldOptiX はテスト データ ワークフロー用に設計されており、JMP の仕様制限の管理機能を活用して、事前定義された制約内または制約外の分布パラメータに基づいて最適な制限を自動的に見つける機能も追加します。
より合理化されたアプローチを探している場合に役立つかもしれません。