S4HANA For ABAP(2):ABAP Expression改变
1.8 ABAP Expression:Understanding The Move From Statements To Expressions
理解命令式语句和声明式语句差异;
示例代码:
"test2 "命令式与声明式语句 FORM f_test2. DATA:lv_val1 TYPE P LENGTH 10 DECIMALS 2. DATA:lv_val2 TYPE P LENGTH 10 DECIMALS 3. DATA:lv_cvar1 TYPE C LENGTH 20. lv_val1 = '10.2'. lv_val2 = '20.2'. lv_cvar1 = 'Test,String'. "命令式语句 ADD 1 TO lv_val1. "声明式语句 "lv_val1 = lv_val1 + 1. "运算比较表达式 IF lv_val1 + 30 > lv_val2 * 2. WRITE:/ 'true'. ENDIF. "嵌套表达式 lv_cvar1 = replace( val = lv_cvar1 sub = 'String' with = to_upper( 'Replaced' ) ). ENDFORM.
1.9 ABAP Expression:Processing Strings Using Expressions and Functions
7.02版本开始,可以通过'&&'符号进行字符串连接操作;
CONCATENATE只支持字符类型C, N, D, T, STRING的连接;
'&&'支持任意类型;
String模板改变:
新增String Function:
1.10 ABAP Expression:Using Inline Declarations
Inline数据对象定义;
示例代码:
"test3 "Using Inline Declarations FORM f_test3. DATA:lt_spfli TYPE TABLE OF spfli. DATA:ls_spfli LIKE LINE OF lt_spfli. SELECT * FROM spfli INTO TABLE lt_spfli. "使用前声明数据对象 LOOP AT lt_spfli INTO ls_spfli. WRITE:/ ls_spfli-carrid,ls_spfli-connid. ENDLOOP. "在使用时声明数据对象 LOOP AT lt_spfli INTO DATA(ls_spfli2). WRITE:/ ls_spfli-carrid,ls_spfli-connid. ENDLOOP. LOOP AT lt_spfli ASSIGNING FIELD-SYMBOL(<fs_spfli2>). WRITE:/ <fs_spfli2>-carrid,<fs_spfli2>-connid. ENDLOOP. "READ TABLE语句 READ TABLE lt_spfli INTO DATA(ls_spfli3) INDEX 1. READ TABLE lt_spfli ASSIGNING FIELD-SYMBOL(<fs_sfpli3>) INDEX 1. "声明后,后续也能使用 WRITE:/ ls_spfli2-carrid,ls_spfli2-connid. ENDFORM.
1.11 ABAP Expression:Creating Objects and Casting Using Expressions
使用NEW创建Objects;
嵌套使用NEW;
7.40版本,CAST类型转换;
7.50版本,IS INSTANCE OF判断一个数据对象是否是另一个类对象类型实例;
7.50版本,CASE TYPE OF,WHEN TYPE,判读数据对象的类对象类型;
1.12 ABAP Expression:Assigning Values Using Expressions
使用VALUE()实现初始化赋值;
示例代码:
"test4 "VALUE,EXACT等额外操作符 FORM f_test4. DATA:lt_spfli TYPE TABLE OF spfli. DATA:ls_spfli LIKE LINE OF lt_spfli. DATA:lt_rcarrid TYPE RANGE OF spfli-carrid. DATA:ls_rcarrid LIKE LINE OF lt_rcarrid. TYPES:BEGIN OF s_ty1, col1 TYPE C LENGTH 10, col2 TYPE I, col3 TYPE I, END OF s_ty1. DATA:lt_ty1 TYPE TABLE OF s_ty1. DATA:ls_ty1 LIKE LINE OF lt_ty1. SELECT * FROM spfli INTO TABLE lt_spfli. TRY. "inline declaration:go_alv cl_salv_table=>factory( IMPORTING r_salv_table = DATA(go_alv) CHANGING t_table = lt_spfli ). "使用VALUE() lt_rcarrid = VALUE #( ( sign = 'I' option = 'EQ' low = 'AA' ) ( sign = 'I' option = 'EQ' low = 'AB' ) ). lt_ty1 = VALUE #( col1 = 'TEST' ( col2 = 10 col3 = 20 ) ( col2 = 22 col3 = 33 ) ). cl_salv_table=>factory( IMPORTING r_salv_table = DATA(go_alv1) CHANGING t_table = lt_rcarrid ). "这种方式不支持CHANGING参数,只支持IMPORTING * cl_salv_table=>factory( IMPORTING r_salv_table = DATA(go_alv2) * CHANGING t_table = VALUE #( * ( sign = 'I' option = 'EQ' low = 'AA' ) * ( sign = 'I' option = 'EQ' low = 'AB' ) ) ). "使用EXACT() DATA:lv_num TYPE N LENGTH 4. DATA:lv_char TYPE C LENGTH 4. lv_char = 'AB12'. lv_num = lv_char. "lv_num = 0012,AB loss WRITE:/ lv_num. TRY. lv_num = EXACT #( lv_char ). CATCH cx_sy_conversion_no_number INTO DATA(lo_conversion_exception). "模板输出 WRITE:/ |{ lo_conversion_exception->get_text( ) }|. ENDTRY. "使用CORRESPONDING() TYPES:BEGIN OF s_spfli, carrid TYPE spfli-carrid, connid TYPE spfli-connid, test TYPE C LENGTH 10, END OF s_spfli. DATA:lt_spfli2 TYPE TABLE OF s_spfli. DATA:ls_spfli2 LIKE LINE OF lt_spfli2. lt_spfli2 = CORRESPONDING #( lt_spfli ). LOOP AT lt_spfli2 INTO ls_spfli2. WRITE:/ ls_spfli2-carrid,ls_spfli2-connid. ENDLOOP. DATA:lv_val1 TYPE string. DATA:lv_val2 TYPE string. lv_val1 = 'TEST'. "使用COND(),if else lv_val2 = COND #( WHEN lv_val1 = 'TEST' THEN 'test value' WHEN lv_val1 = 'TEXT' THEN 'text value' ELSE 'other value' ). "使用SWITCH(),case when lv_val2 = SWITCH #( lv_val1 WHEN 'TEST' THEN 'test value' WHEN 'TEXT' THEN 'text value' ELSE 'other value' ). CATCH cx_salv_msg INTO DATA(lo_exception). "模板输出 WRITE:/ |{ lo_exception->get_text( ) }|. ENDTRY. ENDFORM.
使用REF(),获取数据对象指针;
使用CONV(),进行数据类型转换;
使用EXACT,进行没有精度损失的赋值;
使用CORRESPONDING(),实现MOVE-CORRESPONDING赋值;
使用COND(),实现条件表达式,类似IF ELSE效果;
使用SWITCH(),实现条件表达式,CASE WHEN效果;
1.13 ABAP Expression:Using Enumerations
定义枚举类型;
当赋值不在枚举类型可用值时会报错;
示例代码:
"test5 "枚举类型 FORM f_test5. TYPES:BEGIN OF ENUM enum1, apple, orange, banana, END OF ENUM enum1. DATA:lv_fruit TYPE enum1. lv_fruit = apple. "编译报错 "lv_fruit = 'test'. IF lv_fruit = apple. WRITE:/ 'true'. ENDIF. ENDFORM.
本文来自博客园,作者:渔歌晚唱,转载请注明原文链接:https://www.cnblogs.com/tangToms/p/17151876.html