This commit is contained in:
danrega
2025-07-08 17:20:53 +02:00
parent cb13762536
commit a82e977de0
3 changed files with 200 additions and 46 deletions

View File

@@ -1109,10 +1109,8 @@ TYPES BEGIN OF address_type.
INCLUDE STRUCTURE city_struc AS city RENAMING WITH SUFFIX _city.
TYPES END OF address_type.
DATA component_names type string_table.
LOOP AT CAST cl_abap_structdescr( cl_abap_typedescr=>describe_by_name( 'ADDRESS_TYPE' ) )->components INTO DATA(comp).
APPEND comp-name to component_names.
ENDLOOP.
DATA(component_names) = VALUE string_table( FOR wa IN CAST cl_abap_structdescr(
cl_abap_typedescr=>describe_by_name( 'ADDRESS_TYPE' ) )->components ( CONV #( wa-name ) ) ).
*Content of COMPONENT_NAMES:
*TITLE

View File

@@ -1272,7 +1272,7 @@ ASSERT sy-subrc = 8.
"Specified time stamp is invalid -> sy-subrc = 12
CONVERT TIME STAMP CONV timestamp( '20249999112458' )
TIME ZONE 'NOPE'
TIME ZONE 'EST'
INTO DATE dat.
ASSERT sy-subrc = 12.
```

View File

@@ -208,13 +208,13 @@ SELECT id FROM @itab AS tab
<tr>
<td>
`... AND ...` <br> `... OR ...` <br> `... ( ... ) ...`
`... AND [NOT] ...` <br> `... OR [NOT] ...` <br> `... ( ... ) ...`
</td>
<td>
Combining multiple logical expressions into one logical expression using `AND` or `OR`. To further detail out the desired condition, expressions within parentheses are possible.
Combining multiple logical expressions into one logical expression using `AND` or `OR` (inlcuding negations). To further detail out the desired condition, expressions within parentheses are possible.
</td>
@@ -222,17 +222,27 @@ Combining multiple logical expressions into one logical expression using `AND` o
``` abap
SELECT id FROM @itab AS tab
WHERE id = 1 AND animal = 'bear'
INTO TABLE @it.
WHERE animal = 'bear' AND count = 5
INTO TABLE @it.
SELECT id FROM @itab AS tab
WHERE animal = 'kangaroo' OR count = 4
INTO TABLE @it.
INTO TABLE @it.
SELECT id FROM @itab AS tab
WHERE ( id = 1 AND animal = 'bear' )
OR ( id = 20 AND animal = 'lion' )
INTO TABLE @it.
WHERE ( animal = 'bear' AND count = 5 )
AND ( animal = 'lion' AND count = 20 )
INTO TABLE @it.
SELECT id FROM @itab AS tab
WHERE ( animal = 'bear' AND count = 5 )
OR ( animal = 'lion' AND count = 20 )
INTO TABLE @it.
SELECT id FROM @itab AS tab
WHERE count > 10
OR NOT ( animal = 'kangaroo' AND count = 8 )
INTO TABLE @it.
```
</td>
@@ -316,7 +326,7 @@ SELECT id FROM @itab AS tab
<td>
Checks whether the content of the left operand matches (or does not match) a specified pattern. The pattern can be specified by using wildcard characters. `%` stands for any character string, including an empty string. `_` stands for any character. <br> Using the `ESCAPE` addition, you can specify a single-character escape character of length 1 (e.g. `#`) in front of a wildcard character or the escaped character itsef. For example, to search for the pattern `100%`, you may use an expression such as the the following: `... LIKE '100#%' ESCAPE '#' ...`.
Checks whether the content of the left operand matches (or does not match) a specified pattern. The pattern can be specified by using wildcard characters. `%` stands for any character string, including an empty string. `_` stands for any character. <br> Using the `ESCAPE` addition, you can specify a single-character escape character of length 1 (e.g. `#`) in front of a wildcard character or the escaped character itself. For example, to search for the pattern `100%`, you may use an expression such as the the following: `... LIKE '100#%' ESCAPE '#' ...`.
</td>
@@ -706,7 +716,7 @@ CLASS zcl_demo_abap IMPLEMENTATION.
*&---------------------------------------------------------------------*
SELECT id FROM @itab AS tab
WHERE id = 1 AND animal = 'bear'
WHERE animal = 'bear' AND count = 5
INTO TABLE @it. "1
SELECT id FROM @itab AS tab
@@ -717,15 +727,30 @@ CLASS zcl_demo_abap IMPLEMENTATION.
"in parentheses is false (AND is used between the expressions in parentheses).
"In contrast, the example below returns an entry because of using OR.
SELECT id FROM @itab AS tab
WHERE ( id = 1 AND animal = 'bear' )
AND ( id = 20 AND animal = 'lion' )
WHERE ( animal = 'bear' AND count = 5 )
AND ( animal = 'lion' AND count = 20 )
INTO TABLE @it. "no entry
SELECT id FROM @itab AS tab
WHERE ( id = 1 AND animal = 'bear' )
OR ( id = 20 AND animal = 'lion' )
WHERE ( animal = 'bear' AND count = 5 )
OR ( animal = 'lion' AND count = 20 )
INTO TABLE @it. "1
"Negations with NOT
SELECT id FROM @itab AS tab
WHERE count > 4
AND NOT ( animal = 'kangaroo' AND count = 8 )
INTO TABLE @it. "1,2,3,4,5,8,9,11
SELECT id FROM @itab AS tab
WHERE count > 4
INTO TABLE @it.
SELECT id FROM @itab AS tab
WHERE count > 10
OR NOT ( animal = 'kangaroo' AND count = 8 )
INTO TABLE @it. "1,2,3,4,5,6,8,9,10,11,12
*&---------------------------------------------------------------------*
*& ... a [=|<>|>|<|...] [ALL|ANY|SOME] ( SELECT ... ) ...
*&---------------------------------------------------------------------*
@@ -1025,6 +1050,7 @@ CLASS zcl_demo_abap IMPLEMENTATION.
LEFT OUTER JOIN zdemo_abap_tab1 AS tab1 ON tab1~char1 = tab2~char1
WHERE tab1~char1 IS NULL
INTO TABLE @DATA(joined_tab).
*joined_tab:
*KEY_FIELD CHAR2
*4
@@ -1049,6 +1075,7 @@ CLASS zcl_demo_abap IMPLEMENTATION.
FROM zdemo_abap_tab2 AS tab2
LEFT OUTER JOIN zdemo_abap_tab1 AS tab1 ON tab1~char1 = tab2~char1
INTO TABLE @joined_tab_w_null_ind INDICATORS NULL STRUCTURE nulls.
*joined_tab_w_null_ind:
*S2 NULLS
*KEY_FIELD CHAR2 KEY_FIELD CHAR2
*1 y
@@ -1065,6 +1092,7 @@ CLASS zcl_demo_abap IMPLEMENTATION.
LEFT OUTER JOIN zdemo_abap_tab1 AS tab1 ON tab1~char1 = tab2~char1
WHERE tab1~char1 IS NOT NULL
INTO TABLE @joined_tab.
*joined_tab:
*KEY_FIELD CHAR2
*1 y
*2 y
@@ -1216,18 +1244,21 @@ CLASS zcl_demo_abap IMPLEMENTATION.
LOOP AT itab INTO DATA(wa) WHERE num = 0.
str &&= wa-id.
ENDLOOP.
ASSERT str = `13`.
CLEAR str.
LOOP AT itab INTO wa WHERE num > 20.
str &&= wa-id.
ENDLOOP.
ASSERT str = `45`.
CLEAR str.
"Combination of one or more logical expressions with the Boolean operators
"NOT, AND, OR, EQUIV where parentheses are possible
LOOP AT itab INTO wa WHERE id >= 3 and num > 5.
LOOP AT itab INTO wa WHERE id >= 3 AND num > 5.
str &&= wa-id.
ENDLOOP.
ASSERT str = `45`.
CLEAR str.
"Two logical expressions can be combined with EQUIV, which creates a new
@@ -1244,21 +1275,25 @@ CLASS zcl_demo_abap IMPLEMENTATION.
LOOP AT itab INTO wa WHERE id > 2 EQUIV num < 10.
str &&= wa-id.
ENDLOOP.
ASSERT str = `23`.
CLEAR str.
LOOP AT itab INTO wa WHERE num >= 40 OR num = 0.
str &&= wa-id.
ENDLOOP.
ASSERT str = `1345`.
CLEAR str.
LOOP AT itab INTO wa WHERE NOT num = 0.
str &&= wa-id.
ENDLOOP.
ASSERT str = `245`.
CLEAR str.
LOOP AT itab INTO wa WHERE ( id < 5 AND num > 10 ) AND text = `abc`.
str &&= wa-id.
ENDLOOP.
ASSERT str = `2`.
CLEAR str.
"Comparison operators for character-like data types
@@ -1266,59 +1301,69 @@ CLASS zcl_demo_abap IMPLEMENTATION.
LOOP AT itab INTO wa WHERE text CO `abc`.
str &&= wa-id.
ENDLOOP.
ASSERT str = `12`.
CLEAR str.
"contains not only
LOOP AT itab INTO wa WHERE text CN `abc`.
str &&= wa-id.
ENDLOOP.
ASSERT str = `345`.
CLEAR str.
"contains string
LOOP AT itab INTO wa WHERE text CS `ef`.
str &&= wa-id.
ENDLOOP.
ASSERT str = `34`.
CLEAR str.
"contains no string
LOOP AT itab INTO wa WHERE text NS `ef`.
str &&= wa-id.
ENDLOOP.
ASSERT str = `125`.
CLEAR str.
"contains any
LOOP AT itab INTO wa WHERE text CA `xyzi`.
str &&= wa-id.
ENDLOOP.
ASSERT str = `5`.
CLEAR str.
"contains not any
LOOP AT itab INTO wa WHERE text NA `a`.
str &&= wa-id.
ENDLOOP.
ASSERT str = `345`.
CLEAR str.
"conforms to pattern
LOOP AT itab INTO wa WHERE text CP `*c`.
str &&= wa-id.
ENDLOOP.
ASSERT str = `12`.
CLEAR str.
"does not conform to pattern
LOOP AT itab INTO wa WHERE text NA `*c`.
str &&= wa-id.
ENDLOOP.
ASSERT str = `345`.
CLEAR str.
"[NOT] BETWEEN ... AND ...
LOOP AT itab INTO wa WHERE num BETWEEN 5 AND 45.
str &&= wa-id.
ENDLOOP.
ASSERT str = `24`.
CLEAR str.
LOOP AT itab INTO wa WHERE num NOT BETWEEN 5 AND 45.
str &&= wa-id.
ENDLOOP.
ASSERT str = `135`.
CLEAR str.
"[NOT] IN ranges_table
@@ -1328,6 +1373,7 @@ CLASS zcl_demo_abap IMPLEMENTATION.
LOOP AT itab INTO wa WHERE num IN rangestab.
str &&= wa-id.
ENDLOOP.
ASSERT str = `24`.
CLEAR str.
rangestab = VALUE #( ( sign = `I` option = `LT` low = 5 )
@@ -1336,39 +1382,46 @@ CLASS zcl_demo_abap IMPLEMENTATION.
LOOP AT itab INTO wa WHERE num IN rangestab.
str &&= wa-id.
ENDLOOP.
ASSERT str = `1345`.
CLEAR str.
"IS [NOT] INITIAL
LOOP AT itab INTO wa WHERE num IS INITIAL.
str &&= wa-id.
ENDLOOP.
ASSERT str = `13`.
CLEAR str.
LOOP AT itab INTO wa WHERE num IS NOT INITIAL.
str &&= wa-id.
ENDLOOP.
ASSERT str = `245`.
CLEAR str.
"IS [NOT] BOUND
LOOP AT itab INTO wa WHERE ref IS BOUND.
str &&= wa-id.
ENDLOOP.
ASSERT str = `135`.
CLEAR str.
LOOP AT itab INTO wa WHERE ref IS NOT BOUND.
str &&= wa-id.
ENDLOOP.
ASSERT str = `24`.
CLEAR str.
"IS [NOT] INSTANCE OF
LOOP AT itab INTO wa WHERE oref IS INSTANCE OF cl_system_uuid.
str &&= wa-id.
ENDLOOP.
ASSERT str = `13`.
CLEAR str.
LOOP AT itab INTO wa WHERE oref IS NOT INSTANCE OF cl_system_uuid.
str &&= wa-id.
ENDLOOP.
ASSERT str = `245`.
CLEAR str.
"Dynamic WHERE condition
@@ -1377,6 +1430,7 @@ CLASS zcl_demo_abap IMPLEMENTATION.
LOOP AT itab INTO wa WHERE (dynamic_where_cond).
str &&= wa-id.
ENDLOOP.
ASSERT str = `45`.
CLEAR str.
DATA(dynamic_where_cond_tab) = VALUE string_table( ( `num > 20` )
@@ -1386,6 +1440,7 @@ CLASS zcl_demo_abap IMPLEMENTATION.
LOOP AT itab INTO wa WHERE (dynamic_where_cond_tab).
str &&= wa-id.
ENDLOOP.
ASSERT str = `5`.
CLEAR str.
*&---------------------------------------------------------------------*
@@ -1395,91 +1450,192 @@ CLASS zcl_demo_abap IMPLEMENTATION.
DATA(itab_copy) = itab.
DELETE itab WHERE num > 20.
ASSERT REDUCE string( INIT string = ``
FOR <line> IN itab
NEXT string &&= <line>-id ) = `123`.
itab = itab_copy.
DELETE itab WHERE num = 0.
ASSERT REDUCE string( INIT string = ``
FOR <line> IN itab
NEXT string &&= <line>-id ) = `245`.
itab = itab_copy.
DELETE itab WHERE num > 5 AND id >= 3.
ASSERT REDUCE string( INIT string = ``
FOR <line> IN itab
NEXT string &&= <line>-id ) = `123`.
itab = itab_copy.
DELETE itab WHERE num >= 40 OR num = 0.
ASSERT REDUCE string( INIT string = ``
FOR <line> IN itab
NEXT string &&= <line>-id ) = `2`.
itab = itab_copy.
DELETE itab WHERE NOT num = 0.
ASSERT REDUCE string( INIT string = ``
FOR <line> IN itab
NEXT string &&= <line>-id ) = `13`.
itab = itab_copy.
DELETE itab WHERE ( id < 5 AND num > 10 ) AND text = `abc`.
ASSERT REDUCE string( INIT string = ``
FOR <line> IN itab
NEXT string &&= <line>-id ) = `1345`.
itab = itab_copy.
"contains only
DELETE itab WHERE text CO `abc`.
ASSERT REDUCE string( INIT string = ``
FOR <line> IN itab
NEXT string &&= <line>-id ) = `345`.
itab = itab_copy.
"contains not only
DELETE itab WHERE text CN `abc`.
ASSERT REDUCE string( INIT string = ``
FOR <line> IN itab
NEXT string &&= <line>-id ) = `12`.
itab = itab_copy.
"contains string
DELETE itab WHERE text CS `ef`.
ASSERT REDUCE string( INIT string = ``
FOR <line> IN itab
NEXT string &&= <line>-id ) = `125`.
itab = itab_copy.
"contains no string
DELETE itab WHERE text NS `ef`.
ASSERT REDUCE string( INIT string = ``
FOR <line> IN itab
NEXT string &&= <line>-id ) = `34`.
itab = itab_copy.
"contains any
DELETE itab WHERE text CA `xyzi`.
ASSERT REDUCE string( INIT string = ``
FOR <line> IN itab
NEXT string &&= <line>-id ) = `1234`.
itab = itab_copy.
"contains not any
DELETE itab WHERE text NA `a`.
ASSERT REDUCE string( INIT string = ``
FOR <line> IN itab
NEXT string &&= <line>-id ) = `12`.
itab = itab_copy.
"conforms to pattern
DELETE itab WHERE text CP `*c`.
ASSERT REDUCE string( INIT string = ``
FOR <line> IN itab
NEXT string &&= <line>-id ) = `345`.
itab = itab_copy.
"does not conform to pattern
DELETE itab WHERE text NA `*c`.
ASSERT REDUCE string( INIT string = ``
FOR <line> IN itab
NEXT string &&= <line>-id ) = `12`.
itab = itab_copy.
DELETE itab WHERE num BETWEEN 5 AND 45.
ASSERT REDUCE string( INIT string = ``
FOR <line> IN itab
NEXT string &&= <line>-id ) = `135`.
itab = itab_copy.
DELETE itab WHERE num NOT BETWEEN 5 AND 45.
ASSERT REDUCE string( INIT string = ``
FOR <line> IN itab
NEXT string &&= <line>-id ) = `24`.
itab = itab_copy.
rangestab = VALUE #( ( sign = `I` option = `BT` low = 5 high = 45 ) ).
DELETE itab WHERE num IN rangestab.
ASSERT REDUCE string( INIT string = ``
FOR <line> IN itab
NEXT string &&= <line>-id ) = `135`.
itab = itab_copy.
DELETE itab WHERE num IS INITIAL.
ASSERT REDUCE string( INIT string = ``
FOR <line> IN itab
NEXT string &&= <line>-id ) = `245`.
itab = itab_copy.
DELETE itab WHERE num IS NOT INITIAL.
ASSERT REDUCE string( INIT string = ``
FOR <line> IN itab
NEXT string &&= <line>-id ) = `13`.
itab = itab_copy.
DELETE itab WHERE ref IS BOUND.
ASSERT REDUCE string( INIT string = ``
FOR <line> IN itab
NEXT string &&= <line>-id ) = `24`.
itab = itab_copy.
DELETE itab WHERE ref IS NOT BOUND.
ASSERT REDUCE string( INIT string = ``
FOR <line> IN itab
NEXT string &&= <line>-id ) = `135`.
itab = itab_copy.
DELETE itab WHERE oref IS INSTANCE OF cl_system_uuid.
ASSERT REDUCE string( INIT string = ``
FOR <line> IN itab
NEXT string &&= <line>-id ) = `245`.
itab = itab_copy.
DELETE itab WHERE oref IS NOT INSTANCE OF cl_system_uuid.
ASSERT REDUCE string( INIT string = ``
FOR <line> IN itab
NEXT string &&= <line>-id ) = `13`.
itab = itab_copy.
dynamic_where_cond = `num > 20`.
DELETE itab WHERE (dynamic_where_cond).
ASSERT REDUCE string( INIT string = ``
FOR <line> IN itab
NEXT string &&= <line>-id ) = `123`.
itab = itab_copy.
dynamic_where_cond_tab = VALUE string_table( ( `num > 20` )
( `AND` )
( `id > 4` ) ).
DELETE itab WHERE (dynamic_where_cond_tab).
ASSERT REDUCE string( INIT string = ``
FOR <line> IN itab
NEXT string &&= <line>-id ) = `1234`.
itab = itab_copy.
*&---------------------------------------------------------------------*
@@ -1487,99 +1643,99 @@ CLASS zcl_demo_abap IMPLEMENTATION.
*&---------------------------------------------------------------------*
READ TABLE itab INTO DATA(line) WHERE num > 20.
DATA(tabix) = sy-tabix.
ASSERT sy-tabix = 4.
"The following statement issues a warning, which can be suppressed by a
"pragma. For better performance, the WHERE clause should be replaced by
"a key specification with a simple component or operand pair list.
READ TABLE itab INTO line WHERE num = 0 ##read_where_ok.
tabix = sy-tabix.
ASSERT sy-tabix = 1.
READ TABLE itab INTO line WITH KEY num = 0.
tabix = sy-tabix.
ASSERT sy-tabix = 1.
READ TABLE itab INTO line WHERE num > 5 AND id >= 3.
tabix = sy-tabix.
ASSERT sy-tabix = 4.
READ TABLE itab INTO line WHERE NOT num = 0.
tabix = sy-tabix.
ASSERT sy-tabix = 2.
READ TABLE itab INTO line WHERE ( id < 5 AND num > 10 ) AND text = `abc`.
tabix = sy-tabix.
ASSERT sy-tabix = 2.
"contains only
READ TABLE itab INTO line WHERE text CO `abc`.
tabix = sy-tabix.
ASSERT sy-tabix = 1.
"contains not only
READ TABLE itab INTO line WHERE text CN `abc`.
tabix = sy-tabix.
ASSERT sy-tabix = 3.
"contains string
READ TABLE itab INTO line WHERE text CS `ef`.
tabix = sy-tabix.
ASSERT sy-tabix = 3.
"contains no string
READ TABLE itab INTO line WHERE text NS `ef`.
tabix = sy-tabix.
ASSERT sy-tabix = 1.
"contains any
READ TABLE itab INTO line WHERE text CA `xyzi`.
tabix = sy-tabix.
ASSERT sy-tabix = 5.
"contains not any
READ TABLE itab INTO line WHERE text NA `a`.
tabix = sy-tabix.
ASSERT sy-tabix = 3.
"conforms to pattern
READ TABLE itab INTO line WHERE text CP `*c`.
tabix = sy-tabix.
ASSERT sy-tabix = 1.
"does not conform to pattern
READ TABLE itab INTO line WHERE text NA `*c`.
tabix = sy-tabix.
ASSERT sy-tabix = 3.
READ TABLE itab INTO line WHERE num BETWEEN 5 AND 45.
tabix = sy-tabix.
ASSERT sy-tabix = 2.
READ TABLE itab INTO line WHERE num NOT BETWEEN 5 AND 45.
tabix = sy-tabix.
ASSERT sy-tabix = 1.
rangestab = VALUE #( ( sign = `I` option = `BT` low = 5 high = 45 ) ).
READ TABLE itab INTO line WHERE num IN rangestab.
tabix = sy-tabix.
ASSERT sy-tabix = 2.
"Same as above. Without the pragma, a warning is issued. It is
"recommended that you specify a key and a component or operand
"pair list.
READ TABLE itab INTO line WHERE num IS INITIAL ##read_where_ok.
tabix = sy-tabix.
ASSERT sy-tabix = 1.
READ TABLE itab INTO line WHERE num IS NOT INITIAL.
tabix = sy-tabix.
ASSERT sy-tabix = 2.
READ TABLE itab INTO line WHERE ref IS BOUND.
tabix = sy-tabix.
ASSERT sy-tabix = 1.
READ TABLE itab INTO line WHERE ref IS NOT BOUND.
tabix = sy-tabix.
ASSERT sy-tabix = 2.
READ TABLE itab INTO line WHERE oref IS INSTANCE OF cl_system_uuid.
tabix = sy-tabix.
ASSERT sy-tabix = 1.
READ TABLE itab INTO line WHERE oref IS NOT INSTANCE OF cl_system_uuid.
tabix = sy-tabix.
ASSERT sy-tabix = 2.
dynamic_where_cond = `num > 20`.
READ TABLE itab INTO line WHERE (dynamic_where_cond).
tabix = sy-tabix.
ASSERT sy-tabix = 4.
dynamic_where_cond_tab = VALUE string_table( ( `num > 20` )
( `AND` )
( `id > 4` ) ).
READ TABLE itab INTO line WHERE (dynamic_where_cond_tab).
tabix = sy-tabix.
ASSERT sy-tabix = 5.
*&---------------------------------------------------------------------*
*& FILTER constructor operator
@@ -1692,7 +1848,7 @@ CLASS zcl_demo_abap IMPLEMENTATION.
DATA(it20) = VALUE int_tab_type( FOR w IN itab WHERE ( ref IS BOUND ) ( w-id ) ).
DATA(it21) = VALUE int_tab_type( FOR w IN itab WHERE ( ref IS NOT BOUND ) ( w-id ) ).
DATA(it22) = VALUE int_tab_type( FOR w IN itab WHERE ( oref IS INSTANCE OF cl_system_uuid ) ( w-id ) ).
DATA(it23) = VALUE int_tab_type( FOR w IN itab WHERE ( oref IS NOT INSTANCE OF cl_system_uuid ) ( w-id ) ).
DATA(it23) = VALUE int_tab_type( FOR w IN itab WHERE ( oref IS NOT INSTANCE OF cl_system_uuid ) ( w-id ) ).
dynamic_where_cond = `num > 20`.
DATA(it24) = VALUE int_tab_type( FOR w IN itab WHERE (dynamic_where_cond) ( w-id ) ).
dynamic_where_cond_tab = VALUE string_table( ( `num > 20` )