2015-12-21 170 views
2

更新:應該撤消該問題,該語法是正確的。顯然,SAP通過語法定義了ABAP,然後通過純文本中的附加規則進行修改。我錯過了第二部分。ABAP 7.40,SELECT .. UP到n ROWS語法混淆


我在查看ABAP關鍵字文檔7.40,SELECT - > SELECT additions。對於另外UP TO N行,它給人的例子

DATA: wa_scustom TYPE scustom. 

SELECT * 
     FROM scustom 
     WHERE custtype = 'B' 
     ORDER BY discount DESCENDING 
     INTO @wa_scustom 
     UP TO 3 ROWS. 
ENDSELECT. 

我驗證碼在SAP系統7.40,並得到了錯誤

第7行:「變成」無效點擊這裏。 ''預計

另一方面,下面的代碼被接受,儘管它沒有被文檔中給出的SELECT語法覆蓋:UP TO n ROWS應該在FROM之後。

SELECT COUNT(*) UP TO 1 ROWS 
    FROM MARC 
    WHERE matnr eq 100. 

我們正在編寫一個工具,可以自動生成ABAP代碼,這將是很好知道什麼是合法的,哪些不是。是否有「權威」文件?一般來說,值得嘗試聯繫SAP的某人進行更正嗎? (你看,我對SAP世界有些陌生)如果是的話,那可能是誰?

+0

嗯,我想我找到了關於第二個代碼片段的一些信息:根據ABAP關鍵字文檔7.31,給定的代碼是合法的。所以,也許SAP改變了語法,但讓解析器靜靜地接受舊的語法。 –

+0

它看起來像abap編譯器希望在「/ group by/order by part」之前的「up to」指令。但是我還沒有找到任何有關這些規則的文件。 –

+0

是的,這是通常的SAP政策。在最新的文檔中,它強制只使用最新的語法,但始終支持傳統語法。 – Suncatcher

回答

2

我現在無法檢查,但我懷疑你有「INTO ...」和「UP TO ...」零件放置在「WHERE ...」和「ORDER BY ...」之後部分。 Documentation states是SELECT的語法是:

SELECT result 
INTO target 
FROM source 
[WHERE condition] 
[GROUP BY fields] 
[HAVING cond] 
[ORDER BY fields]. 

有句話「FROM子句...也可以在INTO子句之前。」沒有可以在SELECT/INTO/FROM之間插入WHERE/GROUP BY/HAVING/ORDER BY的註釋。

所以,給一個嘗試:

SELECT * 
    FROM scustom 
    INTO @wa_scustom 
    UP TO 3 ROWS 
    WHERE custtype = 'B' 
    ORDER BY discount DESCENDING. 
ENDSELECT. 
+0

正如我所說的,代碼片段來自ABAP 7.40官方SAP出版物。您的更正有效。我已經看到這個失敗的代碼在另一個7.40系統中工作。但這就是問題所在:哪些系統設置可能在哪裏,哪些是針對每個設備的精確有效語法? –

0

事實上,還有通過SAP強加的語法,只允許「UP TO N行」等論調來在WHERE子句之前。但是,在更新的ABAP服務器版本中,它具有更大的靈活性。

推廣時,請使用較舊的語法。由於SAP具有強大的向後兼容性策略,它仍然可以在更新的版本上運行。 「請保持你所發送的內容,在你接受的內容中保持自由」。

類似的東西:

SELECT {fields} 
    FROM {db table} 
    INTO {work area} 
    UP TO {n} ROWS 
    WHERE {field} {condition} {value} 
    ORDER BY {field} {ASCENDING/DESCENDING}. 
ENDSELECT. 

希望它能幫助。