在 @For 循环中使用数组时对话框列表字段中的错误
Bug in a Dialog List field when using an array in an @For loop
我在对话框列表字段中发现了一个有趣的错误。
我正在尝试创建一个从今年负 17 开始的年份列表,并让列表倒退 30 年。 (例如:2003 年、2002 年、2001 年、2000 年……1973 年)。我显然不想对选项进行硬编码,因为每年我都必须返回并更改它。
我创建了一个简单的对话框列表字段并选择了 "Use formula for choices" 并输入了以下公式:
startYear := @Year(@Now)-17; @For( x:=1; x<=30; x:=x+1; temp[x] := startYear-x); temp
我去存的时候改写成
startYear := @Year(@Now)-17; @For( x:=1; x<=30; x:=x+1; temp[x := startYear-x ]); temp
显然 temp[x := startYear-x ]
不会起作用,但无论我尝试什么,编辑器都会将代码重置为那个。
有谁知道如何编写这种类型的公式,以便它可以工作并满足我的要求?
(Notes Designer 9.01 FP8)
首先回答你的问题:像在公式中那样分配数组下标是不可能的,请参阅设计师帮助的摘录(thanx @Richard Schwartz):
The subscript operator cannot be used on the left side of an assignment statement. That is, you cannot assign a value to a subscripted element. You must build the complete list and then assign it.
其次:我检查了你的公式,如果你把它放在字段的"Value"-公式中,那么它不会被F9修改,只有当它放在对话框列表公式中时我才能重现同样的行为......但我不介意:因为它根本不是一个有效的公式,所以这个恕我直言不能称为 "Bug".
修正后的公式可能如下所示:
_startYear := @Year(@Now)-17;
@For( _x:=1; _x<=30; _x:=_x+1;
_temp := @Text(_startYear-_x);
_myArr := @Trim( _myArr : _temp )
);
_myArr
不要因为下划线而混淆:我用它们来区分变量和字段名。
由于 Dialoglists 存储文本,您需要将单个值转换为文本。
如果你想让年份倒序,那么只需要改变一行:
_myArr := @Trim( _temp : _myArr )
@Formula 语言 - 顺便说一句 - 在列表方面非常酷,可以用不同的方式解决这个问题。例如。通过使用 daterange 和 explode:
_start := @Adjust(@Today;-17;0;0;0;0;0);
_end := @Adjust(@Today;13;0;0;0;0;0);
_daterange := @TextToTime( "[" + @Text(_start) + "-" +
@Text(_end)+"]");
_allDates := @Explode( _dateRange );
@Text(@year(_allDates))
但我承认:尽管它很酷,但它并不是很直观,但在还没有 @For 的情况下,这将是 Notes 5 中的解决方案。
我在对话框列表字段中发现了一个有趣的错误。
我正在尝试创建一个从今年负 17 开始的年份列表,并让列表倒退 30 年。 (例如:2003 年、2002 年、2001 年、2000 年……1973 年)。我显然不想对选项进行硬编码,因为每年我都必须返回并更改它。
我创建了一个简单的对话框列表字段并选择了 "Use formula for choices" 并输入了以下公式:
startYear := @Year(@Now)-17; @For( x:=1; x<=30; x:=x+1; temp[x] := startYear-x); temp
我去存的时候改写成
startYear := @Year(@Now)-17; @For( x:=1; x<=30; x:=x+1; temp[x := startYear-x ]); temp
显然 temp[x := startYear-x ]
不会起作用,但无论我尝试什么,编辑器都会将代码重置为那个。
有谁知道如何编写这种类型的公式,以便它可以工作并满足我的要求?
(Notes Designer 9.01 FP8)
首先回答你的问题:像在公式中那样分配数组下标是不可能的,请参阅设计师帮助的摘录(thanx @Richard Schwartz):
The subscript operator cannot be used on the left side of an assignment statement. That is, you cannot assign a value to a subscripted element. You must build the complete list and then assign it.
其次:我检查了你的公式,如果你把它放在字段的"Value"-公式中,那么它不会被F9修改,只有当它放在对话框列表公式中时我才能重现同样的行为......但我不介意:因为它根本不是一个有效的公式,所以这个恕我直言不能称为 "Bug".
修正后的公式可能如下所示:
_startYear := @Year(@Now)-17;
@For( _x:=1; _x<=30; _x:=_x+1;
_temp := @Text(_startYear-_x);
_myArr := @Trim( _myArr : _temp )
);
_myArr
不要因为下划线而混淆:我用它们来区分变量和字段名。 由于 Dialoglists 存储文本,您需要将单个值转换为文本。 如果你想让年份倒序,那么只需要改变一行:
_myArr := @Trim( _temp : _myArr )
@Formula 语言 - 顺便说一句 - 在列表方面非常酷,可以用不同的方式解决这个问题。例如。通过使用 daterange 和 explode:
_start := @Adjust(@Today;-17;0;0;0;0;0);
_end := @Adjust(@Today;13;0;0;0;0;0);
_daterange := @TextToTime( "[" + @Text(_start) + "-" +
@Text(_end)+"]");
_allDates := @Explode( _dateRange );
@Text(@year(_allDates))
但我承认:尽管它很酷,但它并不是很直观,但在还没有 @For 的情况下,这将是 Notes 5 中的解决方案。