[SAP ABAP開發技術總結]幾個小技巧


 

10.1.     READ TABLE...WITH KEY可使用OR條件或其他非“=”操作符

READ TABLE...WITH KEY... 后面不能接OR條件操作符,也不能使用其他非等於的比較操作符,因原是該語句即使在查詢出多條時也只取第一條,所以限制了 WITH KEY 后面條件使用。下面是錯誤的語法:

READ TABLE it_tab WITH KEY k1 = 'C' OR k2 = 'C'.

可以使用下面方式代替:

LOOP AT il_item_status WHERE k1 = 'C' OR k2 = 'C'.
 
...
 
EXIT.
ENDLOOP.

10.2.     SELECT SINGLE ... WHERE...無法排序問題

SELECT SINGLE ... WHERE ...

使用SINGLE是表示根據表的關鍵字來查詢,這樣才能確保只有一條數據,所以當使用SINGLE時,語法上不能再使用ORDER BY語句(因為沒有必要了),如果查詢時不是根據關鍵字來查詢,且查詢時先排序再取一條時,我們只能使用另一種語法:

SELECT * FROM  tj02t INTO CORRESPONDING FIELDS OF TABLE gt_result UP TO 1 ROWS  

WHERE SPRAS = 'E' ORDER BY ISTAT.

如果是取某個最大值或最小值,則可以使用聚合函數更簡潔:

 SELECT MIN( edatu ) INTO (g_tabcon_mps_wa-edatu)FROM vbep
     
WHERE vbeln = ztab_mps-vbeln AND posnr = ztab_mps-posnr
.

10.3.     當心Where后的條件內表為空時

SelectIfDelete 內表、readlook at內表語句中的Where條件中如果使用的Range是一個空的條件內表  xx IN range恆為真那么 xx NOT IN range則恆為假

注:不會像FOR ALL ENTRIES那樣忽略其他的條件表達式其他條件還是起作用

10.4.     快速查找SO所對應的交貨單DNPO

快速查找SOVBAP)所對應的DNLIPS):雖然可以通過vbap-vbeln = lips-vgbel AND vbap-posnr = lips-vgpos來關聯查找,但LIPS-VGBELLIPS-VGPOS非主鍵,查找起來非常慢(但根據DN來查找所的SO是很快的,因為此時為主鍵查找)但可以通過VBFA單據流表來查找DN,這樣會非常快,因為這是根據主鍵來查找的:

vbfa~vbelv = vbap-vbeln AND  vbfa~posnv = vbap-posnr AND vbfa~vbtyp_v ='C' AND vbfa~vbtyp_n = 'J'

另外,根據SO查找PO時,可以根據EKKN-VBELN= VBAP-VBELN AND EKKN-VBELP=VBAP-POSNRSOPO中間表EKKN里去找,但查找條件為非主鍵也非索引,所以找起來時很慢,可以通過VBFA單據流表進行查找,因為VBFAvbelnposnn 字段上創建了索引(雖然查詢時WHERE從句條件字段不是按主鍵字段順序——使用的是后半部分主鍵,所以用不到主鍵索引,但是是按非主鍵索引字段順序書寫,所以還是可以用到索引):vbfa~vbeln = vbap-vbeln AND  vbfa~posnn = vbap-posnr AND vbfa~vbtyp_v ='V' AND vbfa~vbtyp_n = 'C'

10.5.     X類型的C類型視圖

" <--> 6C5F
" <--> 6B63
*DATA: x(4) TYPE x VALUE '6C5F'.
DATA: x(2) TYPE x VALUE '6C5F'.
FIELD-SYMBOLS: <c> TYPE c.
"有時將X類型分配給C類型時會出錯長度需要是4的倍數所以定義成4的倍數
"即可解決這個問題但有時定義的長度只能是某個特定數所以此時只能使用后面這種方式
"編譯時報錯誤The length of "X" in bytes must be a multiple of the size of
"a Unicode character, regardless of the size of the Unicode character.
*ASSIGN x to <c> CASTING.

"只能先定義一個C類型變量,再將這個C類型變量分配給X類型字段符號,這樣就可
"以隨便在x類型之間搗騰了,但此時C變量不是X變量的真正視圖了(經過了拷貝)
DATA: c(1) .
FIELD-SYMBOLS: <x> TYPE x.
ASSIGN c to <x> CASTING.
<x>
= x.
" 6C5F注:如果輸出的是亂碼,則是字節序的問題,需寫成5F6C(如Windows操作系統中)
WRITE: /(2) c, <x>.
" 6B63注:如果輸出的是亂碼,則是字節序的問題,需寫成636B(如Windows操作系統中)
x = '6B63'.
<x>
= x.
WRITE: /(2) c, <x>.

10.6.     字符串連接:&& 替代 CONCATENATE 

有如將整型(I)與一個字符串(String)進行連接,此時不能直接使用CONCATENATE進行連接,因為CONCATENATE 操作的是字符類型,所以需要將整型轉換為字符型后才能使用CONCATENATE 進行連接,但這里需要注意的,當正整型變量轉換為字符類型時,符號位會轉換為空格,這時使用CONCATENATE 接連得到的字符串可能會多出一個空格;當將整型變量與字符串進行連接時,最好使用 && 操作符,除了直接能連接外,還不會出現多余空格的問題:

DATA: i TYPE i VALUE '10'.
DATA: str TYPE string VALUE 'string'.
DATA: tmp TYPE string.
str
=
i && str.
WRITE: / str.
tmp
= i
.
CONCATENATE tmp str INTO str.
WRITE: / str.

image091

10.7.     Variant變式中動態日期 

報表程序的選擇屏幕中,輸出條件后可以點擊保存按鈕,會彈出創建變式的屏幕,如果條件中有日期字段,日期字段可以隨着時間變化,日期字段的值也可以動態的變化,如對於每天都要跑的Job報表很有用,每天查詢當天。當然也可以通過報表程序的INIT事件里動態獲取當前日期,但可能需要修改程序

image092

image093

除用在中Job外,變式還可以用在Tcode


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM