进度4gl - FOR LAST -查询,给出错误的结果



我希望使用以下查询来查找最后的投标id。

FOR EACH tender-table NO-LOCK WHERE tender-table.kco = 1 BY tender-table.id:
DISPLAY  tender-table.id.
END. 

该查询查看所有投标id,并以升序返回所有id的所有结果。我得到的结果是

10351.036……1060年1061年1062年1063年1064年1065年1066

FOR LAST tender-table NO-LOCK WHERE tender-table.kco = 1 BY tender-table.id:
DISPLAY  tender-table.id.
END.

然而,当我使用这个查询来查找最后一个id时,我得到了结果,

1061年

当我应该看到结果1066。有人能告诉我为什么会这样吗?

FOR LAST是一个非常具有欺骗性的语句。(FOR FIRST也是如此。)它不以直观的方式运行。排序顺序不是由by语句指定的。您将根据所使用的索引获得LAST记录,并且不会进行排序。当BY引用了一个没有索引的字段(或者一个没有按照实际使用的索引顺序排序的字段),或者当WHERE子句没有明显地按照您希望的顺序映射到索引时,您将会选择神秘的记录。

就我个人而言,我强烈建议你忘记使用FOR FIRST &最后。一个更好的选择是:

,它总是按预期排序
FOR EACH tableName WHERE someCriteria BREAK BY sortOrder:
  LEAVE.
END.
DISPLAY whatEver.

(添加" ascending "从FIRST到LAST…)

万一有人需要说服——试试这个"sports"数据库:

for first customer no-lock by discount:
  display name discount.
end.

对不起,我已经设法弄清楚,这1066个值没有投标表。Kco = 1。这就解决了问题。谢谢你的宝贵时间。

相关内容

最新更新