對於不能join的表,使用for all entries in語句將該表與內表串聯。
SELECT bseg~kunnr
bseg~lifnr
bseg~belnr
INTO TABLE itab_bseg
FROM bseg
FOR ALL ENTRIES IN itab_main
WHERE bukrs in _bukrs
and ( belnr = itab_main-belnr
AND hkont = itab_main-hkont ).
由於BSEG不能和BSIS做inner join所以先將BSIS內容放到itab_main 中,然後用 FOR ALL ENTRIES IN來串聯。
1-WHERE子句中的bukrs in _bukrs是指bseg-bukrs存在於_bukrs這個select-options中,_bukrs不是itab_main的field所以這部分不包括在括號中.
當然會增加內存使用了。原本一個條件,數次(驅動表的紀錄條數)向對DB操作,
使用了FOR ALL ENTRIES後,
相當於把驅動表裏的條件字段的所有值用OR 連起來,
一次對DB操作,
條件語句增大,勢必使內存佔用增多。
1.SELECT CARRID
CONNID
PRICE
FROM SFLIGHT
INTO TABLE IT_PRICE
FOR ALL ENTRIES IN IT_SFLIGHT
WHERE CARRID = IT_SFLIGHT-CARRID
AND CONNID = IT_SFLIGHT-CONNID'.
在 WHERE 條件中,IT_SFLIGHT-CARRID和IT_SFLIGHT-CONNID這些列將用作佔位符。該 SELECT 語句的結果集是 SELECT 語句的所有結果集的聯合,這些結果集是用內部表 IT_SFLIGHT 中的相應值在每一行上替換佔位符的結果。實際上該WHERE子句的特殊變式就是下面WHERE基本語句的簡略寫法。
SELECT DISTINCT CARRID
CONNID
PRICE
FROM SFLIGHT
INTO TABLE IT_PRICE
WHERE ( CARRID = 'LH' AND
CONNID = '2415' ) OR
( CARRID = 'SQ' AND
CONNID = '0026' ) OR
( CARRID = 'LH' AND
CONNID = '0400' ) .
2.使用該語句,對於最後得出的結果集系統會自動刪除重復行。因此如果你要保留重複行記錄時,記得在SELECT語句中添加足夠鍵值項目(有必要時,增加全部鍵值項目),以保證結果集中所需重複項目不會被刪除。(例如選取支付金額時,支付事件可能不同,但金額可能相同,此時一定要注意,以避免錯誤刪除結果記錄。)
3.FOR ALL ENTRIES IN後面使用的內部表itab如果爲空,系統將視爲無條件選取,將當前CLIENT下所有記錄選出。因此爲避免無意義的全件檢索,在使用該語句前一定要判斷內部表itab是否爲空,爲空時不執行包含該語句的數據庫檢索處理。
4.由於itab-f實際上是作爲佔位符被替換,所以內部表itab中不要包含HEADER行(項目標識名稱行),以免造成混淆,檢索出錯。
5.內部表itab中作爲條件替換用項目的類型和長度,一定要和檢索數據庫中對應的項目相同,否則編譯不能通過。
6.對於內部表itab中作爲條件替換用項目,不能使用LIKE,BETWEEN,IN比較操作符。因爲這些比較操作符都是不確定比較操作符(將選擇條件設定在一個範圍內),而FOR ALL ENTRIES IN語句的作用相當於將選擇條件塊全部並列開來,用OR連接,如果每個OR分支中又是不確定的範圍,那麼系統性能將大大降低,因此R/3系統在使用該語句時禁止使用不確定比較操作符。
7.使用該語句時,ORDER BY語句和HAVING語句將不能使用。
8.使用該語句時,除COUNT( * )以外的所有合計函數(MAX,MIN,AVG,SUM)都不能使用。
//判斷內表是否爲空
使用語句: DESCRIBE TABLE ITAB LINES VARIABLE.判斷系統變量sy-subrc是否爲0,如果爲0就表示不空,反之爲空!
DESCRIBE TABLE ITAB LINES VARIABLE
IF NOT P_VARIANT IS INITIAL.
WX_VARIANT-VARIANT = P_VARIANT.