我在獲取用戶輸入並將其轉換為變數時遇到問題。 我嘗試為此使用的腳本貼在本段下方。 我多次運行相同的腳本,並且沒有編輯它,我在日誌中得到兩個不同的結果。 該腳本如下:
names default to here(1);
clear log();
close all(journals, no save);
close all(data tables, no save);
defuplim = format(today(),"ddMonyyyy");
deflowlim = format(today() - in days(730), "ddMonyyyy");
New Window("Pick Your Dates in ddMonyyyy format",
<<Modal,
<<return result,
V List Box(
Text Box("Start Date:"),
str1=Text Edit Box(deflowlim),
text box("End Date:"),
str2=Text Edit Box(defuplim)
),
H List Box (Button Box ("OK"), Button Box ("Cancel"))
);
lowlim = str1 << get text;
uplim = str2 << get text;
lowlim=informat(lowlim);
uplim= informat(uplim);
show (lowlim);
show (uplim);
日誌的第一個結果是我期望腳本產生的結果,並將其複製並貼上到下面的引號中:
“
低限 = 2015 年 1 月 19 日;
上行 = 2017 年 1 月 18 日;
“
我從日誌中得到的另一個回應(同樣,根本沒有編輯腳本)是這樣的:
“
已刪除的物件參考: str2 << 在存取或評估 'Glue' 時取得文本,名稱預設為此處( 1 ); /*###*/清除日誌(); /*###*/
關閉全部(日誌,不儲存); /*###*/關閉全部(資料表,不儲存); /*###*/
defuplim = Format( Today(), "ddMonyyyy" ); /*###*/deflowlim =
格式(今天()-天數(730),“ddMonyyyy”); /*###*/
新視窗(“以 ddMonyyyy 格式選擇日期”,
<<莫代爾,
<<回傳結果,
V 列錶框(
文字方塊(“開始日期:”),
str1 = 文字編輯框( deflowlim ),
文字方塊(“結束日期:”),
str2 = 文字編輯框( defuplim )
),
H 列錶框(按鈕框(「確定」)、按鈕框(「取消」))
); /*###*/lowlim = str1 << 取得文字; /*###*/uplim = str2 << 取得文字; /*###*/lowlim
= 訊息( lowlim ); /*###*/uplim = 訊息( uplim ); /*###*/顯示( lowlim ); /*###*/
顯示( uplim ) /*###*/;
在以下腳本中,錯誤標記為 /*###*/
名稱預設為此處( 1 ); /*###*/清除日誌(); /*###*/
關閉全部(日誌,不儲存); /*###*/關閉全部(資料表,不儲存); /*###*/
defuplim = Format( Today(), "ddMonyyyy" ); /*###*/deflowlim =
格式(今天()-天數(730),“ddMonyyyy”); /*###*/
新視窗(“以 ddMonyyyy 格式選擇日期”,
<<莫代爾,
<<回傳結果,
V 列錶框(
文字方塊(“開始日期:”),
str1 = 文字編輯框( deflowlim ),
文字方塊(“結束日期:”),
str2 = 文字編輯框( defuplim )
),
H 列錶框(按鈕框(「確定」)、按鈕框(「取消」))
); /*###*/lowlim = str1 << 取得文字; /*###*/uplim = str2 << 取得文字; /*###*/lowlim
= 訊息( lowlim ); /*###*/uplim = 訊息( uplim ); /*###*/顯示( lowlim ); /*###*/
顯示( uplim ) /*###*/;
“
我已經關閉和打開前四行,但無論它們是否關閉或打開,都會得到相同的結果(混合響應)。
有什麼想法可能導致此錯誤嗎?
為了解釋它,人們需要查看比您指定的更多的程式碼
deflowlim = Today() - In Days( 730 );
str1 = Number Edit Box(
deflowlim,
10,
<<SETFUNCTION></SETFUNCTION>
這裡基本上是設定一個資料輸入欄位以允許使用者輸入日期。資料輸入欄位的類型是數字編輯框()。 (請參閱說明下拉選單下腳本索引中的 Number Edit Box() 文件和範例)。

該文檔指出 Number Edit Box() 的形式是:
y = Number Edit Box( initValue, <width> )
名為「str1」的變數被指定為指向 Number Edit Box() 的指標。 在插圖中,這是“y”變量
變數“deflowlim”用於設定要在數位編輯框()中顯示的初始值。 在插圖中,這是“initValue”。
Number Edit Box() 的寬度設定為 10 個字符
從上面的文件清單可以看出,有大量的專案訊息可以傳遞給 Number Edit Box() 物件。您所詢問的程式碼中的相關訊息是「設定函數」。這是腳本索引中的列表

該訊息的作用是設定一段 JSL,只要 Number Edit Box() 中的某些內容發生更改,該 JSL 就會運行。
lowlim = str1 << get
因此,每當 Number Edit Box() 中發生某些變更時,都會將“get”訊息傳遞給“str1”,即 Number Edit Box()
「獲取」訊息是:

Returns the number currently entered in the edit box
返回的數字被分配給變數“lowlim”。
因此,「lowlim」是一個標量變量,可以在後續的 JSL 中引用它。由於 JMP 日期儲存為連續數值資料值,因此只需分配標量變數。
我希望這能解答您的疑問。
jmp 新手並試圖了解這個序列是如何運作的 - 有人可以解釋程式碼的這方面是如何運作的嗎? 看起來它將框輸入保存到局部變量,而不需要將文字方塊結果輸出到數組,但不確定該函數如何完成此操作。
<<SETFUNCTION></SETFUNCTION>
謝謝,這非常有幫助! 將日期保留為數字很有意義並且需要較少的轉換。
txnelson 的腳本是處理日期的更好方法,此外,它還透過在框中取得值來解決腳本遇到的核心問題。
在腳本中,您建立一個模式新窗口,但在窗口關閉後嘗試從窗口的顯示框中獲取資訊。 一旦視窗關閉,您就無法再存取它所保存的內容 - 它不再存在。 這就是為什麼您會遇到 lowlim = str1 << get text; 語法錯誤的原因。
不過,您已經快到了 - 您指定了模式視窗的返回結果,但您沒有使用從中獲得的結果。
在不進行任何其他更改的情況下(儘管 txnelson 的日期處理更好),您可以透過將新視窗指派給變量,然後取得這些值(下面的變更以紅色顯示)來獲得所需的內容:
ww = New Window("Pick Your Dates in ddMonyyyy format",
<ww["str1"];
uplim = ww["str2"];
試試這個版本......它將日期保留為數字,這是 JMP 更喜歡處理它們的方式
Names Default To Here( 1 );
Clear Log();
Close All( journals, no save );
Close All( data tables, no save );
defuplim = Today();
deflowlim = Today() - In Days( 730 );
New Window( "Pick Your Dates in ddMonyyyy format",
<<MODAL></MODAL>