[[{“value”:”
If like me you don’t know well the ABAP SQL window functions (partitions with OVER, window functions) and have difficulties to quickly choose between them, here’s a compilation of the ABAP Keyword Documentation + ABAP results. It concerns ABAP 7.58.
- AVG (ask me if you need it)
- CORR (ask)
- CORR_SPEARMAN (ask)
- COUNT
- DENSE_RANK
- FIRST_VALUE
- LAG
- LAST_VALUE
- LEAD
- MAX
- MEDIAN (ask)
- MIN
- NTILE
- RANK
- ROW_NUMBER
- STDDEV (ask)
- VAR (ask)
FIRST_VALUE, LAST_VALUE
Content of table DEMO_UPDATE:
| ID | COL1 | COL2 | COL3 |
| A | 1 | 5 | 62 |
| B | 1 | 4 | 62 |
| C | 1 | 8 | 62 |
| D | 1 | 10 | 62 |
| E | 1 | 978 | 62 |
| F | 1 | 927 | 88 |
| G | 1 | 0 | 99 |
| H | 1 | 0 | 124 |
| I | 2 | 1001 | 44 |
| J | 2 | 43 | 44 |
| K | 2 | 4 | 44 |
| L | 2 | 17 | 44 |
| M | 2 | 33 | 44 |
| N | 2 | 100 | 44 |
| O | 2 | 101 | 44 |
| P | 2 | 5839 | 55 |
| Q | 2 | 548 | 77 |
| R | 2 | 18 | 133 |
| S | 3 | 554346 | 23 |
| T | 3 | 1001 | 111 |
ABAP SQL:
SELECT
id,
col1,
col2,
col3,
FIRST_VALUE( col2 ) OVER( PARTITION BY col1 ORDER BY col3 )
AS first_value,
LAST_VALUE( col2 ) OVER( PARTITION BY col1 ORDER BY col3 )
AS last_value,
LAST_VALUE( col2 ) OVER( PARTITION BY col1 ORDER BY col3
ROWS BETWEEN UNBOUNDED PRECEDING
AND UNBOUNDED FOLLOWING )
AS last_value_correct
FROM demo_update
INTO TABLE @FINAL(result).
Result (copied from ABAP Keyword Documentation):
LAG, LEAD
Content of table DEMO_EXPRESSIONS:
| ID | CHAR1 | CHAR2 | NUM1 |
| b | AA | AA | 6 |
| d | AA | AA | 3 |
| e | AA | AA | 4 |
| t | AA | AA | 8 |
| c | AA | AB | 6 |
| v | AA | AB | 1 |
| a | AA | BA | 5 |
| f | AA | BA | 8 |
| k | AB | BB | 2 |
| r | AB | BB | 4 |
| n | BA | AA | 7 |
| u | BA | AB | 4 |
| y | BA | AB | 10 |
| o | BA | BA | 6 |
| x | BA | BA | 10 |
| i | BA | BB | 9 |
| m | BA | BB | 9 |
| p | BA | BB | 6 |
| s | BA | BB | 6 |
| g | BB | AB | 5 |
| l | BB | AB | 4 |
| q | BB | AB | 4 |
| w | BB | AB | 1 |
| h | BB | BA | 7 |
| j | BB | BB | 6 |
ABAP SQL:
SELECT char1, char2,
num1,
ROW_NUMBER( )
OVER( PARTITION BY char1 ORDER BY char2 )
AS rnum,
LEAD( CAST( num1 AS CHAR( 11 ) ), 1, ‘Nope’ )
OVER( PARTITION BY char1 ORDER BY char2 )
AS lead1,
LAG( CAST( num1 AS CHAR( 11 ) ), 1, ‘Nope’ )
OVER( PARTITION BY char1 ORDER BY char2 )
AS lag1,
LEAD( CAST( num1 AS CHAR( 11 ) ), 2, ‘Nope’ )
OVER( PARTITION BY char1 ORDER BY char2 )
AS lead2,
LAG( CAST( num1 AS CHAR( 11 ) ), 2, ‘Nope’ )
OVER( PARTITION BY char1 ORDER BY char2 )
AS lag2,
LEAD( CAST( num1 AS CHAR( 11 ) ), 10, ‘Nope’ )
OVER( PARTITION BY char1 ORDER BY char2 )
AS lead10,
LAG( CAST( num1 AS CHAR( 11 ) ), 10, ‘Nope’ )
OVER( PARTITION BY char1 ORDER BY char2 )
AS lag10
FROM demo_expressions
ORDER BY char1, char2 “#EC CI_NOWHERE
INTO TABLE @FINAL(windowed_order_ascending) ##no_text.
Result:
| CHAR1 | CHAR2 | NUM1 | RNUM | LEAD1 | LAG1 | LEAD2 | LAG2 | LEAD10 | LAG10 |
| AA | AA | 6 | 1 | 3 | Nope | 4 | Nope | Nope | Nope |
| AA | AA | 3 | 2 | 4 | 6 | 8 | Nope | Nope | Nope |
| AA | AA | 4 | 3 | 8 | 3 | 6 | 6 | Nope | Nope |
| AA | AA | 8 | 4 | 6 | 4 | 1 | 3 | Nope | Nope |
| AA | AB | 6 | 5 | 1 | 8 | 5 | 4 | Nope | Nope |
| AA | AB | 1 | 6 | 5 | 6 | 8 | 8 | Nope | Nope |
| AA | BA | 5 | 7 | 8 | 1 | Nope | 6 | Nope | Nope |
| AA | BA | 8 | 8 | Nope | 5 | Nope | 1 | Nope | Nope |
| AB | BB | 2 | 1 | 4 | Nope | Nope | Nope | Nope | Nope |
| AB | BB | 4 | 2 | Nope | 2 | Nope | Nope | Nope | Nope |
| BA | AA | 7 | 1 | 4 | Nope | 10 | Nope | Nope | Nope |
| BA | AB | 4 | 2 | 10 | 7 | 6 | Nope | Nope | Nope |
| BA | AB | 10 | 3 | 6 | 4 | 10 | 7 | Nope | Nope |
| BA | BA | 6 | 4 | 10 | 10 | 9 | 4 | Nope | Nope |
| BA | BA | 10 | 5 | 9 | 6 | 9 | 10 | Nope | Nope |
| BA | BB | 9 | 6 | 9 | 10 | 6 | 6 | Nope | Nope |
| BA | BB | 9 | 7 | 6 | 9 | 6 | 10 | Nope | Nope |
| BA | BB | 6 | 8 | 6 | 9 | Nope | 9 | Nope | Nope |
| BA | BB | 6 | 9 | Nope | 6 | Nope | 9 | Nope | Nope |
| BB | AB | 5 | 1 | 4 | Nope | 4 | Nope | Nope | Nope |
| BB | AB | 4 | 2 | 4 | 5 | 1 | Nope | Nope | Nope |
| BB | AB | 4 | 3 | 1 | 4 | 7 | 5 | Nope | Nope |
| BB | AB | 1 | 4 | 7 | 4 | 6 | 4 | Nope | Nope |
| BB | BA | 7 | 5 | 6 | 1 | Nope | 4 | Nope | Nope |
| BB | BB | 6 | 6 | Nope | 7 | Nope | 1 | Nope | Nope |
ABAP SQL:
SELECT char1, char2,
num1,
ROW_NUMBER( )
OVER( PARTITION BY char1 ORDER BY char2 DESCENDING )
AS rnum,
LEAD( CAST( num1 AS CHAR( 11 ) ), 1, ‘Nope’ )
OVER( PARTITION BY char1 ORDER BY char2 DESCENDING )
AS lead1,
LAG( CAST( num1 AS CHAR( 11 ) ), 1, ‘Nope’ )
OVER( PARTITION BY char1 ORDER BY char2 DESCENDING )
AS lag1,
LEAD( CAST( num1 AS CHAR( 11 ) ), 2, ‘Nope’ )
OVER( PARTITION BY char1 ORDER BY char2 DESCENDING )
AS lead2,
LAG( CAST( num1 AS CHAR( 11 ) ), 2, ‘Nope’ )
OVER( PARTITION BY char1 ORDER BY char2 DESCENDING )
AS lag2,
LEAD( CAST( num1 AS CHAR( 11 ) ), 10, ‘Nope’ )
OVER( PARTITION BY char1 ORDER BY char2 DESCENDING )
AS lead10,
LAG( CAST( num1 AS CHAR( 11 ) ), 10, ‘Nope’ )
OVER( PARTITION BY char1 ORDER BY char2 DESCENDING )
AS lag10
FROM demo_expressions
ORDER BY char1, char2 “#EC CI_NOWHERE
INTO TABLE @FINAL(windowed_order_descending) ##no_text.
Result:
| CHAR1 | CHAR2 | NUM1 | RNUM | LEAD1 | LAG1 | LEAD2 | LAG2 | LEAD10 | LAG10 |
| AA | AA | 6 | 5 | 3 | 1 | 4 | 6 | Nope | Nope |
| AA | AA | 3 | 6 | 4 | 6 | 8 | 1 | Nope | Nope |
| AA | AA | 4 | 7 | 8 | 3 | Nope | 6 | Nope | Nope |
| AA | AA | 8 | 8 | Nope | 4 | Nope | 3 | Nope | Nope |
| AA | AB | 6 | 3 | 1 | 8 | 6 | 5 | Nope | Nope |
| AA | AB | 1 | 4 | 6 | 6 | 3 | 8 | Nope | Nope |
| AA | BA | 5 | 1 | 8 | Nope | 6 | Nope | Nope | Nope |
| AA | BA | 8 | 2 | 6 | 5 | 1 | Nope | Nope | Nope |
| AB | BB | 2 | 1 | 4 | Nope | Nope | Nope | Nope | Nope |
| AB | BB | 4 | 2 | Nope | 2 | Nope | Nope | Nope | Nope |
| BA | AA | 7 | 9 | Nope | 10 | Nope | 4 | Nope | Nope |
| BA | AB | 4 | 7 | 10 | 10 | 7 | 6 | Nope | Nope |
| BA | AB | 10 | 8 | 7 | 4 | Nope | 10 | Nope | Nope |
| BA | BA | 6 | 5 | 10 | 6 | 4 | 6 | Nope | Nope |
| BA | BA | 10 | 6 | 4 | 6 | 10 | 6 | Nope | Nope |
| BA | BB | 9 | 1 | 9 | Nope | 6 | Nope | Nope | Nope |
| BA | BB | 9 | 2 | 6 | 9 | 6 | Nope | Nope | Nope |
| BA | BB | 6 | 3 | 6 | 9 | 6 | 9 | Nope | Nope |
| BA | BB | 6 | 4 | 6 | 6 | 10 | 9 | Nope | Nope |
| BB | AB | 5 | 3 | 4 | 7 | 4 | 6 | Nope | Nope |
| BB | AB | 4 | 4 | 4 | 5 | 1 | 7 | Nope | Nope |
| BB | AB | 4 | 5 | 1 | 4 | Nope | 5 | Nope | Nope |
| BB | AB | 1 | 6 | Nope | 4 | Nope | 4 | Nope | Nope |
| BB | BA | 7 | 2 | 5 | 6 | 4 | Nope | Nope | Nope |
| BB | BB | 6 | 1 | 7 | Nope | 5 | Nope | Nope | Nope |
NTILE
Content of table DEMO_EMPLOYEES:
| NAME | SALARY |
| Lothar Sudhoff | 1354 |
| Johannes Legrand | 1468 |
| Holm Trensch | 2324 |
| Johann Buchholm | 3245 |
| Christa Martin | 3247 |
| Laura Lindwurm | 3247 |
| Amelie Babilon | 3485 |
| Thilo Eichbaum | 5436 |
| Ulla Babilon | 5489 |
| Illya Gueldenpfennig | 7453 |
| Anna Picard | 7453 |
ABAP SQL:
SELECT name,
salary,
NTILE( 5 ) OVER( ORDER BY salary ) AS ntile
FROM demo_employees
INTO TABLE @FINAL(result).
Result:
| NAME | SALARY | NTILE |
| Lothar Sudhoff | 1354 | 1 |
| Johannes Legrand | 1468 | 1 |
| Holm Trensch | 2324 | 1 |
| Johann Buchholm | 3245 | 2 |
| Christa Martin | 3247 | 2 |
| Laura Lindwurm | 3247 | 3 |
| Amelie Babilon | 3485 | 3 |
| Thilo Eichbaum | 5436 | 4 |
| Ulla Babilon | 5489 | 4 |
| Illya Gueldenpfennig | 7453 | 5 |
| Anna Picard | 7453 | 5 |
count, dense_rank, max, min, rank, row_number, sum
Content of table DEMO_EXPRESSIONS:
| ID | CHAR1 | CHAR2 | NUM1 |
| g | AA | AB | 3 |
| i | AA | AB | 7 |
| l | AA | AB | 6 |
| p | AA | AB | 6 |
| c | AA | BA | 10 |
| a | AA | BB | 7 |
| b | AA | BB | 10 |
| e | AB | AB | 4 |
| m | AB | AB | 8 |
| w | AB | AB | 1 |
| r | AB | BA | 1 |
| f | AB | BB | 9 |
| n | AB | BB | 1 |
| s | AB | BB | 4 |
| u | AB | BB | 7 |
| h | BA | AA | 2 |
| x | BA | AA | 8 |
| o | BA | AB | 10 |
| d | BA | BA | 6 |
| v | BA | BB | 8 |
| y | BA | BB | 1 |
| k | BB | AA | 7 |
| j | BB | BA | 2 |
| t | BB | BA | 4 |
| q | BB | BB | 10 |
ABAP SQL:
SELECT char1, char2,
num1,
COUNT(*) OVER( PARTITION BY char1 ) AS cnt,
ROW_NUMBER( ) OVER( PARTITION BY char1 ) AS rnum,
‘-‘ AS rank,
‘-‘ AS schlank,
MAX( num1 ) OVER( PARTITION BY char1 ) AS max,
MIN( num1 ) OVER( PARTITION BY char1 ) AS min,
SUM( num1 ) OVER( PARTITION BY char1 ) AS sum,
division( 100 * num1,
SUM( num1 ) OVER( PARTITION BY char1 ),
2 ) AS perc
FROM demo_expressions
ORDER BY char1, char2
INTO TABLE @FINAL(windowed_no_order).
Result:
| CHAR1 | CHAR2 | NUM1 | CNT | RNUM | RANK | SCHLANK | MAX | MIN | SUM | PERC |
| AA | AB | 3 | 7 | 4 | – | – | 10 | 3 | 49 | 6.12 |
| AA | AB | 7 | 7 | 5 | – | – | 10 | 3 | 49 | 14.29 |
| AA | AB | 6 | 7 | 6 | – | – | 10 | 3 | 49 | 12.24 |
| AA | AB | 6 | 7 | 7 | – | – | 10 | 3 | 49 | 12.24 |
| AA | BA | 10 | 7 | 3 | – | – | 10 | 3 | 49 | 20.41 |
| AA | BB | 7 | 7 | 1 | – | – | 10 | 3 | 49 | 14.29 |
| AA | BB | 10 | 7 | 2 | – | – | 10 | 3 | 49 | 20.41 |
| AB | AB | 4 | 8 | 1 | – | – | 9 | 1 | 35 | 11.43 |
| AB | AB | 8 | 8 | 3 | – | – | 9 | 1 | 35 | 22.86 |
| AB | AB | 1 | 8 | 8 | – | – | 9 | 1 | 35 | 2.86 |
| AB | BA | 1 | 8 | 5 | – | – | 9 | 1 | 35 | 2.86 |
| AB | BB | 9 | 8 | 2 | – | – | 9 | 1 | 35 | 25.71 |
| AB | BB | 1 | 8 | 4 | – | – | 9 | 1 | 35 | 2.86 |
| AB | BB | 4 | 8 | 6 | – | – | 9 | 1 | 35 | 11.43 |
| AB | BB | 7 | 8 | 7 | – | – | 9 | 1 | 35 | 20.0 |
| BA | AA | 2 | 6 | 2 | – | – | 10 | 1 | 35 | 5.71 |
| BA | AA | 8 | 6 | 5 | – | – | 10 | 1 | 35 | 22.86 |
| BA | AB | 10 | 6 | 3 | – | – | 10 | 1 | 35 | 28.57 |
| BA | BA | 6 | 6 | 1 | – | – | 10 | 1 | 35 | 17.14 |
| BA | BB | 8 | 6 | 4 | – | – | 10 | 1 | 35 | 22.86 |
| BA | BB | 1 | 6 | 6 | – | – | 10 | 1 | 35 | 2.86 |
| BB | AA | 7 | 4 | 2 | – | – | 10 | 2 | 23 | 30.43 |
| BB | BA | 2 | 4 | 1 | – | – | 10 | 2 | 23 | 8.7 |
| BB | BA | 4 | 4 | 4 | – | – | 10 | 2 | 23 | 17.39 |
| BB | BB | 10 | 4 | 3 | – | – | 10 | 2 | 23 | 43.48 |
ABAP SQL:
SELECT char1, char2,
num1,
COUNT(*) OVER( PARTITION BY char1
ORDER BY char2 ) AS cnt,
ROW_NUMBER( ) OVER( PARTITION BY char1
ORDER BY char2 ) AS rnum,
RANK( ) OVER( PARTITION BY char1
ORDER BY char2 ) AS rank,
DENSE_RANK( ) OVER( PARTITION BY char1
ORDER BY char2 ) AS schlank,
MAX( num1 ) OVER( PARTITION BY char1
ORDER BY char2 ) AS max,
MIN( num1 ) OVER( PARTITION BY char1
ORDER BY char2 ) AS min,
SUM( num1 ) OVER( PARTITION BY char1
ORDER BY char2 ) AS sum,
division( 100 * num1,
SUM( num1 ) OVER( PARTITION BY char1
ORDER BY char2 ),
2 ) AS perc
FROM demo_expressions
ORDER BY char1, char2
INTO TABLE @FINAL(windowed_order_ascending).
Result:
| CHAR1 | CHAR2 | NUM1 | CNT | RNUM | RANK | SCHLANK | MAX | MIN | SUM | PERC |
| AA | AB | 3 | 4 | 1 | 1 | 1 | 7 | 3 | 22 | 13.64 |
| AA | AB | 7 | 4 | 2 | 1 | 1 | 7 | 3 | 22 | 31.82 |
| AA | AB | 6 | 4 | 3 | 1 | 1 | 7 | 3 | 22 | 27.27 |
| AA | AB | 6 | 4 | 4 | 1 | 1 | 7 | 3 | 22 | 27.27 |
| AA | BA | 10 | 5 | 5 | 5 | 2 | 10 | 3 | 32 | 31.25 |
| AA | BB | 7 | 7 | 6 | 6 | 3 | 10 | 3 | 49 | 14.29 |
| AA | BB | 10 | 7 | 7 | 6 | 3 | 10 | 3 | 49 | 20.41 |
| AB | AB | 4 | 3 | 1 | 1 | 1 | 8 | 1 | 13 | 30.77 |
| AB | AB | 8 | 3 | 2 | 1 | 1 | 8 | 1 | 13 | 61.54 |
| AB | AB | 1 | 3 | 3 | 1 | 1 | 8 | 1 | 13 | 7.69 |
| AB | BA | 1 | 4 | 4 | 4 | 2 | 8 | 1 | 14 | 7.14 |
| AB | BB | 9 | 8 | 5 | 5 | 3 | 9 | 1 | 35 | 25.71 |
| AB | BB | 1 | 8 | 6 | 5 | 3 | 9 | 1 | 35 | 2.86 |
| AB | BB | 4 | 8 | 7 | 5 | 3 | 9 | 1 | 35 | 11.43 |
| AB | BB | 7 | 8 | 8 | 5 | 3 | 9 | 1 | 35 | 20.0 |
| BA | AA | 2 | 2 | 1 | 1 | 1 | 8 | 2 | 10 | 20.0 |
| BA | AA | 8 | 2 | 2 | 1 | 1 | 8 | 2 | 10 | 80.0 |
| BA | AB | 10 | 3 | 3 | 3 | 2 | 10 | 2 | 20 | 50.0 |
| BA | BA | 6 | 4 | 4 | 4 | 3 | 10 | 2 | 26 | 23.08 |
| BA | BB | 8 | 6 | 5 | 5 | 4 | 10 | 1 | 35 | 22.86 |
| BA | BB | 1 | 6 | 6 | 5 | 4 | 10 | 1 | 35 | 2.86 |
| BB | AA | 7 | 1 | 1 | 1 | 1 | 7 | 7 | 7 | 100.0 |
| BB | BA | 2 | 3 | 2 | 2 | 2 | 7 | 2 | 13 | 15.38 |
| BB | BA | 4 | 3 | 3 | 2 | 2 | 7 | 2 | 13 | 30.77 |
| BB | BB | 10 | 4 | 4 | 4 | 3 | 10 | 2 | 23 | 43.48 |
ABAP SQL:
SELECT char1, char2,
num1,
COUNT(*) OVER( PARTITION BY char1
ORDER BY char2 DESCENDING ) AS cnt,
ROW_NUMBER( ) OVER( PARTITION BY char1
ORDER BY char2 DESCENDING ) AS rnum,
RANK( ) OVER( PARTITION BY char1
ORDER BY char2 DESCENDING ) AS rank,
DENSE_RANK( ) OVER( PARTITION BY char1
ORDER BY char2 DESCENDING ) AS schlank,
MAX( num1 ) OVER( PARTITION BY char1
ORDER BY char2 DESCENDING ) AS max,
MIN( num1 ) OVER( PARTITION BY char1
ORDER BY char2 DESCENDING ) AS min,
SUM( num1 ) OVER( PARTITION BY char1
ORDER BY char2 DESCENDING ) AS sum,
division( 100 * num1,
SUM( num1 ) OVER( PARTITION BY char1
ORDER BY char2 DESCENDING ),
2 ) AS perc
FROM demo_expressions
ORDER BY char1 DESCENDING, char2 DESCENDING
INTO TABLE @FINAL(windowed_order_descending).
Result:
| CHAR1 | CHAR2 | NUM1 | CNT | RNUM | RANK | SCHLANK | MAX | MIN | SUM | PERC |
| BB | BB | 10 | 1 | 1 | 1 | 1 | 10 | 10 | 10 | 100.0 |
| BB | BA | 2 | 3 | 2 | 2 | 2 | 10 | 2 | 16 | 12.5 |
| BB | BA | 4 | 3 | 3 | 2 | 2 | 10 | 2 | 16 | 25.0 |
| BB | AA | 7 | 4 | 4 | 4 | 3 | 10 | 2 | 23 | 30.43 |
| BA | BB | 8 | 2 | 1 | 1 | 1 | 8 | 1 | 9 | 88.89 |
| BA | BB | 1 | 2 | 2 | 1 | 1 | 8 | 1 | 9 | 11.11 |
| BA | BA | 6 | 3 | 3 | 3 | 2 | 8 | 1 | 15 | 40.0 |
| BA | AB | 10 | 4 | 4 | 4 | 3 | 10 | 1 | 25 | 40.0 |
| BA | AA | 2 | 6 | 5 | 5 | 4 | 10 | 1 | 35 | 5.71 |
| BA | AA | 8 | 6 | 6 | 5 | 4 | 10 | 1 | 35 | 22.86 |
| AB | BB | 9 | 4 | 1 | 1 | 1 | 9 | 1 | 21 | 42.86 |
| AB | BB | 1 | 4 | 2 | 1 | 1 | 9 | 1 | 21 | 4.76 |
| AB | BB | 4 | 4 | 3 | 1 | 1 | 9 | 1 | 21 | 19.05 |
| AB | BB | 7 | 4 | 4 | 1 | 1 | 9 | 1 | 21 | 33.33 |
| AB | BA | 1 | 5 | 5 | 5 | 2 | 9 | 1 | 22 | 4.55 |
| AB | AB | 4 | 8 | 6 | 6 | 3 | 9 | 1 | 35 | 11.43 |
| AB | AB | 8 | 8 | 7 | 6 | 3 | 9 | 1 | 35 | 22.86 |
| AB | AB | 1 | 8 | 8 | 6 | 3 | 9 | 1 | 35 | 2.86 |
| AA | BB | 7 | 2 | 1 | 1 | 1 | 10 | 7 | 17 | 41.18 |
| AA | BB | 10 | 2 | 2 | 1 | 1 | 10 | 7 | 17 | 58.82 |
| AA | BA | 10 | 3 | 3 | 3 | 2 | 10 | 7 | 27 | 37.04 |
| AA | AB | 3 | 7 | 4 | 4 | 3 | 10 | 3 | 49 | 6.12 |
| AA | AB | 7 | 7 | 5 | 4 | 3 | 10 | 3 | 49 | 14.29 |
| AA | AB | 6 | 7 | 6 | 4 | 3 | 10 | 3 | 49 | 12.24 |
| AA | AB | 6 | 7 | 7 | 4 | 3 | 10 | 3 | 49 | 12.24 |
“}]]
Read More Technology Blog Posts by Members articles
#abap