├── .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 |
--------------------------------------------------------------------------------