我在获取用户输入并将其转换为变量时遇到问题。 我尝试为此使用的脚本粘贴在本段下方。 我多次运行相同的脚本,并且没有编辑它,我在日志中得到两个不同的结果。 该脚本如下:
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>