Update content

This commit is contained in:
danrega
2023-04-03 17:05:10 +02:00
parent afd8609247
commit 0885bff717

View File

@@ -12,28 +12,28 @@
* - Open the class with the ABAP Development Tools (ADT). * - Open the class with the ABAP Development Tools (ADT).
* - Choose F9 to run the class. * - Choose F9 to run the class.
* - Check the console output. * - Check the console output.
* - To understand the context and the ABAP syntax used, check the notes * - To understand the context and the ABAP syntax used, refer to the
* included in the class as comments or refer to the respective topic * notes included in the class as comments or refer to the respective
* in the ABAP Keyword Documentation. * topic in the ABAP Keyword Documentation.
* - Due to the amount of output in the console, the examples include * - Due to the amount of console output, the examples contain numbers
* numbers (e. g. 1) ..., 2) ..., 3) ...) for the individual example * (e.g. 1) ..., 2) ..., 3) ...) for the individual example sections.
* sections. Plus, the variable name is displayed in most cases. Hence, * Also, the variable name is displayed in most cases. So to find
* to easier and faster find the relevant output in the console, just * the relevant output in the console easier and faster, just search
* search in the console for the number/variable name (CTRL+F in the * for the number/variable name in the console (CTRL+F in the console)
* console) or use the debugger. * or use the debugger.
* *
* ----------------------------- NOTE ----------------------------------- * ----------------------------- NOTE -----------------------------------
* The code presented in this class is only meant for supporting the ABAP * The code presented in this class is intended only to support the ABAP
* cheat sheets. It is not intended for direct use in a * cheat sheets. It is not intended for direct use in a production system
* production system environment. The code examples in the ABAP cheat * environment. The code examples in the ABAP cheat sheets are primarily
* sheets are primarily intended to provide a better explanation and * intended to provide a better explanation and visualization of the
* visualization of the syntax and semantics of ABAP statements and not to * syntax and semantics of ABAP statements, not to solve concrete
* solve concrete programming tasks. For production application programs, * programming tasks. For production application programs, you should
* a dedicated solution should therefore always be worked out for each * always work out your own solution for each individual case. There is
* individual case. There is no guarantee for either the correctness or * no guarantee for the correctness or completeness of the code.
* the completeness of the code. In addition, there is no legal * Furthermore, there is no legal responsibility or liability for any
* responsibility or liability for possible errors or their consequences * errors or their consequences that may occur when using the the example
* which occur through the use of the example code. * code.
* *
*********************************************************************** ***********************************************************************
"! <p class="shorttext synchronized">ABAP cheat sheet: Constructor expressions</p> "! <p class="shorttext synchronized">ABAP cheat sheet: Constructor expressions</p>
@@ -105,78 +105,21 @@ protected section.
ENDCLASS. ENDCLASS.
CLASS ZCL_DEMO_ABAP_CONSTRUCTOR_EXPR IMPLEMENTATION. CLASS ZCL_DEMO_ABAP_CONSTRUCTOR_EXPR IMPLEMENTATION.
METHOD fill_deep_structures.
"Clearing all contents of struc2
CLEAR struc2.
"Filling nested tables in deep structures
struc2-struc_nested = VALUE #( comp1 = `aaa`
comp2 = `bbb`
comp3 = `ccc`).
struc1-itab = VALUE #(
( col1 = 111 col2 = 222 )
( col1 = 333 col2 = 444
) ).
struc2-itab = VALUE #(
( col2 = 1 col3 = 2 col4 = 3 )
( col2 = 4 col3 = 5 col4 = 6 )
( col2 = 7 col3 = 8 col4 = 9 )
).
"Filling individual component that is not shared by both structures
struc2-comp4 = 999.
ENDMETHOD.
METHOD fill_struc_and_tab.
CLEAR: s1, s2, tab1, tab2, tab3.
s1 = VALUE #( comp1 = 'A' comp2 = `bbb` comp3 = 1 ).
s2 = VALUE #( comp1 = `ccc` comp2 = 'D' comp3 = 2 comp4 = 3 ).
tab1 = VALUE #(
( comp1 = 'A' comp2 = `bbb` comp3 = 1 )
( comp1 = 'B' comp2 = `ccc` comp3 = 2 )
( comp1 = 'C' comp2 = `ddd` comp3 = 3 ) ).
tab2 = VALUE #(
( comp1 = `eee` comp2 = 'F' comp3 = 4 comp4 = 5 )
( comp1 = `ggg` comp2 = 'H' comp3 = 6 comp4 = 7 )
( comp1 = `iii` comp2 = 'J' comp3 = 8 comp4 = 9 ) ).
tab3 = VALUE #(
( comp1 = `aaa` comp2 = 'B' comp3 = 1 comp4 = 2 )
( comp1 = `ccc` comp2 = 'D' comp3 = 3 comp4 = 4 )
( comp1 = `eee` comp2 = 'F' comp3 = 5 comp4 = 6 )
( comp1 = `ggg` comp2 = 'H' comp3 = 7 comp4 = 8 )
( comp1 = `iii` comp2 = 'J' comp3 = 9 comp4 = 10 ) ).
tab4 = tab3.
ENDMETHOD.
METHOD if_oo_adt_classrun~main. METHOD if_oo_adt_classrun~main.
DATA(output) = NEW zcl_demo_abap_display( out ). DATA(output) = NEW zcl_demo_abap_display( out ).
output->display( `Demo: Constructor Expressions` ). output->display( `ABAP Cheat Sheet: Constructor Expressions` ).
output->next_section( `VALUE` ).
output->display( `1) Structures: Populating a flat structure` ).
output->display( `1. VALUE` ). "A flat structure is created based on a data type defined with a
output->display( `1.1 VALUE: Structures` ).
"1) A flat structure is created based on a data type defined with a
"TYPES statement. The structure is then filled using a constructor "TYPES statement. The structure is then filled using a constructor
"expression with VALUE by specifying the components and assigning "expression with VALUE by specifying the components and assigning
"values. Here, the type can be inferred, hence, a # symbol can be used. "values. Here, the type can be inferred, hence, a # character can be used.
output->display( `1.1.1 Flat structure` ).
TYPES: BEGIN OF struc_type, TYPES: BEGIN OF struc_type,
num TYPE i, num TYPE i,
@@ -191,34 +134,39 @@ CLASS ZCL_DEMO_ABAP_CONSTRUCTOR_EXPR IMPLEMENTATION.
output->display( input = struc name = `struc` ). output->display( input = struc name = `struc` ).
"2) The same structure is then filled purposely omitting components, i. **********************************************************************
"e. these components remain initial.
output->next_section( `1.1.2 Omitting value assignment to components` ). output->next_section( `2) Structures: Omitting value assignment to components` ).
"The same structure is then filled purposely omitting components, i.
"e. these components remain initial.
struc = VALUE #( char1 = 'bbb' ). struc = VALUE #( char1 = 'bbb' ).
output->display( input = struc name = `struc` ). output->display( input = struc name = `struc` ).
"3) The example demonstrates a variable that is declared inline. Here, **********************************************************************
output->next_section( `3) Structures: Inline declaration, explicit type specification` ).
"The example demonstrates a variable that is declared inline. Here,
"the result is a structure which is filled using a constructor "the result is a structure which is filled using a constructor
"expression with VALUE and by specifying the components and assigning "expression with VALUE and by specifying the components and assigning
"values in parentheses. The structure type is specified explicitly. "values in parentheses. The structure type is specified explicitly.
"The # symbol would not work since no type can be inferred from the "The # symbol would not work since no type can be inferred from the
"specified parameters. "specified parameters.
output->next_section( `1.1.3 Structure declared inline, explicit type specification` ).
DATA(struc_inl) = VALUE struc_type( num = 3 DATA(struc_inl) = VALUE struc_type( num = 3
char1 = 'ccc' char1 = 'ccc'
char2 = 'def' ). char2 = 'def' ).
output->display( input = struc_inl name = `struc_inl` ). output->display( input = struc_inl name = `struc_inl` ).
**********************************************************************
output->next_section( `1.2 VALUE: Internal tables` ). output->next_section( `4) Internal tables: Declaration and population` ).
"1) The example demonstrates the declaration of an internal table. The "The example demonstrates the declaration of an internal table. The
"internal table is then filled using a constructor expression with "internal table is then filled using a constructor expression with
"VALUE. "VALUE.
"The type can be inferred here and need not be specified explicitly. "The type can be inferred here and need not be specified explicitly.
@@ -226,8 +174,6 @@ CLASS ZCL_DEMO_ABAP_CONSTRUCTOR_EXPR IMPLEMENTATION.
"specified and assigned values. In the example, 3 lines are added to "specified and assigned values. In the example, 3 lines are added to
"the table. For one line, some components are purposely not assigned. "the table. For one line, some components are purposely not assigned.
output->display( `1.2.1 Declaration and filling of an internal table` ).
DATA itab TYPE TABLE OF struc_type WITH EMPTY KEY. DATA itab TYPE TABLE OF struc_type WITH EMPTY KEY.
itab = VALUE #( ( num = 1 char1 = 'aaa' char2 = 'abc' ) itab = VALUE #( ( num = 1 char1 = 'aaa' char2 = 'abc' )
@@ -236,13 +182,15 @@ CLASS ZCL_DEMO_ABAP_CONSTRUCTOR_EXPR IMPLEMENTATION.
output->display( input = itab name = `itab` ). output->display( input = itab name = `itab` ).
"2) The example demonstrates an internal table declared inline that is **********************************************************************
output->next_section( `5) Internal tables: Inline declaration, explicit type specification` ).
"The example demonstrates an internal table declared inline that is
"filled using a constructor expression with VALUE by specifying the "filled using a constructor expression with VALUE by specifying the
"internal table type explicitly. Note that the internal table type "internal table type explicitly. Note that the internal table type
"cannot be generic in this context. "cannot be generic in this context.
output->next_section( `1.2.2 Table declared inline, explicitly specified table type` ).
TYPES: itab_type TYPE STANDARD TABLE OF struc_type TYPES: itab_type TYPE STANDARD TABLE OF struc_type
WITH NON-UNIQUE KEY num. WITH NON-UNIQUE KEY num.
@@ -250,63 +198,103 @@ CLASS ZCL_DEMO_ABAP_CONSTRUCTOR_EXPR IMPLEMENTATION.
( num = 4 char1 = 'ddd' char2 = 'ghi' ) ( num = 4 char1 = 'ddd' char2 = 'ghi' )
( num = 5 char1 = 'eee' char2 = 'jkl' ) ). ( num = 5 char1 = 'eee' char2 = 'jkl' ) ).
output->display( input = itab2 name = `itab2` ).
"3) Using the LINES OF addition, you can add lines of other tables. DATA(str_table) = VALUE string_table( ( `this` )
( `is a` )
( `table` )
( `of type string` ) ).
output->display( input = itab2 name = `itab2` ).
output->display( input = str_table name = `str_table` ).
**********************************************************************
output->next_section( `6) LINES OF addition` ).
"Using the LINES OF addition, you can add lines of other tables.
"Note: The line type of the other internal table must match the one of "Note: The line type of the other internal table must match the one of
"the target internal table. Using FROM/TO, the table line selection can "the target internal table. Using FROM/TO, the table line selection can
"be further restricted. Without FROM/TO, all lines of the table are "be further restricted. Without FROM/TO, all lines of the table are
"respected. "respected.
output->next_section( `1.2.3 LINES OF addition` ).
itab2 = VALUE #( ( num = 6 char1 = 'fff' char2 = 'mno' ) itab2 = VALUE #( ( num = 6 char1 = 'fff' char2 = 'mno' )
( LINES OF itab ) ( LINES OF itab )
( LINES OF itab FROM 1 TO 2 ) ). ( LINES OF itab FROM 1 TO 2 ) ).
output->display( input = itab2 name = `itab2` ). output->display( input = itab2 name = `itab2` ).
"4) Using the BASE addition, you can keep existing content of the source **********************************************************************
output->next_section( `7) BASE addition for keeping existing data` ).
"Using the BASE addition, you can keep existing content of the source
"internal table. "internal table.
output->next_section( `1.2.4 BASE addition for keeping existing data` ). itab2 = VALUE #( BASE itab2 ( num = 7 char1 = 'ggg' char2 = 'pqr' ) ).
itab2 = VALUE #( BASE itab2 ( num = 7 char1 = 'ggg'
char2 = 'pqr' ) ).
output->display( input = itab2 name = `itab2` ). output->display( input = itab2 name = `itab2` ).
"5) Various examples using ABAP (SQL) statements in which table lines **********************************************************************
"are constructed inline.
output->next_section( `ABAP statements and ABAP SQL statements` ). output->next_section( `8) Assignemnt with the VALUE operator without specifying content in parentheses` ).
output->display( `1.2.5 Modifying internal table from a structure created inline` ).
MODIFY TABLE itab2 FROM VALUE #( num = 7 "Using the VALUE operator without populating anything in the parentheses,
char1 = 'hhh' "data objects are initialized.
char2 = 'stu' ).
"elementary types
DATA(some_num) = 123.
some_num = VALUE #( ).
DATA(another_num) = VALUE i( ).
DATA(some_str) = `hallo`.
some_str = VALUE #( ).
"Initializing internal table/structure
str_table = VALUE #( ).
struc = VALUE #( ).
output->display( input = some_num name = `some_num` ).
output->display( input = another_num name = `another_num` ).
output->display( input = some_str name = `some_str` ).
output->display( input = str_table name = `str_table` ).
output->display( input = struc name = `struc` ).
**********************************************************************
output->next_section( `Excursions: VALUE operator in use with ABAP statements and ABAP SQL statements` ).
"The following examples use ABAP and ABAP SQL statements in which table lines
"are constructed inline using the VALUE operator.
output->display( `9) Modifying internal table from a structure created inline` ).
MODIFY TABLE itab2 FROM VALUE #( num = 7 char1 = 'hhh' char2 = 'stu' ).
output->display( input = itab2 name = `itab2` ). output->display( input = itab2 name = `itab2` ).
**********************************************************************
output->next_section( `1.2.6 Inserting a table line that is created inline into an internal table` ). output->next_section( `10) Inserting a table line that is created inline into an internal table` ).
INSERT VALUE #( num = 8 char1 = 'iii' char2 = 'vwx' ) INSERT VALUE #( num = 8 char1 = 'iii' char2 = 'vwx' ) INTO TABLE itab2.
INTO TABLE itab2.
output->display( input = itab2 name = `itab2` ). output->display( input = itab2 name = `itab2` ).
**********************************************************************
output->next_section( `1.2.7 Deleting a table entry based on a line created inline` ). output->next_section( `11) Deleting a table entry based on a line created inline` ).
DELETE TABLE itab2 FROM VALUE #( num = 3 ). DELETE TABLE itab2 FROM VALUE #( num = 3 ).
output->display( input = itab2 name = `itab2` ). output->display( input = itab2 name = `itab2` ).
"Delete demo database table entries for demo below **********************************************************************
DELETE FROM zdemo_abap_carr.
output->next_section( `1.2.8 Modifying a database table based on an internal table created inline` ). output->next_section( `12) Modifying a database table based on an internal table created inline` ).
"Deleting demo database table entries for the following example
DELETE FROM zdemo_abap_carr.
MODIFY zdemo_abap_carr FROM TABLE @( VALUE #( MODIFY zdemo_abap_carr FROM TABLE @( VALUE #(
( carrid = 'CO' ( carrid = 'CO'
@@ -327,15 +315,16 @@ CLASS ZCL_DEMO_ABAP_CONSTRUCTOR_EXPR IMPLEMENTATION.
output->display( input = itab_carr name = `itab_carr` ). output->display( input = itab_carr name = `itab_carr` ).
output->next_section( `1.3 Excursion: Deep structures and tables` ). **********************************************************************
"1) The example demonstrates the use of constructor expressions with output->next_section( `Excursion: Deep structures and tables` ).
output->display( `13) Deep structure` ).
"The example demonstrates the use of constructor expressions with
"VALUE in the context of a deep structure. Here, a structure is declared "VALUE in the context of a deep structure. Here, a structure is declared
"inline and filled. The structure type includes a nested structure. The "inline and filled. The structure type includes a nested structure. The
"nested structure is filled using a nested VALUE expression. "nested structure is filled using a nested VALUE expression.
output->display( `1.3.1 Deep structure` ).
TYPES: BEGIN OF deep_struc_ty, TYPES: BEGIN OF deep_struc_ty,
num TYPE i, num TYPE i,
char1 TYPE c LENGTH 3, char1 TYPE c LENGTH 3,
@@ -351,10 +340,12 @@ CLASS ZCL_DEMO_ABAP_CONSTRUCTOR_EXPR IMPLEMENTATION.
output->display( input = deep_struc name = `deep_struc` ). output->display( input = deep_struc name = `deep_struc` ).
"2) A deep internal table is created. Also here, nested VALUE **********************************************************************
"expressions are demonstrated.
output->next_section( `1.3.2 Deep internal table` ). output->next_section( `14) Deep internal table` ).
"A deep internal table is created. Also here, nested VALUE
"expressions are demonstrated.
TYPES: BEGIN OF deep_struc_ty2, TYPES: BEGIN OF deep_struc_ty2,
char TYPE c LENGTH 3, char TYPE c LENGTH 3,
@@ -370,35 +361,38 @@ CLASS ZCL_DEMO_ABAP_CONSTRUCTOR_EXPR IMPLEMENTATION.
output->display( input = deep_itab name = `deep_itab` ). output->display( input = deep_itab name = `deep_itab` ).
output->next_section( `2. CORRESPONDING` ). **********************************************************************
output->display( `2.1 CORRESPONDING: Simple Examples with ` && output->next_section( `CORRESPONDING` ).
`Structures and Internal Tables` ). output->display( `Simple Examples with structures and internal tables` ).
"1) Displaying the original structures and tables that are filled in the
"course of a method call. The structures and tables are filled anew
"throughout the examples so that all CORRESPONDING expressions are based
"on the same values.
"Method to fill demo structures and internal tables "Method to fill demo structures and internal tables
"with values to work with "with values to work with
fill_struc_and_tab( ). fill_struc_and_tab( ).
output->display( `2.1.1 Original structure and table content` ). output->display( `15) Original structure and table content` ).
"Displaying the original structures and tables that are filled in the
"course of a method call. The structures and tables are filled anew
"throughout the examples so that all CORRESPONDING expressions are based
"on the same values.
output->display( input = s1 name = `s1` ). output->display( input = s1 name = `s1` ).
output->display( input = s2 name = `s2` ). output->display( input = s2 name = `s2` ).
output->display( input = tab1 name = `tab1` ). output->display( input = tab1 name = `tab1` ).
output->display( input = tab2 name = `it_st` ). output->display( input = tab2 name = `it_st` ).
"2) The target structure and table have a different type but identically **********************************************************************
output->next_section( `16) CORRESPONDING without addition` ).
"The target structure and table have a different type but identically
"named components. The identically named components are filled. Note "named components. The identically named components are filled. Note
"that the target variables are initialized here. Also note the effect "that the target variables are initialized here. Also note the effect
"of an automatic conversion of a variable-length string to a "of an automatic conversion of a variable-length string to a
"fixed-length string (one component is typed with c, the other, "fixed-length string (one component is typed with c, the other,
"identically named component, is of type string). "identically named component, is of type string).
output->next_section( `2.1.2 CORRESPONDING without addition` ).
s2 = CORRESPONDING #( s1 ). s2 = CORRESPONDING #( s1 ).
tab2 = CORRESPONDING #( tab1 ). tab2 = CORRESPONDING #( tab1 ).
@@ -406,13 +400,15 @@ CLASS ZCL_DEMO_ABAP_CONSTRUCTOR_EXPR IMPLEMENTATION.
output->display( input = s2 name = `s2` ). output->display( input = s2 name = `s2` ).
output->display( input = tab2 name = `tab2` ). output->display( input = tab2 name = `tab2` ).
fill_struc_and_tab( ). **********************************************************************
"3) The BASE addition keeps the original content. Structure: The non- output->next_section( `17) BASE addition for keeping original content` ).
"The BASE addition keeps the original content. Structure: The non-
"identical component name retains its value. Internal table: Existing "identical component name retains its value. Internal table: Existing
"table lines are kept. "table lines are kept.
output->next_section( `2.1.3 BASE addition for keeping original content` ). fill_struc_and_tab( ).
s2 = CORRESPONDING #( BASE ( s2 ) s1 ). s2 = CORRESPONDING #( BASE ( s2 ) s1 ).
@@ -421,14 +417,16 @@ CLASS ZCL_DEMO_ABAP_CONSTRUCTOR_EXPR IMPLEMENTATION.
output->display( input = s2 name = `s2` ). output->display( input = s2 name = `s2` ).
output->display( input = tab2 name = `tab2` ). output->display( input = tab2 name = `tab2` ).
fill_struc_and_tab( ). **********************************************************************
"4) The example demonstrates the additions MAPPING and EXCEPT. MAPPING: output->next_section( `18) MAPPING/EXCEPT additions` ).
"The example demonstrates the additions MAPPING and EXCEPT. MAPPING:
"One component of the target structure is assigned the value of a "One component of the target structure is assigned the value of a
"dedicated component of the source structure. EXCEPT: All corresponding "dedicated component of the source structure. EXCEPT: All corresponding
"components are assigned except a specific one. "components are assigned except a specific one.
output->next_section( `2.1.4 MAPPING/EXCEPT additions` ). fill_struc_and_tab( ).
s2 = CORRESPONDING #( s1 MAPPING comp4 = comp3 ). s2 = CORRESPONDING #( s1 MAPPING comp4 = comp3 ).
@@ -437,8 +435,12 @@ CLASS ZCL_DEMO_ABAP_CONSTRUCTOR_EXPR IMPLEMENTATION.
output->display( input = s2 name = `s2` ). output->display( input = s2 name = `s2` ).
output->display( input = tab2 name = `tab2` ). output->display( input = tab2 name = `tab2` ).
output->next_section( `2.2 CORRESPONDING: Demonstrating Various` && **********************************************************************
` Additions Using Deep Structures` ).
output->next_section( `CORRESPONDING: Demonstrating various` &&
` additions using deep structures` ).
output->display( `19) Original content of deep structures` ).
"Displaying the original deep structures and tables that are filled in "Displaying the original deep structures and tables that are filled in
"the course of a method call. The deep structures and tables are filled "the course of a method call. The deep structures and tables are filled
@@ -449,10 +451,13 @@ CLASS ZCL_DEMO_ABAP_CONSTRUCTOR_EXPR IMPLEMENTATION.
"with values to work with "with values to work with
fill_deep_structures( ). fill_deep_structures( ).
output->display( `2.2.1 Original content of deep structures` ).
output->display( input = struc1 name = `struc1` ). output->display( input = struc1 name = `struc1` ).
output->display( input = struc2 name = `struc2` ). output->display( input = struc2 name = `struc2` ).
**********************************************************************
output->next_section( `20) CORRESPONDING without addition` ).
"CORRESPONDING operator without addition "CORRESPONDING operator without addition
"Existing contents of identically named components are replaced. "Existing contents of identically named components are replaced.
"Existing contents of components in the target structure that are not "Existing contents of components in the target structure that are not
@@ -468,13 +473,13 @@ CLASS ZCL_DEMO_ABAP_CONSTRUCTOR_EXPR IMPLEMENTATION.
"column of the source structure. Check the conversion rules for "column of the source structure. Check the conversion rules for
"internal tables. "internal tables.
output->next_section( `2.2.2 CORRESPONDING without addition` ).
struc2 = CORRESPONDING #( struc1 ). struc2 = CORRESPONDING #( struc1 ).
output->display( input = struc2 name = `struc2` ). output->display( input = struc2 name = `struc2` ).
fill_deep_structures( ). **********************************************************************
output->next_section( `21) DEEP addition` ).
"CORRESPONDING operator with the addition DEEP "CORRESPONDING operator with the addition DEEP
"Existing contents of identically named components are replaced. "Existing contents of identically named components are replaced.
@@ -489,13 +494,15 @@ CLASS ZCL_DEMO_ABAP_CONSTRUCTOR_EXPR IMPLEMENTATION.
"identically named components in the nested table. Hence, only col2 as "identically named components in the nested table. Hence, only col2 as
"the only shared and identically named component is filled. "the only shared and identically named component is filled.
output->next_section( `2.2.3 DEEP addition` ). fill_deep_structures( ).
struc2 = CORRESPONDING #( DEEP struc1 ). struc2 = CORRESPONDING #( DEEP struc1 ).
output->display( input = struc2 name = `struc2` ). output->display( input = struc2 name = `struc2` ).
fill_deep_structures( ). **********************************************************************
output->next_section( `22) BASE addition` ).
"CORRESPONDING operator with the addition BASE "CORRESPONDING operator with the addition BASE
"Existing contents of identically named components are replaced. "Existing contents of identically named components are replaced.
@@ -513,13 +520,15 @@ CLASS ZCL_DEMO_ABAP_CONSTRUCTOR_EXPR IMPLEMENTATION.
"assigned starting with the first column of the source structure. Check "assigned starting with the first column of the source structure. Check
"the conversion rules for internal tables. "the conversion rules for internal tables.
output->next_section( `2.2.4 BASE addition` ). fill_deep_structures( ).
struc2 = CORRESPONDING #( BASE ( struc2 ) struc1 ). struc2 = CORRESPONDING #( BASE ( struc2 ) struc1 ).
output->display( input = struc2 name = `struc2` ). output->display( input = struc2 name = `struc2` ).
fill_deep_structures( ). **********************************************************************
output->next_section( `23) DEEP BASE addition` ).
"CORRESPONDING operator with the additions DEEP BASE "CORRESPONDING operator with the additions DEEP BASE
"Existing contents of identically named components are replaced. "Existing contents of identically named components are replaced.
@@ -535,13 +544,15 @@ CLASS ZCL_DEMO_ABAP_CONSTRUCTOR_EXPR IMPLEMENTATION.
"assignment happens for identically named components in the nested table. "assignment happens for identically named components in the nested table.
"Hence, only col2 as the only shared and identically named component is filled. "Hence, only col2 as the only shared and identically named component is filled.
output->next_section( `2.2.5 DEEP BASE addition` ). fill_deep_structures( ).
struc2 = CORRESPONDING #( DEEP BASE ( struc2 ) struc1 ). struc2 = CORRESPONDING #( DEEP BASE ( struc2 ) struc1 ).
output->display( input = struc2 name = `struc2` ). output->display( input = struc2 name = `struc2` ).
fill_deep_structures( ). **********************************************************************
output->next_section( `24) APPENDING addition` ).
"CORRESPONDING operator with the addition APPENDING "CORRESPONDING operator with the addition APPENDING
"Existing contents of identically named components are replaced. "Existing contents of identically named components are replaced.
@@ -559,13 +570,15 @@ CLASS ZCL_DEMO_ABAP_CONSTRUCTOR_EXPR IMPLEMENTATION.
"values are assigned starting with the first column of the source "values are assigned starting with the first column of the source
"structure. Check the conversion rules for internal tables. "structure. Check the conversion rules for internal tables.
output->next_section( `2.2.6 APPENDING addition` ). fill_deep_structures( ).
struc2 = CORRESPONDING #( APPENDING ( struc2 ) struc1 ). struc2 = CORRESPONDING #( APPENDING ( struc2 ) struc1 ).
output->display( input = struc2 name = `struc2` ). output->display( input = struc2 name = `struc2` ).
fill_deep_structures( ). **********************************************************************
output->next_section( `25) DEEP APPENDING` ).
"CORRESPONDING operator with the additions DEEP APPENDING "CORRESPONDING operator with the additions DEEP APPENDING
"Existing contents of identically named components are replaced. "Existing contents of identically named components are replaced.
@@ -582,14 +595,16 @@ CLASS ZCL_DEMO_ABAP_CONSTRUCTOR_EXPR IMPLEMENTATION.
"table. Hence, only col2 as the only shared and identically named "table. Hence, only col2 as the only shared and identically named
"component is filled. "component is filled.
output->next_section( `2.2.7 DEEP APPENDING` ). fill_deep_structures( ).
struc2 = CORRESPONDING #( DEEP APPENDING ( struc2 ) struc1 ). struc2 = CORRESPONDING #( DEEP APPENDING ( struc2 ) struc1 ).
output->display( input = struc2 name = `struc2` ). output->display( input = struc2 name = `struc2` ).
output->next_section( `3. NEW` ). **********************************************************************
output->display( `3.1 NEW: Creating Anonymous Data Objects` ).
output->next_section( `NEW` ).
output->display( `26) Creating Anonymous Data Objects` ).
"The examples show the creation of anonymous data objects. "The examples show the creation of anonymous data objects.
"First, data reference variables are declared using a DATA statement. "First, data reference variables are declared using a DATA statement.
@@ -613,9 +628,9 @@ CLASS ZCL_DEMO_ABAP_CONSTRUCTOR_EXPR IMPLEMENTATION.
dref2 = NEW string( ). dref2 = NEW string( ).
IF dref1->* = 0 AND dref2->* = ``. IF dref1->* = 0 AND dref2->* = ``.
DATA(val) = `Initial values!`. DATA(val) = `Initial values`.
ELSE. ELSE.
val = `No initial values!`. val = `No initial values`.
ENDIF. ENDIF.
"Directly assigning values within the parentheses. "Directly assigning values within the parentheses.
@@ -644,7 +659,9 @@ CLASS ZCL_DEMO_ABAP_CONSTRUCTOR_EXPR IMPLEMENTATION.
output->display( input = dref5 name = `dref5` ). output->display( input = dref5 name = `dref5` ).
output->display( input = dref6 name = `dref6` ). output->display( input = dref6 name = `dref6` ).
output->next_section( `3.2 NEW: Creating Instances of Classes` ). **********************************************************************
output->next_section( `27) Creating Instances of Classes` ).
"The example demonstrates the creation of instances of classes. "The example demonstrates the creation of instances of classes.
"First, an object reference variable is declared with a DATA statement. "First, an object reference variable is declared with a DATA statement.
@@ -679,12 +696,13 @@ CLASS ZCL_DEMO_ABAP_CONSTRUCTOR_EXPR IMPLEMENTATION.
output->display( input = oref2 name = `oref2` ). output->display( input = oref2 name = `oref2` ).
"Method chaining "Method chaining
DATA(result) = NEW local_class( `Ciao` )->double( DATA(result) = NEW local_class( `Ciao` )->double( int = NEW #( 5 ) ).
int = NEW #( 5 ) ).
output->display( input = result name = `result` ). output->display( input = result name = `result` ).
output->next_section( `4. CONV` ). **********************************************************************
output->next_section( `28) CONV` ).
"The examples show the effect of the CONV operator. "The examples show the effect of the CONV operator.
"A variable of type i is declared and assigned a value. Then, "A variable of type i is declared and assigned a value. Then,
@@ -740,7 +758,9 @@ CLASS ZCL_DEMO_ABAP_CONSTRUCTOR_EXPR IMPLEMENTATION.
output->display( `txt is not equal to converted str.` ). output->display( `txt is not equal to converted str.` ).
ENDIF. ENDIF.
output->next_section( `5. EXACT` ). **********************************************************************
output->next_section( `29) EXACT` ).
"The examples show the effect of the EXACT operator that enforces either "The examples show the effect of the EXACT operator that enforces either
"a lossless assignment or a lossless calculation. "a lossless assignment or a lossless calculation.
@@ -798,7 +818,9 @@ CLASS ZCL_DEMO_ABAP_CONSTRUCTOR_EXPR IMPLEMENTATION.
output->display( input = conv_comp name = `conv_comp` ). output->display( input = conv_comp name = `conv_comp` ).
output->next_section( `6. REF` ). **********************************************************************
output->next_section( `30) REF` ).
"The example includes the declaration of a data object and some data "The example includes the declaration of a data object and some data
"reference variables. One data reference variable is typed with a "reference variables. One data reference variable is typed with a
@@ -837,7 +859,9 @@ CLASS ZCL_DEMO_ABAP_CONSTRUCTOR_EXPR IMPLEMENTATION.
output->display( input = dref_d name = `dref_d` ). output->display( input = dref_d name = `dref_d` ).
output->display( input = oref_b name = `oref_b` ). output->display( input = oref_b name = `oref_b` ).
output->next_section( `7. CAST` ). **********************************************************************
output->next_section( `31) CAST` ).
"The example demonstrates the CAST operator in the context of Run Time "The example demonstrates the CAST operator in the context of Run Time
"Type Identification (RTTI). "Type Identification (RTTI).
@@ -862,7 +886,7 @@ CLASS ZCL_DEMO_ABAP_CONSTRUCTOR_EXPR IMPLEMENTATION.
cl_abap_objectdescr=>describe_by_name( 'LOCAL_CLASS' ) cl_abap_objectdescr=>describe_by_name( 'LOCAL_CLASS' )
)->methods. )->methods.
"Using ?= "Excursion: Using the older cast operator ?=
"Retrieving structure components "Retrieving structure components
"Note: More lines of code, helper variables needed "Note: More lines of code, helper variables needed
DATA structdescr TYPE REF TO cl_abap_structdescr. DATA structdescr TYPE REF TO cl_abap_structdescr.
@@ -885,7 +909,9 @@ CLASS ZCL_DEMO_ABAP_CONSTRUCTOR_EXPR IMPLEMENTATION.
output->display( input = components_s1 name = `components_s1` ). output->display( input = components_s1 name = `components_s1` ).
output->display( input = dref_i name = `dref_i` ). output->display( input = dref_i name = `dref_i` ).
output->next_section( `8. COND` ). **********************************************************************
output->next_section( `32) COND` ).
"The example demonstrates the use of the COND operator. The syntax "The example demonstrates the use of the COND operator. The syntax
"includes several WHEN and THEN expressions. "includes several WHEN and THEN expressions.
@@ -911,7 +937,9 @@ CLASS ZCL_DEMO_ABAP_CONSTRUCTOR_EXPR IMPLEMENTATION.
output->display( input = greets name = `greets` ). output->display( input = greets name = `greets` ).
output->next_section( `9. SWITCH` ). **********************************************************************
output->next_section( `33) SWITCH` ).
"The example demonstrates the use of the SWITCH operator. Here, "The example demonstrates the use of the SWITCH operator. Here,
"calculations are carried out. For this "calculations are carried out. For this
@@ -946,7 +974,9 @@ CLASS ZCL_DEMO_ABAP_CONSTRUCTOR_EXPR IMPLEMENTATION.
ENDTRY. ENDTRY.
ENDLOOP. ENDLOOP.
output->next_section( `10. FILTER` ). **********************************************************************
output->next_section( `34) FILTER` ).
"This section covers multiple examples demonstrating the syntactical variety "This section covers multiple examples demonstrating the syntactical variety
"of the FILTER operator. "of the FILTER operator.
@@ -1045,23 +1075,28 @@ CLASS ZCL_DEMO_ABAP_CONSTRUCTOR_EXPR IMPLEMENTATION.
output->display( input = f11 name = `f11` ). output->display( input = f11 name = `f11` ).
output->next_section( `11. Iteration Expressions with FOR` ). **********************************************************************
output->next_section( `Iteration Expressions with FOR` ).
"The examples demonstrate iteration expressions with FOR. The examples "The examples demonstrate iteration expressions with FOR. The examples
"are based on demo internal tables that are filled using a method. The "are based on demo internal tables that are filled using a method. The
"tables are displayed to show the original content of the internal "tables are displayed to show the original content of the internal
"tables that are to be processed. "tables that are to be processed.
output->display( `35) Original table content` ).
"Method to fill demo internal tables with values to work with. "Method to fill demo internal tables with values to work with.
"Tables are displayed showing the values. "Tables are displayed showing the values.
fill_struc_and_tab( ). fill_struc_and_tab( ).
output->display( `11.1 Original table content` ).
output->display( input = tab1 name = `tab1` ). output->display( input = tab1 name = `tab1` ).
output->display( input = tab2 name = `tab2` ). output->display( input = tab2 name = `tab2` ).
output->display( input = tab3 name = `tab3` ). output->display( input = tab3 name = `tab3` ).
output->next_section( `11.2 FOR ... IN ... (LOOP Semantics)` ). **********************************************************************
output->next_section( `36) FOR ... IN ... (LOOP Semantics)` ).
"Examples demonstrating FOR ... IN ... that has the semantics of LOOP. "Examples demonstrating FOR ... IN ... that has the semantics of LOOP.
"1) An internal table is looped across. The whole line is stored in a "1) An internal table is looped across. The whole line is stored in a
@@ -1135,7 +1170,9 @@ CLASS ZCL_DEMO_ABAP_CONSTRUCTOR_EXPR IMPLEMENTATION.
output->display( input = for4 name = `for4` ). output->display( input = for4 name = `for4` ).
output->next_section( `11.2 FOR ... WHILE/UNTIL ... ` && **********************************************************************
output->next_section( `37) FOR ... WHILE/UNTIL ... ` &&
`(DO/WHILE Semantics)` ). `(DO/WHILE Semantics)` ).
"Examples demonstrating FOR ... WHILE/UNTIL ... that has the semantics "Examples demonstrating FOR ... WHILE/UNTIL ... that has the semantics
@@ -1168,7 +1205,9 @@ CLASS ZCL_DEMO_ABAP_CONSTRUCTOR_EXPR IMPLEMENTATION.
output->display( input = for5 name = `for5` ). output->display( input = for5 name = `for5` ).
output->display( input = for6 name = `for6` ). output->display( input = for6 name = `for6` ).
output->next_section( `12. REDUCE` ). **********************************************************************
output->next_section( `38) REDUCE (1)` ).
"The examples demonstrate the REDUCE operator using values contained in "The examples demonstrate the REDUCE operator using values contained in
"an internal table column. Here, the table is of type string. "an internal table column. Here, the table is of type string.
@@ -1210,6 +1249,10 @@ CLASS ZCL_DEMO_ABAP_CONSTRUCTOR_EXPR IMPLEMENTATION.
output->display( input = a_word name = `a_word` ). output->display( input = a_word name = `a_word` ).
output->display( input = sentence name = `sentence` ). output->display( input = sentence name = `sentence` ).
**********************************************************************
output->next_section( `39) REDUCE (2)` ).
"The examples demonstrate summations using the REDUCE operator. "The examples demonstrate summations using the REDUCE operator.
"1) Example using FOR ... UNTIL .... It calculates the total of the "1) Example using FOR ... UNTIL .... It calculates the total of the
"numbers from 1 to 10. The resulting number is stored in a variable that "numbers from 1 to 10. The resulting number is stored in a variable that
@@ -1237,6 +1280,10 @@ CLASS ZCL_DEMO_ABAP_CONSTRUCTOR_EXPR IMPLEMENTATION.
output->display( input = sum1 name = `sum1` ). output->display( input = sum1 name = `sum1` ).
output->display( input = sum2 name = `sum2` ). output->display( input = sum2 name = `sum2` ).
**********************************************************************
output->next_section( `40) REDUCE (3)` ).
"The examples demonstrate the concatenation of strings "The examples demonstrate the concatenation of strings
"1) without the addition THEN "1) without the addition THEN
"2) with the addition THEN "2) with the addition THEN
@@ -1262,7 +1309,9 @@ CLASS ZCL_DEMO_ABAP_CONSTRUCTOR_EXPR IMPLEMENTATION.
output->display( input = conc2 name = `conc2` ). output->display( input = conc2 name = `conc2` ).
output->display( input = conc3 name = `conc3` ). output->display( input = conc3 name = `conc3` ).
output->next_section( `13. LET Expressions` ). **********************************************************************
output->next_section( `41) LET Expressions (1)` ).
"The examples demonstrate LET expressions in different contexts. "The examples demonstrate LET expressions in different contexts.
@@ -1279,6 +1328,8 @@ CLASS ZCL_DEMO_ABAP_CONSTRUCTOR_EXPR IMPLEMENTATION.
output->display( input = str_tab name = `str_tab` ). output->display( input = str_tab name = `str_tab` ).
output->next_section( `42) LET Expressions (2)` ).
"2) LET within a constructor expression with COND: 12 o'clock is "2) LET within a constructor expression with COND: 12 o'clock is
"specified as value for the LET expression. Based on this value, checks "specified as value for the LET expression. Based on this value, checks
"are carried out and an appropriate result is returned. "are carried out and an appropriate result is returned.
@@ -1296,6 +1347,8 @@ CLASS ZCL_DEMO_ABAP_CONSTRUCTOR_EXPR IMPLEMENTATION.
output->display( input = time name = `time` ). output->display( input = time name = `time` ).
output->next_section( `43) LET Expressions (3)` ).
"3) An internal table that includes three components is created and "3) An internal table that includes three components is created and
"filled. A loop across this table is carried out. The purpose of the "filled. A loop across this table is carried out. The purpose of the
"constructor expression is to construct a string by concatenating the "constructor expression is to construct a string by concatenating the
@@ -1334,4 +1387,55 @@ CLASS ZCL_DEMO_ABAP_CONSTRUCTOR_EXPR IMPLEMENTATION.
output->display( input = stringtab name = `stringtab` ). output->display( input = stringtab name = `stringtab` ).
ENDMETHOD. ENDMETHOD.
ENDCLASS.
METHOD fill_deep_structures.
"Clearing all contents of struc2
CLEAR struc2.
"Filling nested tables in deep structures
struc2-struc_nested = VALUE #( comp1 = `aaa`
comp2 = `bbb`
comp3 = `ccc`).
struc1-itab = VALUE #(
( col1 = 111 col2 = 222 )
( col1 = 333 col2 = 444
) ).
struc2-itab = VALUE #(
( col2 = 1 col3 = 2 col4 = 3 )
( col2 = 4 col3 = 5 col4 = 6 )
( col2 = 7 col3 = 8 col4 = 9 )
).
"Filling individual component that is not shared by both structures
struc2-comp4 = 999.
ENDMETHOD.
METHOD fill_struc_and_tab.
CLEAR: s1, s2, tab1, tab2, tab3.
s1 = VALUE #( comp1 = 'A' comp2 = `bbb` comp3 = 1 ).
s2 = VALUE #( comp1 = `ccc` comp2 = 'D' comp3 = 2 comp4 = 3 ).
tab1 = VALUE #(
( comp1 = 'A' comp2 = `bbb` comp3 = 1 )
( comp1 = 'B' comp2 = `ccc` comp3 = 2 )
( comp1 = 'C' comp2 = `ddd` comp3 = 3 ) ).
tab2 = VALUE #(
( comp1 = `eee` comp2 = 'F' comp3 = 4 comp4 = 5 )
( comp1 = `ggg` comp2 = 'H' comp3 = 6 comp4 = 7 )
( comp1 = `iii` comp2 = 'J' comp3 = 8 comp4 = 9 ) ).
tab3 = VALUE #(
( comp1 = `aaa` comp2 = 'B' comp3 = 1 comp4 = 2 )
( comp1 = `ccc` comp2 = 'D' comp3 = 3 comp4 = 4 )
( comp1 = `eee` comp2 = 'F' comp3 = 5 comp4 = 6 )
( comp1 = `ggg` comp2 = 'H' comp3 = 7 comp4 = 8 )
( comp1 = `iii` comp2 = 'J' comp3 = 9 comp4 = 10 ) ).
tab4 = tab3.
ENDMETHOD.
ENDCLASS.