天天看點

FOR ALL ENTRIES IN

一、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,(會自動的删除重複的行是以要是全部的KEY)或者說删除了重複的行,這是個非常緻命的問題,會導緻你的程式邏輯錯誤,而且很難以查找,解決的辦法就是要保證内表ig_bseg中取出的資料必須要有主鍵字段,在本例中,需要再添加buzei字段。

二、自建表和從系統外導入資料需要注意的問題

1、自建表中建立文本類型的字段(自己建立domain)時,需要注意是否允許字段可以保留文本的大小寫狀态,否則預設會全部轉換為大寫字母。

2、

對于各種憑證編碼字段,如:物料憑證mblnr,kunnr,lifnr,belnr,在導入資料到自建表中時,一定要注意前導0的補充問題,否則導入的

資料可能沒有前導0,補充前導0的函數為CONVERSION_EXIT_ALPHA_INPUT,另外,在建立自建表時,将該字段對應的domain的

Convers. routine:設定為ALPHA。

SELECT OBJECTID AS KUNNR                      

    FROM CDHDR                                  

    INTO TABLE TAB_KUNNR

   WHERE UDATE IN S_DATE                        

     AND OBJECTCLAS = CNS_DEBI.                

IF SY-SUBRC <> 0.

    RETURN.

  ENDIF.

  SORT TAB_KUNNR BY KUNNR ASCENDING.

  DELETE ADJACENT DUPLICATES FROM TAB_KUNNR.(有必要的有效率)

  SELECT KUNNR                                  

         VKBUR                                 

         KVGR3                                

         KVGR4                                 

    FROM KNVV                                   

    INTO TABLE TAB_KNVV

     FOR ALL ENTRIES IN TAB_KUNNR

   WHERE KUNNR = TAB_KUNNR-KUNNR                

     AND VKORG IN S_VKORG                   

     AND VTWEG IN S_VTWEG                      

     AND SPART IN S_SPART.                    "製品部門

LOOP AT TAB_KUNNR INTO L_REC_KUNNR.   

 READ TABLE TAB_KNVV INTO L_REC_KNVV

                        WITH KEY KUNNR = L_REC_KUNNR-KUNNR

                        BINARY SEARCH.

     IF SY-SUBRC <> 0.(有不成功的時候就是有header而沒有ITEMS.)

       G_FLG_ERR = CNS_FLG_ON.

       EXIT.

     ENDIF.

endloop

轉自:http://lianxiangpanjin.blog.sohu.com/130134197.html

繼續閱讀