Abap740 Part 2
Abap740 Part 2
REPORT y_new_syntax.
*********************************************
*Expressions
*********************************************
*********************************************
*Inline declaration - Data statement
*********************************************
* Old Syntax
SELECT carrid
connid
countryfr
countryto
FROM spfli
INTO TABLE lt_spfli UP TO 5 ROWS.
ENDLOOP.
* New Syntax
SELECT carrid,
connid,
countryfr,
countryto
FROM spfli
INTO TABLE @DATA(lt_spfli_new) UP TO 5 ROWS.
SKIP 1.
WRITE : ' New Syntax for data/type declaration'.
SKIP 1.
SKIP.
WRITE : 'Some more variation in Select queries '.
SKIP.
SELECT carrid,
connid,
CASE
WHEN countryfr = ' ' THEN 'N/A'
ELSE countryfr
END AS countryfr,
countryto
FROM spfli
INTO TABLE @DATA(lt_spfli_new_var) UP TO 5 ROWS.
*********************************************
*Inline declaration - Field Symbols statement
*********************************************
* Old syntax.
TYPES : BEGIN OF ty_spfli_fs,
carrid TYPE s_carr_id,
connid TYPE s_conn_id,
countryfr TYPE land1,
countryto TYPE land1,
END OF ty_spfli_fs.
SELECT carrid
connid
countryfr
countryto
FROM spfli
INTO TABLE lt_spfli_fs UP TO 5 ROWS.
* New Syntax
*1)
LOOP AT lt_spfli_fs ASSIGNING FIELD-SYMBOL(<lfs_splfi_gs_new>).
WRITE : / <lfs_spfli_gs>-carrid,
15 <lfs_spfli_gs>-connid,
30 <lfs_spfli_gs>-countryfr,
45 <lfs_spfli_gs>-countryto.
ENDLOOP.
*2)
READ TABLE lt_spfli_fs ASSIGNING FIELD-SYMBOL(<lfs_spfli_gs_new_line>) INDEX 1.
WRITE : / <lfs_spfli_gs_new_line>-carrid.
*********************************************
*Constructor Expressions
*********************************************
*Old syntax
* New Syntax
TYPES:
BEGIN OF ty_data,
kunnr TYPE kunnr,
name1 TYPE name1,
ort01 TYPE ort01,
land1 TYPE land1,
END OF ty_data.
TYPES: tt_data TYPE SORTED TABLE OF ty_data WITH UNIQUE KEY kunnr.
* WITH DEFAULT KEY.
*Old syntax
*
*DATA: itab_multi_c TYPE tt_data.
*FIELD-SYMBOLS: <fs> LIKE LINE OF itab_multi_c.
*APPEND INITIAL LINE TO itab_multi_c ASSIGNING <fs>.
*<fs>-kunnr = '123'.
*<fs>-name1 = 'ABCD'.
*<fs>-ort01 = 'LV'.
*<fs>-land1 = 'NV'.
*APPEND INITIAL LINE TO itab_multi_c ASSIGNING <fs>.
*<fs>-kunnr = '456'.
*<fs>-name1 = 'XYZ'.
*<fs>-ort01 = 'LA'.
*<fs>-land1 = 'CA'.
* New Syntax
DATA(itab_multi_comp) =
VALUE tt_data( ( kunnr = '923' name1 = 'ABCD' ort01 = 'LV' land1 = 'NV' )
( kunnr = '456' name1 = 'XYZ' ort01 = 'LA' land1 = 'CA' )
).
ENDIF.
ENDIF.
IF txt = str.
...
ENDIF.
DATA(current_time) = COND string( WHEN CONV t( sy-timlo ) < '120000' THEN |{ sy-
timlo TIME = ISO } AM|
WHEN CONV t( sy-timlo ) > '120000' THEN |{ CONV t( sy-timlo - 12 *
3600 ) TIME = ISO } PM|
WHEN CONV t( sy-timlo ) = '120000' THEN |High Noon|
ELSE |No Idea| ).
WRITE : current_time.
SKIP 1.
*4) Switch Statement - --> Substitute for Case End case statement
WRITE : language.
****************************************
* Table Expressions
*****************************************
ENDIF.
***Line index
DATA(row_num) = line_index( itab_index[ field2 = 2000 ] ).
** Filter
** Reduce
DATA itab1 TYPE STANDARD TABLE OF i WITH EMPTY KEY.
itab1 = VALUE #( FOR j = 1 WHILE j <= 10 ( j ) ).
** chaining
DATA(lv_row1_col1) = VALUE #( itab_index[ field1 = 200 ]-field1 DEFAULT space ).
** Base statement
itab_index3 = VALUE #( BASE itab_index3 ( field1 = 70 field2 = 80 field3 = 90 ) ).
* Empty key
*TYPES addresses TYPE STANDARD TABLE OF scustom-email WITH EMPTY KEY.
*
*DATA email_tab TYPE addresses.
*
*FIELD-SYMBOLS <email> LIKE LINE OF email_tab.
*
*SELECT email
* FROM scustom
* INTO TABLE @email_tab.
*
*LOOP AT email_tab ASSIGNING <email> USING KEY primary_key.
* mail_manager->send( address = <email> text = ... ).
*ENDLOOP.
****************************************
* Character / String Processing
*****************************************
* Old Syntax
string1 = 'TEST'.
string2 = 'TEST'.
subrc_1 = sy-subrc.
CONCATENATE 'This results in sy-subrc' subrc_1 INTO string3.
string4 = 'The length of the string String3 is'.
WRITE : ' String Operation with Data Declaration -> Old Syntax'.
ULINE.
SKIP 1.
WRITE : 'String1:',string1,
/ 'String1:',string2,
/ 'Subrc_1:',subrc_1,
/ 'String3:',string3,
/ 'String4:',string4, strlen( string3 ).
SKIP 1.
*New Syntax
WRITE : 'String Operation with Data Declaration -> New Syntax'.
ULINE.
SKIP 1.
DATA(string1_new) = 'TEST'.
DATA(string2_new) = |test|.
DATA(subrc_1_new) = sy-subrc .
DATA(string3_new) = |This results in sy-subrc{ subrc_1_new } |.
DATA(string4_new) = |The length of the string String3 is
{ strlen( string3_new ) }|.
WRITE : 'String1:',string1_new,
/ 'String1:',string2_new,
/ 'Subrc_1:',subrc_1_new,
/ 'String3:',string3_new,
/ 'String4:',string4_new.
SKIP 1.
WRITE : 'Some more functions ',
/'String1 in reverse', reverse( string1_new ),
/'String1 to lower case', to_lower( string1_new ),
/'String2 to Upper case', to_upper( string2_new ).
ULINE.
SKIP 1.
*b) between
DATA(work_day_flag) = xsdbool( sy-fdayw BETWEEN 1 AND 5 ).
*c) Exceptions raised in conversions can now be handled when making assignments of
string expressions to target fields. This was not previously the case.
*Exceptions raised (for example, in assignments of non-numeric values to numeric
data types or in overflows) can now be handled in the normal way.
****************************************
* Open SQL modifications
*****************************************
*1) Comma separated, escape characters for host variables --> Normal Select
* Cl_demo_output class,
*
*SELECT carrid,
* CARRNAME
* from scarr
* INTO TABLE @DATA(itab_html_demo).
*
*DATA(html) = cl_demo_output=>get( itab_html_demo ).
*cl_demo_output=>display( html ).
* SELECT SO_ID
* CURRENCY_CODE
* GROSS_AMOUNT
*FROM SNWD_SO
*INTO TABLE LT_SO_AMOUNT.
*
**Open SQL syntax(New)
* SELECT SO_ID,
* CURRENCY_CODE,
* GROSS_AMOUNT
*FROM SNWD_SO
*INTO TABLE @data(@LT_SO_AMOUNT).
*3) Aggregation
*SELECT BP_ID,
* COMPANY_NAME,
* SO~CURRENCY_CODE,
* SUM( SO~GROSS_AMOUNT ) AS TOTAL_GROSS_AMOUNT
*FROM SNWD_SO AS SO
*INNER JOIN SNWD_BPA AS BPA
*ON SO~BUYER_GUID = BPA~NODE_KEY
*INTO TABLE @DATA(LT_RESULT)
*GROUP BY BP_ID, COMPANY_NAME, SO~CURRENCY_CODE.
*5)Arithmetic Expression
*SELECT ( 1 + 1 ) AS TWO,
* ( @LV_DISCOUNT * GROSS_AMOUNT ) AS RED_GROSS_AMOUNT,
* CEIL( GROSS_AMOUNT ) AS CEILED_GROSS_AMOUNT
*FROM SNWD_SO
*INTO TABLE @DATA(LT_RESULT).
**6)Concatenation
*SELECT vbeln
* && ' (' && matnr && ')' && '1' as company_name,
* ' 2 ' as company_sir_name
*FROM vbap
*INTO TABLE @DATA(lt_result) up to 5 ROWS.
*
*cl_demo_output=>display_data( lt_result ).
*7)Simple Case
* SELECT ebeln,
* CASE ebeln
* WHEN ' ' THEN 'Empty'
* WHEN 'D' THEN 'Non empty'
* ELSE ebeln
* END AS DELIVERY_STATUS_LONG
*FROM ekpo
*INTO TABLE @DATA(LT_SIMPLE_CASE).
*cl_demo_output=>display_data( LT_SIMPLE_CASE ).
*8)Searched Case
*SELECT SO_ID,
* CASE WHEN GROSS_AMOUNT > 1000
* THEN 'HIGH VOLUME SALES ORDER'
* ELSE ' '
* END AS VOLUMN_ORDER
*FROM SNWD_SO
*INTO TABLE @DATA(LT_SEARCHED_CASE).
*
*9)Coalesce
*SELECT SO_ID,
* SO~GROSS_AMOUNT AS SO_AMOUNT,
* INV_HEAD~GROSS_AMOUNT AS INV_AMOUNT,
*
* POTENTIAL INVOICE AMOUNT
* COALESCE( INV_HEAD~GROSS_AMOUNT, SO~GROSS_AMOUNT )
* AS EXPECTED_AMOUNT
*FROM SNWD_SO AS SO
*LEFT OUTER JOIN SNWD_SO_INV_HEAD AS INV_HEAD
*ON INV_HEAD~SO_GUID = SO~NODE_KEY
*INTO TABLE @DATA(LT_RESULT).
*
*10)Group By
*
* SELECT BP_ID,
* COMPANY_NAME,
* SO~CURRENCY_CODE,
* SUM( SO~GROSS_AMOUNT ) AS TOTAL_AMOUNT,
* CASE
* WHEN SO~GROSS_AMOUNT < 1000
* THEN 'X'
* ELSE ' '
* END AS LOW_VOLUME_FLAG,
* COUNT( * ) AS CNT_ORDERS
*FROM SNWD_SO AS SO
*INNER JOIN SNWD_BPA AS BPA
*ON BPA~NODE_KEY = SO~BUYER_GUID
*INTO TABLE @DATA(LT_RESULT)
*GROUP BY
* BP_ID, COMPANY_NAME,
* SO~CURRENCY_CODE,
* CASE
* WHEN SO~GROSS_AMOUNT < 1000
* THEN 'X'
* ELSE ' '
* END
*ORDER BY COMPANY_NAME.
*
*11)Having
**
* SELECT BP_ID,
* COMPANY_NAME,
* SO~CURRENCY_CODE,
* SUM( SO~GROSS_AMOUNT ) AS TOTAL_AMOUNT
*FROM SNWD_SO AS SO
*INNER JOIN SNWD_BPA AS BPA
*ON BPA~NODE_KEY = SO~BUYER_GUID
*INTO TABLE @DATA(LT_RESULT)
*WHERE SO~DELIVERY_STATUS = ' '
*GROUP BY
* BP_ID,
* COMPANY_NAME,
* SO~CURRENCY_CODE
*HAVING SUM( SO~GROSS_AMOUNT ) > 10000000.
*
*
**Join
*
SELECT
SO_ID,
BP_ID,
GROSS_AMOUNT
FROM SNWD_SO AS SO
RIGHT OUTER JOIN SNWD_BPA AS BPA
ON SO~BUYER_GUID = BPA~NODE_KEY
AND SO~GROSS_AMOUNT > 100000
INTO TABLE @DATA(LT_RESULT).
**Client Handling
*
* SELECT
* BP_ID,
* COMPANY_NAME,
* SO~CURRENCY_CODE,
* SO~GROSS_AMOUNT
*FROM SNWD_SO AS SO
*INNER JOIN SNWD_BPA AS BPA
*ON SO~BUYER_GUID = BPA~NODE_KEY
*"CLIENT 111 DOES NOT EXIST IN THE SYSTEM
*USING CLIENT '111'
*INTO TABLE @DATA(LT_RESULT).
*
*
**SQL with Arithmetic functions
*
*SELECT ID, NUM1, NUM2,
* @OFFSET AS OFFSET,
* 12 AS FUNCT,
* CAST( NUM1 AS FLTP ) / CAST( NUM2 AS FLTP ) AS RATIO,
* DIV( NUM1, NUM2 ) AS DIV,
* MOD( NUM1, NUM2 ) AS MOD,
* @OFFSET + ABS( NUM1 - NUM2 ) AS SUM
* FROM DEMO_EXPRESSIONS
* ORDER BY SUM DESCENDING
* INTO TABLE @DATA(RESULTS).
*
*Case in SQL
*
* SELECT NUM1, NUM2,
*SIMPLE CASE CONSTRUCT
* CASE ID
* WHEN '1' THEN ( CHAR1 && CHAR2 )
* WHEN '9' THEN ( CHAR2 && CHAR1 )
* ELSE @OTHERS
* END AS TEXT,
*COMPLEX CASE CONSTRUCT
* CASE WHEN NUM1 < 50 AND NUM2 < 50 THEN @BOTH_L
* WHEN NUM1 >= 50 AND NUM2 >= 50 THEN @BOTH_GT
* ELSE @OTHERS
* END AS GROUP
* FROM DEMO_EXPRESSIONS
* ORDER BY GROUP
* INTO TABLE @DATA(RESULTS).
*********************-- Substring
*********************Use Case --> Data from two different tables needs to be
compared in Join, But one of them is 6 char and other is 4 char
********************
********************SELECT vbfa~vbeln, " TO for
the delivery
*********************--------------------------------------------------------------
---------------
******************** substring( vbfa~posnn,3,4 ) AS posnn, " TO Line
Item
*********************--------------------------------------------------------------
---------------
******************** ltap~tanum,
******************** ltap~tapos
******************** FROM vbfa
******************** LEFT OUTER JOIN ltap ON ltap~lgnum = vbfa~lgnum
******************** AND ltap~tanum = vbfa~vbeln
********************* AND vbfa~posnn = ltap~tapos
******************** AND substring( vbfa~posnn,3,4 ) =
ltap~tapos " vbfa~posnn = 123456 --> Start from 3 and till last char i.e 3456 = 4
********************
" Start from 3 and go 4 char ahead
******************** WHERE vbfa~vbeln = '0000000773'
******************** AND vbfa~posnn = '000001'
******************** AND vbfa~vbtyp_n = 'Q'
********************
*********************-- Union will sort and delete adjacent duplicates
*********************-- Union all will not. But should be used where we are sure
about unique entries in the table
******************** UNION ALL
********************
********************SELECT vbfa~vbeln, " TO for
the delivery
*********************--------------------------------------------------------------
---------------
******************** substring( vbfa~posnn,3,4 ) AS posnn, " TO Line
Item
*********************--------------------------------------------------------------
---------------
******************** ltap~tanum,
******************** ltap~tapos
******************** FROM vbfa
******************** LEFT OUTER JOIN ltap ON ltap~lgnum = vbfa~lgnum
******************** AND ltap~tanum = vbfa~vbeln
********************* AND vbfa~posnn = ltap~tapos
******************** AND substring( vbfa~posnn,3,4 ) =
ltap~tapos " vbfa~posnn = 123456 --> Start from 3 and till last char i.e 3456 = 4
********************
" Start from 3 and go 4 char ahead
******************** WHERE vbfa~vbeln = '0000000774'
******************** AND vbfa~posnn = '000001'
******************** AND vbfa~vbtyp_n = 'Q'
******************** INTO TABLE @DATA(lt_substring).
********************
********************ULINE.
********************WRITE: / |Substring and Union Example|.
********************ULINE.
********************
*********************-- CAST
********************
********************SELECT SINGLE
******************** FROM mara
******************** FIELDS CAST( matnr AS CHAR( 2 ) ) AS col1
******************** WHERE matnr = 'ZVCXI_DISST_MAT4'
******************** INTO @DATA(result).
********************WRITE: / 'cast'.
********************
********************SELECT id,
******************** num1,
******************** numlong1,
******************** CAST( 100 AS FLTP ) / CAST( 10 AS FLTP ) AS ratio,
******************** div( numlong1, num1 ) AS div,
******************** mod( numlong1, num1 ) AS mod
******************** FROM demo_expressions
******************** INTO TABLE @DATA(lt_results).
********************ULINE.
********************WRITE: 'Casting'.
********************ULINE.
*ENDIF.
*-- FOR
*TYPES:
* BEGIN OF line,
* col1 TYPE i,
* col2 TYPE i,
* col3 TYPE i,
* END OF line,
* itab TYPE STANDARD TABLE OF line WITH EMPTY KEY.
*
*DATA(itab) = VALUE itab(
* FOR j = 11 THEN j + 10 UNTIL j > 40
* ( col1 = j col2 = j + 1 col3 = j + 2 ) ).
*
*WRITE: /'For Loop'.