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. INCLUDE STRUCTURE city_struc AS city RENAMING WITH SUFFIX _city.
TYPES END OF address_type. TYPES END OF address_type.
DATA component_names type string_table. DATA(component_names) = VALUE string_table( FOR wa IN CAST cl_abap_structdescr(
LOOP AT CAST cl_abap_structdescr( cl_abap_typedescr=>describe_by_name( 'ADDRESS_TYPE' ) )->components INTO DATA(comp). cl_abap_typedescr=>describe_by_name( 'ADDRESS_TYPE' ) )->components ( CONV #( wa-name ) ) ).
APPEND comp-name to component_names.
ENDLOOP.
*Content of COMPONENT_NAMES: *Content of COMPONENT_NAMES:
*TITLE *TITLE

View File

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

View File

@@ -208,13 +208,13 @@ SELECT id FROM @itab AS tab
<tr> <tr>
<td> <td>
`... AND ...` <br> `... OR ...` <br> `... ( ... ) ...` `... AND [NOT] ...` <br> `... OR [NOT] ...` <br> `... ( ... ) ...`
</td> </td>
<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> </td>
@@ -222,7 +222,7 @@ Combining multiple logical expressions into one logical expression using `AND` o
``` abap ``` abap
SELECT id FROM @itab AS tab SELECT id FROM @itab AS tab
WHERE id = 1 AND animal = 'bear' WHERE animal = 'bear' AND count = 5
INTO TABLE @it. INTO TABLE @it.
SELECT id FROM @itab AS tab SELECT id FROM @itab AS tab
@@ -230,8 +230,18 @@ SELECT id FROM @itab AS tab
INTO TABLE @it. INTO TABLE @it.
SELECT id FROM @itab AS tab SELECT id FROM @itab AS tab
WHERE ( id = 1 AND animal = 'bear' ) WHERE ( animal = 'bear' AND count = 5 )
OR ( id = 20 AND animal = 'lion' ) 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. INTO TABLE @it.
``` ```
@@ -316,7 +326,7 @@ SELECT id FROM @itab AS tab
<td> <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> </td>
@@ -706,7 +716,7 @@ CLASS zcl_demo_abap IMPLEMENTATION.
*&---------------------------------------------------------------------* *&---------------------------------------------------------------------*
SELECT id FROM @itab AS tab SELECT id FROM @itab AS tab
WHERE id = 1 AND animal = 'bear' WHERE animal = 'bear' AND count = 5
INTO TABLE @it. "1 INTO TABLE @it. "1
SELECT id FROM @itab AS tab 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 parentheses is false (AND is used between the expressions in parentheses).
"In contrast, the example below returns an entry because of using OR. "In contrast, the example below returns an entry because of using OR.
SELECT id FROM @itab AS tab SELECT id FROM @itab AS tab
WHERE ( id = 1 AND animal = 'bear' ) WHERE ( animal = 'bear' AND count = 5 )
AND ( id = 20 AND animal = 'lion' ) AND ( animal = 'lion' AND count = 20 )
INTO TABLE @it. "no entry INTO TABLE @it. "no entry
SELECT id FROM @itab AS tab SELECT id FROM @itab AS tab
WHERE ( id = 1 AND animal = 'bear' ) WHERE ( animal = 'bear' AND count = 5 )
OR ( id = 20 AND animal = 'lion' ) OR ( animal = 'lion' AND count = 20 )
INTO TABLE @it. "1 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 ... ) ... *& ... 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 LEFT OUTER JOIN zdemo_abap_tab1 AS tab1 ON tab1~char1 = tab2~char1
WHERE tab1~char1 IS NULL WHERE tab1~char1 IS NULL
INTO TABLE @DATA(joined_tab). INTO TABLE @DATA(joined_tab).
*joined_tab:
*KEY_FIELD CHAR2 *KEY_FIELD CHAR2
*4 *4
@@ -1049,6 +1075,7 @@ CLASS zcl_demo_abap IMPLEMENTATION.
FROM zdemo_abap_tab2 AS tab2 FROM zdemo_abap_tab2 AS tab2
LEFT OUTER JOIN zdemo_abap_tab1 AS tab1 ON tab1~char1 = tab2~char1 LEFT OUTER JOIN zdemo_abap_tab1 AS tab1 ON tab1~char1 = tab2~char1
INTO TABLE @joined_tab_w_null_ind INDICATORS NULL STRUCTURE nulls. INTO TABLE @joined_tab_w_null_ind INDICATORS NULL STRUCTURE nulls.
*joined_tab_w_null_ind:
*S2 NULLS *S2 NULLS
*KEY_FIELD CHAR2 KEY_FIELD CHAR2 *KEY_FIELD CHAR2 KEY_FIELD CHAR2
*1 y *1 y
@@ -1065,6 +1092,7 @@ CLASS zcl_demo_abap IMPLEMENTATION.
LEFT OUTER JOIN zdemo_abap_tab1 AS tab1 ON tab1~char1 = tab2~char1 LEFT OUTER JOIN zdemo_abap_tab1 AS tab1 ON tab1~char1 = tab2~char1
WHERE tab1~char1 IS NOT NULL WHERE tab1~char1 IS NOT NULL
INTO TABLE @joined_tab. INTO TABLE @joined_tab.
*joined_tab:
*KEY_FIELD CHAR2 *KEY_FIELD CHAR2
*1 y *1 y
*2 y *2 y
@@ -1216,18 +1244,21 @@ CLASS zcl_demo_abap IMPLEMENTATION.
LOOP AT itab INTO DATA(wa) WHERE num = 0. LOOP AT itab INTO DATA(wa) WHERE num = 0.
str &&= wa-id. str &&= wa-id.
ENDLOOP. ENDLOOP.
ASSERT str = `13`.
CLEAR str. CLEAR str.
LOOP AT itab INTO wa WHERE num > 20. LOOP AT itab INTO wa WHERE num > 20.
str &&= wa-id. str &&= wa-id.
ENDLOOP. ENDLOOP.
ASSERT str = `45`.
CLEAR str. CLEAR str.
"Combination of one or more logical expressions with the Boolean operators "Combination of one or more logical expressions with the Boolean operators
"NOT, AND, OR, EQUIV where parentheses are possible "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. str &&= wa-id.
ENDLOOP. ENDLOOP.
ASSERT str = `45`.
CLEAR str. CLEAR str.
"Two logical expressions can be combined with EQUIV, which creates a new "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. LOOP AT itab INTO wa WHERE id > 2 EQUIV num < 10.
str &&= wa-id. str &&= wa-id.
ENDLOOP. ENDLOOP.
ASSERT str = `23`.
CLEAR str. CLEAR str.
LOOP AT itab INTO wa WHERE num >= 40 OR num = 0. LOOP AT itab INTO wa WHERE num >= 40 OR num = 0.
str &&= wa-id. str &&= wa-id.
ENDLOOP. ENDLOOP.
ASSERT str = `1345`.
CLEAR str. CLEAR str.
LOOP AT itab INTO wa WHERE NOT num = 0. LOOP AT itab INTO wa WHERE NOT num = 0.
str &&= wa-id. str &&= wa-id.
ENDLOOP. ENDLOOP.
ASSERT str = `245`.
CLEAR str. CLEAR str.
LOOP AT itab INTO wa WHERE ( id < 5 AND num > 10 ) AND text = `abc`. LOOP AT itab INTO wa WHERE ( id < 5 AND num > 10 ) AND text = `abc`.
str &&= wa-id. str &&= wa-id.
ENDLOOP. ENDLOOP.
ASSERT str = `2`.
CLEAR str. CLEAR str.
"Comparison operators for character-like data types "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`. LOOP AT itab INTO wa WHERE text CO `abc`.
str &&= wa-id. str &&= wa-id.
ENDLOOP. ENDLOOP.
ASSERT str = `12`.
CLEAR str. CLEAR str.
"contains not only "contains not only
LOOP AT itab INTO wa WHERE text CN `abc`. LOOP AT itab INTO wa WHERE text CN `abc`.
str &&= wa-id. str &&= wa-id.
ENDLOOP. ENDLOOP.
ASSERT str = `345`.
CLEAR str. CLEAR str.
"contains string "contains string
LOOP AT itab INTO wa WHERE text CS `ef`. LOOP AT itab INTO wa WHERE text CS `ef`.
str &&= wa-id. str &&= wa-id.
ENDLOOP. ENDLOOP.
ASSERT str = `34`.
CLEAR str. CLEAR str.
"contains no string "contains no string
LOOP AT itab INTO wa WHERE text NS `ef`. LOOP AT itab INTO wa WHERE text NS `ef`.
str &&= wa-id. str &&= wa-id.
ENDLOOP. ENDLOOP.
ASSERT str = `125`.
CLEAR str. CLEAR str.
"contains any "contains any
LOOP AT itab INTO wa WHERE text CA `xyzi`. LOOP AT itab INTO wa WHERE text CA `xyzi`.
str &&= wa-id. str &&= wa-id.
ENDLOOP. ENDLOOP.
ASSERT str = `5`.
CLEAR str. CLEAR str.
"contains not any "contains not any
LOOP AT itab INTO wa WHERE text NA `a`. LOOP AT itab INTO wa WHERE text NA `a`.
str &&= wa-id. str &&= wa-id.
ENDLOOP. ENDLOOP.
ASSERT str = `345`.
CLEAR str. CLEAR str.
"conforms to pattern "conforms to pattern
LOOP AT itab INTO wa WHERE text CP `*c`. LOOP AT itab INTO wa WHERE text CP `*c`.
str &&= wa-id. str &&= wa-id.
ENDLOOP. ENDLOOP.
ASSERT str = `12`.
CLEAR str. CLEAR str.
"does not conform to pattern "does not conform to pattern
LOOP AT itab INTO wa WHERE text NA `*c`. LOOP AT itab INTO wa WHERE text NA `*c`.
str &&= wa-id. str &&= wa-id.
ENDLOOP. ENDLOOP.
ASSERT str = `345`.
CLEAR str. CLEAR str.
"[NOT] BETWEEN ... AND ... "[NOT] BETWEEN ... AND ...
LOOP AT itab INTO wa WHERE num BETWEEN 5 AND 45. LOOP AT itab INTO wa WHERE num BETWEEN 5 AND 45.
str &&= wa-id. str &&= wa-id.
ENDLOOP. ENDLOOP.
ASSERT str = `24`.
CLEAR str. CLEAR str.
LOOP AT itab INTO wa WHERE num NOT BETWEEN 5 AND 45. LOOP AT itab INTO wa WHERE num NOT BETWEEN 5 AND 45.
str &&= wa-id. str &&= wa-id.
ENDLOOP. ENDLOOP.
ASSERT str = `135`.
CLEAR str. CLEAR str.
"[NOT] IN ranges_table "[NOT] IN ranges_table
@@ -1328,6 +1373,7 @@ CLASS zcl_demo_abap IMPLEMENTATION.
LOOP AT itab INTO wa WHERE num IN rangestab. LOOP AT itab INTO wa WHERE num IN rangestab.
str &&= wa-id. str &&= wa-id.
ENDLOOP. ENDLOOP.
ASSERT str = `24`.
CLEAR str. CLEAR str.
rangestab = VALUE #( ( sign = `I` option = `LT` low = 5 ) 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. LOOP AT itab INTO wa WHERE num IN rangestab.
str &&= wa-id. str &&= wa-id.
ENDLOOP. ENDLOOP.
ASSERT str = `1345`.
CLEAR str. CLEAR str.
"IS [NOT] INITIAL "IS [NOT] INITIAL
LOOP AT itab INTO wa WHERE num IS INITIAL. LOOP AT itab INTO wa WHERE num IS INITIAL.
str &&= wa-id. str &&= wa-id.
ENDLOOP. ENDLOOP.
ASSERT str = `13`.
CLEAR str. CLEAR str.
LOOP AT itab INTO wa WHERE num IS NOT INITIAL. LOOP AT itab INTO wa WHERE num IS NOT INITIAL.
str &&= wa-id. str &&= wa-id.
ENDLOOP. ENDLOOP.
ASSERT str = `245`.
CLEAR str. CLEAR str.
"IS [NOT] BOUND "IS [NOT] BOUND
LOOP AT itab INTO wa WHERE ref IS BOUND. LOOP AT itab INTO wa WHERE ref IS BOUND.
str &&= wa-id. str &&= wa-id.
ENDLOOP. ENDLOOP.
ASSERT str = `135`.
CLEAR str. CLEAR str.
LOOP AT itab INTO wa WHERE ref IS NOT BOUND. LOOP AT itab INTO wa WHERE ref IS NOT BOUND.
str &&= wa-id. str &&= wa-id.
ENDLOOP. ENDLOOP.
ASSERT str = `24`.
CLEAR str. CLEAR str.
"IS [NOT] INSTANCE OF "IS [NOT] INSTANCE OF
LOOP AT itab INTO wa WHERE oref IS INSTANCE OF cl_system_uuid. LOOP AT itab INTO wa WHERE oref IS INSTANCE OF cl_system_uuid.
str &&= wa-id. str &&= wa-id.
ENDLOOP. ENDLOOP.
ASSERT str = `13`.
CLEAR str. CLEAR str.
LOOP AT itab INTO wa WHERE oref IS NOT INSTANCE OF cl_system_uuid. LOOP AT itab INTO wa WHERE oref IS NOT INSTANCE OF cl_system_uuid.
str &&= wa-id. str &&= wa-id.
ENDLOOP. ENDLOOP.
ASSERT str = `245`.
CLEAR str. CLEAR str.
"Dynamic WHERE condition "Dynamic WHERE condition
@@ -1377,6 +1430,7 @@ CLASS zcl_demo_abap IMPLEMENTATION.
LOOP AT itab INTO wa WHERE (dynamic_where_cond). LOOP AT itab INTO wa WHERE (dynamic_where_cond).
str &&= wa-id. str &&= wa-id.
ENDLOOP. ENDLOOP.
ASSERT str = `45`.
CLEAR str. CLEAR str.
DATA(dynamic_where_cond_tab) = VALUE string_table( ( `num > 20` ) 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). LOOP AT itab INTO wa WHERE (dynamic_where_cond_tab).
str &&= wa-id. str &&= wa-id.
ENDLOOP. ENDLOOP.
ASSERT str = `5`.
CLEAR str. CLEAR str.
*&---------------------------------------------------------------------* *&---------------------------------------------------------------------*
@@ -1395,91 +1450,192 @@ CLASS zcl_demo_abap IMPLEMENTATION.
DATA(itab_copy) = itab. DATA(itab_copy) = itab.
DELETE itab WHERE num > 20. DELETE itab WHERE num > 20.
ASSERT REDUCE string( INIT string = ``
FOR <line> IN itab
NEXT string &&= <line>-id ) = `123`.
itab = itab_copy. itab = itab_copy.
DELETE itab WHERE num = 0. DELETE itab WHERE num = 0.
ASSERT REDUCE string( INIT string = ``
FOR <line> IN itab
NEXT string &&= <line>-id ) = `245`.
itab = itab_copy. itab = itab_copy.
DELETE itab WHERE num > 5 AND id >= 3. 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. itab = itab_copy.
DELETE itab WHERE num >= 40 OR num = 0. 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. itab = itab_copy.
DELETE itab WHERE NOT num = 0. DELETE itab WHERE NOT num = 0.
ASSERT REDUCE string( INIT string = ``
FOR <line> IN itab
NEXT string &&= <line>-id ) = `13`.
itab = itab_copy. itab = itab_copy.
DELETE itab WHERE ( id < 5 AND num > 10 ) AND text = `abc`. 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. itab = itab_copy.
"contains only "contains only
DELETE itab WHERE text CO `abc`. DELETE itab WHERE text CO `abc`.
ASSERT REDUCE string( INIT string = ``
FOR <line> IN itab
NEXT string &&= <line>-id ) = `345`.
itab = itab_copy. itab = itab_copy.
"contains not only "contains not only
DELETE itab WHERE text CN `abc`. DELETE itab WHERE text CN `abc`.
ASSERT REDUCE string( INIT string = ``
FOR <line> IN itab
NEXT string &&= <line>-id ) = `12`.
itab = itab_copy. itab = itab_copy.
"contains string "contains string
DELETE itab WHERE text CS `ef`. DELETE itab WHERE text CS `ef`.
ASSERT REDUCE string( INIT string = ``
FOR <line> IN itab
NEXT string &&= <line>-id ) = `125`.
itab = itab_copy. itab = itab_copy.
"contains no string "contains no string
DELETE itab WHERE text NS `ef`. DELETE itab WHERE text NS `ef`.
ASSERT REDUCE string( INIT string = ``
FOR <line> IN itab
NEXT string &&= <line>-id ) = `34`.
itab = itab_copy. itab = itab_copy.
"contains any "contains any
DELETE itab WHERE text CA `xyzi`. DELETE itab WHERE text CA `xyzi`.
ASSERT REDUCE string( INIT string = ``
FOR <line> IN itab
NEXT string &&= <line>-id ) = `1234`.
itab = itab_copy. itab = itab_copy.
"contains not any "contains not any
DELETE itab WHERE text NA `a`. DELETE itab WHERE text NA `a`.
ASSERT REDUCE string( INIT string = ``
FOR <line> IN itab
NEXT string &&= <line>-id ) = `12`.
itab = itab_copy. itab = itab_copy.
"conforms to pattern "conforms to pattern
DELETE itab WHERE text CP `*c`. DELETE itab WHERE text CP `*c`.
ASSERT REDUCE string( INIT string = ``
FOR <line> IN itab
NEXT string &&= <line>-id ) = `345`.
itab = itab_copy. itab = itab_copy.
"does not conform to pattern "does not conform to pattern
DELETE itab WHERE text NA `*c`. DELETE itab WHERE text NA `*c`.
ASSERT REDUCE string( INIT string = ``
FOR <line> IN itab
NEXT string &&= <line>-id ) = `12`.
itab = itab_copy. itab = itab_copy.
DELETE itab WHERE num BETWEEN 5 AND 45. 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. itab = itab_copy.
DELETE itab WHERE num NOT BETWEEN 5 AND 45. 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. itab = itab_copy.
rangestab = VALUE #( ( sign = `I` option = `BT` low = 5 high = 45 ) ). rangestab = VALUE #( ( sign = `I` option = `BT` low = 5 high = 45 ) ).
DELETE itab WHERE num IN rangestab. DELETE itab WHERE num IN rangestab.
ASSERT REDUCE string( INIT string = ``
FOR <line> IN itab
NEXT string &&= <line>-id ) = `135`.
itab = itab_copy. itab = itab_copy.
DELETE itab WHERE num IS INITIAL. DELETE itab WHERE num IS INITIAL.
ASSERT REDUCE string( INIT string = ``
FOR <line> IN itab
NEXT string &&= <line>-id ) = `245`.
itab = itab_copy. itab = itab_copy.
DELETE itab WHERE num IS NOT INITIAL. DELETE itab WHERE num IS NOT INITIAL.
ASSERT REDUCE string( INIT string = ``
FOR <line> IN itab
NEXT string &&= <line>-id ) = `13`.
itab = itab_copy. itab = itab_copy.
DELETE itab WHERE ref IS BOUND. DELETE itab WHERE ref IS BOUND.
ASSERT REDUCE string( INIT string = ``
FOR <line> IN itab
NEXT string &&= <line>-id ) = `24`.
itab = itab_copy. itab = itab_copy.
DELETE itab WHERE ref IS NOT BOUND. DELETE itab WHERE ref IS NOT BOUND.
ASSERT REDUCE string( INIT string = ``
FOR <line> IN itab
NEXT string &&= <line>-id ) = `135`.
itab = itab_copy. itab = itab_copy.
DELETE itab WHERE oref IS INSTANCE OF cl_system_uuid. 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. itab = itab_copy.
DELETE itab WHERE oref IS NOT INSTANCE OF cl_system_uuid. 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. itab = itab_copy.
dynamic_where_cond = `num > 20`. dynamic_where_cond = `num > 20`.
DELETE itab WHERE (dynamic_where_cond). DELETE itab WHERE (dynamic_where_cond).
ASSERT REDUCE string( INIT string = ``
FOR <line> IN itab
NEXT string &&= <line>-id ) = `123`.
itab = itab_copy. itab = itab_copy.
dynamic_where_cond_tab = VALUE string_table( ( `num > 20` ) dynamic_where_cond_tab = VALUE string_table( ( `num > 20` )
( `AND` ) ( `AND` )
( `id > 4` ) ). ( `id > 4` ) ).
DELETE itab WHERE (dynamic_where_cond_tab). DELETE itab WHERE (dynamic_where_cond_tab).
ASSERT REDUCE string( INIT string = ``
FOR <line> IN itab
NEXT string &&= <line>-id ) = `1234`.
itab = itab_copy. itab = itab_copy.
*&---------------------------------------------------------------------* *&---------------------------------------------------------------------*
@@ -1487,99 +1643,99 @@ CLASS zcl_demo_abap IMPLEMENTATION.
*&---------------------------------------------------------------------* *&---------------------------------------------------------------------*
READ TABLE itab INTO DATA(line) WHERE num > 20. 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 "The following statement issues a warning, which can be suppressed by a
"pragma. For better performance, the WHERE clause should be replaced by "pragma. For better performance, the WHERE clause should be replaced by
"a key specification with a simple component or operand pair list. "a key specification with a simple component or operand pair list.
READ TABLE itab INTO line WHERE num = 0 ##read_where_ok. 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. 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. 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. 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`. READ TABLE itab INTO line WHERE ( id < 5 AND num > 10 ) AND text = `abc`.
tabix = sy-tabix. ASSERT sy-tabix = 2.
"contains only "contains only
READ TABLE itab INTO line WHERE text CO `abc`. READ TABLE itab INTO line WHERE text CO `abc`.
tabix = sy-tabix. ASSERT sy-tabix = 1.
"contains not only "contains not only
READ TABLE itab INTO line WHERE text CN `abc`. READ TABLE itab INTO line WHERE text CN `abc`.
tabix = sy-tabix. ASSERT sy-tabix = 3.
"contains string "contains string
READ TABLE itab INTO line WHERE text CS `ef`. READ TABLE itab INTO line WHERE text CS `ef`.
tabix = sy-tabix. ASSERT sy-tabix = 3.
"contains no string "contains no string
READ TABLE itab INTO line WHERE text NS `ef`. READ TABLE itab INTO line WHERE text NS `ef`.
tabix = sy-tabix. ASSERT sy-tabix = 1.
"contains any "contains any
READ TABLE itab INTO line WHERE text CA `xyzi`. READ TABLE itab INTO line WHERE text CA `xyzi`.
tabix = sy-tabix. ASSERT sy-tabix = 5.
"contains not any "contains not any
READ TABLE itab INTO line WHERE text NA `a`. READ TABLE itab INTO line WHERE text NA `a`.
tabix = sy-tabix. ASSERT sy-tabix = 3.
"conforms to pattern "conforms to pattern
READ TABLE itab INTO line WHERE text CP `*c`. READ TABLE itab INTO line WHERE text CP `*c`.
tabix = sy-tabix. ASSERT sy-tabix = 1.
"does not conform to pattern "does not conform to pattern
READ TABLE itab INTO line WHERE text NA `*c`. 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. 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. 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 ) ). rangestab = VALUE #( ( sign = `I` option = `BT` low = 5 high = 45 ) ).
READ TABLE itab INTO line WHERE num IN rangestab. 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 "Same as above. Without the pragma, a warning is issued. It is
"recommended that you specify a key and a component or operand "recommended that you specify a key and a component or operand
"pair list. "pair list.
READ TABLE itab INTO line WHERE num IS INITIAL ##read_where_ok. 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. 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. 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. 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. 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. 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`. dynamic_where_cond = `num > 20`.
READ TABLE itab INTO line WHERE (dynamic_where_cond). 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` ) dynamic_where_cond_tab = VALUE string_table( ( `num > 20` )
( `AND` ) ( `AND` )
( `id > 4` ) ). ( `id > 4` ) ).
READ TABLE itab INTO line WHERE (dynamic_where_cond_tab). READ TABLE itab INTO line WHERE (dynamic_where_cond_tab).
tabix = sy-tabix. ASSERT sy-tabix = 5.
*&---------------------------------------------------------------------* *&---------------------------------------------------------------------*
*& FILTER constructor operator *& FILTER constructor operator