在 @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 中的解决方案。