將限制從限製表寫入數據表此 JMP 插件採用單獨數據表(我將其稱為限製表)中的規格限和 23 種不同類型的控制限(即 XBar、S、移動範圍等)中的任何一種,並填充適當的限制JMP數據表中的列屬性。
如上所述,“極限表”只是一個 JMP 表。要成為有效的限製表,它必須有一列包含要更新的列的名稱,然後是每個特定限制的列,該限制的值將移動到包含測量數據的表的列屬性中。下面是限製表的示例。注意:列的名稱不必具有特定的名稱。正如將要看到的,用於規格和控制限的不同部分的列將映射在對話框窗口中。

“極限表”有 7 列和 128 行。每行包含測量數據表中特定列的限值。在此示例中,名為“Column Names”的列包含測量數據表中要更新的列的名稱。“限製表”中的所有列都將根據其所扮演的角色映射到加載項中。
下面的測量數據表是 JMP 樣本數據表中的半導體能力數據表。對於此示例,作為發貨數據表一部分的規格限制已被刪除。

要運行插件,請轉到測量數據表,然後單擊它以使其成為當前“活動”數據表。 然後運行插件。出現的窗口要求用戶選擇用於更新的“限製表”。

當您選擇要使用的表時,窗口將增加選擇框,以將“限值表”中的列映射到它將在將限值移動到測量數據表中所扮演的角色。

這是映射發生的地方。要映射的第一個項目,它標識“限製表”中的列,該列將用作要更新的列的標識符。在我們的示例中,“Column Names”列包含此信息,需要將其放入 ID 列選擇框中。

接下來,我們將限制列映射到限制的類型以及它是指定限制的上限、目標還是下限。。規格限值和控制限值是分開處理的。有一個單選按鈕需要設置為規格限製或控制限制,以匹配您要映射的限制類型。首先,我們將設置規格限制。在“限制”表中,名為 LSL、目標和 USL 的列包含規格限制。要映射它們,只需選擇每一個並將其移動到適當的限制選擇框即可。

XBar LCL、XBar Target 和 XBar UCL 列包含控制限。具體來說,它們包含 XBar 控制限制。要將它們映射到 Add=in,首先將單選按鈕設置為“控制限制”。

地圖環境略有變化。顯示屏上添加了一個向下箭頭框,允許用戶設置要映射的控制限制類型。

“限值表”中的控制限值類型是 XBar 限值,因此這就是我們選擇的控制限值類型。然後我們只需將列映射到每個列所玩的極限擲骰

如果“限製表”中有更多類型的控制限制,則只需重複選擇要映射的限制類型的步驟,然後將相應的列放入代表限制類型的選擇框中即可。
完成映射後,只需單擊“確定”即可執行插件。完成後,您可以通過轉到測量數據表並查看限制列屬性來驗證它是否已成功


