回复:基于两个相关列的 GUI 组合框您需要添加函数(或脚本)来限制第二个组合框中的选项。 下面的一个选项(我认为它应该适用于 JMP14)
Names Default To Here(1);
v1 = "";
v2 = "";
dt = Open("$DOWNLOADS/JMP_Question.xlsx", Worksheets("Sheet1"), invisible);
Summarize(dt, uniqvals = by(:Column 1));
aa_options = Associative Array();
For(i = 1, i <= N Items(uniqvals), i++,
col1_idx = dt << Get Rows Where(:Column 1 == uniqvals[i]);
col2_vals = dt[col1_idx, "Column 2"];
aa_options[uniqvals[i]] = col2_vals;
);
nw = New Window("Set the Value",
Lineup Box(N Col(2),
Text Box("Col1"),
cb1 = Combo Box(uniqvals, << set function(function({this},
cb2_vals = aa_options[(this << get selected)];
cb2 << Set Items(cb2_vals);
)), << Set(1)
),
Text Box("Col2"),
cb2 = Combo Box(aa_options[uniqvals[1]])
),
H List Box(
Button Box("OK",
v1 = cb1 << get selected;
v2 = cb2 << get selected;
nw << close window;
show(v1, v2);
),
Button Box("Cancel", nw << close window)
)
);
回复:基于两个相关列的 GUI 组合框谢谢亚尔莫! 你让它看起来很容易。 
有效。
回复:基于两个相关列的 GUI 组合框你好,
我在使用该对话框时遇到的另一个麻烦是将列表作为输入。
如果我使用下面的代码。
Names Default To Here(1);
v1 = "";
v2 = "";
dt = Open("JMP_Question.xlsx", Worksheets("Sheet1"), invisible);
Summarize(dt, uniqvals = by(:Column 1));
aa_options = Associative Array();
For(i = 1, i <= N Items(uniqvals), i++,
col1_idx = dt << Get Rows Where(:Column 1 == uniqvals[i]);
col2_vals = dt[col1_idx, "Column 2"];
aa_options[uniqvals[i]] = col2_vals;
);
nw = New Window("Set the Value",
Lineup Box(N Col(2),
Text Box("Col1"),
cb1 = Combo Box(
uniqvals,
<<SET function=""></SET>
它没有将列表作为输入。 难道我做错了什么?
谢谢!
回复:基于两个相关列的 GUI 组合框即使 JMP 让你将列表放入文本框(不知道为什么,我认为它应该会抛出错误),它仍然是一个字符串(JMP 很可能对其进行转换),所以你不能直接用索引引用它。
您可以使用 Words 将其拆分为列表(并且可能替换以删除额外的字符,例如括号)或 Parse() 将其拆分为列表
Names Default To Here(1);
nw = new window("",
tb = Text Edit Box({"list1", "list2", "list3"}),
);
tb_txt = tb << get text;
show(tb_txt);
show(type(tb_txt));
show(Parse(tb << get text));
show(type(Parse(tb << get text)));回复:基于两个相关列的 GUI 组合框你好,
如果我尝试将解决方案应用于三列,它会起作用。 但是,我无法根据第一列和第二列创建唯一选择。
Names Default To Here(1);
v1 = "";
v2 = "";
v3 = "";
dt = Open("JMP_Question.xlsx", Worksheets("Sheet1"), invisible);
Summarize(dt, uniqvals_1 = by(:Column 1));
Summarize(dt, uniqvals_2 = by(:Column 2));
Summarize(dt, uniqvals_3 = by(:Column 2,:Column 3));
aa_options = Associative Array();
For(i = 1, i <= N Items(uniqvals_1), i++,
col1_idx = dt << Get Rows Where(:Column 1 == uniqvals_1[i]);
col2_vals = dt[col1_idx, "Column 2"];
aa_options[uniqvals_1[i]] = col2_vals;
);
ab_options = Associative Array();
For(i = 1, i <= N Items(uniqvals_2), i++,
col2_idx = dt << Get Rows Where(:Column 2 == uniqvals_2[i]);
col3_vals = dt[col2_idx, "Column 3"];
ab_options[uniqvals_2[i]] = col3_vals;
);
/*
ac_options = Associative Array();
For(i = 1, i <= N Items(uniqvals_1), i++,
col1_idx = dt << Get Rows Where(:Column 1 == uniqvals_1[i]);
col2_vals = dt[col1_idx, "Column 2"];
For(j=1, j<=N Items(uniqvals_2),j++
col2_idx = dt << Get Rows Where(:Column 2 == uniqvals_2[j]);
col3_vals = dt[col2_idx, "Column 3"];
ac_options[uniqvals_2[j]] = col3_vals;
);
);
*/
print(ac_options);
nw = New Window("Set the Value",
Lineup Box(N Col(2),
Text Box("Col1"),
cb1 = Combo Box(uniqvals_1, << set function(function({this},
cb2_vals = aa_options[(this << get selected)];
cb2 << Set Items(cb2_vals);
)), << Set(1)
),
Text Box("Col2"),
cb2 = Combo Box(uniqvals_2, << set function(function({this},
cb3_vals = ab_options[(this << get selected)];
cb3 << Set Items(cb3_vals);
)), << Set(1)
),
Text Box("Col3"),
cb3 = Combo Box(ab_options[uniqvals_2[1]])
),
H List Box(
Button Box("OK",
v1 = cb1 << get selected;
v2 = cb2 << get selected;
v3 = cb3 << get selected;
nw << close window;
show(v1, v2, v3);
),
Button Box("Cancel", nw << close window)
)
);上面的代码有效。 但是,如果您查看所附图片,我无法为 Col2 和 Col3 创建唯一列表。
我可能缺少一个简单的解决方案。
谢谢!
回复:基于两个相关列的 GUI 组合框您可以创建新列,它是 :Column 1 和 :Column 2 的组合,并将其用于键
基于两个相关列的 GUI 组合框你好,
如果文件中有两列,我可以分别使用这两列创建一个组合框(请参阅随附的 JSL 文件)。 然而,我真正想要的是,一旦我选择第一个选项(比如“a”),它应该将我的第二个框选项限制为仅“a1”、“a2”和“a3”。 请参阅附件中的 Excel 文件。
任何帮助,将不胜感激。
v1 = "m";
v2 = "n";
dt = Open("JMP_Question.xlsx", Worksheets("Sheet1"), invisible);
subDt1 = dt << Subset(Columns(:Column 1), invisible);
Summarize(col1_unique_vals = by(Column 1));
subDt2 = dt << Subset(Columns(:Column 2), invisible);
Summarize(col2_unique_vals = by(Column 2));
win = New Window("Set the Value",
H List Box(Text Box("Col1"), combo_box1 = Combo Box(col1_unique_vals)),
H List Box(Text Box("Col2"), combo_box2 = Combo Box(col2_unique_vals)),
H List Box(
Button Box("OK",
v1 = combo_box1 << get selected;
v2 = combo_box2 << get selected;
win << close window;
),
//a cancel button that closes the window and doesn't store store the results
Button Box("Cancel", win << close window)
)
);
JMP 版本 - JMP Pro 14
自动化和脚本编写质量和工艺工程