對 JSL 的表達形式感到困惑<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />我想將一個小表存儲在另一個表中,以便在同一報告中使用這兩個表的腳本可以在需要時重建小表。這似乎是一個不錯的解決方案,因為表的用戶還可以輕鬆打開那個小的相關信息表,同時僅存儲一個數據表。
在對 expr() 語法層咬牙切齒之後,我確實得到了以下工作......
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt2 = 打開("$SAMPLE_DATA/Abrasion.jmp");
ts=dt<< 獲取腳本();
關閉(dt,nosave);
ne=nameexpr(ts);
eval(substitute(expr(dt2<
//...之後...
dt2<
dtBigClass=當前數據表();
但是,2個問題...
1)事情真的有這麼複雜嗎?使用 getscript() 獲取腳本後,是否沒有更簡單的方法將我獲得的腳本“放入”表中?
2)我對運行腳本後使用 currentdatatable() 讓變量 dtBigClass 指向表並不感到興奮。似乎很容易把錯誤的東西放在那裡。 假設腳本失敗或存在一些計時問題,它仍在將某些表或其他表分配給 dtBigClass。該腳本看起來像“New Table("Big Class..blah,blah",我真的很想運行“ dtBigClass=NewTable("Big Class...blah blah..."我很高興有一個解決方案,我可以將腳本“獲取”為文本字符串的形式,我可以編輯和運行更多直接地。
回复:對 JSL 的表達形式感到困惑謝謝!
我很欣賞這兩個答案。我可能應該更加努力地理解基於 eval expr() 的那些,但我不得不承認我y 首選方法是 eval(parse()) 文本字符串。不用費太多心思,而且我可以運行弦樂部分並直接檢查我正在構建的內容。但是,我不知道如何將其放入字符串中......
char(dt<
ts=dt<
然後 char(ts)...
...那是行不通的。
同樣,你對2的答案似乎非常簡單,但我沒想到這會起作用!我仍然有點驚訝 - 對我來說並不明顯它會返回一些東西放入 dtBigClass 但它很棒。
回复:對 JSL 的表達形式感到困惑表達式操作可能會令人沮喪。 要知道函數參數是在運行時計算還是只是按照編寫的方式接受並不總是那麼容易。 通常,當將表達式傳輸到 GUI 元素(例如列公式或表腳本)時,需要一些額外的工作,因為不會計算參數。 有時,構建一個字符串然後使用 eval(parse()) 比找出最佳用法 expr()、evaexpr() 等更容易。
1)可以稍微簡化一下。 這個例子展示了兩種方法
dt =打開( “$SAMPLE_DATA/大類.jmp” ) ;
dt2 =打開( “$SAMPLE_DATA/磨損.jmp” ) ;
//1. 表達
評估(求值表達式( dt2 <<新腳本( 《大班》 , dtBigClass =表達式( dt <<獲取腳本)))) ;
//2. 細繩
評估(解析( "dt2 << newscript(\!"BigClass2\!", dtBigClass2 =" ||查爾( dt <<獲取腳本) || “)” )) ;
關閉( dt ,不保存) ;
dt2 <<運行腳本( 《大班》 ) ;
dt2 <<運行腳本( 《大班2》 ) ;
2)您可以按照上面的方式在腳本中進行分配,或者如下所示
dtBigClass = dt2 <<運行腳本( 《大班》 ) ;
回复:對 JSL 的表達形式感到困惑1:幾乎那麼複雜。NewScript 期望其參數是腳本,這通常是正確的答案。 這次不行。
2:我也不喜歡 CurrentDatatable 來完成這項工作。
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt2 = Open( "$SAMPLE_DATA/Abrasion.jmp" );
Eval( Eval Expr( dt2 << NewScript( "BigClass", bigclass = Expr( dt << getscript ) ) ) );
替代是一種方法,但您也可以使用 EvalExpr 來僅計算 Expr。EvalExpr 的結果是一個表達式:

這仍然需要評估。EvalExpr 查找 Expr 並對其求值,然後返回進行替換的原始表達式。回顧第 3 行,還執行了一個 Eval 來實際運行 NewScript 命令(但沒有分配給大班)。
當名為“BigClass”的腳本運行時,它會分配變量大班,避免了對 CurrentDatatable 的需要。