进度4GL查询

时间:2014-09-20 17:24:38

标签: progress-4gl

我有一张表说'员工',一个字段说'姓名'。表中有9条记录。我需要在'where'子句的帮助下编写一个'for each'查询,通过该子句,我将能够查看/显示一个选定的名称(比如说'Sheldon'是9的第6个记录),并且按字母顺序休息8个记录(名称)。 **注意:仅通过构造查询。没有临时表,缓冲区的概念。除了'display'语句之外,'for each'块中没有任何内容。

5 个答案:

答案 0 :(得分:1)

我认为你说你有一张员工表,其中包含以下记录:

Dan
Gus
Mike
Paul
Rich
Sheldon
Shelley
William
Xavier

您希望输出为:

Sheldon
Dan
Gus
Mike
Paul
Rich
Shelley
William
Xavier

您不能在单个FOR EACH中执行此操作,因为您有两个完全不同的查询。一个人找到" sheldon"记录(或记录 - 你没有说它们是否是唯一的),还有一个可以找到所有其余的记录。

你可以这样做:

do with frame a.
  for each employee no-lock where name = "Sheldon":
    display name with frame a 10 down.
    down with frame a.
  end.
  for each employee where name <> "Sheldon" by name:
    display name with frame a.
    down with frame a.
  end.
end.

(&#34;使用框架a&#34;以及其他各种&#34;框架a&#34;位只是使用单个框架。如果你不关心你,那么#&## 39; t需要那些位。)

如果您愿意稍微扩展您的视野并且坚持使用FIND,您可以这样做:

find employee no-lock where name = "sheldon".

repeat:

  if not available employee then leave.

  display name with 10 down.

  if name = "sheldon" then
    find first employee no-lock where name <> "sheldon" no-error.
   else
    find next employee where name <> "sheldon" no-error.

end.

答案 1 :(得分:1)

由于显而易见的原因,我没有花太多时间来测试这个,但是恶劣的诡计似乎是:

for each employee where name = "sheldon" or name <> "sheldon":
  display name.
end.

正如我所说 - 我将此作为不合格的测试。如果您这样想,那么您的代码就比它的价值更麻烦。 IMHO。

答案 2 :(得分:0)

通常情况下你会使用FIND,但是因为你要求FOR FOR EACH - 这里有一个w / out WHERE。您可以轻松添加它以获得您想要的任何最终结果。

FOR EACH employee  
    NO-LOCK 
    BY Employee.name:

    DISPLAY employee.name WITH DOWN.

END.

答案 3 :(得分:0)

使用两个用于eaches。第一个从您选择的名称和更大的字母顺序返回,第二个从开始开始,一旦到达您选择的名称就会中断。 这将从您选择的名称开始按字母顺序显示字段。假设name是按字母顺序排序的键字段,否则可以使用其他选项对值进行排序。

抱歉没有测试代码,或担心格式化。也不确定你的意思其余部分必须按字母顺序排列,所以这里有两个版本。

使用临时表可以更容易地执行这些方法中的任何一种。

如果你想从sheldon开始显示sheldon然后是alpha,那么应该是这样的:

FOR EACH employee  where name >= "sheldon" NO-LOCK:
    DISPLAY employee.name.
END.

FOR EACH employee  NO-LOCK:
    if employee.name = "sheldon"
        break;
    DISPLAY employee.name.
END.

如果你想从头开始显示sheldon然后是alpha,那么应该是这样的,不包括sheldon:

FIND employee no-lock where name = "sheldon".
DISPLAY employee.name.

FOR EACH employee  NO-LOCK where name <> "sheldon":
    DISPLAY employee.name.
END.

答案 4 :(得分:0)

一种相对非邪恶的方式,对于记录,这是安全的,以防止未来发布的Openedge与你联系:

for each employee 
    no-lock
    by (if employee.name = "sheldon" then 1 else 2)
    by employee.name
:
    display employee.
end.

......但表现会很糟糕。