ABAP 7.4 及更高版本 [4]:构造运算符

2021-11-07 16:01发布


          点击此处--->   EasySAP.com 群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)

在这篇文章中,您将了解以下构造运算符。


·       NEW

·       VALUE

·       CORRESPONDING

·       FILTER

·       COND

·       SWITCH

·       CONV

·       REF

·       REDUCE

·       EXACT



NEW – 创建一个类的实例

此运算符用于创建类的实例。

"Old way

DATA: lo_abap TYPE REF TO lcl_abap.

CREATE OBJECT lo_abap

 

"New way

DATA(lo_abap) = NEW lcl_abap( ).


当类具有带参数的构造函数时,我们可以在括号 ( ) 内传递参数。

VALUE –构造变量、内部表和工作区

VALUE 是 ABAP 7.40 中最有用的 ABAP 关键字之一。使用此关键字,您可以创建所有类型的数据,如下例所示。

"Character string variable

DATA(lv_string) = VALUE #( 'This is a sample string' ).

 

"Structure

DATA(ls_user)   = VALUE #( user_id   = 'U_JAGD'

                           user_name = 'Jagdish P' ).


在关键字 VALUE 之后使用的 # 以及内联数据声明。这意味着,变量或字段的 TYPE 将被隐式确定。如果要使用特定类型,请使用该类型代替 #。

"Variable with explicit type

DATA(lv_user_name) = VALUE username( 'Jagdish P' ).

 

"Internal table

DATA(lt_itab) = VALUE #(

                  ( user_id = 'U_PATJAG' user_name = 'Jagdish P' )

                  ( user_id = 'U_DOEJOH' user_name = 'John Doe' )

                  ( user_id = 'U_DOEJAN' user_name = 'Jane Doe' )

                ).

 

"Nested structure

DATA(john_mayer) = VALUE customer(

                     name    = 'John Doe'

                     address = VALUE #(

                                 house_number = '001'

                                 street       = 'Unique Road Name'

                                 city         = 'Some New City'

                                 zip_code     = '124421'

                               )

                     date_of_birth = '19750101'

                   ).

 

"Range

DATA lt_range TYPE RANGE OF land1.

lt_range = VALUE #(

             sign = 'I' option = 'EQ'

             (  low = 'IN' )

             (  low = 'US' )

             (  low = 'UK' )    

             (  low = 'FR' )

           ).

I在RANGE构造中,因为sign = 'I' option = 'EQ'对于所有条目都是通用的,因此它们仅在内部 ( ) 之外的顶部指定一次。

CORRESPONDING – Move between structures and tables.

使用此语句,我们可以将内容从一个表移动到另一个表类型不完全相同的表。这也可以用于结构。

"structure

lv_new_structure = CORRESPONDING #( lv_base_structure ).

 

"table

lt_new_tab = CORRESPONDING #( lt_base_tab ).

 

"with mapping of fields with different field name and skip some fields

lv_new_structure = CORRESPONDING #( lv_base_structure MAPPING b4 = a1

                                                      EXCEPT  a2 ).

"Handling duplicates

lt_new_tab = CORRESPONDING #( lt_base_tab DISCARDING DUPLICATES ).

FILTER – Moves rows from one table to another based on the filter condition

您可以移动与 where 条件匹配的行或使用 EXCEPT 并移动与 where 条件不匹配的行。

DATA messages TYPE SORTED TABLE OF t100 WITH NON-UNIQUE KEY sprsl.

SELECT * FROM t100

  WHERE arbgb = 'SABAPDEMOS'

  ORDER BY msgnr

  INTO TABLE @messages.

 

"Get all messages in English

DATA(messages_en) = FILTER #( messages WHERE sprsl = 'E' ).

 

"Get all messages where language is other than English

DATA(messages_non_en) = FILTER #( messages EXCEPT WHERE sprsl = 'E' ).

COND  and SWITCH – Conditional Operators

条件运算符将评估在WHEN之后指定的条件并分配在THEN之后指定的值当所有提到的条件都为假时,则分配ELSE之后指定的值

"COND

DATA(lv_result) = COND #( WHEN sy-msgty = 'S' THEN 'Success'

                          WHEN sy-msgty = 'W' THEN 'Warning'

                          WHEN sy-msgty = 'I' THEN 'Information'

                          WHEN sy-msgty = 'A' THEN 'Abort'

                          ELSE 'Undefined' ).

SWITCH 类似于 COND,但它使用单个变量,其工作方式类似于传统 ABAP 中的 CASE 语句。

"SWITCH

DATA(lv_result) = SWITCH #( WHEN 'S' THEN 'Success'

                            WHEN 'W' THEN 'Warning'

                            WHEN 'I' THEN 'Information'

                            WHEN 'A' THEN 'Abort'

                            ELSE 'Undefined' ).

COND# 会让你写出比 SWTICH 更复杂的条件,但是当你只有一个变量时,SWITCH 更早写和理解。

CONV – Type conversion

CONV 消除了在将数据传递给方法参数或将值从一种类型的字段更改和移动到另一种类型的字段时使用辅助变量的需要。

"Old way

DATA : text   TYPE c LENGTH 255,

       helper TYPE string,

       xstr   TYPE xstring.

 

helper = text   .   "Move to helper variable

xstr   = cl_abap_codepage=>convert_to( source = helper ).

 

"New way

DATA : text TYPE c LENGTH 255.

DATA(xstr) = cl_abap_codepage=>convert_to( source = CONV #( text ) ).

REF – Reference Operator

这用于获取数据的引用。

"Old way

TYPES: tt_flights TYPE STANDARD TABLE OF sflight WITH EMPTY KEY.

DATA : it_flights TYPE tt_flights,

       dref       TYPE REF TO tt_flights.

 

SELECT * FROM sflight INTO TABLE it_flights.

GET REFERENCE OF it_flights INTO dref.

 

"New way

SELECT * FROM sflight INTO TABLE @DATA(it_flights).

DATA(dref) = REF #( it_flights ).

REDCUE – Reduction Operator

Reduce 使用一次或多次迭代(循环)创建指定类型的结果。简单的例子是对从 1 到 100 的数字求和。

"With implicit data type

DATA(lv_sum) = REDUCE #( INIT s = 0

                         FOR  i = 1 UNTIL i > 100

                         NEXT s = s + i ).

 

"With specified data type

DATA(lv_sum) = REDUCE i( INIT s = 0

                         FOR  i = 1 UNTIL i > 100

                         NEXT s = s + i ).

EXACT – Lossless Operator

Exact 可用于将变量或表达式分配给结果变量。这里使用的变量类型通常是不同的。当无法完成无损分配,即无法转换数据时,会触发异常。例如 -

"Conversion error

TYPES numtext TYPE n LENGTH 255.

 

TRY.

    DATA(number) = EXACT numtext( '4 Apples + 2 Oranges' ).

  CATCH cx_sy_conversion_error INTO DATA(exc).

 

    Message 'Exception cx_sy_conversion_error is triggered' Type 'E'

ENDTRY.

 

"rounding loss

TRY.

    DATA(exact_result) = EXACT #( 3 * ( 1 / 3 ) ).

  CATCH cx_sy_conversion_rounding INTO DATA(lo_exc).

    DATA(rounded_result) = lo_exc->value.

ENDTRY.


现在,您应该能够使用这些构造函数运算符更快更好地编写代码。


赞赏支持