如果表已排序,則使行狀態處理程序停止工作是否可以將行狀態處理程序應用於數據表,並在數據表發生更改時使該處理程序繼續工作;例如,如果列是由腳本排序的還是由用戶交互排序的?
我目前有兩張數據表:一張是匯總統計表,一張是原始數據。 用戶在匯總表中選擇一行,行狀態處理程序檢測選擇了哪一行,提取參數名稱並使用所選參數從原始數據表創建圖表。
它工作正常(儘管它確實在找到新選擇的行之前首先選擇了被取消選擇的行),但是如果用戶對匯總表進行排序(例如,如果他們想查看最低的 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 和窗口本身的屬性,但沒有找到任何可以幫助我查看它是否已排序的內容。
謝謝,
馬修。