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