├── .abapgit.xml ├── LICENSE ├── README.md └── src ├── package.devc.xml ├── zahk_demo_numc.tabl.xml ├── zahk_po_head_1.tabl.xml ├── zahk_porg_1.tabl.xml ├── zcl_abap_new_syntax.clas.abap ├── zcl_abap_new_syntax.clas.xml ├── zcl_demo_filtering.clas.abap ├── zcl_demo_filtering.clas.xml ├── zcl_demo_random.clas.abap ├── zcl_demo_random.clas.xml ├── zcl_demo_runtime_measure.clas.abap ├── zcl_demo_runtime_measure.clas.xml ├── zif_test_type_checking.intf.abap └── zif_test_type_checking.intf.xml /.abapgit.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | E 6 | /src/ 7 | PREFIX 8 | 9 | /.gitignore 10 | /LICENSE 11 | /README.md 12 | /package.json 13 | /.travis.yml 14 | /.gitlab-ci.yml 15 | /abaplint.json 16 | /azure-pipelines.yml 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Ali Haydar Kaplan 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ABAP New Syntax 7.4x 7.5x 2 | 3 | ### Inline Declarations 4 | [DATA](https://github.com/alikapllan/abap_new_syntax/blob/master/src/zcl_abap_new_syntax.clas.abap#L464-L481) 5 | [Field-Symbol](https://github.com/alikapllan/abap_new_syntax/blob/master/src/zcl_abap_new_syntax.clas.abap#L483-L492) 6 | [REFERENCE INTO DATA](https://github.com/alikapllan/abap_new_syntax/blob/master/src/zcl_abap_new_syntax.clas.abap#L494-L499) 7 | 8 | ### Constructor Expressions 9 | [VALUE](https://github.com/alikapllan/abap_new_syntax/blob/master/src/zcl_abap_new_syntax.clas.abap#L65-L86) 10 | [CORRESPONDING](https://github.com/alikapllan/abap_new_syntax/blob/master/src/zcl_abap_new_syntax.clas.abap#L90-L115) 11 | [BASE](https://github.com/alikapllan/abap_new_syntax/blob/master/src/zcl_abap_new_syntax.clas.abap#L114-L115) 12 | [NEW](https://github.com/alikapllan/abap_new_syntax/blob/master/src/zcl_abap_new_syntax.clas.abap#L119-L129) 13 | [REF](https://github.com/alikapllan/abap_new_syntax/blob/master/src/zcl_abap_new_syntax.clas.abap#L119-L129) 14 | [FOR](https://github.com/alikapllan/abap_new_syntax/blob/master/src/zcl_abap_new_syntax.clas.abap#L133-L159) 15 | [REDUCE](https://github.com/alikapllan/abap_new_syntax/blob/master/src/zcl_abap_new_syntax.clas.abap#L163-L179) 16 | [FILTER](https://github.com/alikapllan/abap_new_syntax/blob/master/src/zcl_abap_new_syntax.clas.abap#L183-L214) 17 | 18 | ### Conditional Expressions (Part of Constructor Exp.) 19 | [SWITCH](https://github.com/alikapllan/abap_new_syntax/blob/master/src/zcl_abap_new_syntax.clas.abap#L39-L43) 20 | [COND](https://github.com/alikapllan/abap_new_syntax/blob/master/src/zcl_abap_new_syntax.clas.abap#L48-L51) 21 | [xsdbool(extra)](https://github.com/alikapllan/abap_new_syntax/blob/master/src/zcl_abap_new_syntax.clas.abap#L45-L46) 22 | 23 | ### Internal Table Expressions 24 | [iTab expressions](https://github.com/alikapllan/abap_new_syntax/blob/master/src/zcl_abap_new_syntax.clas.abap#506-L517) 25 | [line_index](https://github.com/alikapllan/abap_new_syntax/blob/master/src/zcl_abap_new_syntax.clas.abap#L519-L521) 26 | [line_exists](https://github.com/alikapllan/abap_new_syntax/blob/master/src/zcl_abap_new_syntax.clas.abap#L523-L524) 27 | 28 | ### LOOP AT .. GROUP BY 29 | [LOOP AT .. GROUP BY](https://github.com/alikapllan/abap_new_syntax/blob/master/src/zcl_abap_new_syntax.clas.abap#L529-L560) 30 | 31 | ### Advanced Type Checking 32 | [IS INSTANCE OF](https://github.com/alikapllan/abap_new_syntax/blob/master/src/zcl_abap_new_syntax.clas.abap#L576-L579) 33 | [CASE TYPE OF](https://github.com/alikapllan/abap_new_syntax/blob/master/src/zcl_abap_new_syntax.clas.abap#L581-L587) 34 | [some utility class methods](https://github.com/alikapllan/abap_new_syntax/blob/master/src/zcl_abap_new_syntax.clas.abap#L589-L600) 35 | 36 | ### Conversions 37 | [Alpha Conversion](https://github.com/alikapllan/abap_new_syntax/blob/master/src/zcl_abap_new_syntax.clas.abap#L222-L232) 38 | [Date Format](https://github.com/alikapllan/abap_new_syntax/blob/master/src/zcl_abap_new_syntax.clas.abap#L235-L241) 39 | [Time Format](https://github.com/alikapllan/abap_new_syntax/blob/master/src/zcl_abap_new_syntax.clas.abap#L244-L249) 40 | [Timestamp](https://github.com/alikapllan/abap_new_syntax/blob/master/src/zcl_abap_new_syntax.clas.abap#L252-L259) 41 | [Case of Text](https://github.com/alikapllan/abap_new_syntax/blob/master/src/zcl_abap_new_syntax.clas.abap#L262-L266) 42 | [Number Format](https://github.com/alikapllan/abap_new_syntax/blob/master/src/zcl_abap_new_syntax.clas.abap#L269-L273) 43 | 44 | ### Enhanced OpenSQL 45 | [ABAP SQL Host Expressions](https://www.cadaxo.com/nicht-kategorisiert/abap-sql-host-expressions/) a nice worth to read Blogpost but is in German :P 46 | [Select with FIELDS](https://github.com/alikapllan/abap_new_syntax/blob/master/src/zcl_abap_new_syntax.clas.abap#L280-L284) 47 | [Select with Subquery](https://github.com/alikapllan/abap_new_syntax/blob/master/src/zcl_abap_new_syntax.clas.abap#L286-L293) 48 | [INSERT CORRESPONDING](https://github.com/alikapllan/abap_new_syntax/blob/master/src/zcl_abap_new_syntax.clas.abap#L295-L309) 49 | [VALUE within INSERT](https://github.com/alikapllan/abap_new_syntax/blob/master/src/zcl_abap_new_syntax.clas.abap#L311-L322) 50 | [Joins](https://github.com/alikapllan/abap_new_syntax/blob/master/src/zcl_abap_new_syntax.clas.abap#L324-L358) 51 | [Union](https://github.com/alikapllan/abap_new_syntax/blob/master/src/zcl_abap_new_syntax.clas.abap#L360-L387) 52 | [Aggregation Functions](https://github.com/alikapllan/abap_new_syntax/blob/master/src/zcl_abap_new_syntax.clas.abap#L390-L400) 53 | [CASTING in Aggregation Functions](https://github.com/alikapllan/abap_new_syntax/blob/master/src/zcl_abap_new_syntax.clas.abap#L402-L408) 54 | [Arithmetic Operations & div, division, ceil, floor, round](https://github.com/alikapllan/abap_new_syntax/blob/master/src/zcl_abap_new_syntax.clas.abap#L410-L424) 55 | [String expressions](https://github.com/alikapllan/abap_new_syntax/blob/master/src/zcl_abap_new_syntax.clas.abap#L427-L439) 56 | [Case & Coalesce](https://github.com/alikapllan/abap_new_syntax/blob/master/src/zcl_abap_new_syntax.clas.abap#L442-L452) 57 | 58 | ### All Data Filtering Variations 59 | ##### -> here shown code has been taken from [this nice blogpost](https://software-heroes.com/en/blog/abap-quick-performance-data-filtering) of [SoftwareHeroes](https://software-heroes.com/en/). 60 | [All Data Filtering Variations](https://github.com/alikapllan/abap_new_syntax/blob/master/src/zcl_demo_filtering.clas.abap#L101-L133) 61 | - Loop into DATA 62 | - Loop ASSIGNING 63 | - Loop with Key 64 | - Filter and Lines 65 | - Reduce 66 | - For and Lines 67 | 68 | -> You can also [check their overall performance](https://github.com/alikapllan/abap_new_syntax/blob/master/src/zcl_demo_filtering.clas.abap#L45-L77) at runtime. To see the results, run this class in your ADT. Linked blogpost from SoftwareHeroes above also provides the result at the end of the blog. 69 | 70 | ### Addition - ABAP Feature Matrix 71 | [ABAP Feature Matrix](https://software-heroes.com/en/abap-feature-matrix) 72 | This website shows you a list of avaliable/not available or deprecated ABAP Statements for the release and area you selected. 73 | 74 | [Overview and Usage of ABAP Feature Matrix](https://software-heroes.com/en/blog/abap-matirx-afm-alm-en) 75 | -------------------------------------------------------------------------------- /src/package.devc.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ABAP New Syntax 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/zahk_demo_numc.tabl.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZAHK_DEMO_NUMC 7 | E 8 | TRANSP 9 | X 10 | Table with NUMC type for CAST in Select within aggregation 11 | X 12 | A 13 | 1 14 | 15 | 16 | ZAHK_DEMO_NUMC 17 | A 18 | 0 19 | APPL0 20 | N 21 | 22 | 23 | 24 | CLIENT 25 | X 26 | MANDT 27 | 0 28 | X 29 | E 30 | 31 | 32 | DUMMY_KEY 33 | X 34 | NUMC4 35 | 0 36 | X 37 | E 38 | 39 | 40 | NUMC_FIELD_TO_INT 41 | NUMC4 42 | 0 43 | E 44 | 45 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /src/zahk_po_head_1.tabl.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZAHK_PO_HEAD_1 7 | E 8 | TRANSP 9 | X 10 | Purchase Order Header - Test 11 | D 12 | X 13 | A 14 | 1 15 | 16 | 17 | ZAHK_PO_HEAD_1 18 | A 19 | 0 20 | APPL0 21 | N 22 | 23 | 24 | 25 | CLIENT 26 | X 27 | MANDT 28 | 0 29 | X 30 | E 31 | 32 | 33 | PURCHDOC 34 | X 35 | CHAR10 36 | 0 37 | X 38 | E 39 | 40 | 41 | DESCRIPTION 42 | SSTRING 43 | 0 44 | E 45 | 46 | 47 | STATUS 48 | CHAR1 49 | 0 50 | E 51 | 52 | 53 | PRIORITY 54 | CHAR1 55 | 0 56 | E 57 | 58 | 59 | PURCH_ORG 60 | CHAR4 61 | 0 62 | E 63 | 64 | 65 | NETPRICE 66 | INT4 67 | 0 68 | E 69 | 70 | 71 | CURRENCY 72 | CHAR5 73 | 0 74 | E 75 | 76 | 77 | CREA_DATE_TIME 78 | TIMESTAMPL 79 | 0 80 | E 81 | 82 | 83 | CREATED_BY 84 | SYUNAME 85 | 0 86 | E 87 | 88 | 89 | LAST_CHANGED_TIMESTAMP 90 | TIMESTAMPL 91 | 0 92 | E 93 | 94 | 95 | 96 | D 97 | 98 | 99 | 100 | D 101 | 102 | 103 | 104 | 105 | 106 | -------------------------------------------------------------------------------- /src/zahk_porg_1.tabl.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZAHK_PORG_1 7 | E 8 | TRANSP 9 | X 10 | Purchase - Organization - Test 11 | X 12 | A 13 | 1 14 | 15 | 16 | ZAHK_PORG_1 17 | A 18 | 0 19 | APPL0 20 | N 21 | 22 | 23 | 24 | CLIENT 25 | X 26 | MANDT 27 | 0 28 | X 29 | E 30 | 31 | 32 | ORG 33 | X 34 | CHAR4 35 | 0 36 | X 37 | E 38 | 39 | 40 | PLANT 41 | CHAR20 42 | 0 43 | E 44 | 45 | 46 | LAST_CHANGED_TIMESTAMP 47 | TIMESTAMPL 48 | 0 49 | E 50 | 51 | 52 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /src/zcl_abap_new_syntax.clas.abap: -------------------------------------------------------------------------------- 1 | CLASS zcl_abap_new_syntax DEFINITION 2 | PUBLIC 3 | FINAL 4 | CREATE PUBLIC . 5 | 6 | PUBLIC SECTION. 7 | 8 | INTERFACES zif_test_type_checking . 9 | INTERFACES if_oo_adt_classrun . 10 | PROTECTED SECTION. 11 | PRIVATE SECTION. 12 | 13 | DATA number TYPE int2 . 14 | 15 | METHODS inline_declarations . " DATA, Field-Symbols, LOOP REFERENCE INTO DATA 16 | METHODS constructor_expressions . " VALUE, CORRESPONDING, BASE, NEW, REF, FOR, REDUCE, FILTER 17 | METHODS conditional_expressions . " SWITCH, xsdbool, COND 18 | METHODS internal_table_expressions . 19 | METHODS loop_at_group_by . 20 | METHODS type_checking . " IS INSTANCE OF, CASE TYPE OF 21 | METHODS conversions . " ALPHA Conversion, Date Format, Time Format, TIMESTAMP, Case of Text, Number Format 22 | METHODS enhanced_sql_syntax . " SELECT with FIELD, SELECT with Subquery, VALUE within INSERT 23 | " JOINS, UNION, Aggregation Functions, Arithmetic Operations, SQL String Expressions 24 | " and CASE - COALESCE 25 | ENDCLASS. 26 | 27 | 28 | 29 | CLASS zcl_abap_new_syntax IMPLEMENTATION. 30 | 31 | 32 | METHOD conditional_expressions. 33 | SELECT FROM scarr 34 | FIELDS * 35 | INTO TABLE @DATA(lt_scarr). 36 | 37 | LOOP AT lt_scarr INTO DATA(ls_scarr). 38 | 39 | " SWITCH to determine carrier status 40 | DATA(lv_status) = SWITCH #( ls_scarr-carrid 41 | WHEN 'LH' THEN 'Major ' 42 | WHEN 'AA' THEN 'Global ' 43 | ELSE 'Regional' ). 44 | 45 | " xsdbool to check if the carrier uses EUR as currency 46 | DATA(lv_is_currency_euro) = xsdbool( ls_scarr-currcode = 'EUR' ). 47 | 48 | " COND to assign a description based on destinations 49 | DATA(lv_description_cur) = COND #( WHEN lv_is_currency_euro = abap_true THEN 'Euro currency ' 50 | WHEN ls_scarr-currcode = 'USD' THEN 'Dolar currency' 51 | ELSE 'Other currency' ). 52 | 53 | CONCATENATE ls_scarr-carrname lv_status 'uses' lv_description_cur 54 | INTO DATA(lv_summary) SEPARATED BY space. 55 | 56 | * out->write( lv_summary ). 57 | ENDLOOP. 58 | ENDMETHOD. 59 | 60 | 61 | METHOD constructor_expressions. 62 | 63 | * VALUE, CORRESPONDING, BASE, NEW, REF, FOR, REDUCE, FILTER 64 | *--------------------------------------------------------------------* 65 | *& VALUE 66 | TYPES: BEGIN OF lty_student, 67 | id TYPE int2, 68 | name TYPE char40, 69 | END OF lty_student, 70 | ltt_student TYPE STANDARD TABLE OF lty_student 71 | WITH EMPTY KEY. 72 | 73 | " VALUE with structure 74 | DATA(ls_student) = VALUE lty_student( id = 1 name = 'Jack' ). 75 | 76 | 77 | " VALUE with iTab - 1 78 | DATA(lt_student) = VALUE ltt_student( ( id = 2 name = 'Ashley' ) ). 79 | 80 | " VALUE with iTab - 2 81 | DATA: lt_student2 TYPE ltt_student. 82 | lt_student2 = VALUE #( ( id = 3 name = 'Richard' ) 83 | ( id = 4 name = 'Anna' ) ). 84 | 85 | " INSERT VALUE - no extra data definition needed 86 | INSERT VALUE #( id = 5 name = 'Ben' ) INTO TABLE lt_student2. 87 | *--------------------------------------------------------------------* 88 | 89 | *--------------------------------------------------------------------* 90 | *& CORRESPONDING & BASE 91 | TYPES: BEGIN OF lty_scarr, 92 | carrname TYPE scarr-carrname, 93 | currcode TYPE scarr-currcode, 94 | carrid TYPE scarr-carrid, " id not in the beginning 95 | " no url field 96 | END OF lty_scarr, 97 | ltt_scarr TYPE STANDARD TABLE OF lty_scarr WITH EMPTY KEY. 98 | 99 | DATA: lt_scarr_no_url TYPE ltt_scarr. 100 | 101 | SELECT FROM scarr 102 | FIELDS * 103 | INTO CORRESPONDING FIELDS OF TABLE @lt_scarr_no_url 104 | UP TO 5 ROWS. 105 | 106 | " CORRESPONDING -> Field names and its types should be identical 107 | DATA(lt_scarr_no_url2) = CORRESPONDING ltt_scarr( lt_scarr_no_url ). 108 | 109 | SELECT FROM scarr 110 | FIELDS * 111 | WHERE carrid = 'UA' 112 | INTO TABLE @DATA(lt_scarr) UP TO 1 ROWS. 113 | 114 | " BASE keeps the former values inside 115 | lt_scarr_no_url2 = CORRESPONDING #( BASE ( lt_scarr_no_url2 ) lt_scarr ). 116 | *--------------------------------------------------------------------* 117 | 118 | *--------------------------------------------------------------------* 119 | *& NEW & REF 120 | DATA: oref TYPE REF TO zcl_abap_new_syntax, 121 | dref1 LIKE REF TO oref, 122 | dref2 TYPE REF TO int2. 123 | 124 | oref = NEW #( ). " creates object from class 125 | " DATA(oref) = NEW zcl_test_02_constructor_expr( ). " with inline dec. 126 | 127 | dref1 = REF #( oref ). " holds object reference 128 | dref2 = NEW #( ). " holds data reference 129 | dref2->* = dref1->*->number. 130 | *--------------------------------------------------------------------* 131 | 132 | *--------------------------------------------------------------------* 133 | *& FOR 134 | TYPES: BEGIN OF lty_carrier, 135 | carrid TYPE scarr-carrid, 136 | carrname TYPE scarr-carrname, 137 | END OF lty_carrier, 138 | ltt_carrier TYPE STANDARD TABLE OF lty_carrier WITH EMPTY KEY. 139 | 140 | SELECT FROM scarr 141 | FIELDS * 142 | INTO TABLE @lt_scarr. 143 | 144 | " FOR 145 | DATA(lt_carriers) = VALUE ltt_carrier( FOR carr IN lt_scarr 146 | ( carrid = carr-carrid carrname = carr-carrname ) ). 147 | 148 | " FOR with WHERE 149 | DATA(lt_carriers_with_usd) = VALUE ltt_carrier( FOR IN lt_scarr 150 | WHERE ( currcode = 'USD' ) 151 | ( carrid = -carrid 152 | carrname = -carrname ) ). 153 | 154 | " FOR with WHERE & CORRESPONDING 155 | DATA(lt_carriers_with_eur_jpy) = VALUE ltt_carrier( FOR IN lt_scarr 156 | WHERE ( currcode = 'EUR' AND 157 | currcode = 'JPY' ) 158 | " also filling carrid & carrname 159 | ( CORRESPONDING #( ) ) ). 160 | *--------------------------------------------------------------------* 161 | 162 | *--------------------------------------------------------------------* 163 | *& REDUCE 164 | TYPES: BEGIN OF lty_scarr_aggregate, 165 | carrid TYPE scarr-carrid, 166 | flights TYPE int2, " Assuming there is a field indicating a total of flight 167 | END OF lty_scarr_aggregate, 168 | ltt_scarr_aggregate TYPE STANDARD TABLE OF lty_scarr_aggregate WITH EMPTY KEY. 169 | 170 | " Example data 171 | DATA(lt_scarr_aggregate) = VALUE ltt_scarr_aggregate( ( carrid = 'LH' flights = 10 ) 172 | ( carrid = 'AA' flights = 20 ) 173 | ( carrid = 'BA' flights = 30 ) ). 174 | 175 | DATA(lv_total_flights) = REDUCE i( INIT sum = 0 176 | FOR scarr IN lt_scarr_aggregate 177 | NEXT sum = sum + scarr-flights ). 178 | 179 | * out->write( 'Total of flights: ' && lv_total_flights ). 180 | *--------------------------------------------------------------------* 181 | 182 | *--------------------------------------------------------------------* 183 | *& FILTER 184 | TYPES ltt_scarr2 TYPE STANDARD TABLE OF scarr WITH NON-UNIQUE SORTED KEY carrid 185 | COMPONENTS carrid. 186 | " -> iTab must have at least one SORTED or HASHED KEY to use FILTER operator 187 | 188 | DATA lt_scarr_all TYPE ltt_scarr2. 189 | 190 | SELECT FROM scarr 191 | FIELDS * 192 | INTO CORRESPONDING FIELDS OF TABLE @lt_scarr_all. 193 | 194 | " Air Berlin only 195 | * DATA(lt_scarr_ab) = FILTER #( lt_scarr_all USING KEY carrid WHERE carrid = 'AB ' ). " char3 196 | DATA(lt_scarr_ab) = FILTER #( lt_scarr_all USING KEY carrid 197 | WHERE carrid = CONV #( 'AB' ) ). " explicit convert 198 | 199 | " -> OR is not allowed in WHERE condition due to simplicity. For this -> VALUE (FOR IN itab) or LOOP 200 | * DATA(lt_scarr_ab_lh) = FILTER #( lt_scarr_all USING KEY carrid WHERE carrid = CONV #( 'AB' ) OR 201 | * carrid = CONV #( 'LH' ) ). 202 | 203 | 204 | " -> AND is only allowed on the condition not using same key. 205 | * DATA(lt_scarr_ab_lh) = FILTER #( lt_scarr_all USING KEY carrid WHERE carrid = CONV #( 'AB' ) AND 206 | * carrid = CONV #( 'LH' ) ). 207 | 208 | " EXCLUDE Air Berlin 209 | DATA(lt_scarr_excl_ab) = FILTER #( lt_scarr_all EXCEPT USING KEY carrid 210 | WHERE carrid = CONV #( 'AB' ) ). 211 | 212 | " FILTER in TABLE Condition - again all entries without Air Berlin 213 | DATA(lt_scarr_excl_ab2) = FILTER #( lt_scarr_all IN lt_scarr_ab USING KEY carrid 214 | WHERE carrid <> carrid ). 215 | *--------------------------------------------------------------------* 216 | 217 | ENDMETHOD. 218 | 219 | 220 | METHOD conversions. 221 | 222 | DATA: lv_matnr_without_zero TYPE char15 VALUE '123456789', 223 | lv_matnr_with_zero TYPE char15 VALUE '000000123456789'. 224 | 225 | * 7.51: New Conversions 226 | 227 | * ALPHA Conversion 228 | DATA(lv_alpha_in) = |{ lv_matnr_without_zero ALPHA = IN }|. " adds leading zeros. You can also use it for every conversion which a standard FM does e.g. CONVERSION_EXIT_PARVW_INPUT 229 | * out->write( lv_alpha_in ). 230 | 231 | DATA(lv_alpha_out) = |{ lv_matnr_with_zero ALPHA = OUT }|. " removes leading zeros. You can also use it for every conversion which a standard FM does 232 | * out->write( lv_alpha_out ). 233 | 234 | 235 | * Date Format 236 | " YYYY-MM-DD 237 | * out->write( |ISO Format : { sy-datum DATE = ISO }| ). 238 | " as per user setting 239 | * out->write( |User Format : { sy-datum DATE = USER }| ). 240 | " Formatting setting of language environment 241 | * out->write( |Environment Format : { sy-datum DATE = ENVIRONMENT }| ). 242 | 243 | 244 | * Time Format 245 | * out->write( 'Time' ). 246 | * out->write( |RAW Format: { sy-uzeit TIME = RAW }| ). 247 | * out->write( |ISO Format: { sy-uzeit TIME = ISO }| ). 248 | * out->write( |User Format: { sy-uzeit TIME = USER }| ). 249 | * out->write( |Environment Format: { sy-uzeit TIME = USER }| ). 250 | 251 | 252 | * TIMESTAMP 253 | SELECT SINGLE tzonesys FROM ttzcu INTO @DATA(lv_timezone). 254 | GET TIME STAMP FIELD DATA(lv_timestamp). 255 | * out->write( 'TIMESTAMP' ). 256 | * out->write( |'Space Format:' { lv_timestamp TIMEZONE = lv_timezone TIMESTAMP = SPACE }| ). 257 | * out->write( |'User Format:' { lv_timestamp TIMEZONE = lv_timezone TIMESTAMP = USER }| ). 258 | * out->write( |'ISO Format:' { lv_timestamp TIMEZONE = lv_timezone TIMESTAMP = ISO }| ). 259 | * out->write( |'Environment Format:' { lv_timestamp TIMEZONE = lv_timezone TIMESTAMP = ENVIRONMENT }| ). 260 | 261 | 262 | * Case of Text 263 | * out->write( 'Case of Text' ). 264 | * out->write( |RAW Format: { 'Data' CASE = (cl_abap_format=>c_raw) }| ). 265 | * out->write( |Upper Format: { 'Data' CASE = (cl_abap_format=>c_upper) }| ). 266 | * out->write( |Lower Format: { 'Data' CASE = (cl_abap_format=>c_lower) }| ). 267 | 268 | 269 | * Number Format 270 | DATA(lv_number) = 1234567890. 271 | * out->write( |Raw Format: { lv_number NUMBER = (cl_abap_format=>n_raw) }| ). 272 | * out->write( |User Format: { lv_number NUMBER = (cl_abap_format=>n_user) }| ). 273 | * out->write( |Environment Format: { lv_number NUMBER = (cl_abap_format=>n_environment) }| ). 274 | 275 | ENDMETHOD. 276 | 277 | 278 | METHOD enhanced_sql_syntax. 279 | 280 | " SELECT with FIELD 281 | SELECT FROM zahk_po_head_1 282 | FIELDS COUNT(*) AS count_rec, 283 | COUNT( DISTINCT purch_org ) AS count_org " unique amount of purch. organization 284 | INTO @DATA(ls_count_po_header). 285 | 286 | " SELECT with Subquery 287 | SELECT FROM zahk_po_head_1 AS po_header 288 | FIELDS * 289 | WHERE EXISTS 290 | ( SELECT FROM zahk_porg_1 291 | FIELDS * 292 | WHERE org = po_header~purch_org ) 293 | INTO TABLE @DATA(lt_po_head_subquery). 294 | 295 | " INSERT CORRESPONDING 296 | DATA lt_po_head_subquery_v2 LIKE lt_po_head_subquery. 297 | 298 | LOOP AT lt_po_head_subquery INTO DATA(ls_po_head_subquery). 299 | INSERT CORRESPONDING #( ls_po_head_subquery ) INTO TABLE lt_po_head_subquery_v2 REFERENCE INTO DATA(lr_po_head_subquery_v2). 300 | 301 | SELECT SINGLE FROM zahk_po_head_1 302 | FIELDS currency 303 | WHERE currency = 'EUR' 304 | AND created_by = 'ALEX' 305 | INTO CORRESPONDING FIELDS OF @lr_po_head_subquery_v2->*. 306 | 307 | lr_po_head_subquery_v2->currency = 'USD'. 308 | lr_po_head_subquery_v2->created_by = cl_abap_context_info=>get_user_technical_name( ). 309 | ENDLOOP. 310 | 311 | " VALUE within INSERT 312 | GET TIME STAMP FIELD DATA(lv_timestamp). 313 | 314 | INSERT zahk_porg_1 FROM @( VALUE #( org = 'ORG6' 315 | plant = 'Plant6' 316 | last_changed_timestamp = lv_timestamp ) ). 317 | 318 | INSERT zahk_porg_1 FROM TABLE @( 319 | VALUE #( last_changed_timestamp = lv_timestamp " puts in 3 records same value 320 | ( org = 'ORG7' plant = 'Plant7' ) 321 | ( org = 'ORG8' plant = 'Plant6' ) 322 | ( org = 'ORG9' plant = 'Plant7' ) ) ). 323 | 324 | " JOINS 325 | 326 | " 1. INNER JOIN 327 | SELECT 328 | FROM zahk_po_head_1 AS po 329 | INNER JOIN " or JOIN 330 | zahk_porg_1 AS porg ON po~purch_org = porg~org 331 | FIELDS po~purchdoc, 332 | porg~plant, 333 | po~netprice 334 | ORDER BY porg~plant 335 | INTO TABLE @DATA(lt_inner_join). 336 | 337 | 338 | " 2. LEFT OUTER JOIN 339 | SELECT 340 | FROM zahk_po_head_1 AS po 341 | LEFT OUTER JOIN " or LEFT JOIN 342 | zahk_porg_1 AS porg ON po~purch_org = porg~org 343 | FIELDS po~purchdoc, 344 | porg~plant, 345 | po~netprice 346 | ORDER BY porg~plant 347 | INTO TABLE @DATA(lt_left_join). 348 | 349 | " 3. RIGHT OUTER JOIN 350 | SELECT 351 | FROM zahk_po_head_1 AS po 352 | RIGHT OUTER JOIN " or RIGHT JOIN 353 | zahk_porg_1 AS porg ON po~purch_org = porg~org 354 | FIELDS po~purchdoc, 355 | porg~plant, 356 | po~netprice 357 | ORDER BY porg~plant 358 | INTO TABLE @DATA(lt_right_join). 359 | 360 | " UNION 361 | " -> it joins the output tables of two or more queries in SQL with each other 362 | 363 | " 1. UNION 364 | SELECT FROM zahk_po_head_1 FIELDS purch_org AS org 365 | UNION 366 | SELECT FROM zahk_porg_1 FIELDS org 367 | INTO TABLE @DATA(lt_union). " with @data -> selected field names must be same(also types) 368 | 369 | " other variant - if some columns not present in second table 370 | SELECT FROM zahk_po_head_1 FIELDS purch_org AS org, 371 | purchdoc 372 | UNION 373 | SELECT FROM zahk_porg_1 FIELDS org, 374 | '-' AS purchdoc " purchdoc doesn't exist in porg_1 table 375 | INTO TABLE @DATA(lt_union_for_missed_column). 376 | 377 | " 2. UNION ALL 378 | SELECT FROM zahk_po_head_1 FIELDS purch_org AS org 379 | UNION ALL " joins every occurring data from selected columns together 380 | SELECT FROM zahk_porg_1 FIELDS org 381 | INTO TABLE @DATA(lt_union_all). 382 | 383 | " 3. UNION DISTINCT 384 | SELECT FROM zahk_po_head_1 FIELDS purch_org AS org 385 | UNION DISTINCT " joins every unique data from selected columns together 386 | SELECT FROM zahk_porg_1 FIELDS org 387 | INTO TABLE @DATA(lt_union_distinct). 388 | 389 | 390 | " Aggregation Functions 391 | SELECT FROM zahk_po_head_1 392 | FIELDS purch_org, 393 | SUM( netprice ) AS total_price, 394 | MAX( netprice ) AS max_price, 395 | MIN( netprice ) AS min_price, 396 | AVG( netprice ) AS avg_price, 397 | AVG( netprice AS DEC( 16,2 ) ) AS avr_price_dec 398 | GROUP BY purch_org 399 | ORDER BY total_price 400 | INTO TABLE @DATA(lt_po_header_grouped). 401 | 402 | " CASTING in Aggregation Functions 403 | SELECT FROM zahk_demo_numc 404 | FIELDS dummy_key, 405 | SUM( CAST( numc_field_to_int AS INT4 ) ) AS numc_summed_in_int, 406 | AVG( numc_field_to_int AS DEC( 8,1 ) ) AS numc_avr_in_dec 407 | GROUP BY dummy_key 408 | INTO TABLE @DATA(lt_cast_in_agg_functions). 409 | 410 | " Arithmetic Operations - div, division, floor, round 411 | SELECT FROM zahk_po_head_1 412 | FIELDS purchdoc, 413 | netprice + 10 AS cust_netprice, 414 | ( - netprice ) + 20 AS netprice_negative, 415 | ( netprice + 10 ) * 20 AS netprice_new, 416 | " division not possible with types -> int, dec type (solution: div, division) 417 | CAST( netprice AS FLTP ) / CAST( 100 AS FLTP ) AS netprice_div, 418 | div( CAST( netprice AS INT4 ), 5 ) AS netprice_int_div, 419 | division( ( netprice + 10 ) * 20, 33, 2 ) AS netprice_dec_div, 420 | 421 | ceil( division( ( netprice + 10 ) * 20, 33, 2 ) ) AS ceil, " 1 round up 422 | floor( division( ( netprice + 10 ) * 20, 33, 2 ) ) AS floor, " 1 round down 423 | round( division( ( netprice + 10 ) * 20, 33, 2 ), 1 ) AS round " round decimal UP & DOWN 424 | INTO TABLE @DATA(lt_po_arithmetic). 425 | 426 | 427 | " SQL String Expressions - DDIC based Tables & CDS Views only 428 | SELECT FROM zahk_po_head_1 429 | FIELDS purchdoc, 430 | upper( description ) AS uppered, 431 | lower( description ) AS lowered, 432 | length( description ) AS len_dec, 433 | concat( description, purch_org ) AS sum_conc, 434 | concat_with_space( description, purch_org, 2 ) AS sum_conc_space, 435 | substring( description, 1, 4 ) AS short_desc, " starting index, how many character 436 | replace( description, 'Product', 'PRD' ) AS repl_desc, 437 | lpad( purch_org, 8, '-' ) AS dec_8_l, " adds - to the left 438 | rpad( purch_org, 8, '*' ) AS dec_8_r " adds * to the right 439 | INTO TABLE @DATA(lt_po_string_exp). 440 | 441 | 442 | " CASE - COALESCE 443 | SELECT FROM zahk_po_head_1 444 | FIELDS purchdoc, 445 | description, 446 | coalesce( netprice, 0 ) AS netprice, " print 0, if netprice value is NULL 447 | * coalesce( netprice, netprice1, 0 ) " checks netprice1 if netprice is NULL. Otherwise print 0 448 | CASE WHEN netprice < 15 THEN 'cheap' 449 | WHEN netprice > 15 THEN 'expensive' 450 | ELSE 'no price' 451 | END AS price_comment 452 | INTO TABLE @DATA(lt_po_case_coalesce). 453 | 454 | ENDMETHOD. 455 | 456 | 457 | METHOD if_oo_adt_classrun~main. 458 | " paste here the code you would like to try and run 459 | ENDMETHOD. 460 | 461 | 462 | METHOD inline_declarations. 463 | 464 | *--------------------------------------------------------------------* 465 | *& - DATA 466 | DATA(lv_number) = 5. " variable 467 | 468 | SELECT SINGLE FROM scarr 469 | FIELDS * 470 | WHERE carrid = 'AA' 471 | INTO @DATA(ls_scarr). " structure 472 | 473 | DATA(ls_scarr_copy) = ls_scarr. 474 | 475 | SELECT FROM scarr 476 | FIELDS * 477 | WHERE carrid = 'AA' 478 | INTO TABLE @DATA(lt_scarr). " table 479 | 480 | DATA(lt_scarr_copy) = lt_scarr. 481 | *--------------------------------------------------------------------* 482 | 483 | *--------------------------------------------------------------------* 484 | *& Field Symbols 485 | SELECT FROM scarr 486 | FIELDS * 487 | INTO TABLE @DATA(lt_scarr2) 488 | UP TO 2 ROWS. 489 | 490 | LOOP AT lt_scarr2 ASSIGNING FIELD-SYMBOL(). 491 | -currcode = 'USD'. 492 | ENDLOOP. 493 | 494 | *& LOOP - REFERENCE INTO DATA 495 | LOOP AT lt_scarr2 REFERENCE INTO DATA(lr_scarr). 496 | lr_scarr->currcode = 'EUR'. " - works same as field symbols 497 | ENDLOOP. " - FS offers more performance in tables 498 | " with more entries 499 | *--------------------------------------------------------------------* 500 | 501 | ENDMETHOD. 502 | 503 | 504 | METHOD internal_table_expressions. 505 | 506 | SELECT FROM scarr 507 | FIELDS * 508 | INTO TABLE @DATA(lt_scarr). 509 | 510 | " fetching whole data line(structure) of Lufthansa 511 | " -> if no record is found, throws exception -> cx_sy_itab_line_not_found 512 | " either handle exception via TRY-CATCH or use VALUE #( .. OPTIONAL ) to avoid dump 513 | DATA(ls_lufthansa) = lt_scarr[ carrid = 'LH' ]. 514 | DATA(ls_lufthansa_opt) = VALUE #( lt_scarr[ carrid = 'LH' ] OPTIONAL ). 515 | 516 | " fetching a specific column data of Lufthansa 517 | DATA(lv_lufthansa_carrid) = lt_scarr[ carrid = 'LH' ]-carrid. 518 | 519 | " whether a specific carrier exists (e.g. Lufthansa) 520 | " -> in IF condition no need for xsdbool -> IF line_exists( lt_scarr[ carrid = 'LH' ] )... 521 | DATA(lv_lufthansa_exists) = xsdbool( line_exists( lt_scarr[ carrid = 'LH' ] ) ). 522 | 523 | " index of Lufthansa (returns 0 in case of no record found) 524 | DATA(lv_lv_lufthansa_index) = line_index( lt_scarr[ carrid = 'LH' ] ). 525 | 526 | ENDMETHOD. 527 | 528 | 529 | METHOD loop_at_group_by. 530 | 531 | SELECT FROM scarr 532 | FIELDS * 533 | INTO TABLE @DATA(lt_scarr). 534 | 535 | " Group by currency 536 | LOOP AT lt_scarr INTO DATA(ls_scarr) GROUP BY ls_scarr-currcode. " can be extended ASCENDING / DESCENDING 537 | 538 | ENDLOOP. 539 | 540 | " Group by more fields 541 | LOOP AT lt_scarr INTO ls_scarr GROUP BY ( carrid = ls_scarr-carrid " explicit field specification needed 542 | currcode = ls_scarr-currcode ). 543 | 544 | ENDLOOP. 545 | 546 | " Group by currency EUR or USD 547 | LOOP AT lt_scarr INTO ls_scarr WHERE currcode = 'EUR' 548 | OR currcode = 'USD' 549 | GROUP BY ls_scarr-currcode. 550 | 551 | ENDLOOP. 552 | 553 | " with Field-Symbol 554 | LOOP AT lt_scarr ASSIGNING FIELD-SYMBOL() GROUP BY -currcode. 555 | 556 | ENDLOOP. 557 | 558 | " with REFERENCE INTO 559 | LOOP AT lt_scarr REFERENCE INTO DATA(lr_scarr) GROUP BY lr_scarr->*-carrid. 560 | " or GROUP BY lr_scarr->carrid 561 | ENDLOOP. 562 | 563 | ENDMETHOD. 564 | 565 | 566 | METHOD type_checking. 567 | 568 | DATA: lo_if_type_check TYPE REF TO zif_test_type_checking. 569 | 570 | lo_if_type_check = CAST #( NEW zcl_abap_new_syntax( ) ). 571 | 572 | * -> to confirm the object's specific class type / instance type 573 | * -> or when dealing with inheritance hierarchies 574 | * where multiple classes implement the same interface 575 | 576 | " IS INSTANCE OF 577 | IF lo_if_type_check IS INSTANCE OF zcl_abap_new_syntax. 578 | * out->write( 'IS INSTANCE OF -> zcl_abap_new_syntax' ). 579 | ENDIF. 580 | 581 | " CASE TYPE OF 582 | CASE TYPE OF lo_if_type_check. 583 | WHEN TYPE zcl_abap_new_syntax INTO DATA(lo_optional). 584 | * out->write( 'CASE TYPE OF -> zcl_abap_new_syntax' ). 585 | WHEN OTHERS. 586 | * out->write( 'Other type/instance' ). 587 | ENDCASE. 588 | 589 | " Other variants 590 | " -> Utility Classes might be beneficial in more dynamic scenarios 591 | " (e.g. determining class from a configuration at runtime) 592 | IF abap_true = cl_lcr_util=>instanceof( object = lo_if_type_check 593 | class = 'zcl_abap_new_syntax' ). 594 | * out->write( 'variant 3 -> zcl_abap_new_syntax' ). 595 | ENDIF. 596 | 597 | IF abap_true = cl_wdy_wb_reflection_helper=>is_instance_of( object = lo_if_type_check 598 | type_name = 'zcl_abap_new_syntax' ). 599 | * out->write( 'variant 4 -> zcl_abap_new_syntax' ). 600 | ENDIF. 601 | 602 | ENDMETHOD. 603 | ENDCLASS. 604 | -------------------------------------------------------------------------------- /src/zcl_abap_new_syntax.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCL_ABAP_NEW_SYNTAX 7 | E 8 | ABAP New Syntax 7.4 7.5x 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | D 17 | ABAP New Syntax 7.4 7.5x 18 | 19 | 20 | 21 | 22 | CONDITIONAL_EXPRESSIONS 23 | E 24 | SWITCH, xsdbool, COND 25 | 26 | 27 | CONSTRUCTOR_EXPRESSIONS 28 | E 29 | VALUE, CORRESPONDING, BASE, NEW, REF, FOR, REDUCE, FILTER 30 | 31 | 32 | CONVERSIONS 33 | E 34 | ALPHA Conversion, Date/Time/Number Format, TIMESTAMP, Text 35 | 36 | 37 | ENHANCED_SQL_SYNTAX 38 | E 39 | SELECT FIELD/Subquery,JOINS,UNION,Aggregation,Arithmetic opr 40 | 41 | 42 | INTERNAL_TABLE_EXPRESSIONS 43 | E 44 | line_exists, line_index etc. 45 | 46 | 47 | NUMBER 48 | E 49 | 2 Byte Signed Integer 50 | 51 | 52 | TYPE_CHECKING 53 | E 54 | IS INSTANCE OF, CASE TYPE OF 55 | 56 | 57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /src/zcl_demo_filtering.clas.abap: -------------------------------------------------------------------------------- 1 | CLASS zcl_demo_filtering DEFINITION 2 | PUBLIC FINAL 3 | CREATE PUBLIC. 4 | 5 | PUBLIC SECTION. 6 | INTERFACES if_oo_adt_classrun. 7 | 8 | TYPES: BEGIN OF ts_data, 9 | identifier TYPE i, 10 | payload TYPE string, 11 | sdate TYPE d, 12 | END OF ts_data. 13 | TYPES tt_data TYPE STANDARD TABLE OF ts_data WITH EMPTY KEY 14 | WITH NON-UNIQUE SORTED KEY by_date COMPONENTS sdate. 15 | 16 | PRIVATE SECTION. 17 | CONSTANTS c_table_entries TYPE i VALUE 500000. 18 | 19 | DATA mt_data TYPE tt_data. 20 | DATA md_random_filter TYPE d. 21 | 22 | METHODS prepare_random_data. 23 | 24 | METHODS run_basic_loop_data 25 | RETURNING VALUE(rd_result) TYPE i. 26 | 27 | METHODS run_basic_loop_assigning 28 | RETURNING VALUE(rd_result) TYPE i. 29 | 30 | METHODS run_loop_with_key 31 | RETURNING VALUE(rd_result) TYPE i. 32 | 33 | METHODS run_filter_and_lines 34 | RETURNING VALUE(rd_result) TYPE i. 35 | 36 | METHODS run_reduce 37 | RETURNING VALUE(rd_result) TYPE i. 38 | 39 | METHODS run_for_lines 40 | RETURNING VALUE(rd_result) TYPE i. 41 | ENDCLASS. 42 | 43 | 44 | CLASS zcl_demo_filtering IMPLEMENTATION. 45 | METHOD if_oo_adt_classrun~main. 46 | prepare_random_data( ). 47 | 48 | " ..Basic Loop 49 | DATA(lo_run) = NEW zcl_demo_runtime_measure( ). 50 | DATA(ld_count) = run_basic_loop_data( ). 51 | out->write( |Basic Loop (DATA) - { ld_count } : { lo_run->get_diff( ) }| ). 52 | 53 | " ..Loop Assigning 54 | lo_run = NEW zcl_demo_runtime_measure( ). 55 | ld_count = run_basic_loop_assigning( ). 56 | out->write( |Basic Loop (ASSIGNING) - { ld_count }: { lo_run->get_diff( ) }| ). 57 | 58 | " ..Loop with Key 59 | lo_run = NEW zcl_demo_runtime_measure( ). 60 | ld_count = run_loop_with_key( ). 61 | out->write( |Loop with key - { ld_count } : { lo_run->get_diff( ) }| ). 62 | 63 | " ..FILTER 64 | lo_run = NEW zcl_demo_runtime_measure( ). 65 | ld_count = run_filter_and_lines( ). 66 | out->write( |Filter and Lines - { ld_count } : { lo_run->get_diff( ) }| ). 67 | 68 | " ..REDUCE 69 | lo_run = NEW zcl_demo_runtime_measure( ). 70 | ld_count = run_reduce( ). 71 | out->write( |Reduce - { ld_count } : { lo_run->get_diff( ) }| ). 72 | 73 | " ..FOR 74 | lo_run = NEW zcl_demo_runtime_measure( ). 75 | ld_count = run_for_lines( ). 76 | out->write( |FOR and Lines - { ld_count } : { lo_run->get_diff( ) }| ). 77 | ENDMETHOD. 78 | 79 | METHOD prepare_random_data. 80 | DATA(lo_random_date) = NEW zcl_demo_random( id_min = 0 81 | id_max = 180 ). 82 | DATA(lo_random_string) = NEW zcl_demo_random( id_min = 1 83 | id_max = 6 ). 84 | 85 | DO c_table_entries TIMES. 86 | INSERT VALUE #( identifier = sy-index 87 | payload = SWITCH #( lo_random_string->rand( ) 88 | WHEN 1 THEN `My text is alone` 89 | WHEN 2 THEN `Second entry of this` 90 | WHEN 3 THEN `What you need` 91 | WHEN 4 THEN `The long summer` 92 | WHEN 5 THEN `Advertising your next project` 93 | WHEN 6 THEN `A rainy day` ) 94 | sdate = CONV d( cl_abap_context_info=>get_system_date( ) - lo_random_date->rand( ) ) ) 95 | INTO TABLE mt_data. 96 | ENDDO. 97 | 98 | md_random_filter = cl_abap_context_info=>get_system_date( ) - lo_random_date->rand( ). 99 | ENDMETHOD. 100 | 101 | METHOD run_basic_loop_data. 102 | LOOP AT mt_data INTO DATA(ls_data) WHERE sdate = md_random_filter. 103 | rd_result += 1. 104 | ENDLOOP. 105 | ENDMETHOD. 106 | 107 | METHOD run_basic_loop_assigning. 108 | LOOP AT mt_data ASSIGNING FIELD-SYMBOL() WHERE sdate = md_random_filter. 109 | rd_result += 1. 110 | ENDLOOP. 111 | ENDMETHOD. 112 | 113 | METHOD run_loop_with_key. 114 | LOOP AT mt_data ASSIGNING FIELD-SYMBOL() USING KEY by_date WHERE sdate = md_random_filter. 115 | rd_result += 1. 116 | ENDLOOP. 117 | ENDMETHOD. 118 | 119 | METHOD run_filter_and_lines. 120 | rd_result = lines( FILTER #( mt_data USING KEY by_date WHERE sdate = md_random_filter ) ). 121 | ENDMETHOD. 122 | 123 | METHOD run_reduce. 124 | rd_result = REDUCE #( 125 | INIT ld_count TYPE i 126 | FOR IN mt_data USING KEY by_date WHERE ( sdate = md_random_filter ) 127 | NEXT ld_count += 1 ). 128 | ENDMETHOD. 129 | 130 | METHOD run_for_lines. 131 | rd_result = lines( VALUE tt_data( FOR IN mt_data USING KEY by_date WHERE ( sdate = md_random_filter ) 132 | ( CORRESPONDING #( ) ) ) ). 133 | ENDMETHOD. 134 | ENDCLASS. 135 | -------------------------------------------------------------------------------- /src/zcl_demo_filtering.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCL_DEMO_FILTERING 7 | E 8 | several filtering techniques 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | D 17 | several filtering techniques 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /src/zcl_demo_random.clas.abap: -------------------------------------------------------------------------------- 1 | CLASS zcl_demo_random DEFINITION 2 | PUBLIC FINAL 3 | CREATE PUBLIC. 4 | 5 | PUBLIC SECTION. 6 | CLASS-METHODS class_constructor. 7 | 8 | METHODS constructor 9 | IMPORTING id_min TYPE i DEFAULT 1 10 | id_max TYPE i DEFAULT 6. 11 | 12 | METHODS rand 13 | RETURNING VALUE(rd_rand) TYPE i. 14 | 15 | PRIVATE SECTION. 16 | CLASS-DATA mo_seed TYPE REF TO cl_abap_random. 17 | 18 | DATA mo_rand TYPE REF TO cl_abap_random. 19 | DATA md_from TYPE i. 20 | DATA md_to TYPE i. 21 | ENDCLASS. 22 | 23 | 24 | CLASS zcl_demo_random IMPLEMENTATION. 25 | METHOD class_constructor. 26 | TRY. 27 | DATA(ld_date) = cl_abap_context_info=>get_system_date( ). 28 | DATA(ld_time) = cl_abap_context_info=>get_system_time( ). 29 | 30 | DATA(ld_seed) = CONV i( |{ ld_date+4 }{ ld_time }| ). 31 | CATCH cx_sy_conversion_overflow. 32 | ld_seed = 1337. 33 | ENDTRY. 34 | 35 | mo_seed = cl_abap_random=>create( ld_seed ). 36 | ENDMETHOD. 37 | 38 | METHOD constructor. 39 | md_from = id_min. 40 | md_to = id_max. 41 | 42 | mo_rand = cl_abap_random=>create( mo_seed->intinrange( low = 1 43 | high = 10000 ) ). 44 | ENDMETHOD. 45 | 46 | METHOD rand. 47 | rd_rand = mo_rand->intinrange( low = md_from 48 | high = md_to ). 49 | ENDMETHOD. 50 | ENDCLASS. 51 | -------------------------------------------------------------------------------- /src/zcl_demo_random.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCL_DEMO_RANDOM 7 | E 8 | Generating Random Numbers Class 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | D 17 | Generating Random Numbers Class 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /src/zcl_demo_runtime_measure.clas.abap: -------------------------------------------------------------------------------- 1 | CLASS zcl_demo_runtime_measure DEFINITION 2 | PUBLIC FINAL 3 | CREATE PUBLIC. 4 | 5 | PUBLIC SECTION. 6 | METHODS constructor. 7 | 8 | METHODS get_diff 9 | RETURNING VALUE(rd_result) TYPE timestampl. 10 | 11 | PRIVATE SECTION. 12 | DATA md_started TYPE timestampl. 13 | 14 | METHODS get_timestampl 15 | RETURNING VALUE(rd_result) TYPE timestampl. 16 | ENDCLASS. 17 | 18 | 19 | CLASS zcl_demo_runtime_measure IMPLEMENTATION. 20 | METHOD constructor. 21 | md_started = get_timestampl( ). 22 | ENDMETHOD. 23 | 24 | METHOD get_diff. 25 | rd_result = get_timestampl( ) - md_started. 26 | ENDMETHOD. 27 | 28 | METHOD get_timestampl. 29 | GET TIME STAMP FIELD rd_result. 30 | ENDMETHOD. 31 | ENDCLASS. 32 | -------------------------------------------------------------------------------- /src/zcl_demo_runtime_measure.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCL_DEMO_RUNTIME_MEASURE 7 | E 8 | Runtime Measurement Class 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | D 17 | Runtime Measurement Class 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /src/zif_test_type_checking.intf.abap: -------------------------------------------------------------------------------- 1 | interface ZIF_TEST_TYPE_CHECKING 2 | public . 3 | 4 | endinterface. 5 | -------------------------------------------------------------------------------- /src/zif_test_type_checking.intf.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZIF_TEST_TYPE_CHECKING 7 | E 8 | Test Interface 9 | 2 10 | 1 11 | X 12 | 13 | 14 | 15 | 16 | --------------------------------------------------------------------------------