top of page

SAP ABAP - Create TOC from Transport Requests

Updated: Aug 29, 2022

TR:

EN:






*&---------------------------------------------------------------------*
*& Report Z_ABAP_CREATE_TOC
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT z_abap_create_toc.

TABLES : trheader.
DATA : gv_toc_text TYPE trheader-as4text.
DATA : gt_task_req_list TYPE TABLE OF trheader-trkorr.
DATA : gv_toc_no TYPE trheader-trkorr.

SELECTION-SCREEN BEGIN OF BLOCK b1.

SELECT-OPTIONS : s_req FOR trheader-trkorr.

SELECTION-SCREEN SKIP.
PARAMETERS : pc_tocn AS CHECKBOX DEFAULT 'X',
             pc_rel  AS CHECKBOX DEFAULT ''.
SELECTION-SCREEN SKIP.
PARAMETERS : p_toc_n  TYPE trheader-as4text,
             p_target TYPE trheader-tarsystem OBLIGATORY DEFAULT 'KRQ'.
SELECTION-SCREEN END OF BLOCK b1.

START-OF-SELECTION.

CLEAR : gv_toc_text,gt_task_req_list[],gv_toc_no.

IF pc_tocn = 'X'.

   IF s_req-high IS NOT INITIAL OR
     lines( s_req[] ) > 1 .
     MESSAGE 'Tek bir request giriniz' TYPE 'I'.
  ELSE.
     PERFORM create_toc.
  ENDIF.
ELSE.
   IF p_toc_n IS INITIAL.
      MESSAGE 'Request Metni Giriniz.' TYPE 'I'.
   ELSEIF p_toc_n(4) NE 'TOC:'.
      MESSAGE 'Request Metni "TOC:" ile başlamalı.' TYPE 'I'.
   ELSE.
       gv_toc_text = p_toc_n.
      PERFORM create_toc.
   ENDIF.
ENDIF.

IF pc_rel = 'X' AND gv_toc_no IS NOT INITIAL.
   PERFORM release_toc.
ENDIF.


*&---------------------------------------------------------------------*
*& Form create_toc
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM create_toc .

SELECT * FROM e070
INTO TABLE @DATA(lt_e070)
WHERE trkorr IN @s_req.

IF sy-subrc = 0.
   SELECT * FROM e070
   INTO TABLE @DATA(lt_e070_tasks)
   FOR ALL ENTRIES IN @lt_e070
   WHERE strkorr EQ @lt_e070-trkorr.

   SELECT * FROM e07t
   INTO TABLE @DATA(lt_e07t)
   FOR ALL ENTRIES IN @lt_e070
   WHERE trkorr EQ @lt_e070-trkorr
   AND langu EQ @sy-langu.
ENDIF.

LOOP AT lt_e070 REFERENCE INTO DATA(lr_e070).
   IF lr_e070->strkorr IS NOT INITIAL.
      APPEND lr_e070->trkorr TO gt_task_req_list.
   ELSE.
      IF pc_tocn = 'X' AND gv_toc_text IS INITIAL.
         IF line_exists( lt_e07t[ trkorr = lr_e070->trkorr ] ).
           gv_toc_text = 'TOC:' && lt_e07t[ trkorr = lr_e070->trkorr ]-as4text.
      ENDIF.
   ENDIF.
   LOOP AT lt_e070_tasks REFERENCE INTO DATA(lr_e070_task)
                         WHERE strkorr = lr_e070->trkorr.

       APPEND lr_e070_task->trkorr TO gt_task_req_list.
    ENDLOOP.
   ENDIF.
ENDLOOP.

DATA : ls_toc_req TYPE trwbo_request_header.
CALL FUNCTION 'TR_INSERT_REQUEST_WITH_TASKS'
EXPORTING
       iv_type            = 'T'
       iv_text            = gv_toc_text
       iv_owner           = sy-uname
       iv_target          = p_target
       iv_with_badi_check = 'X'
IMPORTING
       es_request_header  = ls_toc_req
EXCEPTIONS
       insert_failed      = 1
       enqueue_failed     = 2
OTHERS             = 3.
IF sy-subrc <> 0.
   MESSAGE ID sy-msgid
         TYPE sy-msgty
       NUMBER sy-msgno
         WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
      EXIT.
ENDIF.
   gv_toc_no = ls_toc_req-trkorr.

LOOP AT gt_task_req_list REFERENCE INTO DATA(lr_task_req).
CALL FUNCTION 'TR_COPY_COMM'
   EXPORTING
         wi_dialog                = ''
         wi_trkorr_from           = lr_task_req->*
         wi_trkorr_to             = ls_toc_req-trkorr
         wi_without_documentation = 'X'
   EXCEPTIONS
         db_access_error          = 1
         trkorr_from_not_exist    = 2
         trkorr_to_is_repair      = 3
         trkorr_to_locked         = 4
         trkorr_to_not_exist      = 5
         trkorr_to_released       = 6
         user_not_owner           = 7
         no_authorization         = 8
         wrong_client             = 9
         wrong_category           = 10
         object_not_patchable     = 11
         OTHERS