0% found this document useful (0 votes)
58 views

Abap740 Part 2

This document demonstrates the differences between old and new ABAP syntax using examples of expressions, inline declarations, field symbols, constructor expressions, and table expressions. Some key differences shown include using the @DATA annotation for inline declarations, replacing FIELD-SYMBOLS with FIELD-SYMBOL, and replacing older statements with new syntax like SWITCH, COND, FILTER, and REDUCE. The goal is to help transition code to newer ABAP syntax.

Uploaded by

Krish K
Copyright
© © All Rights Reserved
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
58 views

Abap740 Part 2

This document demonstrates the differences between old and new ABAP syntax using examples of expressions, inline declarations, field symbols, constructor expressions, and table expressions. Some key differences shown include using the @DATA annotation for inline declarations, replacing FIELD-SYMBOLS with FIELD-SYMBOL, and replacing older statements with new syntax like SWITCH, COND, FILTER, and REDUCE. The goal is to help transition code to newer ABAP syntax.

Uploaded by

Krish K
Copyright
© © All Rights Reserved
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 15

*----------------------------------------------------------------------*

* Title : Old v/s New ABAP syntax *


* Object ID : *
* Author : Sumeet and Ronak *
* Date : *
* Business Cont : *
* Release : *
*----------------------------------------------------------------------*
***@TECHNICALDOCUMENTATION
* Program Purpose: To demo Old v/s New Syntax *
***END
*----------------------------------------------------------------------*

REPORT y_new_syntax.

*********************************************
*Expressions
*********************************************

*********************************************
*Inline declaration - Data statement
*********************************************

* Old Syntax

TYPES : BEGIN OF ty_spfli,


carrid TYPE s_carr_id,
connid TYPE s_conn_id,
countryfr TYPE land1,
countryto TYPE land1,
END OF ty_spfli.

DATA : ls_spfli TYPE ty_spfli,


lt_spfli TYPE STANDARD TABLE OF ty_spfli.

SELECT carrid
connid
countryfr
countryto
FROM spfli
INTO TABLE lt_spfli UP TO 5 ROWS.

WRITE : ' Old Syntax for data/type declaration'.


SKIP 1.

WRITE : 0 'Airline code',


15 'Flight Number',
30 'Country from',
45 'Countr to'.

LOOP AT lt_spfli INTO ls_spfli.


WRITE : / ls_spfli-carrid,
15 ls_spfli-connid,
30 ls_spfli-countryfr,
45 ls_spfli-countryto.

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.

WRITE : 0 'Airline code',


15 'Flight Number',
30 'Country from',
45 'Countr to'.

LOOP AT lt_spfli_new INTO DATA(ls_spfli_new).


WRITE : / ls_spfli_new-carrid,
15 ls_spfli_new-connid,
30 ls_spfli_new-countryfr,
45 ls_spfli_new-countryto.
ENDLOOP.

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.

WRITE : 0 'Airline code',


15 'Flight Number',
30 'Country from',
45 'Countr to'.

LOOP AT lt_spfli_new_var INTO DATA(ls_spfli_new_var).


WRITE : / ls_spfli_new_var-carrid,
15 ls_spfli_new_var-connid,
30 ls_spfli_new_var-countryfr,
45 ls_spfli_new_var-countryto.
ENDLOOP.

*********************************************
*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.

DATA : ls_spfli_fs TYPE ty_spfli_fs,


lt_spfli_fs TYPE STANDARD TABLE OF ty_spfli_fs.

FIELD-SYMBOLS : <lfs_spfli_tab> TYPE STANDARD TABLE,


<lfs_spfli_gs> TYPE ty_spfli_fs.

SELECT carrid
connid
countryfr
countryto
FROM spfli
INTO TABLE lt_spfli_fs UP TO 5 ROWS.

ASSIGN lt_spfli_fs[] TO <lfs_spfli_tab>.

WRITE : ' Old Syntax for Field Symbols declaration'.


SKIP 1.

WRITE : 0 'Airline code',


15 'Flight Number',
30 'Country from',
45 'Countr to'.

LOOP AT <lfs_spfli_tab> ASSIGNING <lfs_spfli_gs>.


WRITE : / <lfs_spfli_gs>-carrid,
15 <lfs_spfli_gs>-connid,
30 <lfs_spfli_gs>-countryfr,
45 <lfs_spfli_gs>-countryto.
ENDLOOP.

* 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.

*** Assign function mentioned in table expressions later

*********************************************
*Constructor Expressions
*********************************************

*1) Value Operator

TYPES: t_itab_value_ex1 TYPE STANDARD TABLE OF i


WITH DEFAULT KEY.

*Old syntax

DATA : itab_value_ex1 TYPE t_itab_value_ex1.

APPEND: 100 TO itab_value_ex1,


0 TO itab_value_ex1,
300 TO itab_value_ex1.

* New Syntax

DATA(itab_value_ex2) = VALUE t_itab_value_ex1( ( 100 ) ( ) ( 300 ) ).

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' )
).

***Syntax for deep structure


***struct = VALUE t_struct( col1 = 1
*** col2 = VALUE #( col1 = 1
*** col2 = 2 ) ).
*2) Conv

DATA: int TYPE i.

int = sqrt( 5 ) + sqrt( 6 ).


WRITE: / int,'Int'.
DATA(int_conv) = CONV decfloat34( sqrt( 5 ) ) + CONV decfloat34( sqrt( 6 ) ).
WRITE : / int_conv ,'Int Convert'.

* Without Explicit conversion


IF 1 / 3 > 0.

ENDIF.

*With Explicit conversion


