2014-09-20 75 views
0

我有一个表说'员工'与一个单一的字段说'名称'。表中有9条记录。我需要在'where'子句的帮助下为每个查询写一个'for'查询,通过这个子句,我可以查看/显示一个选定的名字(比如'Sheldon'是9中的第6条记录)其余8个按字母顺序记录(名称)。 **注意:只能通过构建查询。没有临时表,缓冲区的概念。 'display'语句以外的'for each'块内不允许任何内容。进度4GL查询

+0

你说“一个选定的名字”。这里选择了什么?在什么基础上选择一个名字? – Austin 2014-09-20 17:49:00

+0

这是一组相当奇怪的要求。我很好奇,你是否愿意详细说明为什么你需要这些特殊的限制? – 2014-09-21 14:52:58

+0

首先,我需要知道我的理由是否可能或不正确的方式我陷害!我不需要这些特殊的限制,除非面试官充满信心地声称可以做到这一点,我很好奇是驾驶的可能性! – Sheldon 2014-09-24 20:35:30

回答

0

通常情况下,你会为​​此找到一个FIND,但是因为你要求一个FOR EACH - 这里有一个w/out WHERE。你可以很容易地添加,以获得你想要的任何最终结果。

FOR EACH employee 
    NO-LOCK 
    BY Employee.name: 

    DISPLAY employee.name WITH DOWN. 

END. 
+0

这真的不产生什么被问:首先一个具体名称,其余的按字母顺序排列后... – Jensd 2014-09-21 08:54:32

+1

他的要求是矛盾的 - 只有一个“为每个”,一个显示语句,首先显示一个名称,然后是所有表中除名称外的其他名称按升序排列。 他想要的东西无法完成。考虑到这一点,我认为他对这门语言非常陌生,所以我在上面写了一个选项,那就是他可以随时“品尝”味道。 – 2014-09-21 18:27:26

+0

嗨@TimKuehn,我同意我对这门语言很陌生,至少对你有用。我会推动我的简短介绍,然后是2年2个月的进展,而编程概念推动我不少于6年。我要求这不能按照面试官问我的方式完成(至少这是我的'问题'),至少他可以听取我使用_buffer_的概念,但他的要求是不可动摇的,所以我选择了这个论坛来获得一个可能来自天才的世界'! – Sheldon 2014-09-24 20:41:40

1

我认为你说你有一个雇员表像记录:

Dan 
Gus 
Mike 
Paul 
Rich 
Sheldon 
Shelley 
William 
Xavier 

而你所要的输出是:

Sheldon 
Dan 
Gus 
Mike 
Paul 
Rich 
Shelley 
William 
Xavier 

在你不能做到这一点一个FOR FOREACH,因为你有两个完全不同的查询。一个找到“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. 

(“请勿与框架”和其他各种“帧”位仅仅使用单一框架如果你不关心这个。你不需要那些位)

如果你愿意扩大你的视野了一下,弯腰用找你能做到这一点,像这样:

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. 
+0

也许考虑在第二个循环中执行'IF name ='Sheldon'THEN NEXT'以避免表扫描?这个例子可能不是致命的,但可能用于其他查询。 – Jensd 2014-09-21 07:03:00

+1

如果你正在扫描整个东西附近的东西,这没什么大不了的。 – 2014-09-21 11:33:26

+1

这是一个好点! (但是如果你在一个新的版本中,你可以添加TABLE-SCAN选项...) – Jensd 2014-09-21 14:38:07

0

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

对不起,没有测试代码,或担心格式。也不知道你的意思其余的必须按字母顺序排列,所以这里有两个变化。

使用临时表可以更轻松地完成这些方法中的任何一种。

应该是这样,如果你想显示从谢尔顿起谢尔顿然后阿尔法:如果你想显示从开始谢尔顿然后阿尔法

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. 

应该是这样,但不包括谢尔登:

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

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

出于显而易见的原因,我并没有花很多的时间去检测这一点,但卑鄙的欺骗似乎是:

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

正如我所说 - 我会用它作为不合格测试。如果你这样想,那么你的代码比它的价值更麻烦。恕我直言。

+0

我完全同意! – AquaAlex 2014-10-07 10:27:35

0

相对为非作恶方式,备案,这是对你拧Openedge的未来版本的安全:

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

...但性能将是可怕的。