After reading this great blog from J. Jonkergouw on his website about Delete overlapping requests DataStore Object using ABAP, we had a similar issue, however we needed to keep one historic load in the DSO. That's why we altered the code a bit to keep requests from one DSO.
Kudos to the code of Joury, very nice to implement.
DATA:
l_t_rsiccont TYPE STANDARD TABLE OF rsiccont,
lv_ftimestampc TYPE c LENGTH 14,
lv_ttimestampc TYPE c LENGTH 14,
lv_frtimestamp TYPE rstimestmp,
lv_totimestamp TYPE rstimestmp,
lv_calweek TYPE /bi0/oicalweek,
lv_first_date TYPE scal-date,
lv_last_date TYPE scal-date.
CONSTANTS:
lc_begin_time TYPE c LENGTH 6 VALUE '000000',
lc_end_time TYPE c LENGTH 6 VALUE '235959',
lc_dso TYPE rsinfocube VALUE 'ZJJ_DSO_NAME',
lc_dso_out TYPE rsinfocube VALUE 'ZRB_DSO_NAME'.
FIELD-SYMBOLS:
<lfs_rsiccont> TYPE rsiccont.
*- Convert system date to calendar week.
CALL FUNCTION 'ZBW_DATE_TO_ANYTHING'
EXPORTING
i_calday = sy-datum
IMPORTING
e_calweek = lv_calweek.
*- Get week first and last day.
CALL FUNCTION 'WEEK_GET_FIRST_DAY'
EXPORTING
week = lv_calweek
IMPORTING
date = lv_first_date
EXCEPTIONS
week_invalid = 1
OTHERS = 2.
*- Define last day of the week
lv_last_date = lv_first_date + 6.
*- Concatenate to a string with format YYYYMMDDHHIISS
CONCATENATE lv_first_date lc_begin_time INTO lv_ftimestampc.
CONCATENATE lv_last_date lc_end_time INTO lv_ttimestampc.
*- Convert the from and to string to a timestamp format
*- Needed to select data from the RSICCONT
lv_frtimestamp = lv_ftimestampc.
lv_totimestamp = lv_ttimestampc.
*- Select all requests which are currently in the data monitor
*- The adjustment made is an inner join from the request table
*- which stores the source of the DTP and is filtered out in the where class
SELECT rnr timestamp FROM rsiccont AS p
INNER JOIN rsbkrequest AS r ON r~request = p~rnr
INTO CORRESPONDING FIELDS OF TABLE l_t_rsiccont
WHERE icube EQ lc_dso
AND NOT src EQ lc_dso_out
AND timestamp BETWEEN lv_frtimestamp AND lv_totimestamp.
*- If we start ASCENDING then the oldest requests will be
*- deleted including the ones till the current date.
SORT l_t_rsiccont BY timestamp DESCENDING.
*- Start looping over the requests.
LOOP AT l_t_rsiccont ASSIGNING <lfs_rsiccont>.
*- Delete requests from the DSO
CALL FUNCTION 'RSSM_DELETE_REQUEST'
EXPORTING
request = <lfs_rsiccont>-rnr
infocube = lc_dso
dialog = abap_false
EXCEPTIONS
request_not_in_cube = 1
infocube_not_found = 2
request_already_aggregated = 3
request_already_comdensed = 4
no_enqueue_possible = 5
cube_in_planning_mode = 6
OTHERS = 7.
* Uncomment if you want to enable error handling
* IF sy-subrc <> 0.
* MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
* WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
* ENDIF.
ENDLOOP.