
1.New Keyword in ABAPDATA新語法允許在語句內(nèi)部動(dòng)態(tài)聲明變量該作用域與普通定義的變量范圍一致ABAP、ICON 這些類型池語句不再需要通過TYPE-POOL聲明DATA(lv_true_false) abap_false. DATA(lv_icon) icon_material.通過賦值的方式來動(dòng)態(tài)聲明變量系統(tǒng)會(huì)根據(jù)所賦的值來確定變量類型雖然可以用但是不建議使用因?yàn)榈胶竺婺阕约憾紩?huì)忘記是什么類型其中字符類型會(huì)參照數(shù)據(jù)長度來指定其中此方法不通用無法通過賦值動(dòng)態(tài)聲明浮點(diǎn)數(shù)DATA(lv_char) This is a sentence. DATA(lv_integer) 15.動(dòng)態(tài)聲明內(nèi)表/結(jié)構(gòu)字段類型與SELECT LIST對應(yīng)的字段一致在包含常量字段時(shí)需要賦別名以指定內(nèi)表/結(jié)構(gòu)中的字段名常用SELECT matnr, maktx FROM makt INTO TABLE DATA(lt_data). SELECT SINGLE matnr, Constant AS field FROM makt INTO DATA(lwa_data).在LOOP內(nèi)表時(shí)動(dòng)態(tài)聲明結(jié)構(gòu)可以避免使用帶表頭的內(nèi)表常用LOOP AT gt_data INTO DATA(lwa_data). ... ENDLOOP.在常見的操作語句中動(dòng)態(tài)聲明變量多數(shù)情況下可以在 INTO 語句后使用如下為連接/拆分字符串示例CONCATENATE Text - 01 INTO DATA(lv_concat). SPLIT lv_concat AT - INTO DATA(lv_part1) DATA(lv_part2). SPLIT lv_concat AT - INTO TABLE DATA(lt_data).在調(diào)用方法時(shí)動(dòng)態(tài)聲明變量來接收傳出參數(shù)可以避免因類型不一致而導(dǎo)致的dump。go_splitter_row-get_container( EXPORTING row 1 column 1 RECEIVING container DATA(go_cont) ).注釋Data動(dòng)態(tài)聲明的內(nèi)表無法接受crossponding傳遞的數(shù)據(jù)。動(dòng)態(tài)聲明不是萬能的謹(jǐn)慎使用。使用最好加注釋備注聲明的結(jié)構(gòu)FIELD-SYMBOL與DATA關(guān)鍵字類似FIELD-SYMBOL允許在語句內(nèi)部動(dòng)態(tài)聲明字段符號在 LOOP 時(shí)動(dòng)態(tài)聲明字段符號需要區(qū)分的是普通定義使用的是 FIELD-SYMBOLSLOOP AT gt_data ASSIGNING (fs_data). ... ENDLOOP.在 ASSIGN 時(shí)動(dòng)態(tài)聲明字段符號并分配ASSIGN (lv_fieldname) TO FIELD-SYMBOL(fs_field).NEW使用 NEW 創(chuàng)建實(shí)例化引用對象用來代替CREATE OBJECT使用 NEW 關(guān)鍵字時(shí)如果等號左側(cè)的對象還沒有確定類型則必須在 NEW 關(guān)鍵字后指定類型如 GO_GRID_NEW如果是已經(jīng)預(yù)定義的對象則可以用 # 代替如 GO_GRID例注釋測試未成功。i_parent 是類方法go_con不知道如何定義。 DATA(go_grid_new) NEW cl_gui_alv_grid( i_parent go_con ). DATA: go_grid TYPE REF TO cl_gui_alv_grid. go_grid NEW #( i_parent go_con ).REF使用 REF 定義引用變量用來代替 CREATE DATA在使用 REF時(shí)不需要提前聲明變量也不用指定類型類型默認(rèn)會(huì)與被指向的變量保持一致TYPES:BEGIN OF lty_data, matnr TYPE mara-matnr, mtart TYPE mara-mtart, matkl TYPE mara-matkl, text1 TYPE char50, END OF lty_data. DATA(lwa_data) VALUE lty_data( matnr MATERIAL-001 mtart FOOD matkl 1010 text1 FIRST ). DATA(lv_ref) REF #( lwa_data ). lv_ref-* VALUE #( matnr MATERIAL-002 mtart WATR matkl 1020’ ). lv_ref-text1 SECOND.注釋注意使用了REF定義引用變量則引用變量無法通過工作區(qū)-字段訪問只能通過引用變量—字段訪問。下段注釋為錯(cuò)誤寫法WRITE:/ LV_REF-MATNR,LV_REF-MTART,LV_REF-MATKL,LV_REF-TEXT1.測試結(jié)果VALUE新語法中可以使用 VALUE 作為賦值語句主要用來為內(nèi)表、結(jié)構(gòu)、變量等對象賦值參數(shù)類型引用同NEW關(guān)鍵字在VALUE子句中字段可以分開賦值也可以使用結(jié)構(gòu)整體賦值為內(nèi)表賦值時(shí)需要用小括號將一行的數(shù)據(jù)包在一起例注意value會(huì)默認(rèn)覆蓋原來的數(shù)據(jù)。經(jīng)過測試覺得覆蓋一詞并不準(zhǔn)確可以認(rèn)為是重新賦值。原來有的不同的數(shù)據(jù)會(huì)被刪除。參考TYPES:BEGIN OF lty_data, matnr TYPE mara-matnr, mtart TYPE mara-mtart, matkl TYPE mara-matkl, text1 TYPE char50, END OF lty_data. DATA: lt_data TYPE TABLE OF lty_data. DATA(lwa_data) VALUE lty_data( matnr mtart FOOD matkl 1020 text1 FIRST material ). lt_data VALUE #( ( lwa_data )“預(yù)定義的數(shù)據(jù)類型可以用#代替 ( matnr MATERIAL-002 mtart FOOD matkl 1020 text1 SECOND material ) ).此外VALUE語句作為結(jié)構(gòu)時(shí)可以直接在特定語句中使用APPEND VALUE #( value TEST ) TO lt_data. MODIFY lt_data FROM VALUE #( checkbox X ) TRANSPORTING checkbox WHERE checkbox IS INITIAL.BASE在使用 VALUE 作為賦值語句時(shí)默認(rèn)會(huì)覆蓋原有的數(shù)據(jù)通過BASE子句基于原有數(shù)據(jù)進(jìn)行賦值在結(jié)構(gòu)賦值語句中使用 BASE 時(shí)原有字段的數(shù)據(jù)會(huì)被保留但是當(dāng)在VALUE語句中對同一字段再次賦值時(shí)該字段數(shù)據(jù)會(huì)被覆蓋DATA(lwa_data) VALUE gty_data( matnr MATERIAL-001 mtart FOOD ). lwa_data VALUE #( BASE lwa_data mtart WATR matkl 1020 text1 FIRST material ).在內(nèi)表賦值語句中使用 BASE 時(shí)內(nèi)表原有的數(shù)據(jù)會(huì)被保留新增條目會(huì)被追加到內(nèi)表中效果同 Append Linelt_data VALUE #( ( lwa_data ) ). lt_data VALUE #( BASE lt_data ( matnr MATERIAL-002 mtart FOOD matkl 1030 text1 SECOND material ) ).注意使用 BASE語句時(shí)盡量保持前后結(jié)構(gòu)一致在使用不同的結(jié)構(gòu)時(shí)可能不報(bào)錯(cuò)但數(shù)據(jù)會(huì)錯(cuò)位FOR在內(nèi)表賦值語句中可以使用FOR語句從其他內(nèi)表中批量引入數(shù)據(jù)并處理注意建議理清楚邏輯再嘗試使用for語句。其實(shí)就是表的loop遍歷對每一層loop的工作區(qū)進(jìn)行修改然后傳值。重點(diǎn)是where后面的條件語句。使用FOR語句時(shí)需要為內(nèi)表定義臨時(shí)工作區(qū)如LWA_DATA僅允許在當(dāng)前語句中使用賦值過程中會(huì)使用到該工作區(qū)但在WHERE條件里只能直接使用內(nèi)表的字段名需要注意的是WHERE后面接的條件語句必須使用小括號包起來INDEX INTO 定義的臨時(shí)變量可用來記錄當(dāng)前操作行的序列作用與LOOP語句中的系統(tǒng)變量 SY-TABIX 類似TYPES:lty_tableTYPE TABLE OFlty_dataWITH DEFAULT KEY.lt_dataVALUE#( (matnrMATERIAL-001mtartWATRmatkl1020text1FIRST material)(matnrMATERIAL-002mtartFOODmatkl1030text1SECOND material)(matnrMATERIAL-003mtartWATRmatkl1040text1THIRD material) ).DATA(lt_for) VALUElty_table(FORlwa_dataINlt_dataINDEX INTOlv_indexWHERE(mtartWATR)(matnrlwa_data-matnrmtartlwa_data-mtartmatklCONV#(lv_index)text1lwa_data-text1)).在FOR語句中允許將結(jié)構(gòu)作為整體直接進(jìn)行賦值但是結(jié)構(gòu)必須與表行兼容可以用于從內(nèi)表中獲取特定條件的數(shù)據(jù)DATA(lt_for) VALUElty_table(FORlwa_dataINlt_dataWHERE(mtartWATR)(lwa_data) ).如果結(jié)構(gòu)與表行不兼容可以嵌套使用CORRESPONDING語句進(jìn)行賦值如下例 CORRESPONDING具體用法可參考后續(xù)示例 TYPES:BEGIN OFlty_data_new,matnrTYPEmara-matnr,matklTYPEmara-matkl,END OFlty_data_new.TYPES:lty_table_newTYPE TABLE OFlty_data_newWITH DEFAULT KEY.DATA(lt_for) VALUElty_table_new(FORlwa_dataINlt_dataWHERE(mtartWATR)(CORRESPONDING#(lwa_data) ) ).結(jié)構(gòu)字段過多時(shí)一般建議使用整體賦值如果少部分字段存在特殊的賦值邏輯可嵌套使用VALUE以及BASE語句進(jìn)行處理將例1的邏輯轉(zhuǎn)換如下DATA(lt_for) VALUElty_table(FORlwa_dataINlt_dataINDEX INTOlv_indexWHERE(mtartWATR)(VALUE#(BASElwa_datamatklCONV#(lv_index)) ) ).LET使用 LET 引入短生命周期變量可以用來簡化部分冗余代碼LET關(guān)鍵字可以使用在VALUESWITCHCOND等語句中與 FOR 語句類似LET 語句中定義的臨時(shí)變量同樣只能在當(dāng)前語句中使用在其他語句中使用時(shí)會(huì)檢查出語法錯(cuò)誤lwa_lineVALUE#(LETlwa_dataVALUE#(lt_data[ matnrMATERIAL-001]OPTIONAL)lv_stringDate:sy-datumINmatnrlwa_data-matnrmtartlwa_data-mtartmatkllwa_data-matkltext1lv_string).剩下的慢慢更新。。。