如果表已排序,则使行状态处理程序停止工作是否可以将行状态处理程序应用于数据表,并在数据表发生更改时使该处理程序继续工作;例如,如果列是由脚本排序的还是由用户交互排序的?
我目前有两张数据表:一张是汇总统计表,一张是原始数据。 用户在汇总表中选择一行,行状态处理程序检测选择了哪一行,提取参数名称并使用所选参数从原始数据表创建图表。
它工作正常(尽管它确实在找到新选择的行之前首先选择了被取消选择的行),但是如果用户对汇总表进行排序(例如,如果他们想查看最低的 Cpk 或其他一些指标),它就会中断).
我在以下基于脚本帮助的简单示例中看到了同样的问题:
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
f = Function( {a}, Print( a ) );
rs = dt << make row state handler( f );
dt << Select Rows( 1 );
dt << sort( by( :weight ), replace table, order( ascending ) );
dt << Select Rows( 9 );输出是:
Scriptable[]
[1]
我认为这可能与此愿望清单项目有关: https://community.jmp.com/t5/JMP-Wish-List/Improve-JMP-s-state-handlers-hover-label-row-state-handler/idi-p/527992 . 有什么解决方法吗?
我在 MacOS 上使用 JMP17.0。
谢谢你!
自动化和脚本回复:如果表已排序,则使行状态处理程序停止工作顺便说一句,我意识到我给出的脚本示例可以通过添加来轻松解决
rs = dt << make row state handler( f );
在我的 Sort() 命令之后立即。 这是交互式案例(用户按列手动对表格进行排序,然后选择一行)才是问题所在。
我尝试通过向表中添加一个脚本来重置行状态处理程序来尝试解决方法:
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
f = Function( {a}, Print( a ) );
rs = dt << make row state handler( f );
dt << new script("Fix Row State Handler",
rs = dt << make row state handler( f );
); // errors when the script is run!
dt << Select Rows( 1 );
wait(0);
dt << sort( by( :weight ), replace table, order( ascending ) );
rs = dt << make row state handler( f ); // fixes issue when scripting
dt << Select Rows( 9 );但是当我单击绿色三角形运行脚本时出现错误:
Send Expects Scriptable Object in access or evaluation of 'Send' , dt << /*###*/make row state handler( f ) /*###*/ at line 6 in ...
然而,即使这可行,也不是理想的,因为它需要用户记住在对表格进行排序后执行此操作。
谢谢,
马修。
回复:如果表已排序,则使行状态处理程序停止工作你好,
也许您可以使用报告来驱动脚本。 当选择行时,表格框可以运行脚本,并且当对汇总表进行排序时,表格框似乎不会中断 - 请尝试以下操作来了解一下。
Names Default To Here(1);
dt = open ("$Sample_Data\Car Physical Data.jmp");
dtSum = dt << summary( group(:Country), mean(:weight) );
nw = new window("ex",
dtb = Data Table Box( dtSum,
<< Set Selectable rows,
<< Set Click Sort )
);
//do something when a row is selected. Here, we just print the country.
dtb << Set Row Change Function ( function( { this },
selCountry = this[1][this << get selected rows];
print(evalinsert("Selected country is: ^selCountry[1]^."))
) );
干杯,
布雷迪
回复:如果表已排序,则使行状态处理程序停止工作嗨,布雷迪,这太棒了,谢谢! 这给了我一个比以前更强大、更可用的解决方案。
一个问题:是否可以从 JSL 查询数据表框以找出用户按哪一列(如果有)对表进行排序?
问候,
马修。
回复:如果表已排序,则使行状态处理程序停止工作你好马修,
我不知道如何查询以查看哪个(如果有)列用于对表进行排序。 您可以通过检查列来强制执行此操作,但它可能会变得昂贵,具体取决于表大小。
回复:如果表已排序,则使行状态处理程序停止工作嗨布雷迪,
谢谢你的提示。
我不知道如何查询以查看哪个(如果有)列用于对表进行排序。 您可以通过检查列来强制执行此操作,但它可能会变得昂贵,具体取决于表大小。
你能帮我用暴力破解的方法吗? 我尝试查看 DataTableColBox 和窗口本身的属性,但没有找到任何可以帮助我查看它是否已排序的内容。
谢谢,
马修。