PROGRESS 4GL - 何时使用 FOR FIRST、CAN-FIND 和 FIND FIRST?

Bha*_*rat 2 progress-4gl openedge

我是 4GL 的新手。我总是愿意编写正确的代码,并愿意了解我们正在使用的每个关键字的两端,但遵循给出相同结果的示例查询。我不知道什么时候使用FIND FIRST、FOR FIRST和CAN-FIND?请帮助我重写完美的答案

FOR EACH Customer NO-LOCK:
    FOR FIRST Order OF Customer:
    /*somelogic*/
    END.
END.

FOR EACH Customer NO-LOCK:
    FIND FIRST Order OF Customer NO-LOCK NO-ERROR.
    IF AVAILABLE Order THEN
    /*somelogic*/
END.

FOR EACH Customer NO-LOCK:
  IF CAN-FIND(FIRST  Order OF Customer ) THEN
  DO:
        /*somelogic*/
  END.
END.
Run Code Online (Sandbox Code Playgroud)

小智 5

FOR FIRST 将您找到的记录范围限定为一个块。它避免了在块中引用记录时必须检查记录的可用性,因为如果记录不可用,则块将不会执行。

永远不应该真正使用 FIND FIRST。如果有很多记录,您无法控制第一个找到哪条记录;如果只有一个记录,您应该只使用 FIND 而无需使用 FIRST。这样,代码就可以解释预期的内容,并且您可以测试是否存在模糊性,以确保有人没有做一些愚蠢的事情。

CAN-FIND 用于检查记录是否存在,而不实际将该记录拉回客户端。缓冲区中将没有可用记录,因此您无法使用该数据。这是检查记录是否存在的绝佳方法,而无需通过网络将内容拉回。如果您不关心数据,请使用它。

  • 当您确实只需要了解有序集中的第一个记录时,FIND FIRST 有时很有用。尽管这几乎总是意味着有人没有正确规范化使其成为一件有趣的事情的属性。您还依赖未声明的索引来支持您假定的排序,因此 FIND 并不是真正解决该问题的最佳方法。这很糟糕,但 FIND FIRST 真正令人讨厌的事情是代码库总是将 FIRST 粘到每个 FIND 上。这是一种可怕的“最糟糕的做法”,需要杜绝。 (2认同)