* Function module

FUNCTION z_do_nothing.
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  IMPORTING
*"     REFERENCE(IV_IMPORT) TYPE  STRING
*"  EXPORTING
*"     REFERENCE(ET_EXPORT) TYPE  ICL_STRING_T
*"----------------------------------------------------------------------

* some declarations
  CONSTANTS: lc_const TYPE char10 VALUE '0123456789'.

  DATA: lv_dec    TYPE decfloat16,
        ls_mara   TYPE mara,
        lt_mara   TYPE TABLE OF mara,
        lo_object TYPE REF TO cl_any_class.

  DATA spfli_tab TYPE STANDARD TABLE OF spfli
                         WITH EMPTY KEY
             WITH NON-UNIQUE SORTED KEY carr_city
                             COMPONENTS carrid cityfrom.

  FIELD-SYMBOLS: <mara> TYPE mara.

* a full line comment
  DATA(lv_int) = 1000.  " just an initializer

  " create an object and call a method
  CREATE OBJECT lo_obj
    EXPORTING
      iv_int = lv_int.

  DATA(lv_result) = lo_obj->do_nothing( ).
  DATA(lo_obj2) = new cl_any_class( lv_int ).

  " Get some material data 
  SELECT SINGLE matnr, matkl, mtart, maktx
    FROM mara 
    INNER JOIN makt 
      ON makt~matnr EQ mara~matnr
    INTO @ls_mara 
    WHERE matkl EQ '1324'
      AND spras EQ @sy-langu.

  SELECT * FROM mara INTO TABLE @DATA(lt_mara).

  " some ABAP 7.40 syntax
  LOOP AT lt_mara ASSIGNING FIELD-SYMBOL(<wa>)
    GROUP BY ( carrid = <wa>-matkl count = GROUP SIZE )
    ASCENDING
    ASSIGNING FIELD-SYMBOL(<group1>).

    CHECK <wa>-mtart EQ '0001'.
  ENDLOOP.

  IF line_exists( lt_mara[ matnr = '1324' ] ).
    ls_mara = lt_mara[ matnr = '1324' ].
    WRITE: / 'The Material', ls_mara-matnr, '...'.
  ENDIF.

  SELECT * FROM spfli INTO TABLE @spfli_tab.

  DATA(extract) = FILTER #( spfli_tab USING KEY carr_city
                              WHERE carrid   = CONV #( to_upper( carrid ) ) AND
                                    cityfrom = CONV #( to_upper( cityfrom ) ) ).

  DATA(rnd_color) = cl_abap_random_int=>create( seed = CONV #( sy-uzeit ) min = 1 max = 4 ).
  lt_fields = VALUE #( FOR i = 0 UNTIL i > 15
                         ( VALUE #( FOR j = 0 UNTIL j > 15
                             ( rnd_color->get_next( ) ) ) ) ).

  DATA lr_int TYPE RANGE OF i.
  lr_int = VALUE #( sign = 'I'  option = 'BT' ( low = 1  high = 10 )
                                              ( low = 21 high = 30 )
                                              ( low = 41 high = 50 )
                                option = 'GE' ( low = 61 )  ).
  IF 7 IN lr_int.
    " found
  ENDIF.

  PERFORM do_something USING 'test' 
                       CHANGING et_export.

ENDFUNCTION.

* Form routine 

FORM do_something USING iv_input TYPE string
                  CHANGING ct_result TYPE icl_string_t.

  " some more code here ... 
  ct_result = VALUE #( 
    ( iv_input ) 
  ).

  APPEND iv_input 
    TO ct_result.

ENDFORM.

* CDS View

@AbapCatalog.sqlViewName: 'ZBC_DTEL_SEARCHV'
@AbapCatalog.compiler.compareFilter: true
@AbapCatalog.preserveKey: true
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: 'Dataelement Search'

define view ZBC_DTEL_SEARCH as select from dd04l 
  left outer join dd04t
    on dd04t.rollname = dd04l.rollname 
    and dd04t.ddlanguage = $session.system_language  
{
    key dd04l.rollname,
    dd04l.domname,   
    dd04l.datatype,
    dd04l.leng,
    dd04l.decimals,
    dd04l.lowercase,
    dd04t.ddtext,
    dd04t.reptext,
    dd04t.scrtext_s,
    dd04t.scrtext_m,
    dd04t.scrtext_l
}

* NEW operator
DATA(obj) = NEW class( )

* VALUE operator
itab = VALUE #( )

* CORRESPONDING operator
struct2 = CORRESPONDING #( struct1 )

* DEFINE VIEW ENTITY: all keywords
DEFINE VIEW ENTITY ZTest

* keyword keyword name
ASSOCIATION TO ZEntity

* keyword keyword name
COMPOSITION OF ZChild

*** builtins ***
lv_result = conv( lv_value )
div( arg1 arg2 )
currency_conversion( )
reduce( )
filter( )
corresponding( )

*** cond and switch ***
lv_result = COND #( WHEN lv_var = 1 THEN a )
lv_result = SWITCH #( lv_var )

*** let ***
LET lv_var = 1 IN y
LOOP AT itab STEP 2

*** annotation should be a keyword***
@ANNOTATION.label
MANY TO ONE

*** name ***
$session.system_language

* not a keyword *
dd04l.decimals
table.data

*** not keywords ***
input = 'test'
output = 'result'