品質工程回复:將限制從限製表寫入數據表@tx尼爾森非常感謝你的幫助!!
上面的腳本運行良好!
回复:將限制從限製表寫入數據表JSL 不會僅僅因為顯示了一個窗口就停止處理腳本。因此,當顯示窗口時,您的“Biv6”圖形生成器正在執行。您需要更改輸入對話框代碼,告訴它在添加規格限制的代碼末尾運行“Biv6”代碼。
如果您將 Graph Builder 代碼更改為封裝到 Expr() 函數中,則在執行 Expr() 之前它不會運行。
myGraphBuilder = Expr(
biv6 = Graph Builder(
Variables( X( :PPO_26_H ) ),
Show Control Panel( 0 ),
Elements( Histogram( X, Legend( 4 ) ), Box Plot( X, Legend( 6 ) ) ),
SendToReport(
Dispatch( {}, "PPO_26_H", ScaleBox, {Label Row( Set Font Size( 16 ) )} ),
Dispatch( {}, "graph title", TextEditBox, {Set Font Size( 24 )} )
)
);
biv6 << save picture( "c:\temp\biv6.png" );
);
因此,現在您只需決定何時讓對話框執行圖形生成器。我的建議是在執行“runit”Expr() 後立即將其放入按鈕框“OK”腳本中。
Button Box( "OK",
WriteLimitColNames( LimitNum );
lowconcat = highconcat = "";
For( i = 1, i <= N Items( LowList ), i++,
lowconcat = lowconcat || LowList[i];
highconcat = highconcat || HighList[i];
);
LimitsChoosen = Length( lowconcat || highconcat ) > 0;
// Check to see if the required data has been input
If(
N Items( colListY << GetItems ) == 0, Dialog( "No ID Column Specified", Button( "OK" ) ), // Else
LimitsChoosen == 0, Dialog( "No Limit Columns Specified", Button( "OK" ) ), // Else
RecallList = {lowlist = {}, avglist = {}, highlist = {}};
RecallList["lowlist"] = lowlist;
RecallList["avglist"] = avglist;
RecallList["highlist"] = highlist;
// Place the selected values from the screen into the recall list
Insert Into( RecallList, Parse( "IDColumn = \!"" || Char( (colListY << get items)[1] ) || "\!"" ) );
If( IgnoreCB << get == 1,
IgnoreMissing = "Yes",
IgnoreMissing = "No"
);
ShowLims = ShowCB << get;
ShowRpt = ReportCB << get;
Insert Into( RecallList, Parse( "IgnoreMissing = \!"" || IgnoreMissing || "\!"" ) );
Insert Into( RecallList, Parse( "ShowLims = " || Char( showlims ) ) );
Insert Into( RecallList, Parse( "ShowRpt = " || Char( showRpt ) ) );
// Save recall string to Recall namespace
Recall:WriteLimits = RecallList;
nw << CloseWindow;
dtReport = New Table( "Report",
Private,
New Column( "Column", Character, "Nominal" ),
New Column( "Limit Type", Character, "Nominal" ),
New Column( "Level",
Character,
"Nominal",
Set Property( "Value Ordering", {"Lower", "Average", "Upper"} )
),
New Column( "Value", Numeric, "Continuous", Format( "Best", 10 ) ),
New Column( "Limit",
Character,
"Nominal",
Set Property( "Value Ordering", {"Spec Limit", "Control Limit"} )
),
New Column( "OldNew", Character, "Nominal", Set Property( "Value Ordering", {"Previous", "New"} ) )
);
dtReport:Column << set property( "Row Order Levels", 1 );
// Create a working copy of the limits table
dtLimits << Select Rows( NotFoundListRowNumbers );
dtLimits << invert row selection;
dtLimitsTemp = dtLimits << subset(invisible, selected rows(1), selected columns(0));
dtLimits << clear select;
dtOriginalLimits = dtLimits;
dtLimits = dtLimitsTemp;
wait(0);
// Run the actual code that updates the limits
runit;
myGraphBuilder;
);
),
回复:將限制從限製表寫入數據表圖形生成器並保存圖像!
我想在規範之後將圖形生成器保存到圖像,但是 t下面的腳本在應用規範之前生成圖像。
Open("C:\Users\A07\Desktop\data\Working data\Jump\spec_limit.jmp");
dt = open();
Names Default To Here( 1 );
Clear Symbols();
/*****************************************************************************/
/* */
/* This is the inital piece of code to be run in the script */
/* It initializes the environment and opens the initial user inptut dialog */
/* */
/*****************************************************************************/
Main = Expr(
dt = Current Data Table();
LastColListY = "";
// The recall values are saved into a namespace called "Recall"
// and if it currently doesn't exist, set it up
If( Namespace Exists( "Recall" ) == 0,
recall = New Namespace(
"Recall"
)
);
// Get a list of all of the numeric columns in the data table
AllNumericColumns = dt << get column names( numeric, string );
AllNumericColumnsCompressed = AllNumericColumns;
// Uppercase and compress the column names
For( i = 1, i <= N Items( AllNumericColumns ), i++,
AllNumericColumnsCompressed[i] = Uppercase( AllNumericColumnsCompressed[i] );
While( Pat Match( AllNumericColumnsCompressed[i], " ", "" ) > 0, Pat Match( AllNumericColumnsCompressed[i], " ", "" ) );
);
// This iist is the list of the names used within JMP Contol Limits and is used by the script
// to set the type of contol limit being updated
ControlLimitList = {"XBar", "R", "S", "Individual Measurement", "Moving Range", "Median Moving Range", "P", "NP", "C", "U", "UWMA", "EWMA",
"CUSUM", "Levey Jennings", "Individual on Group Means", "Individual on Group Std Devs", "Moving Range on Group Means",
"Moving Range on Group Stds", "Median Moving Range on Group Means", "Median Moving Range on Group Std Devs", "Run Chart", "G", "T"};
// Variale used to set the length of the column selection list
nc = N Col( dt );
lbWidth = 160;
// Create a list of all of the open tables
list_tables = {};
For( i = 1, i <= N Table(), i++,
Insert Into( list_tables, Data Table( i ) << get name )
);
// Display the Limits Table Selection window
nw = New Window( "Populate Limits",
V List Box(
Spacer Box( size( 1, 5 ) ),
H List Box( IconBB = Button Box( "" ), IconTB = Text Box( "Populate Limits Column Property from a separate table" ) ),
Spacer Box( size( 1, 20 ) ),
TheHlB = H List Box(
V List Box(
Text Box( "Select Limits Table" ),
Spacer Box( size( 1, 2 ) ),
Panel Box( "Set Limits in " || Char( dt << get name ) || " with",
TableLB = List Box( list_tables, n lines( 6 ), width( 220 ) ),
)
)
),
Spacer Box( size( 1, 10 ) ),
H List Box(
Spacer Box( size( 10, 1 ) ),
createtableBB = Button Box( "Create Limits Table from Current Active Data Table", createlimitstable )
),
Spacer Box( size( 1, 10 ) )
),
// When the user selection for the limits data table changes, reset the column dialog boxes
TableLB << on change(
// Delete the button box
Try( createtableBb << delete );
// Blank out the low,avg and high lists
resetlists;
// Delete the current column dialog boxes
Try( clusterdlg << delete );
// If the user has selected a new limits table, reset the window
If( Try( (tablelb << get selected)[1], "" ) != "",
dtlimits = Data Table( (tablelb << get selected)[1] );
Current Data Table( dtlimits );
// Reinput the code for the column dialog boxes....this is
// required, because the col list boxes do not lose the data
// table references without totally deleting the col list box
// and bringing in new instances
clusterexpr;
// Add the col dialog boxes to the current display
theHLB << append( clusterdlg );
// Reset required lists
AllLimitColList = AllLimitColListCompressed = {};
Try( AllLimitColList = Column( dtlimits, Column Names ) << get values );
AllLimitColListCompressed = AllLimitColList;
// Uppercase and remove blanks from the column list
For( i = 1, i <= N Items( AllLimitColList ), i++,
AllLimitColListCompressed[i] = Uppercase( AllLimitColListCompressed[i] );
While( Pat Match( AllLimitColListCompressed[i], " ", "" ) > 0, Pat Match( AllLimitColListCompressed[i], " ", "" ) );
);
);
),
// Set the icon
iconbb << set icon( "Update" )
);
);
/*****************************************************************************/
/* */
/* Create a Limits Table populating limits from the current data table */
/* */
/*****************************************************************************/
CreateLimitsTable = Expr(
HasBeenSeen = Repeat( 0, 24 );
dtnew = New Table( "Limits Table", invisible, New Column( "Column Names", character, values( AllNumericColumns ) ) );
// Pass through all of the specified parameters and extract any limits found in the
// active data table and move them to the new limits data table
For( allvars = 1, allvars <= N Items( AllNumericColumns ), allvars++,
col = Parse( "dt:" || AllNumericColumns[allvars] );
// Gather in the already set Control and Spec Limits
controls = col << get property( "Control Limits" );
specs = col << get property( "Spec Limits" );
// Process Spec Limits
If( !(Char( specs ) == "Scriptable[]" | Is Empty( specs ) == 1),
If( HasBeenSeen[24] == 0,
dtnew << New Column( "LSL" );
dtnew << New Column( "Target" );
dtnew << New Column( "USL" );
HasBeenSeen[24] = 1;
);
For( i = 1, i <= N Items( specs ), i++,
If( Is Missing( Try( Specs["LSL"], . ) ) == 0,
dtnew:LSL[AllVars] = Specs["LSL"]
);
If( Is Missing( Try( Specs["Target"], . ) ) == 0,
dtnew:Target[AllVars] = Specs["Target"]
);
If( Is Missing( Try( Specs["LSL"], . ) ) == 0,
dtnew:USL[AllVars] = Specs["USL"]
);
);
);
// All of the Control limits have the same structure. This code extracts all of the different
// types of control limits and moves them to the limits table
If( !(Char( controls ) == "Scriptable[]" | Is Empty( controls ) == 1),
For( i = 1, i <= N Items( controls ), i++,
If( Contains( ControlLimitList, Trim( Word( 1, Char( controls[i] ), "(,)" ) ) ) > 0,
Control Limit Type = Trim( Word( 1, Char( controls[i] ), "(,)" ) );
LimitListNumber = Contains( ControlLimitList, Trim( Word( 1, Char( controls[i] ), "(,)" ) ) );
If( HasBeenSeen[LimitListNumber] == 0,
dtnew << New Column( ControlLimitList[LimitListNumber] || "LCL" );
dtnew << New Column( ControlLimitList[LimitListNumber] || "AVG" );
dtnew << New Column( ControlLimitList[LimitListNumber] || "UCL" );
HasBeenSeen[LimitListNumber] = 1;
);
For( ctype = 2, ctype <= 6, ctype = ctype + 2,
If( Trim( Word( ctype, Char( controls[i] ), "(,)" ) ) == "Avg",
Column( dtnew, ControlLimitList[LimitListNumber] || "AVG" )[AllVars] = Num(
Word( ctype + 1, Char( controls[i] ), "(,)" )
)
);
If( Trim( Word( ctype, Char( controls[i] ), "(,)" ) ) == "LCL",
Column( dtnew, ControlLimitList[LimitListNumber] || "LCL" )[AllVars] = Num(
Word( ctype + 1, Char( controls[i] ), "(,)" )
)
);
If( Trim( Word( ctype, Char( controls[i] ), "(,)" ) ) == "UCL",
Column( dtnew, ControlLimitList[LimitListNumber] || "UCL" )[AllVars] = Num(
Word( ctype + 1, Char( controls[i] ), "(,)" )
)
);
);
)
);
);
);
If( N Cols( dtnew ) == 1,
dtnew << New Column( "LSL" );
dtnew << New Column( "Target" );
dtnew << New Column( "USL" );
dtnew << New Column( "XBarLCL" );
dtnew << New Column( "XBarAVG" );
dtnew << New Column( "XBarUCL" );
);
Insert Into( List_Tables, "Limits Table" );
x = List_Tables;
TableLB << RemoveAll;
TableLB << append( list_tables );
dtnew << zoom window;
);
/*****************************************************************************/
/* */
/* Blank out all selections and reset to the current limit */
/* */
/*****************************************************************************/
resetLists = Expr(
lowList = avgList = highList = {"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""};
If( Try( LimitTypeRB << get, 1 ) == 1,
limitNum = 24,
LimitNum = cb << get
);
);
// Initialize the lists
ResetLists;
/*****************************************************************************/
/* */
/* Set the Control Limits for all specified control limits for a single */
/* row from the limits data table */
/* */
/*****************************************************************************/
SetControlLimits = Function( {c, CList, IgnoreMissing, i},
{c, CList, IgnoreMissing},
// Big List pulls in any existing limit control values. This allows for the addition of
// replacement of limit values without erasing any limits that currently exist.
c = AllNumericColumns[Contains( AllnumericColumnsCompressed, AllLimitColListCompressed[i] )];
biglist = Column( dt, c ) << getproperty( "control limits" );
// Roll across all of the types of contol limits found
For( cl = 1, cl <= N Items( CList ), cl++,
little = {__type__( Avg( avexpr ), UCL( ULexpr ), LCL( LLexpr ) )};
Substitute Into( little, Expr( __type__ ), Parse( controllimitnamesList[CList[cl]] ) );
// Get the new limits to be processed from the limits table
// If no column has been specified for one of the limits, a
// missing value is set
lcl = Try( Column( dtlimits, lowlist[CList[cl]] )[i], . );
tar = Try( Column( dtlimits, avglist[CList[cl]] )[i], . );
ucl = Try( Column( dtlimits, highlist[CList[cl]] )[i], . );
// If Control Limits were found interrogate them
If( Is Empty( biglist ) == 0,
For( _i_ = N Items( big list ), _i_ >= 1, _i_--,
If( Uppercase( Word( 1, biglist[_i_], "(" ) ) == Uppercase( controllimitnamesList[CList[cl]] ),
onelist = Char( biglist[_i_] );
xlcl = .;
xtarget = .;
xucl = .;
For( limitcnt = 2, limitcnt <= 7, limitcnt = limitcnt + 2,
alimit = Word( limitcnt, onelist, "(,)" );
If(
Contains( alimit, "LCL" ) > 0, xlcl = Num( Word( limitcnt + 1, onelist, "(,)" ) ),
Contains( alimit, "Avg" ) > 0, xtarget = Num( Word( limitcnt + 1, onelist, "(,)" ) ),
Contains( alimit, "UCL" ) > 0, xucl = Num( Word( limitcnt + 1, onelist, "(,)" ) )
);
);
Remove From( biglist, _i_ );
dtReport << add Rows( 1 );
dtReport:Column[N Rows( dtReport )] = c;
dtReport:Limit Type[N Rows( dtReport )] = controllimitnamesList[CList[cl]];
dtReport:Limit[N Rows( dtReport )] = "Control Limit";
dtReport:OldNew[N Rows( dtReport )] = "Previous";
dtReport:Level[N Rows( dtReport )] = "Lower";
dtReport:Value[N Rows( dtReport )] = xlcl;
dtReport << add Rows( 1 );
dtReport:Column[N Rows( dtReport )] = c;
dtReport:Limit Type[N Rows( dtReport )] = controllimitnamesList[CList[cl]];
dtReport:Level[N Rows( dtReport )] = "Average";
dtReport:Value[N Rows( dtReport )] = xtarget;
dtReport:Limit[N Rows( dtReport )] = "Control Limit";
dtReport:OldNew[N Rows( dtReport )] = "Previous";
dtReport << add Rows( 1 );
dtReport:Column[N Rows( dtReport )] = c;
dtReport:Limit Type[N Rows( dtReport )] = controllimitnamesList[CList[cl]];
dtReport:Level[N Rows( dtReport )] = "Upper";
dtReport:Value[N Rows( dtReport )] = xucl;
dtReport:Limit[N Rows( dtReport )] = "Control Limit";
dtReport:OldNew[N Rows( dtReport )] = "Previous";
);
// If the limits do not currently exist, but other control limits are there,
// insert the new control limits into the large control limit list
If( Is Missing( lcl ) + Is Missing( tar ) + Is Missing( ucl ) > 0,
// If Missing values from the limits table are to signal not to
// change the current limit, then process them accoringly
If( IgnoreMissing == "No",
If( LowList[CList[cl]] != "",
Substitute Into( little, Expr( LLexpr ), Eval( lcl ) ),
Substitute Into( little, Expr( LLexpr ), Eval( xlcl ) );
lcl = xlcl;
);
If( AvgList[CList[cl]] != "",
Substitute Into( little, Expr( avexpr ), Eval( tar ) ),
Substitute Into( little, Expr( avexpr ), Eval( xtarget ) );
tar = xtarget;
);
If( HighList[CList[cl]] != "",
Substitute Into( little, Expr( ULexpr ), Eval( ucl ) ),
Substitute Into( little, Expr( ULexpr ), Eval( xucl ) );
ucl = xucl;
);
,
If( Is Missing( lcl ) == 1 | LowList[CList[cl]] == "",
Substitute Into( little, Expr( LLexpr ), Eval( xlcl ) );
lcl = xcl;
,
Substitute Into( little, Expr( LLexpr ), Eval( lcl ) )
);
If( Is Missing( ucl ) == 1 | HighList[CList[cl]] == "",
Substitute Into( little, Expr( ULexpr ), Eval( xucl ) );
ucl = xucl;
,
Substitute Into( little, Expr( ULexpr ), Eval( ucl ) )
);
If( Is Missing( tar ) == 1 | AvgList[CList[cl]] == "",
Substitute Into( little, Expr( avexpr ), Eval( xtarget ) );
tar = xtarget;
,
Substitute Into( little, Expr( avexpr ), Eval( tar ) )
);
)
,
// Just add the new limits if not concerned about preserving data
// and replacing limits if missing values have been specified
If( Is Missing( lcl ) + Is Missing( tar ) + Is Missing( ucl ) < 3,
If( LowList[CList[cl]] != "",
Substitute Into( little, Expr( LLexpr ), Eval( lcl ) ),
Substitute Into( little,
Expr( LLexpr ),
Eval( xlcl );
lcl = xlcl;
)
);
If( AvgList[CList[cl]] != "",
Substitute Into( little, Expr( avexpr ), Eval( tar ) ),
Substitute Into( little, Expr( avexpr ), Eval( xtarget ) );
tar = xtarget;
);
If( HighList[CList[cl]] != "",
Substitute Into( little, Expr( ULexpr ), Eval( ucl ) ),
Substitute Into( little, Expr( ULexpr ), Eval( xucl ) );
ucl = xucl;
);
)
);
// If the big list doesn't exist, create it
If( Is Empty( biglist ) == 1,
biglist = {}
);
// Add the current limit type to the overall list of control limits
Insert Into( biglist, little );
dtReport << add Rows( 1 );
dtReport:Column[N Rows( dtReport )] = c;
dtReport:Limit Type[N Rows( dtReport )] = controllimitnamesList[CList[cl]];
dtReport:Limit[N Rows( dtReport )] = "Control Limit";
dtReport:OldNew[N Rows( dtReport )] = "New";
dtReport:Level[N Rows( dtReport )] = "Lower";
dtReport:Value[N Rows( dtReport )] = lcl;
dtReport << add Rows( 1 );
dtReport:Column[N Rows( dtReport )] = c;
dtReport:Limit Type[N Rows( dtReport )] = controllimitnamesList[CList[cl]];
dtReport:Level[N Rows( dtReport )] = "Average";
dtReport:Value[N Rows( dtReport )] = tar;
dtReport:Limit[N Rows( dtReport )] = "Control Limit";
dtReport:OldNew[N Rows( dtReport )] = "New";
dtReport << add Rows( 1 );
dtReport:Column[N Rows( dtReport )] = c;
dtReport:Limit Type[N Rows( dtReport )] = controllimitnamesList[CList[cl]];
dtReport:Level[N Rows( dtReport )] = "Upper";
dtReport:Value[N Rows( dtReport )] = ucl;
dtReport:Limit[N Rows( dtReport )] = "Control Limit";
dtReport:OldNew[N Rows( dtReport )] = "New";
)
,
// No control limits currently exist for the target column, so create the large
// control limit list by setting it equal to the new input limits
dtReport << add Rows( 1 );
dtReport:Column[N Rows( dtReport )] = c;
dtReport:Limit Type[N Rows( dtReport )] = controllimitnamesList[CList[cl]];
dtReport:Limit[N Rows( dtReport )] = "Control Limit";
dtReport:OldNew[N Rows( dtReport )] = "Previous";
dtReport:Level[N Rows( dtReport )] = "Lower";
dtReport:Value[N Rows( dtReport )] = .;
dtReport << add Rows( 1 );
dtReport:Column[N Rows( dtReport )] = c;
dtReport:Limit Type[N Rows( dtReport )] = controllimitnamesList[CList[cl]];
dtReport:Level[N Rows( dtReport )] = "Average";
dtReport:Value[N Rows( dtReport )] = .;
dtReport:Limit[N Rows( dtReport )] = "Control Limit";
dtReport:OldNew[N Rows( dtReport )] = "Previous";
dtReport << add Rows( 1 );
dtReport:Column[N Rows( dtReport )] = c;
dtReport:Limit Type[N Rows( dtReport )] = controllimitnamesList[CList[cl]];
dtReport:Level[N Rows( dtReport )] = "Upper";
dtReport:Value[N Rows( dtReport )] = .;
dtReport:Limit[N Rows( dtReport )] = "Control Limit";
dtReport:OldNew[N Rows( dtReport )] = "Previous";
If( Is Missing( lcl ) + Is Missing( tar ) + Is Missing( ucl ) < 3,
If( LowList[CList[cl]] != "",
Substitute Into( little, Expr( LLexpr ), Eval( lcl ) ),
Substitute Into( little, Expr( LLexpr ), Eval( . ) );
lcl = .;
);
If( AvgList[CList[cl]] != "",
Substitute Into( little, Expr( avexpr ), Eval( tar ) ),
Substitute Into( little, Expr( avexpr ), Eval( . ) );
tar = .;
);
If( HighList[CList[cl]] != "",
Substitute Into( little, Expr( ULexpr ), Eval( ucl ) ),
Substitute Into( little, Expr( ULexpr ), Eval( . ) );
ucl = .;
);
);
// If the big list doesn't exist, create it
If( Is Empty( biglist ) == 1,
biglist = {}
);
// Add the current limit type to the overall list of control limits
Insert Into( biglist, little );
dtReport << add Rows( 1 );
dtReport:Column[N Rows( dtReport )] = c;
dtReport:Limit Type[N Rows( dtReport )] = controllimitnamesList[CList[cl]];
dtReport:Limit[N Rows( dtReport )] = "Control Limit";
dtReport:OldNew[N Rows( dtReport )] = "New";
dtReport:Level[N Rows( dtReport )] = "Lower";
dtReport:Value[N Rows( dtReport )] = lcl;
dtReport << add Rows( 1 );
dtReport:Column[N Rows( dtReport )] = c;
dtReport:Limit Type[N Rows( dtReport )] = controllimitnamesList[CList[cl]];
dtReport:Level[N Rows( dtReport )] = "Average";
dtReport:Value[N Rows( dtReport )] = tar;
dtReport:Limit[N Rows( dtReport )] = "Control Limit";
dtReport:OldNew[N Rows( dtReport )] = "New";
dtReport << add Rows( 1 );
dtReport:Column[N Rows( dtReport )] = c;
dtReport:Limit Type[N Rows( dtReport )] = controllimitnamesList[CList[cl]];
dtReport:Level[N Rows( dtReport )] = "Upper";
dtReport:Value[N Rows( dtReport )] = ucl;
dtReport:Limit[N Rows( dtReport )] = "Control Limit";
dtReport:OldNew[N Rows( dtReport )] = "New";
)
;
);
If( Char( biglist ) != "Scriptable[]" & Is Empty( biglist ) == 0 & biglist != {},
Column( dt, c ) << setproperty( "control limits", Eval( biglist ) )
);
);
/*****************************************************************************/
/* */
/* Set the Spec Limits for all specified control limits for a single */
/* row from the limits data table */
/* */
/*****************************************************************************/
SetSpecLimits = Function( {c, lsl, usl, avg, IgnoreMissing, showlims},
{c, lsl, usl, avg, IgnoreMissing, showlims},
// Get the current spec limits
Try( speclist = Column( dt, c ) << get property( "spec limits" ), {} );
Try( xlsl = speclist["LSL"], xlsl = . );
Try( xusl = speclist["USL"], xusl = . );
Try( xavg = speclist["Target"], xavg = . );
dtReport << add Rows( 1 );
dtReport:Column[N Rows( dtReport )] = c;
dtReport:Limit Type[N Rows( dtReport )] = "_";
dtReport:Limit[N Rows( dtReport )] = "Spec Limit";
dtReport:OldNew[N Rows( dtReport )] = "Previous";
dtReport:Level[N Rows( dtReport )] = "Lower";
dtReport:Value[N Rows( dtReport )] = xlsl;
dtReport << add Rows( 1 );
dtReport:Column[N Rows( dtReport )] = c;
dtReport:Limit Type[N Rows( dtReport )] = "_";
dtReport:Level[N Rows( dtReport )] = "Average";
dtReport:Value[N Rows( dtReport )] = xavg;
dtReport:Limit[N Rows( dtReport )] = "Spec Limit";
dtReport:OldNew[N Rows( dtReport )] = "Previous";
dtReport << add Rows( 1 );
dtReport:Column[N Rows( dtReport )] = c;
dtReport:Limit Type[N Rows( dtReport )] = "_";
dtReport:Level[N Rows( dtReport )] = "Upper";
dtReport:Value[N Rows( dtReport )] = xusl;
dtReport:Limit[N Rows( dtReport )] = "Spec Limit";
dtReport:OldNew[N Rows( dtReport )] = "Previous";
// Process the limits
If( Is Missing( lsl ) + Is Missing( avg ) + Is Missing( usl ) < 3,
// If misssing value input is to be Ignored, that means that
// old values of the limits are to be moved forward if the new
// input values are missing values
If( IgnoreMissing == "Yes",
If( (Is Missing( xusl ) == 1 & Is Missing( usl ) == 0) | HighList[24] != "",
xusl = usl
);
If( (Is Missing( xlsl ) == 1 & Is Missing( lsl ) == 0) | LowList[24] != "",
xlsl = lsl
);
If( (Is Missing( xavg ) == 1 & Is Missing( avg ) == 0) | AvgList[24] != "",
xavg = avg
);
cmd = Expr(
Column( dt, c ) << SetProperty(
"Spec LImits",
{LSL( Expr( xlsl ) ), USL( Expr( xusl ) ), Target( Expr( xavg ) ), Show Limits( Expr( showlims ) )}
)
);
dtReport << add Rows( 1 );
dtReport:Column[N Rows( dtReport )] = c;
dtReport:Limit Type[N Rows( dtReport )] = "_";
dtReport:Limit[N Rows( dtReport )] = "Spec Limit";
dtReport:OldNew[N Rows( dtReport )] = "New";
dtReport:Level[N Rows( dtReport )] = "Lower";
dtReport:Value[N Rows( dtReport )] = xlsl;
dtReport << add Rows( 1 );
dtReport:Column[N Rows( dtReport )] = c;
dtReport:Limit Type[N Rows( dtReport )] = "_";
dtReport:Level[N Rows( dtReport )] = "Average";
dtReport:Value[N Rows( dtReport )] = xavg;
dtReport:Limit[N Rows( dtReport )] = "Spec Limit";
dtReport:OldNew[N Rows( dtReport )] = "New";
dtReport << add Rows( 1 );
dtReport:Column[N Rows( dtReport )] = c;
dtReport:Limit Type[N Rows( dtReport )] = "_";
dtReport:Level[N Rows( dtReport )] = "Upper";
dtReport:Value[N Rows( dtReport )] = xusl;
dtReport:Limit[N Rows( dtReport )] = "Spec Limit";
dtReport:OldNew[N Rows( dtReport )] = "New";
, // Else
If( LowList[24] == "",
lsl = xlsl
);
If( AvgList[24] == "",
avg = xavg
);
If( HighList[24] == "",
usl = xusl
);
cmd = Expr(
Column( dt, c ) << SetProperty(
"Spec LImits",
{LSL( Expr( lsl ) ), USL( Expr( usl ) ), Target( Expr( avg ) ), Show Limits( Expr( showlims ) )}
)
);
dtReport << add Rows( 1 );
dtReport:Column[N Rows( dtReport )] = c;
dtReport:Limit Type[N Rows( dtReport )] = "_";
dtReport:Limit[N Rows( dtReport )] = "Spec Limit";
dtReport:OldNew[N Rows( dtReport )] = "New";
dtReport:Level[N Rows( dtReport )] = "Lower";
dtReport:Value[N Rows( dtReport )] = lsl;
dtReport << add Rows( 1 );
dtReport:Column[N Rows( dtReport )] = c;
dtReport:Limit Type[N Rows( dtReport )] = "_";
dtReport:Level[N Rows( dtReport )] = "Average";
dtReport:Value[N Rows( dtReport )] = avg;
dtReport:Limit[N Rows( dtReport )] = "Spec Limit";
dtReport:OldNew[N Rows( dtReport )] = "New";
dtReport << add Rows( 1 );
dtReport:Column[N Rows( dtReport )] = c;
dtReport:Limit Type[N Rows( dtReport )] = "_";
dtReport:Level[N Rows( dtReport )] = "Upper";
dtReport:Value[N Rows( dtReport )] = usl;
dtReport:Limit[N Rows( dtReport )] = "Spec Limit";
dtReport:OldNew[N Rows( dtReport )] = "New";
);
Eval( Eval Expr( cmd ) );
);
);
/*****************************************************************************/
/* */
/* Run through each of the columns in the limits table and call the functions*/
/* that update the limits, based upon what limits have been specified in the */
/* dialog input screen */
/* */
/*****************************************************************************/
runit = Expr(
ControlLimitNamesList = {"XBar", "R", "S", "Individual Measurement", "Moving Range", "Median Moving Range", "P", "NP", "C", "U", "UWMA", "EWMA",
"CUMSUM", "Levey Jennings", "Individual on Group Means", "Individual on Group Std Devs", "Moving Range on Group Means",
"Moving Range on Group Std Devs", "Median Moving Range on Group Means", "Median Moving Range on Group Std Devs", "Run Chart", "G", "T"};
// Create a list of which control limits have been specified
CList = {};
For( i = 1, i <= 23, i++,
If( LowList[i] || avgList[i] || highList[i] != "",
Insert Into( CList, i )
)
);
// If spec limits have been specified, setup a similar flag to the control limits
// to use for spec limit processing
SLList = {};
If( LowList[24] || avgList[24] || highList[24] != "",
Insert Into( SLList, 24 )
);
// Get Excluded Rows in the Limits Table so they can be bypassed in processing
Excluded Rows = As List( dtLimits << get excluded rows );
// Roll across the rows in the limits table and process the new limits
For( ii = 1, ii <= N Items( AllLimitColList ), ii++,
Process = "Yes";
If( N Items( Excluded Rows ) > 0,
If( Loc( Excluded Rows, ii ) > 0,
Process = "No",
Process = "Yes"
)
);
If( Process == "Yes",
targetName = AllNumericColumns[Contains( AllnumericColumnsCompressed, AllLimitColListCompressed[ii] )];
//ii=30
// If there are spec limits to be processed, call the setspeclimits function
If( N Items( SLList ) > 0,
return = setspeclimits(
Targetname,
Try( Column( dtlimits, lowlist[24] )[ii], . ),
Try( Column( dtlimits, highlist[24] )[ii], . ),
Try( Column( dtlimits, avglist[24] )[ii], . ),
IgnoreMissing,
showLims
)
);
// If Control limit changes have been specified, call the SetControlLimits function
If( N Items( CList ) > 0,
return = SetControlLimits( TargetName, CList, IgnoreMissing, ii )
);
);
);
ShowReport;
close(dtLimits, nosave );
dtLimits = dtOriginalLimits;
current data table(dt);
);
/*****************************************************************************/
/* */
/* This is the display for the column selections where the user matches the */
/* the limit columns from the limit data table with the columns in the */
/* data table */
/* */
/*****************************************************************************/
clusterexpr = Expr(
all Columns List = dtlimits << get column names;
Current Data Table( dtlimits );
clusterDlg = V List Box(
Border Box( Left( 3 ), top( 2 ),
V List Box(
Text Box( "Select Columns to Read the Limits From" ),
H List Box(
V List Box(
// Generate the master display box for the columns in the data table
Panel Box( "Select Columns",
cldvlb = H List Box(
Popup Box(
{"Clear", filterval = "" ; thefilter << set text( "" ) ; clearit ; ,
"Numeric", filterval = "" ; thefilter << set text( "" ) ; clearit ; For( II = 1,
II <= N Items( All Columns List ), II++,
If( Column( All Columns List[II] ) << get data type != "Numeric",
colListData << set selected( II )
)
) ; colListData << remove selected ; ,
"Character", filterval = "" ; thefilter << set text( "" ) ; clearit ; For( II = 1,
II <= N Items( All Columns List ), II++,
If( Column( All Columns List[II] ) << get data type != "Character",
colListData << set selected( II )
)
) ; colListData << remove selected ; ,
"Name Contains", filterval = "" ; filtervlb << prepend(
V List Box(
thefilter = Text Edit Box( "",
<<SET width=""> 0;
// Check to see if the required data has been input
If(
N Items( colListY << GetItems ) == 0, Dialog( "No ID Column Specified", Button( "OK" ) ), // Else
LimitsChoosen == 0, Dialog( "No Limit Columns Specified", Button( "OK" ) ), // Else
RecallList = {lowlist = {}, avglist = {}, highlist = {}};
RecallList["lowlist"] = lowlist;
RecallList["avglist"] = avglist;
RecallList["highlist"] = highlist;
// Place the selected values from the screen into the recall list
Insert Into( RecallList, Parse( "IDColumn = \!"" || Char( (colListY << get items)[1] ) || "\!"" ) );
If( IgnoreCB << get == 1,
IgnoreMissing = "Yes",
IgnoreMissing = "No"
);
ShowLims = ShowCB << get;
ShowRpt = ReportCB << get;
Insert Into( RecallList, Parse( "IgnoreMissing = \!"" || IgnoreMissing || "\!"" ) );
Insert Into( RecallList, Parse( "ShowLims = " || Char( showlims ) ) );
Insert Into( RecallList, Parse( "ShowRpt = " || Char( showRpt ) ) );
// Save recall string to Recall namespace
Recall:WriteLimits = RecallList;
nw << CloseWindow;
dtReport = New Table( "Report",
Private,
New Column( "Column", Character, "Nominal" ),
New Column( "Limit Type", Character, "Nominal" ),
New Column( "Level",
Character,
"Nominal",
Set Property( "Value Ordering", {"Lower", "Average", "Upper"} )
),
New Column( "Value", Numeric, "Continuous", Format( "Best", 10 ) ),
New Column( "Limit",
Character,
"Nominal",
Set Property( "Value Ordering", {"Spec Limit", "Control Limit"} )
),
New Column( "OldNew", Character, "Nominal", Set Property( "Value Ordering", {"Previous", "New"} ) )
);
dtReport:Column << set property( "Row Order Levels", 1 );
// Create a working copy of the limits table
dtLimits << Select Rows( NotFoundListRowNumbers );
dtLimits << invert row selection;
dtLimitsTemp = dtLimits << subset(invisible, selected rows(1), selected columns(0));
dtLimits << clear select;
dtOriginalLimits = dtLimits;
dtLimits = dtLimitsTemp;
wait(0);
// Run the actual code that updates the limits
runit;
);
),
Button Box( "Cancel",
clusterDlg << CloseWindow;
Names Default To Here( 1 );
),
Text Box( " " ),
Button Box( "Remove",
colListY << RemoveSelected;
collower << remove selected;
colaverage << remove selected;
colupper << remove selected;
),
Button Box( "Recall",
If( Is List( Recall:WriteLimits ) == 1,
Eval List( Recall:WriteLimits );
If( Try( (colListY << get items)[1], "" ) != IDcolumn,
colListY << RemoveAll;
colListY << append( IDcolumn );
);
If( IgnoreMissing == "Yes",
IgnoreCB << set( 1 ),
IgnoreCB << set( 0 )
);
ShowCB << set( ShowLims );
ReportCB << set( ShowRpt );
readLimitColNames( LimitNum );
)
),
Button Box( "Help", notImplemented )
)
)
),
)
)
),
// Set the default values for the check box options
IgnoreCB << set( 1 );
IgnoreMissing = "Yes";
ShowCB << set( 1 );
ShowLims = 1;
ReportCB << set( 1 );
ShowRpt = 1;
);
// Write the names to the Limit Lists ffrom the display window
WriteLimitColNames = Function( {lNum},
LowList[LNum] = Try( (colLower << get items)[1], "" );
AvgList[LNum] = Try( (colAverage << get items)[1], "" );
HighList[LNum] = Try( (colUpper << get items)[1], "" );
);
// Read the limit values from the Limit Lists and populate
// the display window with the values
ReadLimitColNames = Function( {lNum},
{lNum},
tmplist = lowlist;
ColLower << remove all;
lowlist = tmplist;
tmplist = {};
Insert Into( tmplist, lowlist[lnum] );
collower << append( tmplist );
tmplist = avglist;
ColAverage << remove all;
avglist = tmplist;
tmplist = {};
Insert Into( tmplist, avglist[lnum] );
colAverage << append( tmplist );
tmplist = Highlist;
ColUpper << remove all;
Highlist = tmplist;
tmplist = {};
Insert Into( tmplist, Highlist[lnum] );
ColUpper << append( tmplist );
);
// When the value for the column that contains the names of the data
// table columns that will have their limits changed, process the list,
// comparing it to the data table to check for columns not found
ColListY << On Change(
If( Try( (ColListY << get items)[1], "" ) != LastColListY,
If( Try( N Items( colListY << get items ), 0 ) > 0,
AllLimitColList = AllLimitColListCompressed = NotProcessedColumnsList = NotProcessedColumnsListCompressed = {};
LastColListY = (ColListY << get items)[1];
If( Try( (colListY << get items)[1], "" ) != "",
AllLimitColList = Column( dtlimits, (colListY << get items)[1] ) << get values;
AllLimitColListCompressed = AllLimitColList;
NotFoundList = {};
NotFoundListRowNumbers = {};
// Uppercase and compress the column names
For( i = N Items( AllLimitColList ), i > 0, i--,
AllLimitColListCompressed[i] = Uppercase( AllLimitColListCompressed[i] );
While( Pat Match( AllLimitColListCompressed[i], " ", "" ) > 0, Pat Match( AllLimitColListCompressed[i], " ", "" ) );
If( Contains( AllNumericColumnsCompressed, AllLimitColListCompressed[i] ) == 0,
Insert Into( NotFoundList, AllLimitColList[i] );
Insert Into( NotFoundListRowNumbers, i );
AllLimitColListCompressed = Remove( AllLimitColListCompressed, i, 1 );
AllLimitColList = Remove( AllLimitColList, i, 1 );
);
);
// Find all of the columns that are not going to be processed
NotProcessedColumnsListCompressed = NotProcessedColumnsList = dt << get column Names( string );
For( i = N Items( NotProcessedColumnsList ), i > 0, i--,
NotProcessedColumnsListCompressed[i] = Uppercase( NotProcessedColumnsListCompressed[i] );
While( Pat Match( NotProcessedColumnsListCompressed[i], " ", "" ) > 0,
Pat Match( NotProcessedColumnsListCompressed[i], " ", "" )
);
If( Contains( AllLimitColListCompressed, NotProcessedColumnsListCompressed[i] ) > 0,
//Insert Into( NotFoundList, AllLimitColList[i] );
NotProcessedColumnsListCompressed = Remove( NotProcessedColumnsListCompressed, i, 1 );
NotProcessedColumnsList = Remove( NotProcessedColumnsList, i, 1 );
);
);
// If there are columns that do not exist in the data table, notify the user
If( N Items( NotFoundList ) > 0,
winLocation = nw << get window position;
err = New Window( "Columns Not Found",
Border Box( top( 10 ), Left( 10 ), Right( 10 ), bottom( 10 ), sides( 15 ),
V List Box(
Spacer Box( size( 1, 10 ) ),
Text Box( "The following column(s) names(s) were referenced in the" ),
Text Box( "Limit Table, but no numeric column of that/those name(s)" ),
Text Box( "were found in the data table." ),
Spacer Box( size( 1, 10 ) ),
H List Box( Spacer Box( size( 60, 1 ) ), List Box( NotFoundList ) ),
Spacer Box( size( 1, 10 ) ),
Text Box( "No limits will be set for the above referenced columns" ),
Spacer Box( size( 1, 10 ) ),
H List Box(
continueBB = Button Box( "Continue Anyway", err << close window ),
stopBB = Button Box( "Stop Script",
err << close window;
nw << close window;
Throw();
)
)
)
)
);
err << move window( winLocation[1] + 100, winLocation[2] + 100 ) << zoom window;
);
);
)
)
);
);
/*****************************************************************************/
/* */
/* An Expr to run for any function that has not been implemented. It */
// displays a dialog window telling the user that the function has not been */
/* implemented yet */
/* */
/*****************************************************************************/
notImplemented = Expr(
Dialog( "Feature Not Implemented Yet", Button( "OK" ) )
);
/*****************************************************************************/
/* */
/* Code used in the column selection filter to reset the selection box */
/* */
/*****************************************************************************/
clearit = Expr(
For( II = 1, II <= N Items( colListData << get items ), II++,
colListData << set selected( II )
);
colListData << remove selected;
colListData << append( all columns list );
);
// Call the main expr as the inital piece of script to be run
main;
biv6 = Graph Builder(
Variables( X( :PPO_26_H ) ),
Show Control Panel( 0 ),
Elements( Histogram( X, Legend( 4 ) ), Box Plot( X, Legend( 6 ) ) ),
SendToReport(
Dispatch( {}, "PPO_26_H", ScaleBox, {Label Row( Set Font Size( 16 ) )} ),
Dispatch( {}, "graph title", TextEditBox, {Set Font Size( 24 )} )
)
);
biv6 << save picture("c:\temp\biv6.png");</SET>
回复:將限制從限製表寫入數據表你在說什麼圖表?總結報告?
回复:將限制從限製表寫入數據表謝謝,這個插件對我來說非常好。
我有一個問題。
如何在加載項先運行後製作圖表?
回复:將限制從限製表寫入數據表謝謝,很棒的插件和腳本!
一直致力於自動化一些分析,這非常完美。 不需要能力分析,而且對於 100 多個變量來說,能力分析非常慢。 管理由於某種原因未從表導入並掛起的規格限制。
回复:將限制從限製表寫入數據表我不知道任何首選項設置會更改規格限制參考線的默認顏色。我過去所做的是以我想要的顏色創建自己的參考線,而不是使用 JMP 默認值來生成限制線。
回复:將限制從限製表寫入數據表你好@tx尼爾森,
無論如何,我可以將 USL 和 LSL 線顏色更改為紅色(從默認的藍色)?
謝謝你,
安安
回复:將限制從限製表寫入數據表由於 JMP 添加了管理限制的功能,該功能接管了從限製表向數據表寫入限制的操作,因此我不會增強該插件。但是,下面是一個簡單的腳本,應該為您提供一個開始,以及一個將從限制數據表中讀取並將單位添加到另一個表的列的腳本
Names Default To Here( 1 );
Clear Symbols();
dt = Open( "$SAMPLE_DATA/big class.jmp" );
dtLimits = New Table( "Limits",
New Column( "Column Name", Character, values( {"height", "weight"} ) ),
New Column( "Units", Character, values( {"Inches", "Lbs"} ) )
);
colNamesList = {"height", "weight"};
For( i = 1, i <= N Items( colNamesList ), i++,
dtLimits << select where( :Column Name == colNamesList[i] );
If( N Rows( dtLimits << get selected rows ) > 0,
Eval(
Substitute(
Expr(
Column( dt, colNamesList[i] ) << set property( "Units", __units__ )
),
Expr( __units__ ), dtLimits:Units[i]
)
)
);
);回复:將限制從限製表寫入數據表@tx尼爾森這是一個很棒的插件,我們可以為另一個規格表中的列添加“單位”嗎?有沒有增強的 JSL 腳本?
謝謝,
文卡特
回复:將限制從限製表寫入數據表完美的!這工作正常。 請繼續製作此版本的插件代碼...
回复:將限制從限製表寫入數據表我相信這是一個可以解決該問題的版本。嘗試一下,如果它解決了您的問題,請回复我。然後我將在文件交換上發布新的插件
Names Default To Here( 1 );
Clear Symbols();
/*****************************************************************************/
/* */
/* This is the inital piece of code to be run in the script */
/* It initializes the environment and opens the initial user inptut dialog */
/* */
/*****************************************************************************/
Main = Expr(
dt = Current Data Table();
LastColListY = "";
// The recall values are saved into a namespace called "Recall"
// and if it currently doesn't exist, set it up
If( Namespace Exists( "Recall" ) == 0,
recall = New Namespace(
"Recall"
)
);
// Get a list of all of the numeric columns in the data table
AllNumericColumns = dt << get column names( numeric, string );
AllNumericColumnsCompressed = AllNumericColumns;
// Uppercase and compress the column names
For( i = 1, i <= N Items( AllNumericColumns ), i++,
AllNumericColumnsCompressed[i] = Uppercase( AllNumericColumnsCompressed[i] );
While( Pat Match( AllNumericColumnsCompressed[i], " ", "" ) > 0, Pat Match( AllNumericColumnsCompressed[i], " ", "" ) );
);
// This iist is the list of the names used within JMP Contol Limits and is used by the script
// to set the type of contol limit being updated
ControlLimitList = {"XBar", "R", "S", "Individual Measurement", "Moving Range", "Median Moving Range", "P", "NP", "C", "U", "UWMA", "EWMA",
"CUSUM", "Levey Jennings", "Individual on Group Means", "Individual on Group Std Devs", "Moving Range on Group Means",
"Moving Range on Group Stds", "Median Moving Range on Group Means", "Median Moving Range on Group Std Devs", "Run Chart", "G", "T"};
// Variale used to set the length of the column selection list
nc = N Col( dt );
lbWidth = 160;
// Create a list of all of the open tables
list_tables = {};
For( i = 1, i <= N Table(), i++,
Insert Into( list_tables, Data Table( i ) << get name )
);
// Display the Limits Table Selection window
nw = New Window( "Populate Limits",
V List Box(
Spacer Box( size( 1, 5 ) ),
H List Box( IconBB = Button Box( "" ), IconTB = Text Box( "Populate Limits Column Property from a separate table" ) ),
Spacer Box( size( 1, 20 ) ),
TheHlB = H List Box(
V List Box(
Text Box( "Select Limits Table" ),
Spacer Box( size( 1, 2 ) ),
Panel Box( "Set Limits in " || Char( dt << get name ) || " with",
TableLB = List Box( list_tables, n lines( 6 ), width( 220 ) ),
)
)
),
Spacer Box( size( 1, 10 ) ),
H List Box(
Spacer Box( size( 10, 1 ) ),
createtableBB = Button Box( "Create Limits Table from Current Active Data Table", createlimitstable )
),
Spacer Box( size( 1, 10 ) )
),
// When the user selection for the limits data table changes, reset the column dialog boxes
TableLB << on change(
// Delete the button box
Try( createtableBb << delete );
// Blank out the low,avg and high lists
resetlists;
// Delete the current column dialog boxes
Try( clusterdlg << delete );
// If the user has selected a new limits table, reset the window
If( Try( (tablelb << get selected)[1], "" ) != "",
dtlimits = Data Table( (tablelb << get selected)[1] );
Current Data Table( dtlimits );
// Reinput the code for the column dialog boxes....this is
// required, because the col list boxes do not lose the data
// table references without totally deleting the col list box
// and bringing in new instances
clusterexpr;
// Add the col dialog boxes to the current display
theHLB << append( clusterdlg );
// Reset required lists
AllLimitColList = AllLimitColListCompressed = {};
Try( AllLimitColList = Column( dtlimits, Column Names ) << get values );
AllLimitColListCompressed = AllLimitColList;
// Uppercase and remove blanks from the column list
For( i = 1, i <= N Items( AllLimitColList ), i++,
AllLimitColListCompressed[i] = Uppercase( AllLimitColListCompressed[i] );
While( Pat Match( AllLimitColListCompressed[i], " ", "" ) > 0, Pat Match( AllLimitColListCompressed[i], " ", "" ) );
);
);
),
// Set the icon
iconbb << set icon( "Update" )
);
);
/*****************************************************************************/
/* */
/* Create a Limits Table populating limits from the current data table */
/* */
/*****************************************************************************/
CreateLimitsTable = Expr(
HasBeenSeen = Repeat( 0, 24 );
dtnew = New Table( "Limits Table", invisible, New Column( "Column Names", character, values( AllNumericColumns ) ) );
// Pass through all of the specified parameters and extract any limits found in the
// active data table and move them to the new limits data table
For( allvars = 1, allvars <= N Items( AllNumericColumns ), allvars++,
col = Parse( "dt:" || AllNumericColumns[allvars] );
// Gather in the already set Control and Spec Limits
controls = col << get property( "Control Limits" );
specs = col << get property( "Spec Limits" );
// Process Spec Limits
If( !(Char( specs ) == "Scriptable[]" | Is Empty( specs ) == 1),
If( HasBeenSeen[24] == 0,
dtnew << New Column( "LSL" );
dtnew << New Column( "Target" );
dtnew << New Column( "USL" );
HasBeenSeen[24] = 1;
);
For( i = 1, i <= N Items( specs ), i++,
If( Is Missing( Try( Specs["LSL"], . ) ) == 0,
dtnew:LSL[AllVars] = Specs["LSL"]
);
If( Is Missing( Try( Specs["Target"], . ) ) == 0,
dtnew:Target[AllVars] = Specs["Target"]
);
If( Is Missing( Try( Specs["LSL"], . ) ) == 0,
dtnew:USL[AllVars] = Specs["USL"]
);
);
);
// All of the Control limits have the same structure. This code extracts all of the different
// types of control limits and moves them to the limits table
If( !(Char( controls ) == "Scriptable[]" | Is Empty( controls ) == 1),
For( i = 1, i <= N Items( controls ), i++,
If( Contains( ControlLimitList, Trim( Word( 1, Char( controls[i] ), "(,)" ) ) ) > 0,
Control Limit Type = Trim( Word( 1, Char( controls[i] ), "(,)" ) );
LimitListNumber = Contains( ControlLimitList, Trim( Word( 1, Char( controls[i] ), "(,)" ) ) );
If( HasBeenSeen[LimitListNumber] == 0,
dtnew << New Column( ControlLimitList[LimitListNumber] || "LCL" );
dtnew << New Column( ControlLimitList[LimitListNumber] || "AVG" );
dtnew << New Column( ControlLimitList[LimitListNumber] || "UCL" );
HasBeenSeen[LimitListNumber] = 1;
);
For( ctype = 2, ctype <= 6, ctype = ctype + 2,
If( Trim( Word( ctype, Char( controls[i] ), "(,)" ) ) == "Avg",
Column( dtnew, ControlLimitList[LimitListNumber] || "AVG" )[AllVars] = Num(
Word( ctype + 1, Char( controls[i] ), "(,)" )
)
);
If( Trim( Word( ctype, Char( controls[i] ), "(,)" ) ) == "LCL",
Column( dtnew, ControlLimitList[LimitListNumber] || "LCL" )[AllVars] = Num(
Word( ctype + 1, Char( controls[i] ), "(,)" )
)
);
If( Trim( Word( ctype, Char( controls[i] ), "(,)" ) ) == "UCL",
Column( dtnew, ControlLimitList[LimitListNumber] || "UCL" )[AllVars] = Num(
Word( ctype + 1, Char( controls[i] ), "(,)" )
)
);
);
)
);
);
);
If( N Cols( dtnew ) == 1,
dtnew << New Column( "LSL" );
dtnew << New Column( "Target" );
dtnew << New Column( "USL" );
dtnew << New Column( "XBarLCL" );
dtnew << New Column( "XBarAVG" );
dtnew << New Column( "XBarUCL" );
);
Insert Into( List_Tables, "Limits Table" );
x = List_Tables;
TableLB << RemoveAll;
TableLB << append( list_tables );
dtnew << zoom window;
);
/*****************************************************************************/
/* */
/* Blank out all selections and reset to the current limit */
/* */
/*****************************************************************************/
resetLists = Expr(
lowList = avgList = highList = {"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""};
If( Try( LimitTypeRB << get, 1 ) == 1,
limitNum = 24,
LimitNum = cb << get
);
);
// Initialize the lists
ResetLists;
/*****************************************************************************/
/* */
/* Set the Control Limits for all specified control limits for a single */
/* row from the limits data table */
/* */
/*****************************************************************************/
SetControlLimits = Function( {c, CList, IgnoreMissing, i},
{c, CList, IgnoreMissing},
// Big List pulls in any existing limit control values. This allows for the addition of
// replacement of limit values without erasing any limits that currently exist.
c = AllNumericColumns[Contains( AllnumericColumnsCompressed, AllLimitColListCompressed[i] )];
biglist = Column( dt, c ) << getproperty( "control limits" );
// Roll across all of the types of contol limits found
For( cl = 1, cl <= N Items( CList ), cl++,
little = {__type__( Avg( avexpr ), UCL( ULexpr ), LCL( LLexpr ) )};
Substitute Into( little, Expr( __type__ ), Parse( controllimitnamesList[CList[cl]] ) );
// Get the new limits to be processed from the limits table
// If no column has been specified for one of the limits, a
// missing value is set
lcl = Try( Column( dtlimits, lowlist[CList[cl]] )[i], . );
tar = Try( Column( dtlimits, avglist[CList[cl]] )[i], . );
ucl = Try( Column( dtlimits, highlist[CList[cl]] )[i], . );
// If Control Limits were found interrogate them
If( Is Empty( biglist ) == 0,
For( _i_ = N Items( big list ), _i_ >= 1, _i_--,
If( Uppercase( Word( 1, biglist[_i_], "(" ) ) == Uppercase( controllimitnamesList[CList[cl]] ),
onelist = Char( biglist[_i_] );
xlcl = .;
xtarget = .;
xucl = .;
For( limitcnt = 2, limitcnt <= 7, limitcnt = limitcnt + 2,
alimit = Word( limitcnt, onelist, "(,)" );
If(
Contains( alimit, "LCL" ) > 0, xlcl = Num( Word( limitcnt + 1, onelist, "(,)" ) ),
Contains( alimit, "Avg" ) > 0, xtarget = Num( Word( limitcnt + 1, onelist, "(,)" ) ),
Contains( alimit, "UCL" ) > 0, xucl = Num( Word( limitcnt + 1, onelist, "(,)" ) )
);
);
Remove From( biglist, _i_ );
dtReport << add Rows( 1 );
dtReport:Column[N Rows( dtReport )] = c;
dtReport:Limit Type[N Rows( dtReport )] = controllimitnamesList[CList[cl]];
dtReport:Limit[N Rows( dtReport )] = "Control Limit";
dtReport:OldNew[N Rows( dtReport )] = "Previous";
dtReport:Level[N Rows( dtReport )] = "Lower";
dtReport:Value[N Rows( dtReport )] = xlcl;
dtReport << add Rows( 1 );
dtReport:Column[N Rows( dtReport )] = c;
dtReport:Limit Type[N Rows( dtReport )] = controllimitnamesList[CList[cl]];
dtReport:Level[N Rows( dtReport )] = "Average";
dtReport:Value[N Rows( dtReport )] = xtarget;
dtReport:Limit[N Rows( dtReport )] = "Control Limit";
dtReport:OldNew[N Rows( dtReport )] = "Previous";
dtReport << add Rows( 1 );
dtReport:Column[N Rows( dtReport )] = c;
dtReport:Limit Type[N Rows( dtReport )] = controllimitnamesList[CList[cl]];
dtReport:Level[N Rows( dtReport )] = "Upper";
dtReport:Value[N Rows( dtReport )] = xucl;
dtReport:Limit[N Rows( dtReport )] = "Control Limit";
dtReport:OldNew[N Rows( dtReport )] = "Previous";
);
// If the limits do not currently exist, but other control limits are there,
// insert the new control limits into the large control limit list
If( Is Missing( lcl ) + Is Missing( tar ) + Is Missing( ucl ) > 0,
// If Missing values from the limits table are to signal not to
// change the current limit, then process them accoringly
If( IgnoreMissing == "No",
If( LowList[CList[cl]] != "",
Substitute Into( little, Expr( LLexpr ), Eval( lcl ) ),
Substitute Into( little, Expr( LLexpr ), Eval( xlcl ) );
lcl = xlcl;
);
If( AvgList[CList[cl]] != "",
Substitute Into( little, Expr( avexpr ), Eval( tar ) ),
Substitute Into( little, Expr( avexpr ), Eval( xtarget ) );
tar = xtarget;
);
If( HighList[CList[cl]] != "",
Substitute Into( little, Expr( ULexpr ), Eval( ucl ) ),
Substitute Into( little, Expr( ULexpr ), Eval( xucl ) );
ucl = xucl;
);
,
If( Is Missing( lcl ) == 1 | LowList[CList[cl]] == "",
Substitute Into( little, Expr( LLexpr ), Eval( xlcl ) );
lcl = xcl;
,
Substitute Into( little, Expr( LLexpr ), Eval( lcl ) )
);
If( Is Missing( ucl ) == 1 | HighList[CList[cl]] == "",
Substitute Into( little, Expr( ULexpr ), Eval( xucl ) );
ucl = xucl;
,
Substitute Into( little, Expr( ULexpr ), Eval( ucl ) )
);
If( Is Missing( tar ) == 1 | AvgList[CList[cl]] == "",
Substitute Into( little, Expr( avexpr ), Eval( xtarget ) );
tar = xtarget;
,
Substitute Into( little, Expr( avexpr ), Eval( tar ) )
);
)
,
// Just add the new limits if not concerned about preserving data
// and replacing limits if missing values have been specified
If( Is Missing( lcl ) + Is Missing( tar ) + Is Missing( ucl ) < 3,
If( LowList[CList[cl]] != "",
Substitute Into( little, Expr( LLexpr ), Eval( lcl ) ),
Substitute Into( little,
Expr( LLexpr ),
Eval( xlcl );
lcl = xlcl;
)
);
If( AvgList[CList[cl]] != "",
Substitute Into( little, Expr( avexpr ), Eval( tar ) ),
Substitute Into( little, Expr( avexpr ), Eval( xtarget ) );
tar = xtarget;
);
If( HighList[CList[cl]] != "",
Substitute Into( little, Expr( ULexpr ), Eval( ucl ) ),
Substitute Into( little, Expr( ULexpr ), Eval( xucl ) );
ucl = xucl;
);
)
);
// If the big list doesn't exist, create it
If( Is Empty( biglist ) == 1,
biglist = {}
);
// Add the current limit type to the overall list of control limits
Insert Into( biglist, little );
dtReport << add Rows( 1 );
dtReport:Column[N Rows( dtReport )] = c;
dtReport:Limit Type[N Rows( dtReport )] = controllimitnamesList[CList[cl]];
dtReport:Limit[N Rows( dtReport )] = "Control Limit";
dtReport:OldNew[N Rows( dtReport )] = "New";
dtReport:Level[N Rows( dtReport )] = "Lower";
dtReport:Value[N Rows( dtReport )] = lcl;
dtReport << add Rows( 1 );
dtReport:Column[N Rows( dtReport )] = c;
dtReport:Limit Type[N Rows( dtReport )] = controllimitnamesList[CList[cl]];
dtReport:Level[N Rows( dtReport )] = "Average";
dtReport:Value[N Rows( dtReport )] = tar;
dtReport:Limit[N Rows( dtReport )] = "Control Limit";
dtReport:OldNew[N Rows( dtReport )] = "New";
dtReport << add Rows( 1 );
dtReport:Column[N Rows( dtReport )] = c;
dtReport:Limit Type[N Rows( dtReport )] = controllimitnamesList[CList[cl]];
dtReport:Level[N Rows( dtReport )] = "Upper";
dtReport:Value[N Rows( dtReport )] = ucl;
dtReport:Limit[N Rows( dtReport )] = "Control Limit";
dtReport:OldNew[N Rows( dtReport )] = "New";
)
,
// No control limits currently exist for the target column, so create the large
// control limit list by setting it equal to the new input limits
dtReport << add Rows( 1 );
dtReport:Column[N Rows( dtReport )] = c;
dtReport:Limit Type[N Rows( dtReport )] = controllimitnamesList[CList[cl]];
dtReport:Limit[N Rows( dtReport )] = "Control Limit";
dtReport:OldNew[N Rows( dtReport )] = "Previous";
dtReport:Level[N Rows( dtReport )] = "Lower";
dtReport:Value[N Rows( dtReport )] = .;
dtReport << add Rows( 1 );
dtReport:Column[N Rows( dtReport )] = c;
dtReport:Limit Type[N Rows( dtReport )] = controllimitnamesList[CList[cl]];
dtReport:Level[N Rows( dtReport )] = "Average";
dtReport:Value[N Rows( dtReport )] = .;
dtReport:Limit[N Rows( dtReport )] = "Control Limit";
dtReport:OldNew[N Rows( dtReport )] = "Previous";
dtReport << add Rows( 1 );
dtReport:Column[N Rows( dtReport )] = c;
dtReport:Limit Type[N Rows( dtReport )] = controllimitnamesList[CList[cl]];
dtReport:Level[N Rows( dtReport )] = "Upper";
dtReport:Value[N Rows( dtReport )] = .;
dtReport:Limit[N Rows( dtReport )] = "Control Limit";
dtReport:OldNew[N Rows( dtReport )] = "Previous";
If( Is Missing( lcl ) + Is Missing( tar ) + Is Missing( ucl ) < 3,
If( LowList[CList[cl]] != "",
Substitute Into( little, Expr( LLexpr ), Eval( lcl ) ),
Substitute Into( little, Expr( LLexpr ), Eval( . ) );
lcl = .;
);
If( AvgList[CList[cl]] != "",
Substitute Into( little, Expr( avexpr ), Eval( tar ) ),
Substitute Into( little, Expr( avexpr ), Eval( . ) );
tar = .;
);
If( HighList[CList[cl]] != "",
Substitute Into( little, Expr( ULexpr ), Eval( ucl ) ),
Substitute Into( little, Expr( ULexpr ), Eval( . ) );
ucl = .;
);
);
// If the big list doesn't exist, create it
If( Is Empty( biglist ) == 1,
biglist = {}
);
// Add the current limit type to the overall list of control limits
Insert Into( biglist, little );
dtReport << add Rows( 1 );
dtReport:Column[N Rows( dtReport )] = c;
dtReport:Limit Type[N Rows( dtReport )] = controllimitnamesList[CList[cl]];
dtReport:Limit[N Rows( dtReport )] = "Control Limit";
dtReport:OldNew[N Rows( dtReport )] = "New";
dtReport:Level[N Rows( dtReport )] = "Lower";
dtReport:Value[N Rows( dtReport )] = lcl;
dtReport << add Rows( 1 );
dtReport:Column[N Rows( dtReport )] = c;
dtReport:Limit Type[N Rows( dtReport )] = controllimitnamesList[CList[cl]];
dtReport:Level[N Rows( dtReport )] = "Average";
dtReport:Value[N Rows( dtReport )] = tar;
dtReport:Limit[N Rows( dtReport )] = "Control Limit";
dtReport:OldNew[N Rows( dtReport )] = "New";
dtReport << add Rows( 1 );
dtReport:Column[N Rows( dtReport )] = c;
dtReport:Limit Type[N Rows( dtReport )] = controllimitnamesList[CList[cl]];
dtReport:Level[N Rows( dtReport )] = "Upper";
dtReport:Value[N Rows( dtReport )] = ucl;
dtReport:Limit[N Rows( dtReport )] = "Control Limit";
dtReport:OldNew[N Rows( dtReport )] = "New";
)
;
);
If( Char( biglist ) != "Scriptable[]" & Is Empty( biglist ) == 0 & biglist != {},
Column( dt, c ) << setproperty( "control limits", Eval( biglist ) )
);
);
/*****************************************************************************/
/* */
/* Set the Spec Limits for all specified control limits for a single */
/* row from the limits data table */
/* */
/*****************************************************************************/
SetSpecLimits = Function( {c, lsl, usl, avg, IgnoreMissing, showlims},
{c, lsl, usl, avg, IgnoreMissing, showlims},
// Get the current spec limits
Try( speclist = Column( dt, c ) << get property( "spec limits" ), {} );
Try( xlsl = speclist["LSL"], xlsl = . );
Try( xusl = speclist["USL"], xusl = . );
Try( xavg = speclist["Target"], xavg = . );
dtReport << add Rows( 1 );
dtReport:Column[N Rows( dtReport )] = c;
dtReport:Limit Type[N Rows( dtReport )] = "_";
dtReport:Limit[N Rows( dtReport )] = "Spec Limit";
dtReport:OldNew[N Rows( dtReport )] = "Previous";
dtReport:Level[N Rows( dtReport )] = "Lower";
dtReport:Value[N Rows( dtReport )] = xlsl;
dtReport << add Rows( 1 );
dtReport:Column[N Rows( dtReport )] = c;
dtReport:Limit Type[N Rows( dtReport )] = "_";
dtReport:Level[N Rows( dtReport )] = "Average";
dtReport:Value[N Rows( dtReport )] = xavg;
dtReport:Limit[N Rows( dtReport )] = "Spec Limit";
dtReport:OldNew[N Rows( dtReport )] = "Previous";
dtReport << add Rows( 1 );
dtReport:Column[N Rows( dtReport )] = c;
dtReport:Limit Type[N Rows( dtReport )] = "_";
dtReport:Level[N Rows( dtReport )] = "Upper";
dtReport:Value[N Rows( dtReport )] = xusl;
dtReport:Limit[N Rows( dtReport )] = "Spec Limit";
dtReport:OldNew[N Rows( dtReport )] = "Previous";
// Process the limits
If( Is Missing( lsl ) + Is Missing( avg ) + Is Missing( usl ) < 3,
// If misssing value input is to be Ignored, that means that
// old values of the limits are to be moved forward if the new
// input values are missing values
If( IgnoreMissing == "Yes",
If( (Is Missing( xusl ) == 1 & Is Missing( usl ) == 0) | HighList[24] != "",
xusl = usl
);
If( (Is Missing( xlsl ) == 1 & Is Missing( lsl ) == 0) | LowList[24] != "",
xlsl = lsl
);
If( (Is Missing( xavg ) == 1 & Is Missing( avg ) == 0) | AvgList[24] != "",
xavg = avg
);
cmd = Expr(
Column( dt, c ) << SetProperty(
"Spec LImits",
{LSL( Expr( xlsl ) ), USL( Expr( xusl ) ), Target( Expr( xavg ) ), Show Limits( Expr( showlims ) )}
)
);
dtReport << add Rows( 1 );
dtReport:Column[N Rows( dtReport )] = c;
dtReport:Limit Type[N Rows( dtReport )] = "_";
dtReport:Limit[N Rows( dtReport )] = "Spec Limit";
dtReport:OldNew[N Rows( dtReport )] = "New";
dtReport:Level[N Rows( dtReport )] = "Lower";
dtReport:Value[N Rows( dtReport )] = xlsl;
dtReport << add Rows( 1 );
dtReport:Column[N Rows( dtReport )] = c;
dtReport:Limit Type[N Rows( dtReport )] = "_";
dtReport:Level[N Rows( dtReport )] = "Average";
dtReport:Value[N Rows( dtReport )] = xavg;
dtReport:Limit[N Rows( dtReport )] = "Spec Limit";
dtReport:OldNew[N Rows( dtReport )] = "New";
dtReport << add Rows( 1 );
dtReport:Column[N Rows( dtReport )] = c;
dtReport:Limit Type[N Rows( dtReport )] = "_";
dtReport:Level[N Rows( dtReport )] = "Upper";
dtReport:Value[N Rows( dtReport )] = xusl;
dtReport:Limit[N Rows( dtReport )] = "Spec Limit";
dtReport:OldNew[N Rows( dtReport )] = "New";
, // Else
If( LowList[24] == "",
lsl = xlsl
);
If( AvgList[24] == "",
avg = xavg
);
If( HighList[24] == "",
usl = xusl
);
cmd = Expr(
Column( dt, c ) << SetProperty(
"Spec LImits",
{LSL( Expr( lsl ) ), USL( Expr( usl ) ), Target( Expr( avg ) ), Show Limits( Expr( showlims ) )}
)
);
dtReport << add Rows( 1 );
dtReport:Column[N Rows( dtReport )] = c;
dtReport:Limit Type[N Rows( dtReport )] = "_";
dtReport:Limit[N Rows( dtReport )] = "Spec Limit";
dtReport:OldNew[N Rows( dtReport )] = "New";
dtReport:Level[N Rows( dtReport )] = "Lower";
dtReport:Value[N Rows( dtReport )] = lsl;
dtReport << add Rows( 1 );
dtReport:Column[N Rows( dtReport )] = c;
dtReport:Limit Type[N Rows( dtReport )] = "_";
dtReport:Level[N Rows( dtReport )] = "Average";
dtReport:Value[N Rows( dtReport )] = avg;
dtReport:Limit[N Rows( dtReport )] = "Spec Limit";
dtReport:OldNew[N Rows( dtReport )] = "New";
dtReport << add Rows( 1 );
dtReport:Column[N Rows( dtReport )] = c;
dtReport:Limit Type[N Rows( dtReport )] = "_";
dtReport:Level[N Rows( dtReport )] = "Upper";
dtReport:Value[N Rows( dtReport )] = usl;
dtReport:Limit[N Rows( dtReport )] = "Spec Limit";
dtReport:OldNew[N Rows( dtReport )] = "New";
);
Eval( Eval Expr( cmd ) );
);
);
/*****************************************************************************/
/* */
/* Run through each of the columns in the limits table and call the functions*/
/* that update the limits, based upon what limits have been specified in the */
/* dialog input screen */
/* */
/*****************************************************************************/
runit = Expr(
ControlLimitNamesList = {"XBar", "R", "S", "Individual Measurement", "Moving Range", "Median Moving Range", "P", "NP", "C", "U", "UWMA", "EWMA",
"CUMSUM", "Levey Jennings", "Individual on Group Means", "Individual on Group Std Devs", "Moving Range on Group Means",
"Moving Range on Group Std Devs", "Median Moving Range on Group Means", "Median Moving Range on Group Std Devs", "Run Chart", "G", "T"};
// Create a list of which control limits have been specified
CList = {};
For( i = 1, i <= 23, i++,
If( LowList[i] || avgList[i] || highList[i] != "",
Insert Into( CList, i )
)
);
// If spec limits have been specified, setup a similar flag to the control limits
// to use for spec limit processing
SLList = {};
If( LowList[24] || avgList[24] || highList[24] != "",
Insert Into( SLList, 24 )
);
// Get Excluded Rows in the Limits Table so they can be bypassed in processing
Excluded Rows = As List( dtLimits << get excluded rows );
// Roll across the rows in the limits table and process the new limits
For( ii = 1, ii <= N Items( AllLimitColList ), ii++,
Process = "Yes";
If( N Items( Excluded Rows ) > 0,
If( Loc( Excluded Rows, ii ) > 0,
Process = "No",
Process = "Yes"
)
);
If( Process == "Yes",
targetName = AllNumericColumns[Contains( AllnumericColumnsCompressed, AllLimitColListCompressed[ii] )];
//ii=30
// If there are spec limits to be processed, call the setspeclimits function
If( N Items( SLList ) > 0,
return = setspeclimits(
Targetname,
Try( Column( dtlimits, lowlist[24] )[ii], . ),
Try( Column( dtlimits, highlist[24] )[ii], . ),
Try( Column( dtlimits, avglist[24] )[ii], . ),
IgnoreMissing,
showLims
)
);
// If Control limit changes have been specified, call the SetControlLimits function
If( N Items( CList ) > 0,
return = SetControlLimits( TargetName, CList, IgnoreMissing, ii )
);
);
);
ShowReport;
close(dtLimits, nosave );
dtLimits = dtOriginalLimits;
current data table(dt);
);
/*****************************************************************************/
/* */
/* Create and display a Summary Report */
/* */
/*****************************************************************************/
ShowReport = Expr(
If( N Rows( dtReport ) > 0,
// Calculate Required Scroll Bar Width
Current Data Table( dtReport );
Summarize( dtReport, Ltypes = By( :Limit Type ) );
hsize = N Items( Ltypes ) * 200 + 150;
// Generate a tabluate report for the display
tab = Tabulate(
Change Item Label( Statistics( Sum, " " ) ),
Remove Column Label( Grouping Columns( :Limit Type, :Limit, :OldNew ) ),
Show Control Panel( 0 ),
Include missing for grouping columns( 1 ),
Add Table(
Column Table( Grouping Columns( :Limit, :Limit Type, :OldNew ), Analysis Columns( :Value ) ),
Row Table( Grouping Columns( :Column, :Level ) )
),
SendToReport( Dispatch( {}, "Tabulate", OutlineBox, {Set Title( "Set Limits Report" )} ) )
);
Tab << on Close( Close( dtReport, nosave ) );
// Modify the output so the Tabulate table is in a scroll box of limited size
Report( tab ) << append( thescroll = Scroll Box( size( hsize, 700 ) ) );
thescroll << append( Report( Tab )[Box( 1 )] );
// Delete the non scroll box version of the table
Report( Tab )[Box( 1 )] << delete;
// If Non Processed columns are found in the data table, list them out
If( N Items( NotProcessedColumnsList ) > 0,
rptNotProcessedOB = Outline Box( "Columns Not Processed",
Border Box( top( 10 ), Left( 10 ), Right( 10 ), bottom( 10 ), sides( 15 ),
V List Box(
Spacer Box( size( 1, 10 ) ),
Text Box( "The following column(s) are in the data table" ),
Text Box( "but are not being processed because they were)" ),
Text Box( "not referenced in the limits table." ),
Spacer Box( size( 1, 10 ) ),
H List Box( Spacer Box( size( 60, 1 ) ), List Box( NotProcessedColumnsList ) ),
Spacer Box( size( 1, 10 ) ),
Text Box( "No limits will be set for the above referenced columns" ),
Spacer Box( size( 1, 10 ) )
)
)
);
rptNotProcessedOB << close;
Report( Tab ) << Append( rptNotProcessedOB );
);
// If columns were found in the limits table, but not in the data table
// list them out
If( N Items( NotFoundList ) > 0,
rptNotFoundOB = Outline Box( "Columns Not Found",
Border Box( top( 10 ), Left( 10 ), Right( 10 ), bottom( 10 ), sides( 15 ),
V List Box(
Spacer Box( size( 1, 10 ) ),
Text Box( "The following column(s) names(s) were referenced in the" ),
Text Box( "Limit Table, but no numeric column of that/those name(s)" ),
Text Box( "were found in the data table." ),
Spacer Box( size( 1, 10 ) ),
H List Box( Spacer Box( size( 60, 1 ) ), List Box( NotFoundList ) ),
Spacer Box( size( 1, 10 ) ),
Text Box( "No limits will be set for the above referenced columns" ),
Spacer Box( size( 1, 10 ) )
)
)
);
rptNotFoundOB << close;
Report( Tab ) << Append( Spacer Box( size( 1, 10 ) ) );
Report( Tab ) << Append( rptNotFoundOB );
);
)
);
/*****************************************************************************/
/* */
/* This is the display for the column selections where the user matches the */
/* the limit columns from the limit data table with the columns in the */
/* data table */
/* */
/*****************************************************************************/
clusterexpr = Expr(
all Columns List = dtlimits << get column names;
Current Data Table( dtlimits );
clusterDlg = V List Box(
Border Box( Left( 3 ), top( 2 ),
V List Box(
Text Box( "Select Columns to Read the Limits From" ),
H List Box(
V List Box(
// Generate the master display box for the columns in the data table
Panel Box( "Select Columns",
cldvlb = H List Box(
Popup Box(
{"Clear", filterval = "" ; thefilter << set text( "" ) ; clearit ; ,
"Numeric", filterval = "" ; thefilter << set text( "" ) ; clearit ; For( II = 1,
II <= N Items( All Columns List ), II++,
If( Column( All Columns List[II] ) << get data type != "Numeric",
colListData << set selected( II )
)
) ; colListData << remove selected ; ,
"Character", filterval = "" ; thefilter << set text( "" ) ; clearit ; For( II = 1,
II <= N Items( All Columns List ), II++,
If( Column( All Columns List[II] ) << get data type != "Character",
colListData << set selected( II )
)
) ; colListData << remove selected ; ,
"Name Contains", filterval = "" ; filtervlb << prepend(
V List Box(
thefilter = Text Edit Box( "",
<<SET width=""> 0;
// Check to see if the required data has been input
If(
N Items( colListY << GetItems ) == 0, Dialog( "No ID Column Specified", Button( "OK" ) ), // Else
LimitsChoosen == 0, Dialog( "No Limit Columns Specified", Button( "OK" ) ), // Else
RecallList = {lowlist = {}, avglist = {}, highlist = {}};
RecallList["lowlist"] = lowlist;
RecallList["avglist"] = avglist;
RecallList["highlist"] = highlist;
// Place the selected values from the screen into the recall list
Insert Into( RecallList, Parse( "IDColumn = \!"" || Char( (colListY << get items)[1] ) || "\!"" ) );
If( IgnoreCB << get == 1,
IgnoreMissing = "Yes",
IgnoreMissing = "No"
);
ShowLims = ShowCB << get;
ShowRpt = ReportCB << get;
Insert Into( RecallList, Parse( "IgnoreMissing = \!"" || IgnoreMissing || "\!"" ) );
Insert Into( RecallList, Parse( "ShowLims = " || Char( showlims ) ) );
Insert Into( RecallList, Parse( "ShowRpt = " || Char( showRpt ) ) );
// Save recall string to Recall namespace
Recall:WriteLimits = RecallList;
nw << CloseWindow;
dtReport = New Table( "Report",
Private,
New Column( "Column", Character, "Nominal" ),
New Column( "Limit Type", Character, "Nominal" ),
New Column( "Level",
Character,
"Nominal",
Set Property( "Value Ordering", {"Lower", "Average", "Upper"} )
),
New Column( "Value", Numeric, "Continuous", Format( "Best", 10 ) ),
New Column( "Limit",
Character,
"Nominal",
Set Property( "Value Ordering", {"Spec Limit", "Control Limit"} )
),
New Column( "OldNew", Character, "Nominal", Set Property( "Value Ordering", {"Previous", "New"} ) )
);
dtReport:Column << set property( "Row Order Levels", 1 );
// Create a working copy of the limits table
dtLimits << Select Rows( NotFoundListRowNumbers );
dtLimits << invert row selection;
dtLimitsTemp = dtLimits << subset(invisible, selected rows(1), selected columns(0));
dtLimits << clear select;
dtOriginalLimits = dtLimits;
dtLimits = dtLimitsTemp;
wait(0);
// Run the actual code that updates the limits
runit;
);
),
Button Box( "Cancel",
clusterDlg << CloseWindow;
Names Default To Here( 1 );
),
Text Box( " " ),
Button Box( "Remove",
colListY << RemoveSelected;
collower << remove selected;
colaverage << remove selected;
colupper << remove selected;
),
Button Box( "Recall",
If( Is List( Recall:WriteLimits ) == 1,
Eval List( Recall:WriteLimits );
If( Try( (colListY << get items)[1], "" ) != IDcolumn,
colListY << RemoveAll;
colListY << append( IDcolumn );
);
If( IgnoreMissing == "Yes",
IgnoreCB << set( 1 ),
IgnoreCB << set( 0 )
);
ShowCB << set( ShowLims );
ReportCB << set( ShowRpt );
readLimitColNames( LimitNum );
)
),
Button Box( "Help", notImplemented )
)
)
),
)
)
),
// Set the default values for the check box options
IgnoreCB << set( 1 );
IgnoreMissing = "Yes";
ShowCB << set( 1 );
ShowLims = 1;
ReportCB << set( 1 );
ShowRpt = 1;
);
// Write the names to the Limit Lists ffrom the display window
WriteLimitColNames = Function( {lNum},
LowList[LNum] = Try( (colLower << get items)[1], "" );
AvgList[LNum] = Try( (colAverage << get items)[1], "" );
HighList[LNum] = Try( (colUpper << get items)[1], "" );
);
// Read the limit values from the Limit Lists and populate
// the display window with the values
ReadLimitColNames = Function( {lNum},
{lNum},
tmplist = lowlist;
ColLower << remove all;
lowlist = tmplist;
tmplist = {};
Insert Into( tmplist, lowlist[lnum] );
collower << append( tmplist );
tmplist = avglist;
ColAverage << remove all;
avglist = tmplist;
tmplist = {};
Insert Into( tmplist, avglist[lnum] );
colAverage << append( tmplist );
tmplist = Highlist;
ColUpper << remove all;
Highlist = tmplist;
tmplist = {};
Insert Into( tmplist, Highlist[lnum] );
ColUpper << append( tmplist );
);
// When the value for the column that contains the names of the data
// table columns that will have their limits changed, process the list,
// comparing it to the data table to check for columns not found
ColListY << On Change(
If( Try( (ColListY << get items)[1], "" ) != LastColListY,
If( Try( N Items( colListY << get items ), 0 ) > 0,
AllLimitColList = AllLimitColListCompressed = NotProcessedColumnsList = NotProcessedColumnsListCompressed = {};
LastColListY = (ColListY << get items)[1];
If( Try( (colListY << get items)[1], "" ) != "",
AllLimitColList = Column( dtlimits, (colListY << get items)[1] ) << get values;
AllLimitColListCompressed = AllLimitColList;
NotFoundList = {};
NotFoundListRowNumbers = {};
// Uppercase and compress the column names
For( i = N Items( AllLimitColList ), i > 0, i--,
AllLimitColListCompressed[i] = Uppercase( AllLimitColListCompressed[i] );
While( Pat Match( AllLimitColListCompressed[i], " ", "" ) > 0, Pat Match( AllLimitColListCompressed[i], " ", "" ) );
If( Contains( AllNumericColumnsCompressed, AllLimitColListCompressed[i] ) == 0,
Insert Into( NotFoundList, AllLimitColList[i] );
Insert Into( NotFoundListRowNumbers, i );
AllLimitColListCompressed = Remove( AllLimitColListCompressed, i, 1 );
AllLimitColList = Remove( AllLimitColList, i, 1 );
);
);
// Find all of the columns that are not going to be processed
NotProcessedColumnsListCompressed = NotProcessedColumnsList = dt << get column Names( string );
For( i = N Items( NotProcessedColumnsList ), i > 0, i--,
NotProcessedColumnsListCompressed[i] = Uppercase( NotProcessedColumnsListCompressed[i] );
While( Pat Match( NotProcessedColumnsListCompressed[i], " ", "" ) > 0,
Pat Match( NotProcessedColumnsListCompressed[i], " ", "" )
);
If( Contains( AllLimitColListCompressed, NotProcessedColumnsListCompressed[i] ) > 0,
//Insert Into( NotFoundList, AllLimitColList[i] );
NotProcessedColumnsListCompressed = Remove( NotProcessedColumnsListCompressed, i, 1 );
NotProcessedColumnsList = Remove( NotProcessedColumnsList, i, 1 );
);
);
// If there are columns that do not exist in the data table, notify the user
If( N Items( NotFoundList ) > 0,
winLocation = nw << get window position;
err = New Window( "Columns Not Found",
Border Box( top( 10 ), Left( 10 ), Right( 10 ), bottom( 10 ), sides( 15 ),
V List Box(
Spacer Box( size( 1, 10 ) ),
Text Box( "The following column(s) names(s) were referenced in the" ),
Text Box( "Limit Table, but no numeric column of that/those name(s)" ),
Text Box( "were found in the data table." ),
Spacer Box( size( 1, 10 ) ),
H List Box( Spacer Box( size( 60, 1 ) ), List Box( NotFoundList ) ),
Spacer Box( size( 1, 10 ) ),
Text Box( "No limits will be set for the above referenced columns" ),
Spacer Box( size( 1, 10 ) ),
H List Box(
continueBB = Button Box( "Continue Anyway", err << close window ),
stopBB = Button Box( "Stop Script",
err << close window;
nw << close window;
Throw();
)
)
)
)
);
err << move window( winLocation[1] + 100, winLocation[2] + 100 ) << zoom window;
);
);
)
)
);
);
/*****************************************************************************/
/* */
/* An Expr to run for any function that has not been implemented. It */
// displays a dialog window telling the user that the function has not been */
/* implemented yet */
/* */
/*****************************************************************************/
notImplemented = Expr(
Dialog( "Feature Not Implemented Yet", Button( "OK" ) )
);
/*****************************************************************************/
/* */
/* Code used in the column selection filter to reset the selection box */
/* */
/*****************************************************************************/
clearit = Expr(
For( II = 1, II <= N Items( colListData << get items ), II++,
colListData << set selected( II )
);
colListData << remove selected;
colListData << append( all columns list );
);
// Call the main expr as the inital piece of script to be run
main;</SET>
。
回复:將限制從限製表寫入數據表你好特克斯尼爾森,謝謝你的劇本。 當我運行它時,它運行沒有任何錯誤。 但是,當我查看規範限制時,對於“某些列”腳本分配了錯誤的限制值...我檢查了列名稱,命名不是問題...我無法弄清楚它運行良好的原因對於一些專欄和一些可能不是,,,,,我錯過了什麼嗎? 你能幫我嗎?
回复:將限制從限製表寫入數據表謝謝你的精彩劇本。回复:將限制從限製表寫入數據表絕對出色的插件。 非常節省時間。 特別是當“顯示為圖形參考線”自動激活時。
感謝分享。
菲利普
回复:將限制從限製表寫入數據表感謝您的評論。至於將插件作為 JSL 的一部分運行,您將必須深入研究代碼並提取工作部分。該代碼被構造為函數和 EXPR,這應該允許您輕鬆地刪除從對話框中調用的代碼。
回复:將限制從限製表寫入數據表很棒的插件! 我只是想為一個項目寫一些同樣的東西。
是否可以通過 JSL 運行插件? 我想自動化在我的應用程序中添加規格限制的過程。
回复:將限制從限製表寫入數據表@邁克D_安德森是正確的。 該插件需要 JMP 12 或更高版本
回复:將限制從限製表寫入數據表您可以檢查該插件的版本兼容性。 他可能將其限制為 12 或更新。 您可能需要諮詢您的許可證管理員。 我很確定您可以訪問版本 12 和 13……其中有很多改進,您可能會發現非常方便。
最好的,
中號
回复:將限制從限製表寫入數據表我的計算機中未安裝此 .jmpaddin 文件。
有人有這個問題嗎?

/昂蒂