This commit is contained in:
danrega
2023-09-28 10:10:55 +02:00
parent 5b472c62ce
commit 5eb32e005c
15 changed files with 303 additions and 265 deletions

View File

@@ -1,6 +1,6 @@
***********************************************************************
*
* ABAP cheat sheet: Internal tables
* ABAP cheat sheet: Internal tables
*
* -------------------------- PURPOSE ----------------------------------
* - Example to demonstrate various syntactical options for working with
@@ -45,12 +45,9 @@ CLASS zcl_demo_abap_internal_tables DEFINITION
PUBLIC SECTION.
INTERFACES: if_oo_adt_classrun.
CLASS-METHODS: class_constructor.
protected section.
PRIVATE SECTION.
"Creating structured data types.
TYPES: "Line types for internal tables
BEGIN OF struc1,
@@ -107,81 +104,9 @@ protected section.
CLASS-METHODS:
fill_dbtabs,
fill_itabs_for_corresponding.
ENDCLASS.
CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
METHOD class_constructor.
fill_dbtabs( ).
ENDMETHOD.
METHOD fill_dbtabs.
"Initializing and filling of database tables to have data to work with
DELETE FROM zdemo_abap_tab1.
DELETE FROM zdemo_abap_tab2.
MODIFY zdemo_abap_tab1 FROM TABLE @( VALUE #(
( key_field = 100 char1 = 'aaa' char2 = 'bbb' num1 = 1 num2 = 2 )
( key_field = 200 char1 = 'ccc' char2 = 'ddd' num1 = 3 num2 = 4 )
( key_field = 300 char1 = 'eee' char2 = 'fff' num1 = 5 num2 = 6 )
( key_field = 400 char1 = 'ggg' char2 = 'hhh' num1 = 7 num2 = 8 )
) ).
MODIFY zdemo_abap_tab2 FROM TABLE @( VALUE #(
( key_field = 500 char1 = 'iii' num1 = 10 numlong = 1000 )
( key_field = 600 char1 = 'kkk' num1 = 12 numlong = 2000 )
( key_field = 700 char1 = 'mmm' num1 = 14 numlong = 3000 )
( key_field = 800 char1 = 'ooo' num1 = 15 numlong = 4000 )
) ).
ENDMETHOD.
METHOD fill_itabs_for_corresponding.
tab1 = VALUE #( ( a = 1 b = 'aaa' c = 'aaa' d = 'A' )
( a = 2 b = 'bbb' c = 'bbb' d = 'B' ) ).
tab2 = VALUE #( ( a = 3 b = 'ccc' e = 'ccc' f = `CCC` )
( a = 4 b = 'ddd' e = 'ddd' f = `DDD` ) ).
tab3 = VALUE #( ( LINES OF tab1 ) ).
tab4 = VALUE #( ( a = 1 b = 'xxx' e = 'yyy' f = `ZZZ` )
( LINES OF tab2 ) ).
itab_nested1 = VALUE #(
( key_field = 1 char1 = 'aaa'
tab = VALUE #( ( key_field = 1 num1 = 2 num2 = 3 )
( key_field = 2 num1 = 3 num2 = 4 )
( key_field = 3 num1 = 4 num2 = 5 ) ) )
( key_field = 2 char1 = 'bbb'
tab = VALUE #( ( key_field = 4 num1 = 5 num2 = 6 )
( key_field = 5 num1 = 6 num2 = 7 )
( key_field = 6 num1 = 7 num2 = 8 ) ) ) ).
itab_nested2 = VALUE #(
( key_field = 99 char2 = 'yyy' tab = VALUE #(
( key_field = 10 char1 = 'aaa'
char2 = 'bbb' num1 = 100 num2 = 200 )
( key_field = 20 char1 = 'ccc'
char2 = 'ddd' num1 = 300 num2 = 400 )
( key_field = 30 char1 = 'eee'
char2 = 'fff' num1 = 500 num2 = 600 ) ) )
( key_field = 100 char2 = 'zzz' tab = VALUE #(
( key_field = 40 char1 = 'ggg'
char2 = 'hhh' num1 = 700 num2 = 800 )
( key_field = 50 char1 = 'iii'
char2 = 'jjj' num1 = 900 num2 = 1000 )
( key_field = 60 char1 = 'kkk'
char2 = 'lll' num1 = 1100 num2 = 1200 ) ) ) ).
ENDMETHOD.
CLASS zcl_demo_abap_internal_tables IMPLEMENTATION.
METHOD if_oo_adt_classrun~main.
@@ -235,7 +160,7 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `3) Adding mutliple lines of an internal table to` &&
` another one` ).
` another one` ).
"No additions: All lines are added to the target internal table
APPEND LINES OF it_so TO it_st.
@@ -256,7 +181,7 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `4) Adding lines of an internal table to` &&
` another one by specifying the index range.` ).
` another one by specifying the index range.` ).
"When using only FROM, all lines are respected until the final
"table entry. When using only TO, all lines are respected
@@ -272,7 +197,7 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `5) Inserting lines of an internal table` &&
` into another one at a specific position` ).
` into another one at a specific position` ).
"Inserting a single line
INSERT VALUE #( a = 10 b = 'ggg' c = 'hhh' d = 'iii' )
@@ -292,7 +217,7 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
"Table on the right is constructed inline using VALUE and assigned
"Note: This way, existing table content is cleared.
it_st = VALUE #( ( line )
it_st = VALUE #( ( line )
( a = 2 b = 'ddd' c = 'eee' d = 'fff' ) ).
output->display( input = it_st name = `it_st` ).
@@ -300,7 +225,7 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `7) Creating a new table inline and adding lines` &&
` using a constructor expression` ).
` using a constructor expression` ).
"Internal table type
TYPES it_type LIKE it_st.
@@ -316,7 +241,7 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `8) Adding lines using constructor expressions ` &&
`and keeping existing table content` ).
`and keeping existing table content` ).
"BASE addition: existing table content is not removed
it_st = VALUE #( BASE it_st ( a = 5 b = 'mmm' c = 'nnn' d = 'ooo' )
@@ -328,13 +253,13 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `9) Adding lines from other internal tables using` &&
` constructor expressions` ).
` constructor expressions` ).
"With LINES OF itab specified within the pair of parentheses,
"all lines of the internal table are added; here, in the same
"expression another line is added as well
it_st = VALUE #( BASE it_st ( LINES OF it_st2 )
( a = 7 b = 'sss' c = 'ttt' d = 'uuu' )
( a = 7 b = 'sss' c = 'ttt' d = 'uuu' )
).
output->display( input = it_st name = `it_st` ).
@@ -342,7 +267,7 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `10) Copying table content (without constructor ` &&
`expression)` ).
`expression)` ).
"Assignment of a table to another one having a matching line type
it_st = it_st2.
@@ -366,9 +291,9 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `Copying content from another table that has ` &&
`a different line type ...` ).
output->display( `11a) ... and deleting existing table content ` &&
`using the CORRESPONDING operator` ).
`a different line type ...` ).
output->display( `12) ... and deleting existing table content ` &&
`using the CORRESPONDING operator` ).
tab1 = CORRESPONDING #( tab2 ).
@@ -378,8 +303,8 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `11b) ... and deleting existing table content ` &&
`using MOVE-CORRESPONDING` ).
output->next_section( `13) ... and deleting existing table content ` &&
`using MOVE-CORRESPONDING` ).
MOVE-CORRESPONDING tab2 TO tab1.
@@ -389,8 +314,8 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `11c) ... and keeping existing table ` &&
`content using the CORRESPONDING operator` ).
output->next_section( `14) ... and keeping existing table ` &&
`content using the CORRESPONDING operator` ).
tab1 = CORRESPONDING #( BASE ( tab1 ) tab2 ).
@@ -400,8 +325,8 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `11d) ... and keeping existing table ` &&
`content using MOVE-CORRESPONDING` ).
output->next_section( `15) ... and keeping existing table ` &&
`content using MOVE-CORRESPONDING` ).
MOVE-CORRESPONDING tab2 TO tab1 KEEPING TARGET LINES.
@@ -411,8 +336,8 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `11e) ... respecting component ` &&
`mapping` ).
output->next_section( `16) ... respecting component ` &&
`mapping` ).
"Specifying components of a source table that are assigned to the
"components of a target table in mapping relationships
@@ -424,7 +349,7 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `11f) ... excluding components` ).
output->next_section( `17) ... excluding components` ).
"Excluding components from the assignment
tab1 = CORRESPONDING #( tab2 EXCEPT b ).
@@ -433,7 +358,7 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `11g) ... excluding components and using MAPPING` ).
output->next_section( `18) ... excluding components and using MAPPING` ).
"EXCEPT * means that all components remain initial not specified
"for mapping
@@ -445,7 +370,7 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `11h) ... discarding duplicates` ).
output->next_section( `19) ... discarding duplicates` ).
"Preventing runtime errors if duplicate lines are assigned to
"target table that is defined to only accept unique keys.
@@ -463,8 +388,8 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `11i) Copying data from a deep ` &&
`internal table to another deep internal table` ).
output->next_section( `20) Copying data from a deep ` &&
`internal table to another deep internal table` ).
output->display( `Original table content` ).
output->display( input = itab_nested1 name = `itab_nested1` ).
@@ -472,8 +397,8 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `11j) ... deleting ` &&
`existing content (CORRESPONDING operator)` ).
output->next_section( `21) ... deleting ` &&
`existing content (CORRESPONDING operator)` ).
itab_nested2 = CORRESPONDING #( DEEP itab_nested1 ).
@@ -483,8 +408,8 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `11k) ... deleting ` &&
`existing content (MOVE-CORRESPONDING)` ).
output->next_section( `22) ... deleting ` &&
`existing content (MOVE-CORRESPONDING)` ).
MOVE-CORRESPONDING itab_nested1 TO itab_nested2
EXPANDING NESTED TABLES.
@@ -495,8 +420,8 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `11l) ... keeping ` &&
`existing content (CORRESPONDING operator)` ).
output->next_section( `23) ... keeping ` &&
`existing content (CORRESPONDING operator)` ).
itab_nested2 = CORRESPONDING #( DEEP BASE ( itab_nested2 )
itab_nested1 ).
@@ -507,8 +432,8 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `11m) ... keeping ` &&
`existing content (MOVE-CORRESPONDING)` ).
output->next_section( `24) ... keeping ` &&
`existing content (MOVE-CORRESPONDING)` ).
MOVE-CORRESPONDING itab_nested1 TO itab_nested2
EXPANDING NESTED TABLES KEEPING TARGET LINES.
@@ -518,8 +443,8 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `Filling internal tables: Excursions` ).
output->display( `12) Selecting multiple rows from a database ` &&
`table into an internal table` ).
output->display( `25) Selecting multiple rows from a database ` &&
`table into an internal table` ).
SELECT FROM zdemo_abap_tab1
FIELDS key_field, char1, char2, num1, num2
@@ -530,8 +455,8 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `13) Sequentially adding multiple rows from ` &&
`a database table to an internal table` ).
output->next_section( `26) Sequentially adding multiple rows from ` &&
`a database table to an internal table` ).
DATA itab TYPE TABLE OF zdemo_abap_tab1 WITH NON-UNIQUE KEY client key_field.
@@ -554,9 +479,9 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `14) Adding multiple rows from a database table ` &&
`to an internal table that has a different line type than the ` &&
`database table and keeping existing table content` ).
output->next_section( `27) Adding multiple rows from a database table ` &&
`to an internal table that has a different line type than the ` &&
`database table and keeping existing table content` ).
SELECT FROM zdemo_abap_tab2
FIELDS *
@@ -567,9 +492,9 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `15) Adding multiple rows from a database table ` &&
`to an internal table that has a different line type than the ` &&
`database table and deleting existing table content` ).
output->next_section( `28) Adding multiple rows from a database table ` &&
`to an internal table that has a different line type than the ` &&
`database table and deleting existing table content` ).
SELECT FROM zdemo_abap_tab2
FIELDS *
@@ -580,8 +505,8 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `16) Adding multiple rows from an internal table ` &&
`to an internal table using SELECT` ).
output->next_section( `29) Adding multiple rows from an internal table ` &&
`to an internal table using SELECT` ).
SELECT key_field, char1, char2, num1, num2
FROM @itab AS itab_alias
@@ -591,14 +516,14 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `17) Combining data of multiple tables into an` &&
` internal table using an inner join` ).
output->next_section( `30) Combining data of multiple tables into an` &&
` internal table using an inner join` ).
"Filling table to be selected from
itab = VALUE #( ( key_field = 500 char1 = 'uuu' char2 = 'vvv'
num1 = 501 num2 = 502 )
num1 = 501 num2 = 502 )
( key_field = 600 char1 = 'www' char2 = 'xxx'
num1 = 601 num2 = 602 ) ).
num1 = 601 num2 = 602 ) ).
"SELECT list includes fields from both tables
"If there are no equivalent entries in the first or second table,
@@ -614,8 +539,8 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `18) Filling internal table ` &&
`using a subquery (1)` ).
output->next_section( `31) Filling internal table ` &&
`using a subquery (1)` ).
"A subquery is specified in the WHERE clause
"Here, data is selected from a database table depending on
@@ -630,8 +555,8 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `19) Filling internal table ` &&
`using a subquery (2)` ).
output->next_section( `32) Filling internal table ` &&
`using a subquery (2)` ).
"A subquery using EXISTS in the WHERE clause.
"In the example, data is selected from a database table depending
@@ -649,9 +574,9 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `20) Filling an internal table from a table ` &&
`depending on the existence of data in another internal table ` &&
`using the addition FOR ALL ENTRIES` ).
output->next_section( `33) Filling an internal table from a table ` &&
`depending on the existence of data in another internal table ` &&
`using the addition FOR ALL ENTRIES` ).
"In the example, data is selected from a database table depending
"on the existence of data in an internal table. Only if a line
@@ -670,8 +595,8 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `21) Adding content from a database to internal` &&
` table by using alias names in the SELECT list` ).
output->next_section( `34) Adding content from a database to internal` &&
` table by using alias names in the SELECT list` ).
DATA itab2 TYPE TABLE OF zdemo_abap_tab2 WITH EMPTY KEY.
@@ -688,7 +613,7 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `22) FILTER: Filtering internal table by condition` ).
output->next_section( `35) FILTER: Filtering internal table by condition` ).
"This section covers multiple examples demonstrating the syntactical variety
"of the FILTER operator.
@@ -707,11 +632,11 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
DATA fi_tab3 TYPE HASHED TABLE OF fi_str WITH UNIQUE KEY a.
"Filling internal tables
fi_tab1 = VALUE #( ( a = 1 b = 'aaa' c = 'abc' )
( a = 2 b = 'bbb' c = 'def' )
( a = 3 b = 'ccc' c = 'hij' )
( a = 4 b = 'ddd' c = 'klm' )
( a = 5 b = 'eee' c = 'nop' ) ).
fi_tab1 = VALUE #( ( a = 1 b = 'aaa' c = 'abc' )
( a = 2 b = 'bbb' c = 'def' )
( a = 3 b = 'ccc' c = 'hij' )
( a = 4 b = 'ddd' c = 'klm' )
( a = 5 b = 'eee' c = 'nop' ) ).
fi_tab2 = fi_tab1.
fi_tab3 = fi_tab1.
@@ -789,8 +714,8 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `25) Inserting data into an internal table ` &&
`using a COLLECT statement` ).
output->next_section( `36) Inserting data into an internal table ` &&
`using a COLLECT statement` ).
"Internal table to work with
DATA itab_num TYPE SORTED TABLE OF l_type2
@@ -809,7 +734,7 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `Reading from internal tables` ).
output->next_section( `37) Reading from internal tables` ).
"Filling internal tables
it_st = VALUE #( ( a = 1 b = 'aaa' c = 'bbb' d = 'ccc' )
@@ -843,7 +768,7 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `26) Reading a single line into target area` ).
output->next_section( `38) Reading a single line into target area` ).
"The examples anticipate the reading of a line by index since the
"syntax requires to specify the reading via index or key. Both
@@ -880,7 +805,7 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `Reading a single line via index ...` ).
output->display( `27) ... using READ TABLE` ).
output->display( `39) ... using READ TABLE` ).
"Primary table index used implicitly
READ TABLE it_so_sec INTO DATA(wa3) INDEX 1.
@@ -910,7 +835,7 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `28) ... table expressions (1)` ).
output->next_section( `40) ... table expressions (1)` ).
"Reading via index; primary table index is used implicitly
DATA(lv1) = it_so_sec[ 2 ].
@@ -949,7 +874,7 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `29) ... table expressions (2)` ).
output->next_section( `41) ... table expressions (2)` ).
"Copying a table line via table expression and embedding in
"a constructor expression
@@ -973,7 +898,7 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `Reading a single line via table keys ...` ).
output->display( `30) ... using READ TABLE (1)` ).
output->display( `42) ... using READ TABLE (1)` ).
"Primary table key (COMPONENTS addition is optional)
READ TABLE it_so_sec INTO DATA(wa9)
@@ -1001,7 +926,7 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `31) ... using READ TABLE (2)` ).
output->next_section( `43) ... using READ TABLE (2)` ).
"Reading a line based on keys specified in a work area
"Here, the work area contains primary and secondary key values.
@@ -1029,7 +954,7 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `32) ... using table expressions` ).
output->next_section( `44) ... using table expressions` ).
"Primary table key (COMPONENTS addition is optional)
DATA(lv9) = it_so_sec[ KEY primary_key COMPONENTS a = 1 ].
@@ -1050,7 +975,7 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `33) Reading a single line via free key` ).
output->next_section( `45) Reading a single line via free key` ).
"Note: If there a multiple matching entries, the first found
"is returned.
READ TABLE it_so_sec INTO DATA(wa17) WITH KEY c = '###'.
@@ -1062,7 +987,7 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `34) Excursion: Addressing individual components` ).
output->next_section( `46) Excursion: Addressing individual components` ).
"Addressing a component using the component selector
DATA(comp1) = it_so_sec[ 1 ]-b.
@@ -1084,7 +1009,7 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `35) Checking if a line exists in an internal table` ).
output->next_section( `47) Checking if a line exists in an internal table` ).
"Defining the key
DATA(key1) = 2.
@@ -1109,8 +1034,8 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `36) Checking the index of a ` &&
`specific line` ).
output->next_section( `48) Checking the index of a ` &&
`specific line` ).
DATA(key2) = 4.
@@ -1166,8 +1091,8 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
|in the internal table.| ).
ENDIF.
output->next_section( `37) Checking how many lines are in an` &&
` internal table` ).
output->next_section( `49) Checking how many lines are in an` &&
` internal table` ).
DATA(itab_lines) = lines( it_so_sec ).
output->display( |The internal table consists of { itab_lines } | &&
@@ -1176,9 +1101,9 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `Processing multiple internal table lines ` &&
`sequentially` ).
output->display( `38a) Reading a complete table by sequentially ` &&
`reading all lines` ).
`sequentially` ).
output->display( `50) Reading a complete table by sequentially ` &&
`reading all lines` ).
"No further addition: All lines are respected.
LOOP AT it_so_sec ASSIGNING FIELD-SYMBOL(<fs4>).
@@ -1190,7 +1115,7 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->display( `38b) LOOP AT statements with different targets` ).
output->display( `51) LOOP AT statements with different targets` ).
"The following examples demonstrate the different targets that
"are possible for LOOP AT statements. In the example above,
@@ -1265,7 +1190,7 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `39) Reading multiple lines by an index range` ).
output->next_section( `52) Reading multiple lines by an index range` ).
"Specific lines in an index range are respected
"Note: FROM/TO alone can specified, too.
@@ -1278,7 +1203,7 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `40) Reading multiple lines by condition` ).
output->next_section( `53) Reading multiple lines by condition` ).
LOOP AT it_so_sec ASSIGNING FIELD-SYMBOL(<fs6>) WHERE a < 3.
"Modifying a component to visualize the reading of specific lines.
@@ -1289,8 +1214,8 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `41) Looping across a table without an interest` &&
` in the table content` ).
output->next_section( `54) Looping across a table without an interest` &&
` in the table content` ).
"Here, only the system fields are set.
LOOP AT it_so_sec TRANSPORTING NO FIELDS WHERE a < 3.
@@ -1302,7 +1227,7 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `42) Loop with table key specification` ).
output->next_section( `55) Loop with table key specification` ).
DATA it_st_em TYPE TABLE OF struc1 WITH EMPTY KEY.
@@ -1317,12 +1242,54 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
output->display( input = it_st_em name = `it_st_em` ).
**********************************************************************
output->next_section( `STEP addition in LOOP AT statements` ).
output->display( `56) Reversing loop order` ).
DATA(it_abc) = VALUE string_table( ( `a` ) ( `b` ) ( `c` ) ( `d` ) ( `e` ) ( `f` ) ).
DATA it_abc_result TYPE string_table.
"Reversing the loop order with the addition STEP
"Each line is read indicated by absolute value 1
LOOP AT it_abc ASSIGNING FIELD-SYMBOL(<step>) STEP -1.
APPEND <step> TO it_abc_result.
ENDLOOP.
output->display( input = it_abc_result name = `it_abc_result` ).
**********************************************************************
output->next_section( `57) Forward loop and defining step size` ).
"Forward loop indicated by positive integer, every second line is processed
CLEAR it_abc_result.
LOOP AT it_abc ASSIGNING FIELD-SYMBOL(<sec>) STEP 2.
APPEND <sec> TO it_abc_result.
ENDLOOP.
output->display( input = it_abc_result name = `it_abc_result` ).
**********************************************************************
output->next_section( `58) STEP addition combined with FROM/TO` ).
"Combining the STEP addition with other additions, e.g. FROM and TO
"Note: If the value after STEP is negative, the value after FROM
"must be greater than the value after TO.
CLEAR it_abc_result.
LOOP AT it_abc ASSIGNING FIELD-SYMBOL(<from_to>) FROM 6 TO 3 STEP -2.
APPEND <from_to> TO it_abc_result.
ENDLOOP.
output->display( input = it_abc_result name = `it_abc_result` ).
**********************************************************************
output->next_section( `Creating and filling tables using table ` &&
`iterations with FOR and VALUE` ).
output->display( `43) Retrieving values of one column in ` &&
`an internal table.` ).
`iterations with FOR and VALUE` ).
output->display( `59) Retrieving values of one column in ` &&
`an internal table.` ).
"Creating internal table type
TYPES ty_numbers TYPE TABLE OF i WITH EMPTY KEY.
@@ -1331,14 +1298,14 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
"evaluating a table using a table iteration with an iteration
"expressions within a constructor expression.
DATA(lv_num_a) = VALUE ty_numbers( FOR ls1 IN it_ha_sec
( ls1-a ) ).
( ls1-a ) ).
output->display( input = lv_num_a name = `lv_num_a` ).
**********************************************************************
output->next_section( `44) Retrieving values of one column in ` &&
`an internal table based on conditions` ).
output->next_section( `60) Retrieving values of one column in ` &&
`an internal table based on conditions` ).
DATA(lv_num_b) = VALUE ty_numbers( FOR ls2 IN it_ha_sec
WHERE ( a < 3 ) ( ls2-a ) ).
@@ -1347,30 +1314,31 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `45) Looping across 2 tables ` &&
`and retrieving values based on conditions` ).
output->next_section( `61) Looping across 2 tables ` &&
`and retrieving values based on conditions` ).
"Internal table type
TYPES tabtype LIKE it_so_sec.
DATA(itab_for_2tab) =
VALUE tabtype(
FOR ls3 IN it_ha_sec
FOR ls4 IN it_so_sec WHERE ( a = ls3-a )
( a = ls3-a b = ls4-b c = ls3-c d = ls4-d ) ).
FOR ls3 IN it_ha_sec
FOR ls4 IN it_so_sec WHERE ( a = ls3-a )
( a = ls3-a b = ls4-b c = ls3-c d = ls4-d ) ).
output->display( input = itab_for_2tab name = `itab_for_2tab` ).
**********************************************************************
output->next_section( `46) Retrieving and changing values from an ` &&
`internal tables sequentially` ).
output->next_section( `62) Retrieving and changing values from an ` &&
`internal tables sequentially` ).
DATA(it_changed) = VALUE tabtype( FOR ls5 IN it_so_sec
( a = ls5-a b = 'WWW' c = 'VVV' d = 'UUU' ) ).
( a = ls5-a b = 'WWW' c = 'VVV' d = 'UUU' ) ).
output->display( input = it_changed name = `it_changed` ).
**********************************************************************
output->next_section( `Sorting internal tables` ).
output->next_section( `63) Sorting internal tables` ).
"Creating structured data types
TYPES: BEGIN OF s1,
@@ -1401,14 +1369,14 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
it2 = it1.
output->display( `Original internal table content ` &&
`(it1 and it2 have the same content)` ).
`(it1 and it2 have the same content)` ).
output->display( input = it1 name = `it1` ).
output->display( input = it2 name = `it2` ).
**********************************************************************
output->next_section( `47) Sorting by primary table key` ).
output->next_section( `64) Sorting by primary table key` ).
"Primary key: component a
SORT it1.
@@ -1417,8 +1385,8 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `48) Sorting by primary table key in ascending` &&
` order` ).
output->next_section( `65) Sorting by primary table key in ascending` &&
` order` ).
"The sorting result is the same as above (where ASCENDING is used
"implicitly). Here, it is explicitly specified.
@@ -1428,8 +1396,8 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `49) Sorting by primary table key respecting all ` &&
`non-numeric fields` ).
output->next_section( `66) Sorting by primary table key respecting all ` &&
`non-numeric fields` ).
"Primary key: standard table key (all non-numeric fields)
SORT it2.
@@ -1444,8 +1412,8 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `50) Sorting by primary table key in ` &&
`descending order` ).
output->next_section( `67) Sorting by primary table key in ` &&
`descending order` ).
"Sorting in descending order and by primary table key
SORT it1 DESCENDING.
@@ -1454,7 +1422,7 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `51) Sorting by explicitly specified component (1)` ).
output->next_section( `68) Sorting by explicitly specified component (1)` ).
"Here, the component is the primary table key.
"The sorting result is the same as above.
SORT it1 BY a DESCENDING.
@@ -1463,7 +1431,7 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `52) Sorting by explicitly specified component (2)` ).
output->next_section( `69) Sorting by explicitly specified component (2)` ).
"Sorting by arbitrary, non-key field
SORT it1 BY d DESCENDING.
@@ -1472,8 +1440,8 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `53) Sorting by multiple explicitly specified` &&
` components` ).
output->next_section( `70) Sorting by multiple explicitly specified` &&
` components` ).
"Sorting by multiple components and specifying the sort order
SORT it1 BY b ASCENDING c DESCENDING.
@@ -1482,8 +1450,8 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `54) Sorting by respecting the values of all` &&
` components` ).
output->next_section( `71) Sorting by respecting the values of all` &&
` components` ).
"Sorting by considering the values of each field of the table line
SORT it1 BY table_line.
@@ -1492,7 +1460,7 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `Modifying internal table content` ).
output->next_section( `72) Modifying internal table content` ).
output->display( `Internal table content before modifications` ).
"Standard table
@@ -1506,7 +1474,7 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `55) Directly modifying recently read table lines` ).
output->next_section( `73) Directly modifying recently read table lines` ).
"READ TABLE
"Reading table line into target area (field symbol)
@@ -1525,7 +1493,7 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `56) Modifying internal table content using MODIFY` ).
output->next_section( `74) Modifying internal table content using MODIFY` ).
"Modifying table lines via key values
"Line that is used to modify internal table
line = VALUE #( a = 2 b = 'zzz' c = 'yyy' ).
@@ -1579,7 +1547,7 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `57) Deleting internal table content using DELETE` ).
output->next_section( `75) Deleting internal table content using DELETE` ).
"Deleting via index
"Primary table index is used implicitly.
DELETE it_st INDEX 1.
@@ -1620,9 +1588,9 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `Deleting adjacent duplicate entries` ).
output->next_section( `76) Deleting adjacent duplicate entries` ).
output->display( `Original table content (restored before` &&
` each of the following examples)` ).
` each of the following examples)` ).
it_st = VALUE #( ( a = 1 b = 'BBB' c = '###' d = '###' )
( a = 2 b = '###' c = '###' d = '###' )
@@ -1645,8 +1613,8 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->display( `58) Deleting adjacent duplicates based on` &&
` primary table key` ).
output->next_section( `77) Deleting adjacent duplicates based on` &&
` primary table key` ).
"Note: Using the primary table key can have unexpected consequences
"if the primary table key is the standard key or if it is empty.
@@ -1658,8 +1626,8 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `59) Deleting adjacent duplicates by comparing ` &&
`all field values` ).
output->next_section( `78) Deleting adjacent duplicates by comparing ` &&
`all field values` ).
DELETE ADJACENT DUPLICATES FROM it_st2 COMPARING ALL FIELDS.
@@ -1669,8 +1637,8 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `60) Deleting adjacent duplicates by comparing ` &&
`specific field values` ).
output->next_section( `79) Deleting adjacent duplicates by comparing ` &&
`specific field values` ).
DELETE ADJACENT DUPLICATES FROM it_st2 COMPARING a c.
@@ -1680,8 +1648,8 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `61) Deleting adjacent duplicates by using a` &&
` table key` ).
output->next_section( `80) Deleting adjacent duplicates by using a` &&
` table key` ).
"In this case, the result is the same as in the first example.
DELETE ADJACENT DUPLICATES FROM it_st2 USING KEY primary_key.
@@ -1690,7 +1658,7 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `62) Deleting the entire internal table content` ).
output->next_section( `81) Deleting the entire internal table content` ).
CLEAR it_st.
@@ -1710,7 +1678,7 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `Excursions` ).
output->display( `63) Secondary table keys and hashed tables` ).
output->display( `82) Secondary table keys and hashed tables` ).
"Declaring a hashed table
DATA hashed_tab
@@ -1749,7 +1717,7 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
**********************************************************************
output->next_section( `64) Empty keys in internal table created inline` ).
output->next_section( `83) Empty keys in internal table created inline` ).
"This example visualizes the fact that when using an inline
"construction like INTO TABLE @DATA(itab) in SELECT statements, the
"resulting table has an empty table key. Here, the key information
@@ -1785,6 +1753,67 @@ CLASS ZCL_DEMO_ABAP_INTERNAL_TABLES IMPLEMENTATION.
)->get_keys( ).
output->display( input = k2 name = `k2` ).
ENDMETHOD.
ENDCLASS.
METHOD class_constructor.
fill_dbtabs( ).
ENDMETHOD.
METHOD fill_dbtabs.
"Initializing and filling of database tables to have data to work with
DELETE FROM zdemo_abap_tab1.
DELETE FROM zdemo_abap_tab2.
MODIFY zdemo_abap_tab1 FROM TABLE @( VALUE #(
( key_field = 100 char1 = 'aaa' char2 = 'bbb' num1 = 1 num2 = 2 )
( key_field = 200 char1 = 'ccc' char2 = 'ddd' num1 = 3 num2 = 4 )
( key_field = 300 char1 = 'eee' char2 = 'fff' num1 = 5 num2 = 6 )
( key_field = 400 char1 = 'ggg' char2 = 'hhh' num1 = 7 num2 = 8 ) ) ).
MODIFY zdemo_abap_tab2 FROM TABLE @( VALUE #(
( key_field = 500 char1 = 'iii' num1 = 10 numlong = 1000 )
( key_field = 600 char1 = 'kkk' num1 = 12 numlong = 2000 )
( key_field = 700 char1 = 'mmm' num1 = 14 numlong = 3000 )
( key_field = 800 char1 = 'ooo' num1 = 15 numlong = 4000 ) ) ).
ENDMETHOD.
METHOD fill_itabs_for_corresponding.
tab1 = VALUE #( ( a = 1 b = 'aaa' c = 'aaa' d = 'A' )
( a = 2 b = 'bbb' c = 'bbb' d = 'B' ) ).
tab2 = VALUE #( ( a = 3 b = 'ccc' e = 'ccc' f = `CCC` )
( a = 4 b = 'ddd' e = 'ddd' f = `DDD` ) ).
tab3 = VALUE #( ( LINES OF tab1 ) ).
tab4 = VALUE #( ( a = 1 b = 'xxx' e = 'yyy' f = `ZZZ` )
( LINES OF tab2 ) ).
itab_nested1 = VALUE #(
( key_field = 1 char1 = 'aaa'
tab = VALUE #( ( key_field = 1 num1 = 2 num2 = 3 )
( key_field = 2 num1 = 3 num2 = 4 )
( key_field = 3 num1 = 4 num2 = 5 ) ) )
( key_field = 2 char1 = 'bbb'
tab = VALUE #( ( key_field = 4 num1 = 5 num2 = 6 )
( key_field = 5 num1 = 6 num2 = 7 )
( key_field = 6 num1 = 7 num2 = 8 ) ) ) ).
itab_nested2 = VALUE #(
( key_field = 99 char2 = 'yyy' tab = VALUE #(
( key_field = 10 char1 = 'aaa'
char2 = 'bbb' num1 = 100 num2 = 200 )
( key_field = 20 char1 = 'ccc'
char2 = 'ddd' num1 = 300 num2 = 400 )
( key_field = 30 char1 = 'eee'
char2 = 'fff' num1 = 500 num2 = 600 ) ) )
( key_field = 100 char2 = 'zzz' tab = VALUE #(
( key_field = 40 char1 = 'ggg'
char2 = 'hhh' num1 = 700 num2 = 800 )
( key_field = 50 char1 = 'iii'
char2 = 'jjj' num1 = 900 num2 = 1000 )
( key_field = 60 char1 = 'kkk'
char2 = 'lll' num1 = 1100 num2 = 1200 ) ) ) ).
ENDMETHOD.
ENDCLASS.