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后的條件內表為空時
在Select、If、Delete 內表、read、look at內表語句中的Where條件中,如果使用的Range是一個空的條件內表,則 xx IN range恆為真,那么 xx NOT IN range則恆為假。
注:不會像FOR ALL ENTRIES那樣,忽略其他的條件表達式,其他條件還是起作用
10.4. 快速查找SO所對應的交貨單DN及PO
快速查找SO(VBAP)所對應的DN(LIPS):雖然可以通過vbap-vbeln = lips-vgbel AND vbap-posnr = lips-vgpos來關聯查找,但LIPS-VGBEL、LIPS-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-POSNR到SO與PO中間表EKKN里去找,但查找條件為非主鍵也非索引,所以找起來時很慢,可以通過VBFA單據流表進行查找,因為VBFA在vbeln、posnn 字段上創建了索引(雖然查詢時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.
10.7. Variant變式中動態日期
報表程序的選擇屏幕中,輸出條件后可以點擊保存按鈕,會彈出創建變式的屏幕,如果條件中有日期字段,日期字段可以隨着時間變化,日期字段的值也可以動態的變化,如對於每天都要跑的Job報表很有用,每天查詢當天。當然也可以通過報表程序的INIT事件里動態獲取當前日期,但可能需要修改程序
除用在中Job外,變式還可以用在Tcode中


