From 0885bff7171c01c3b368a492b3e4a62cc42b9bf6 Mon Sep 17 00:00:00 2001 From: danrega <16720986+danrega@users.noreply.github.com> Date: Mon, 3 Apr 2023 17:05:10 +0200 Subject: [PATCH] Update content --- src/zcl_demo_abap_constructor_expr.clas.abap | 464 ++++++++++++------- 1 file changed, 284 insertions(+), 180 deletions(-) diff --git a/src/zcl_demo_abap_constructor_expr.clas.abap b/src/zcl_demo_abap_constructor_expr.clas.abap index 7c9b1f1..6b22045 100644 --- a/src/zcl_demo_abap_constructor_expr.clas.abap +++ b/src/zcl_demo_abap_constructor_expr.clas.abap @@ -12,28 +12,28 @@ * - Open the class with the ABAP Development Tools (ADT). * - Choose F9 to run the class. * - Check the console output. -* - To understand the context and the ABAP syntax used, check the notes -* included in the class as comments or refer to the respective topic -* in the ABAP Keyword Documentation. -* - Due to the amount of output in the console, the examples include -* numbers (e. g. 1) ..., 2) ..., 3) ...) for the individual example -* sections. Plus, the variable name is displayed in most cases. Hence, -* to easier and faster find the relevant output in the console, just -* search in the console for the number/variable name (CTRL+F in the -* console) or use the debugger. +* - To understand the context and the ABAP syntax used, refer to the +* notes included in the class as comments or refer to the respective +* topic in the ABAP Keyword Documentation. +* - Due to the amount of console output, the examples contain numbers +* (e.g. 1) ..., 2) ..., 3) ...) for the individual example sections. +* Also, the variable name is displayed in most cases. So to find +* the relevant output in the console easier and faster, just search +* for the number/variable name in the console (CTRL+F in the console) +* or use the debugger. * * ----------------------------- NOTE ----------------------------------- -* The code presented in this class is only meant for supporting the ABAP -* cheat sheets. It is not intended for direct use in a -* production system environment. The code examples in the ABAP cheat -* sheets are primarily intended to provide a better explanation and -* visualization of the syntax and semantics of ABAP statements and not to -* solve concrete programming tasks. For production application programs, -* a dedicated solution should therefore always be worked out for each -* individual case. There is no guarantee for either the correctness or -* the completeness of the code. In addition, there is no legal -* responsibility or liability for possible errors or their consequences -* which occur through the use of the example code. +* The code presented in this class is intended only to support the ABAP +* cheat sheets. It is not intended for direct use in a production system +* environment. The code examples in the ABAP cheat sheets are primarily +* intended to provide a better explanation and visualization of the +* syntax and semantics of ABAP statements, not to solve concrete +* programming tasks. For production application programs, you should +* always work out your own solution for each individual case. There is +* no guarantee for the correctness or completeness of the code. +* Furthermore, there is no legal responsibility or liability for any +* errors or their consequences that may occur when using the the example +* code. * *********************************************************************** "!

ABAP cheat sheet: Constructor expressions

