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.

 

 

posted @ 2023-03-17 08:09  渔歌晚唱  阅读(61)  评论(0编辑  收藏  举报