IF CONV decfloat34( 1 / 3 ) > 0.

ENDIF.

DATA txt TYPE abap_bool.


DATA str TYPE string.

txt = ' ' .


str = ` `.

IF txt = str.
...
ENDIF.

IF txt = CONV abap_bool( str ).


...
ENDIF.

*3) COND --> Substitute for If else statements

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

DATA(language) = SWITCH #( sy-langu WHEN 'E' THEN 'English'


WHEN 'D' THEN 'German'
ELSE 'Other' ).

WRITE : language.
****************************************
* Table Expressions
*****************************************

*1) Read straight from index.

TYPES : BEGIN OF ty_int_exp,


field1 TYPE i,
field2 TYPE i,
field3 TYPE i,
END OF ty_int_exp.

TYPES : tt_int_exp TYPE STANDARD TABLE OF ty_int_exp WITH DEFAULT KEY.

DATA(itab_index) = VALUE tt_int_exp( ( field1 = 10 field2 = 20 field3 = 30 )


( field1 = 100 field2 = 200 field3 = 300 )
( field1 = 1000 field2 = 2000 field3 = 3000 )
).

DATA(ls_itab_index) = VALUE ty_int_exp( itab_index[ 1 ] DEFAULT VALUE


ty_int_exp( field1 = 0 field2 = 0 field3 = 0 ) ).

**Read with where clause.


DATA(ls_itab_index2) = VALUE ty_int_exp( itab_index[ field1 = 200 ] DEFAULT VALUE
ty_int_exp( field1 = 0 field2 = 0 field3 = 0 ) ).

** Assign and then change values


ASSIGN itab_index[ 1 ] TO FIELD-SYMBOL(<lfs_itab_index>).
<lfs_itab_index>-field1 = <lfs_itab_index>-field1 * 5.

*** Line exists alternate to read table transporting no fields


IF line_exists( itab_index[ field1 = 100 ] ).

ENDIF.

**** Number of lines


DATA(number_of_lines) = lines( itab_index ).

***Line index
DATA(row_num) = line_index( itab_index[ field2 = 2000 ] ).

** Filter

TYPES: BEGIN OF lty_flt,


coun_from TYPE land1,
END OF lty_flt,
tt_flt TYPE HASHED TABLE OF lty_flt WITH UNIQUE KEY coun_from.

DATA: lt_spfli1 TYPE TABLE OF spfli,


lt_spfli2 TYPE TABLE OF spfli,
lt_spfli3 TYPE TABLE OF spfli,
lt_flt TYPE tt_flt.
*-- Get all entries from SPFLI
SELECT * FROM spfli INTO TABLE lt_spfli1.

* Fill value on filter table LT_FLT


lt_flt = VALUE tt_flt( ( coun_from = 'DE' )
).
* FILTERING apply on internal table LT_SPFLI1 based on filter table
lt_spfli2 = FILTER #( lt_spfli1 IN lt_flt
WHERE countryfr = coun_from ).

lt_spfli3 = FILTER #( lt_spfli1 EXCEPT IN lt_flt


WHERE countryfr = coun_from ).

*DATA(ls_spfli2) = lt_spfli2[ 1 ]. "--> Get First Line of internal Table


DATA(ls_spfli2) = VALUE #( lt_spfli2[ carrid = 'AC' ] DEFAULT space ). "--> Get
line with CARRID = AC
*IF line_exists( lt_spfli2[ carrid = 'RC' ] ).
WRITE: /'FILTER'.

** Reduce
DATA itab1 TYPE STANDARD TABLE OF i WITH EMPTY KEY.
itab1 = VALUE #( FOR j = 1 WHILE j <= 10 ( j ) ).

DATA(sum) = REDUCE i( INIT x = 0 FOR wa IN itab1 NEXT x = x + wa ).


WRITE: /'Reducing a table to a variable'.

** chaining
DATA(lv_row1_col1) = VALUE #( itab_index[ field1 = 200 ]-field1 DEFAULT space ).

*** For and let


DATA(itab_index3) = VALUE tt_int_exp( FOR <lfs_index3> IN itab_index
LET x = 3
IN field3 = <lfs_index3>-field3 * x
(
field1 = <lfs_index3>-field1
field2 = <lfs_index3>-field2
)
).

** 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

DATA : string1 TYPE char4,


string2 TYPE char4,
subrc_1 TYPE string,
string3 TYPE string,
string4 TYPE string.

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.

******** Character string processing

DATA : lv_hu_ext TYPE exidv VALUE '1000'.


DATA(lv_hu_in) = |{ lv_hu_ext ALPHA = IN }|.
DATA(lv_hu_out) = |{ lv_hu_in ALPHA = OUT }|.

WRITE : / lv_hu_in, to_upper( 'hu in' ),


/ lv_hu_out, to_lower( 'HU_OUT' ),
/ lv_hu_in && lv_hu_out .

*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 ).

*2) Comparison with old and new

*Open SQL syntax(old)

* 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).

**Result, with type inference


* SELECT SO_ID,
* CURRENCY_CODE,
* GROSS_AMOUNT,
* DELIVERY_STATUS
*FROM SNWD_SO
*INTO TABLE @DATA(LT_RESULT).
*

*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.

**4) Existence Check


*
* SELECT SINGLE 'Exist'
*FROM SNWD_SO
*INTO @data(LV_EXISTS).
*IF LV_EXISTS = ABAP_TRUE.
** DO SOME AWESOME APPLICATION LOGIC
*ELSE.
** NO SALES ORDER EXISTS
*ENDIF.

*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'.

You might also like