Yes, you need to implement top and skip logic in backend code.
Sample -
DATA: lv_from TYPE i,
lv_to TYPE i.
DATA: lref_data TYPE REF TO data.
FIELD-SYMBOLS: <fs_result> TYPE STANDARD TABLE,
<fs_rec> TYPE any.
*-- Reference the data
CREATE DATA lref_data LIKE ct_data.
ASSIGN lref_data->* TO <fs_result>.
IF iv_skip IS NOT INITIAL.
lv_from = iv_skip + 1. "start from record
ELSE.
lv_from = 1.
ENDIF.
IF iv_top IS NOT INITIAL.
lv_to = lv_from + iv_top - 1.
ELSE.
lv_to = lines( ct_data ).
ENDIF.
LOOP AT ct_data ASSIGNING <fs_rec> FROM lv_from TO lv_to.
IF <fs_rec> IS ASSIGNED.
APPEND <fs_rec> TO <fs_result>.
ENDIF.
ENDLOOP.
*-- Output the required number of records
ct_data = <fs_result>.
IF <fs_rec> IS ASSIGNED.
UNASSIGN <fs_rec>.
ENDIF.
ENDMETHOD.
BR.