@@ -105,78 +105,21 @@ protected section. ENDCLASS. - 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. 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` ). - output->display( `1.1 VALUE: Structures` ). - - "1) A flat structure is created based on a data type defined with a + "A flat structure is created based on a data type defined with a "TYPES statement. The structure is then filled using a constructor "expression with VALUE by specifying the components and assigning - "values. Here, the type can be inferred, hence, a # symbol can be used. - - output->display( `1.1.1 Flat structure` ). + "values. Here, the type can be inferred, hence, a # character can be used. TYPES: BEGIN OF struc_type, num TYPE i, @@ -191,34 +134,39 @@ CLASS ZCL_DEMO_ABAP_CONSTRUCTOR_EXPR IMPLEMENTATION. 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' ). 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 "expression with VALUE and by specifying the components and assigning "values in parentheses. The structure type is specified explicitly. "The # symbol would not work since no type can be inferred from the "specified parameters. - output->next_section( `1.1.3 Structure declared inline, explicit type specification` ). - DATA(struc_inl) = VALUE struc_type( num = 3 char1 = 'ccc' char2 = 'def' ). 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 "VALUE. "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 "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. 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` ). - "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 "internal table type explicitly. Note that the internal table type "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 WITH NON-UNIQUE KEY num. @@ -250,63 +198,103 @@ CLASS ZCL_DEMO_ABAP_CONSTRUCTOR_EXPR IMPLEMENTATION. ( num = 4 char1 = 'ddd' char2 = 'ghi' ) ( 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 "the target internal table. Using FROM/TO, the table line selection can "be further restricted. Without FROM/TO, all lines of the table are "respected. - output->next_section( `1.2.3 LINES OF addition` ). - itab2 = VALUE #( ( num = 6 char1 = 'fff' char2 = 'mno' ) ( LINES OF itab ) ( LINES OF itab FROM 1 TO 2 ) ). 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. - 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` ). - "5) Various examples using ABAP (SQL) statements in which table lines - "are constructed inline. +********************************************************************** - output->next_section( `ABAP statements and ABAP SQL statements` ). - output->display( `1.2.5 Modifying internal table from a structure created inline` ). + output->next_section( `8) Assignemnt with the VALUE operator without specifying content in parentheses` ). - MODIFY TABLE itab2 FROM VALUE #( num = 7 - char1 = 'hhh' - char2 = 'stu' ). + "Using the VALUE operator without populating anything in the parentheses, + "data objects are initialized. + + "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->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' ) - INTO TABLE itab2. + INSERT VALUE #( num = 8 char1 = 'iii' char2 = 'vwx' ) INTO TABLE 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 ). 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 #( ( carrid = 'CO' @@ -327,15 +315,16 @@ CLASS ZCL_DEMO_ABAP_CONSTRUCTOR_EXPR IMPLEMENTATION. 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 "inline and filled. The structure type includes a nested structure. The "nested structure is filled using a nested VALUE expression. - output->display( `1.3.1 Deep structure` ). - TYPES: BEGIN OF deep_struc_ty, num TYPE i, char1 TYPE c LENGTH 3, @@ -351,10 +340,12 @@ CLASS ZCL_DEMO_ABAP_CONSTRUCTOR_EXPR IMPLEMENTATION. 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, 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->next_section( `2. CORRESPONDING` ). +********************************************************************** - output->display( `2.1 CORRESPONDING: 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. + output->next_section( `CORRESPONDING` ). + output->display( `Simple Examples with structures and internal tables` ). "Method to fill demo structures and internal tables "with values to work with 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 = s2 name = `s2` ). output->display( input = tab1 name = `tab1` ). 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 "that the target variables are initialized here. Also note the effect "of an automatic conversion of a variable-length string to a "fixed-length string (one component is typed with c, the other, "identically named component, is of type string). - output->next_section( `2.1.2 CORRESPONDING without addition` ). - s2 = CORRESPONDING #( s1 ). tab2 = CORRESPONDING #( tab1 ). @@ -406,13 +400,15 @@ CLASS ZCL_DEMO_ABAP_CONSTRUCTOR_EXPR IMPLEMENTATION. output->display( input = s2 name = `s2` ). 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 "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 ). @@ -421,14 +417,16 @@ CLASS ZCL_DEMO_ABAP_CONSTRUCTOR_EXPR IMPLEMENTATION. output->display( input = s2 name = `s2` ). 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 "dedicated component of the source structure. EXCEPT: All corresponding "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 ). @@ -437,8 +435,12 @@ CLASS ZCL_DEMO_ABAP_CONSTRUCTOR_EXPR IMPLEMENTATION. output->display( input = s2 name = `s2` ). 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 "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 fill_deep_structures( ). - output->display( `2.2.1 Original content of deep structures` ). output->display( input = struc1 name = `struc1` ). output->display( input = struc2 name = `struc2` ). +********************************************************************** + + output->next_section( `20) CORRESPONDING without addition` ). + "CORRESPONDING operator without addition "Existing contents of identically named components are replaced. "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 "internal tables. - output->next_section( `2.2.2 CORRESPONDING without addition` ). - struc2 = CORRESPONDING #( struc1 ). output->display( input = struc2 name = `struc2` ). - fill_deep_structures( ). +********************************************************************** + + output->next_section( `21) DEEP addition` ). "CORRESPONDING operator with the addition DEEP "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 "the only shared and identically named component is filled. - output->next_section( `2.2.3 DEEP addition` ). + fill_deep_structures( ). struc2 = CORRESPONDING #( DEEP struc1 ). output->display( input = struc2 name = `struc2` ). - fill_deep_structures( ). +********************************************************************** + + output->next_section( `22) BASE addition` ). "CORRESPONDING operator with the addition BASE "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 "the conversion rules for internal tables. - output->next_section( `2.2.4 BASE addition` ). + fill_deep_structures( ). struc2 = CORRESPONDING #( BASE ( struc2 ) struc1 ). output->display( input = struc2 name = `struc2` ). - fill_deep_structures( ). +********************************************************************** + + output->next_section( `23) DEEP BASE addition` ). "CORRESPONDING operator with the additions DEEP BASE "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. "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 ). output->display( input = struc2 name = `struc2` ). - fill_deep_structures( ). +********************************************************************** + + output->next_section( `24) APPENDING addition` ). "CORRESPONDING operator with the addition APPENDING "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 "structure. Check the conversion rules for internal tables. - output->next_section( `2.2.6 APPENDING addition` ). + fill_deep_structures( ). struc2 = CORRESPONDING #( APPENDING ( struc2 ) struc1 ). output->display( input = struc2 name = `struc2` ). - fill_deep_structures( ). +********************************************************************** + + output->next_section( `25) DEEP APPENDING` ). "CORRESPONDING operator with the additions DEEP APPENDING "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 "component is filled. - output->next_section( `2.2.7 DEEP APPENDING` ). + fill_deep_structures( ). struc2 = CORRESPONDING #( DEEP APPENDING ( struc2 ) struc1 ). 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. "First, data reference variables are declared using a DATA statement. @@ -613,9 +628,9 @@ CLASS ZCL_DEMO_ABAP_CONSTRUCTOR_EXPR IMPLEMENTATION. dref2 = NEW string( ). IF dref1->* = 0 AND dref2->* = ``. - DATA(val) = `Initial values!`. + DATA(val) = `Initial values`. ELSE. - val = `No initial values!`. + val = `No initial values`. ENDIF. "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 = 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. "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` ). "Method chaining - DATA(result) = NEW local_class( `Ciao` )->double( - int = NEW #( 5 ) ). + DATA(result) = NEW local_class( `Ciao` )->double( int = NEW #( 5 ) ). 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. "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.` ). ENDIF. - output->next_section( `5. EXACT` ). +********************************************************************** + + output->next_section( `29) EXACT` ). "The examples show the effect of the EXACT operator that enforces either "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->next_section( `6. REF` ). +********************************************************************** + + output->next_section( `30) REF` ). "The example includes the declaration of a data object and some data "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 = 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 "Type Identification (RTTI). @@ -862,7 +886,7 @@ CLASS ZCL_DEMO_ABAP_CONSTRUCTOR_EXPR IMPLEMENTATION. cl_abap_objectdescr=>describe_by_name( 'LOCAL_CLASS' ) )->methods. - "Using ?= + "Excursion: Using the older cast operator ?= "Retrieving structure components "Note: More lines of code, helper variables needed 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 = 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 "includes several WHEN and THEN expressions. @@ -911,7 +937,9 @@ CLASS ZCL_DEMO_ABAP_CONSTRUCTOR_EXPR IMPLEMENTATION. 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, "calculations are carried out. For this @@ -946,7 +974,9 @@ CLASS ZCL_DEMO_ABAP_CONSTRUCTOR_EXPR IMPLEMENTATION. ENDTRY. ENDLOOP. - output->next_section( `10. FILTER` ). +********************************************************************** + + output->next_section( `34) FILTER` ). "This section covers multiple examples demonstrating the syntactical variety "of the FILTER operator. @@ -1045,23 +1075,28 @@ CLASS ZCL_DEMO_ABAP_CONSTRUCTOR_EXPR IMPLEMENTATION. 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 "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 that are to be processed. + output->display( `35) Original table content` ). + "Method to fill demo internal tables with values to work with. "Tables are displayed showing the values. fill_struc_and_tab( ). - output->display( `11.1 Original table content` ). output->display( input = tab1 name = `tab1` ). output->display( input = tab2 name = `tab2` ). 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. "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->next_section( `11.2 FOR ... WHILE/UNTIL ... ` && +********************************************************************** + + output->next_section( `37) FOR ... WHILE/UNTIL ... ` && `(DO/WHILE 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 = for6 name = `for6` ). - output->next_section( `12. REDUCE` ). +********************************************************************** + + output->next_section( `38) REDUCE (1)` ). "The examples demonstrate the REDUCE operator using values contained in "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 = sentence name = `sentence` ). +********************************************************************** + + output->next_section( `39) REDUCE (2)` ). + "The examples demonstrate summations using the REDUCE operator. "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 @@ -1237,6 +1280,10 @@ CLASS ZCL_DEMO_ABAP_CONSTRUCTOR_EXPR IMPLEMENTATION. output->display( input = sum1 name = `sum1` ). output->display( input = sum2 name = `sum2` ). +********************************************************************** + + output->next_section( `40) REDUCE (3)` ). + "The examples demonstrate the concatenation of strings "1) without 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 = conc3 name = `conc3` ). - output->next_section( `13. LET Expressions` ). +********************************************************************** + + output->next_section( `41) LET Expressions (1)` ). "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->next_section( `42) LET Expressions (2)` ). + "2) LET within a constructor expression with COND: 12 o'clock is "specified as value for the LET expression. Based on this value, checks "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->next_section( `43) LET Expressions (3)` ). + "3) An internal table that includes three components is created and "filled. A loop across this table is carried out. The purpose of 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` ). 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. \ No newline at end of file