2014-09-20 89 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. 

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