Aller au contenu

Exploit - Remove request from ADSO by Abap

&---------------------------------------------------------------------*
& Report ZDEL_REQ_ADSO
&---------------------------------------------------------------------*
&
&---------------------------------------------------------------------*

REPORT zdel_req_adso.

PARAMETERS: p_adsonm TYPE rsoadsonm.
PARAMETERS: p_nb_req TYPE i.
DATA: ls_tlogo       TYPE rstran_s_tlogo,
      lt_tlogo_tabl  TYPE rsdso_t_data_tlogo_tabl,
      lr_task_param  TYPE REF TO cl_rsdso_data_task_param,
      lr_task_caller TYPE REF TO cl_rsdso_data_task_caller.

DATA lt_request_xref TYPE rsdso_t_data_request_xref.
DATA v_line          TYPE LINE OF rsdso_t_data_request_xref.
DATA v_nb_lignes     TYPE i.
DATA v_start         TYPE i.

* fill TLOGO structure
ls_tlogo-tlogo = 'ADSO'.
* ou
ls_tlogo-tlogo = 'CUBE'.

ls_tlogo-objnm = p_adsonm.

* create instance of cl_rsdso_data_request_list
DATA(lr_request_list) = cl_rsdso_data_request_list=>create(
i_s_tlogo   = ls_tlogo ).

* refresh list
lr_request_list->refresh( ).

* get list of all requests in XREF format
lt_request_xref = lr_request_list->get_t_request_xref( ).

* On retire de la liste toutes les demandes qu'on ne veut pas
* supprimer
* combien de demandes y aa-t-il ?
* On trie en partant de la plus récente
SORT lt_request_xref BY src_pos DESCENDING.

READ TABLE lt_request_xref INTO v_line INDEX 1.

v_nb_lignes = v_line-src_pos.

* On va supprimer toutes les lignes qu'on veut pas supprimer
* donc on va partir de la ligne que le user a saisi +1

v_start = p_nb_req +  1.

* et on supprime toutes les lignes au-delà
DELETE lt_request_xref FROM v_start TO v_nb_lignes.

*create another instance of cl_rsdso_data_request_list with XREF list
*why this?

*I cannot create lr_request_list with i_task_type = 'DELETE' and
*execute the method "refresh". But without i_task_type = 'DELETE'
*the method "start" of lr_task return with a dump...

*So, lets do this twice..
lr_request_list = cl_rsdso_data_request_list=>create(
i_s_tlogo   = ls_tlogo
i_task_type = 'DELETE'
i_t_request_xref = lt_request_xref ).

*create task for deletion
DATA(lr_task) = cl_rsdso_data_task=>create(
i_s_tlogo = ls_tlogo
i_type = 'DELETE'
i_t_tlogo_tabl = lt_tlogo_tabl
i_r_request_list = lr_request_list
i_r_param = lr_task_param
i_r_caller = lr_task_caller ).

* start deletion

TRY.
  lr_task->start( ).
  CATCH cx_rs_input_invalid INTO DATA(lr_failed).
ENDTRY.

IF lr_failed IS INITIAL.

    * get status
    DATA(lv_status) = lr_task->get_status( ).

    * get log
    DATA(l_r_log)  = lr_task->get_r_log( ).

    * write messages
    LOOP AT l_r_log->get_t_msg( ) ASSIGNING FIELD-SYMBOL(<f_s_msg>).
        DATA ls_msg TYPE rspc_s_msg.
        MOVE-CORRESPONDING <f_s_msg> TO ls_msg.
        MESSAGE ID ls_msg-msgid TYPE ls_msg-msgty NUMBER ls_msg-msgno
        WITH ls_msg-msgv1 ls_msg-msgv2 ls_msg-msgv3 ls_msg-msgv4.
    ENDLOOP.

ELSE.

    WRITE 'No Request was deleted.'.

ENDIF.