一、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