ABAP新语法
1.New Keyword in ABAPDATA新语法允许在语句内部动态声明变量该作用域与普通定义的变量范围一致ABAP、ICON 这些类型池语句不再需要通过TYPE-POOL声明DATA(lv_true_false) abap_false. DATA(lv_icon) icon_material.通过赋值的方式来动态声明变量系统会根据所赋的值来确定变量类型虽然可以用但是不建议使用因为到后面你自己都会忘记是什么类型其中字符类型会参照数据长度来指定其中此方法不通用无法通过赋值动态声明浮点数DATA(lv_char) This is a sentence. DATA(lv_integer) 15.动态声明内表/结构字段类型与SELECT LIST对应的字段一致在包含常量字段时需要赋别名以指定内表/结构中的字段名常用SELECT matnr, maktx FROM makt INTO TABLE DATA(lt_data). SELECT SINGLE matnr, Constant AS field FROM makt INTO DATA(lwa_data).在LOOP内表时动态声明结构可以避免使用带表头的内表常用LOOP AT gt_data INTO DATA(lwa_data). ... ENDLOOP.在常见的操作语句中动态声明变量多数情况下可以在 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).在调用方法时动态声明变量来接收传出参数可以避免因类型不一致而导致的dump。go_splitter_row-get_container( EXPORTING row 1 column 1 RECEIVING container DATA(go_cont) ).注释Data动态声明的内表无法接受crossponding传递的数据。动态声明不是万能的谨慎使用。使用最好加注释备注声明的结构FIELD-SYMBOL与DATA关键字类似FIELD-SYMBOL允许在语句内部动态声明字段符号在 LOOP 时动态声明字段符号需要区分的是普通定义使用的是 FIELD-SYMBOLSLOOP AT gt_data ASSIGNING (fs_data). ... ENDLOOP.在 ASSIGN 时动态声明字段符号并分配ASSIGN (lv_fieldname) TO FIELD-SYMBOL(fs_field).NEW使用 NEW 创建实例化引用对象用来代替CREATE OBJECT使用 NEW 关键字时如果等号左侧的对象还没有确定类型则必须在 NEW 关键字后指定类型如 GO_GRID_NEW如果是已经预定义的对象则可以用 # 代替如 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时不需要提前声明变量也不用指定类型类型默认会与被指向的变量保持一致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定义引用变量则引用变量无法通过工作区-字段访问只能通过引用变量—字段访问。下段注释为错误写法WRITE:/ LV_REF-MATNR,LV_REF-MTART,LV_REF-MATKL,LV_REF-TEXT1.测试结果VALUE新语法中可以使用 VALUE 作为赋值语句主要用来为内表、结构、变量等对象赋值参数类型引用同NEW关键字在VALUE子句中字段可以分开赋值也可以使用结构整体赋值为内表赋值时需要用小括号将一行的数据包在一起例注意value会默认覆盖原来的数据。经过测试觉得覆盖一词并不准确可以认为是重新赋值。原来有的不同的数据会被删除。参考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 )“预定义的数据类型可以用#代替 ( matnr MATERIAL-002 mtart FOOD matkl 1020 text1 SECOND material ) ).此外VALUE语句作为结构时可以直接在特定语句中使用APPEND VALUE #( value TEST ) TO lt_data. MODIFY lt_data FROM VALUE #( checkbox X ) TRANSPORTING checkbox WHERE checkbox IS INITIAL.BASE在使用 VALUE 作为赋值语句时默认会覆盖原有的数据通过BASE子句基于原有数据进行赋值在结构赋值语句中使用 BASE 时原有字段的数据会被保留但是当在VALUE语句中对同一字段再次赋值时该字段数据会被覆盖DATA(lwa_data) VALUE gty_data( matnr MATERIAL-001 mtart FOOD ). lwa_data VALUE #( BASE lwa_data mtart WATR matkl 1020 text1 FIRST material ).在内表赋值语句中使用 BASE 时内表原有的数据会被保留新增条目会被追加到内表中效果同 Append Linelt_data VALUE #( ( lwa_data ) ). lt_data VALUE #( BASE lt_data ( matnr MATERIAL-002 mtart FOOD matkl 1030 text1 SECOND material ) ).注意使用 BASE语句时尽量保持前后结构一致在使用不同的结构时可能不报错但数据会错位FOR在内表赋值语句中可以使用FOR语句从其他内表中批量引入数据并处理注意建议理清楚逻辑再尝试使用for语句。其实就是表的loop遍历对每一层loop的工作区进行修改然后传值。重点是where后面的条件语句。使用FOR语句时需要为内表定义临时工作区如LWA_DATA仅允许在当前语句中使用赋值过程中会使用到该工作区但在WHERE条件里只能直接使用内表的字段名需要注意的是WHERE后面接的条件语句必须使用小括号包起来INDEX INTO 定义的临时变量可用来记录当前操作行的序列作用与LOOP语句中的系统变量 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语句中允许将结构作为整体直接进行赋值但是结构必须与表行兼容可以用于从内表中获取特定条件的数据DATA(lt_for) VALUElty_table(FORlwa_dataINlt_dataWHERE(mtartWATR)(lwa_data) ).如果结构与表行不兼容可以嵌套使用CORRESPONDING语句进行赋值如下例 CORRESPONDING具体用法可参考后续示例 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) ) ).结构字段过多时一般建议使用整体赋值如果少部分字段存在特殊的赋值逻辑可嵌套使用VALUE以及BASE语句进行处理将例1的逻辑转换如下DATA(lt_for) VALUElty_table(FORlwa_dataINlt_dataINDEX INTOlv_indexWHERE(mtartWATR)(VALUE#(BASElwa_datamatklCONV#(lv_index)) ) ).LET使用 LET 引入短生命周期变量可以用来简化部分冗余代码LET关键字可以使用在VALUESWITCHCOND等语句中与 FOR 语句类似LET 语句中定义的临时变量同样只能在当前语句中使用在其他语句中使用时会检查出语法错误lwa_lineVALUE#(LETlwa_dataVALUE#(lt_data[ matnrMATERIAL-001]OPTIONAL)lv_stringDate:sy-datumINmatnrlwa_data-matnrmtartlwa_data-mtartmatkllwa_data-matkltext1lv_string).剩下的慢慢更新。。。