For all entries使用中注意的問題

來源:互聯網
上載者:User
對於不能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.

-------------------------------------------------------------------------

 

一、Select語句中使用FOR ALL ENTRIES IN需要注意的問題
在ABAP編程中,使用for all entries in 是必不可少的語句,相信大家都使用過,例如:

data: begin of ig_bseg occurs 0,
          werks like bseg-werks,
          belnr  like bseg-belnr,
          gjahr  like bseg-gjahr,
          dmbtr like bseg-dmbtr,
        end of ig_mseg.
if not ig_bkpf[] is initial.
  select werks belnr gjahr dmbtr into corresponding fields of table ig_bseg
  from bseg for all entries in ig_bkpf
  where werks = ig_bkpf-werks and belnr = ig_bkpf-belnr and  gjahr = ig_bkpf-gjahr.
endif.

需要注意以下問題
1、首先,必須要判斷For all entries in後面的內表是否為空白,如果它為空白的話,那麼在where條件中的與內表中欄位進行比較的結果全部為真,也就是全部滿足條件,這會導致取出非常多的資料,極大地影響系統的效能。
2、對於上例,按照邏輯分析可以取出某個憑證的所有行項目,但是實際情況會與你預期的不一致,如果某個憑證的多個行項目的dmbtr值是完全一樣的,那麼在內表ig_bseg中你只會得到一行記錄,而不是多行,它自動使用了distinct,或者說刪除了重複的行,這是個非常致命的問題,會導致你的程式邏輯錯誤,而且很難以尋找,解決的辦法就是要保證內表ig_bseg中取出的資料必須要有主鍵欄位,在本例中,需要再添加buzei欄位。

二、自建表和從系統外匯入資料需要注意的問題
1、自建表中建立文本類型的欄位(自己建立domain)時,需要注意是否允許欄位可以保留文本的大小寫狀態,否則預設會全部轉換為大寫字母。
2、對於各種憑證編碼欄位,如:物料憑證mblnr,kunnr,lifnr,belnr,在匯入資料到自建表中時,一定要注意前置0的補充問題,否則匯入的資料可能沒有前置0,補充前置0的函數為CONVERSION_EXIT_ALPHA_INPUT,另外,在建立自建表時,將該欄位對應的domain的Convers. routine:設定為ALPHA。

 

補充,就是覺得這個用於資料少的內表合適,雖然是說一下子從資料庫裡拿資料,串連資料庫次數少了,可是對資料庫造成的負擔較大。

 ----------------------------------------------------

 

Duplicates are discarded from the result set. If the internal table itab does not contain any entries, the system treats the statement as though there were no WHERE cond condition, and selects all records.

上面SAP協助中對FOR ALL ENTRIES的說明,我沒有注意第一條說明,結果寫程式時出現了莫名其妙的錯誤,算出來的結果有時候少,有時候正確,找了好久也不知道原因。 吸取教訓,以後使用FOR ALL ENTRIES的時候,取出的欄位一定要包括表的主鍵,這樣就沒有問題了。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.