点击此处---> 群内免费提供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.
现在,您应该能够使用这些构造函数运算符更快更好地编写代码。