Wednesday, November 11, 2020

List of Solman open tickets/requests before upgrade from 7.1 - custom clone of tx. /TMWFLOW/REPORTINGN

If you face the upgrade from Solution manager 7.1 to upper version, you need to properly close all open transports. For this purpose you need to have a reliable list of such transports. Ok, there is SAP transaction /TMWFLOW/REPORTINGN offering this kind of export. Nevertheless BC colleagues found, this transaction does not give us a comprehensive list. But if you are calling the transaction one ticket after the other, it works. So we have developed a report using the logic of tx. /TMWFLOW/REPORTINGN to gain list of requests and target systems for given date range, see below screen inputs. May it make your transition a bit easier.


Disclaimer: The logic of tx./TMWFLOW/REPORTINGN listing requests has been put into the method get_requests() in one long dirty list of code lines. Even most of the variable names have been preserved (global,local).


Good luck!







*&---------------------------------------------------------------------*
*& Report  BC_LIST_TRANSPORTS
*&
*&---------------------------------------------------------------------*
* Purpose:  List transports to be solved before Solman upgrade
*&---------------------------------------------------------------------*

REPORT  /yournamespace/bc_list_transports.

INCLUDE /
yournamespace/bc_list_transport_cl1.




TABLEScrmt_report_orderadm_hcrm_jest.

*-----------------------------------------------------------------------
* SELECTION SCREEN
*-----------------------------------------------------------------------
SELECTION-SCREEN BEGIN OF BLOCK bl WITH FRAME TITLE text-001.

SELECT-OPTIONS:
  " Select date range from - to
  so_date FOR sy-datum OBLIGATORY,

  " Process types
  so_rtyp FOR crmt_report_orderadm_h-process_type NO INTERVALS NO DATABASE SELECTION,

  " Object Status
  so_stat FOR crm_jest-stat NO INTERVALS NO DATABASE SELECTION" tj30t-estat

SELECTION-SCREENBEGIN OF LINE.

SELECTION-SCREEN COMMENT 1(11text-002 FOR FIELD p_rads.
PARAMETERSp_rads RADIOBUTTON GROUP rb1.

SELECTION-SCREEN COMMENT 19(1text-004  FOR FIELD p_radf.

SELECTION-SCREEN COMMENT 25(23text-003  FOR FIELD p_radf.
PARAMETERSp_radf RADIOBUTTON GROUP rb1.

SELECTION-SCREENEND OF LINE.

SELECTION-SCREEN END OF BLOCK bl.



*******************************************************************
INITIALIZATION.
*******************************************************************

  " Date range
  so_date-sign 'I'.
  so_date-option 'BT'.
  so_date-low  sy-datum.
  so_date-high sy-datum.
  APPEND so_date.

  " Process type - 2x wanted
  so_rtyp-sign 'I'.
  so_rtyp-option 'EQ'.
  so_rtyp-low  'ZMHF'.
  APPEND so_rtyp.

  so_rtyp-sign 'I'.
  so_rtyp-option 'EQ'.
  so_rtyp-low  'ZMMJ'.
  APPEND so_rtyp.

  " Object Status
*  so_stat-sign = 'I'.
*  so_stat-option = 'EQ'.
*  so_stat-low  = 'E*'. - dynamic SQL LIKE has to be used E%
*  APPEND so_stat.

  so_stat-sign 'E'.
  so_stat-option 'EQ'.
  so_stat-low  'E0006'.
  APPEND so_stat.

  so_stat-sign 'E'.
  so_stat-option 'EQ'.
  so_stat-low  'E0008'.
  APPEND so_stat.

  so_stat-sign 'E'.
  so_stat-option 'EQ'.
  so_stat-low  'E0010'.
  APPEND so_stat.

  so_stat-sign 'E'.
  so_stat-option 'EQ'.
  so_stat-low  'E0016'.
  APPEND so_stat.


  " init docking container for ALV
  lcl_main_bc_list_transport=>self->init).

*******************************************************************
START-OF-SELECTION.
*******************************************************************

  lcl_main_bc_list_transport=>self->run(
    " General settings
    it_date_range so_date[]
    it_pr_type    so_rtyp[]
    it_ob_stat    so_stat[]
    iv_list_f     p_radf
  ).



*&---------------------------------------------------------------------*
*&  Include           /
yournamespace/BC_LIST_TRANSPORT_CL1

*&---------------------------------------------------------------------*

*----------------------------------------------------------------------*
*       CLASS lcl_main_bc_list_transport DEFINITION
*----------------------------------------------------------------------*
* Main class listing Solman tickets + workbenches
*----------------------------------------------------------------------*
* sources:
* http://www.kerum.pl/infodepot/00031
* http://zevolving.com/2008/10/display-alv-report-output-in-the-same-selection-screen/
*----------------------------------------------------------------------*

CLASS lcl_main_bc_list_transport DEFINITION CREATE PRIVATE FINAL.

  PUBLIC SECTION.

    TYPESBEGIN OF ts_date,
             sign                   TYPE tvarv_sign,
             option                 TYPE tvarv_opti,
             low                    TYPE sydatum,
             high                   TYPE sydatum,
           END OF ts_date,
           tt_date TYPE STANDARD TABLE OF ts_date,
           BEGIN OF ts_rtyp,
             sign                   TYPE tvarv_sign,
             option                 TYPE tvarv_opti,
             low                    TYPE crmd_orderadm_h-process_type,
             high                   TYPE crmd_orderadm_h-process_type,
           END OF ts_rtyp,
           tt_rtyp TYPE STANDARD TABLE OF ts_rtyp,
           BEGIN OF ts_stat,
             sign                   TYPE tvarv_sign,
             option                 TYPE tvarv_opti,
             low                    TYPE crm_jest-stat"tj30t-estat,
             high                   TYPE crm_jest-stat"tj30t-estat,
           END OF ts_stat,
           tt_stat TYPE STANDARD TABLE OF ts_stat,
           BEGIN OF ts_result,
             object_id              TYPE crmd_orderadm_h-object_id,
             process_type           TYPE crmd_orderadm_h-process_type,
             description            TYPE crmd_orderadm_h-description,
             posting_date           TYPE crmd_orderadm_h-posting_date,
             created_at             TYPE crmd_orderadm_h-created_at,
             stat                   TYPE crm_jest-stat,
             txt04                  TYPE tj30t-txt30,
             txt30                  TYPE tj30t-txt30,
             created_by             TYPE crmd_orderadm_h-created_by,
             created_by_fullname    TYPE emnam,

             " full list - taken by REPORTN

             " header
             concatstatuser         TYPE crmt_dno_service_monitor-concatstatuser,
             process_type_txt       TYPE crmt_dno_service_monitor-process_type_txt,
             omnitracker            TYPE crmt_dno_service_monitor-po_number_sold,
             person_resp_list       TYPE crmt_dno_service_monitor-person_resp_list,
             sales_employee_list    TYPE crmt_dno_service_monitor-sales_employee_list,
             object_type            TYPE crmt_dno_service_monitor-object_type,
             itm_type               TYPE crmt_dno_service_monitor-itm_type,
             concatstatuser_item    TYPE crmt_dno_service_monitor-concatstatuser_item,

             " request
             strkorr                TYPE /tmwflow/rep2_exp_requests-strkorr,
             tarsystem              TYPE /tmwflow/rep2_exp_requests-tarsystem,
             trfunction             TYPE /tmwflow/rep2_exp_requests-trfunction,
             trstatus               TYPE /tmwflow/rep2_exp_requests-trstatus,
             sysname                TYPE /tmwflow/rep2_exp_requests-sysname,

           END OF ts_result.


    CLASS-DATA
      self TYPE REF TO lcl_main_bc_list_transport.

    CLASS-METHODS
      class_constructor.

    METHODS:
      init,
      run
       IMPORTING
        it_date_range               TYPE tt_date
        it_pr_type                  TYPE tt_rtyp
        it_ob_stat                  TYPE tt_stat
        iv_list_f                   TYPE flag.

  PRIVATE SECTION.

    DATA:
      t_tickets                     TYPE STANDARD TABLE OF ts_result" crmd_orderadm_h + other tables
      t_tickets_reportn             TYPE STANDARD TABLE OF ts_result,
      o_alv                         TYPE REF TO cl_salv_table.

    METHODS:
      constructor,
      get_tickets
        IMPORTING it_date_range     TYPE tt_date
                  it_pr_type        TYPE tt_rtyp
                  it_ob_stat        TYPE tt_stat,
      process_tickets
        IMPORTING iv_list_f         TYPE flag,
      get_requests
        CHANGING  cs_result         TYPE ts_result,
      sql_selopt_to_where
        IMPORTING iv_field          TYPE string
        CHANGING  ct_selopt         TYPE ert_range_option
                  ct_where_cond     TYPE esh_t_co_rfcrt_options,
      sql_operator_map
        IMPORTING iv_option         TYPE ers_range_option-option
        CHANGING  cv_operator       TYPE string,
      alv_generate.

ENDCLASS.                    "lcl_main_bc_list_transport DEFINITION

*----------------------------------------------------------------------*
*       CLASS lcl_main_bc_list_transport IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_main_bc_list_transport IMPLEMENTATION.

  METHOD class_constructor.

    CREATE OBJECT self.

  ENDMETHOD.                    "class_constructor

  METHOD constructor.

  ENDMETHOD.                    "constructor

  METHOD init.

    alv_generate).

  ENDMETHOD.                    "init

  METHOD run.

    self->get_ticketsit_date_range it_date_range
                       it_pr_type    it_pr_type
                       it_ob_stat     it_ob_stat
                      ).

    self->process_ticketsiv_list_f =  iv_list_f ).

  ENDMETHOD.                    "run

  METHOD get_tickets.

    DATAlt_where_cond       TYPE esh_t_co_rfcrt_options,
          lv_where_cond       LIKE LINE OF lt_where_cond,
          lt_selopt           TYPE ert_range_option,
          ls_selopt           LIKE LINE OF lt_selopt.


    " Date condition
    FIELD-SYMBOLS<fs_date> LIKE LINE OF it_date_range.
    LOOP AT it_date_range ASSIGNING <fs_date>.
      CLEAR ls_selopt.
      MOVE-CORRESPONDING <fs_date> TO ls_selopt.
      APPEND ls_selopt TO lt_selopt.
    ENDLOOP.

    sql_selopt_to_where(
       EXPORTING iv_field      'o~posting_date'
       CHANGING  ct_selopt     lt_selopt
                 ct_where_cond lt_where_cond
    ).

    " Process type conditions
    IF it_pr_type IS NOT INITIAL.

      FIELD-SYMBOLS<fs_pr_type> LIKE LINE OF it_pr_type.
      CLEAR lt_selopt.
      LOOP AT it_pr_type ASSIGNING <fs_pr_type>.
        CLEAR ls_selopt.
        MOVE-CORRESPONDING <fs_pr_type> TO ls_selopt.
        APPEND ls_selopt TO lt_selopt.
      ENDLOOP.

      sql_selopt_to_where(
         EXPORTING iv_field      'o~process_type'
         CHANGING  ct_selopt     lt_selopt
                   ct_where_cond lt_where_cond
      ).
    ENDIF.


    " Object status - here it is exclusion of unwanted statuses from the list
    IF it_ob_stat IS NOT INITIAL.

      FIELD-SYMBOLS<fs_ob_stat> LIKE LINE OF it_ob_stat.
      CLEAR lt_selopt.
      LOOP AT it_ob_stat ASSIGNING <fs_ob_stat>.
        CLEAR ls_selopt.
        MOVE-CORRESPONDING <fs_ob_stat> TO ls_selopt.
        APPEND ls_selopt TO lt_selopt.
      ENDLOOP.

      sql_selopt_to_where(
         EXPORTING iv_field      'j~stat'
         CHANGING  ct_selopt     lt_selopt
                   ct_where_cond lt_where_cond
      ).

    ENDIF.


    " JEST conditions - get just open ones
    lv_where_cond ' AND ( j~stat LIKE `E%` )  AND ( j~inact <> `X` ) '.
    APPEND lv_where_cond TO lt_where_cond.

    " Select tables flagged active to be checked via RFC
    SELECT o~object_id o~process_type o~description o~posting_date o~created_at j~stat o~created_by
    FROM crmd_orderadm_h AS o
    INNER JOIN crm_jest AS ON o~guid j~objnr
    INTO CORRESPONDING FIELDS OF TABLE t_tickets
    WHERE (lt_where_cond)
    ORDER BY o~object_id.

  ENDMETHOD.                    "get_tickets

  METHOD process_tickets.

    FIELD-SYMBOLS<fs_table> LIKE LINE OF t_tickets.
    DATAlv_where            TYPE string,
          lo_columns          TYPE REF TO cl_salv_columns_table,
          lo_column           TYPE REF TO cl_salv_column_table.

    LOOP AT t_tickets ASSIGNING <fs_table>.

      " Get status text
      CONCATENATE ' ( estat = `' <fs_table>-stat '` ) AND ( stsma LIKE `' <fs_table>-process_type 'HEAD` ) AND ( spras = `E` )' space INTO lv_where.
      SELECT SINGLE txt04 txt30
      FROM tj30t
      INTO (<fs_table>-txt04<fs_table>-txt30)
      WHERE (lv_where).

*      IF sy-subrc NE 0.
*        CONCATENATE ' ( estat = `' <fs_table>-stat '` ) AND ( stsma LIKE `' <fs_table>-process_type '%` ) AND ( spras = `E` )' space INTO lv_where.
*        SELECT SINGLE txt04 txt30
*        FROM tj30t
*        INTO (<fs_table>-txt04, <fs_table>-txt30)
*        WHERE (lv_where).
*      ENDIF.

      CLEAR lv_where.

      " Get fullname of created by
      IF <fs_table>-created_by IS NOT INITIAL.
        CALL FUNCTION 'BBP_LA_GET_FULLNAME_BY_USERID'
          EXPORTING
            i_userid      <fs_table>-created_by
          IMPORTING
            e_fullname    <fs_table>-created_by_fullname
          EXCEPTIONS
            no_user_found 1
            OTHERS        2.
      ENDIF.
    ENDLOOP.

    IF iv_list_f EQ abap_true.

      DELETE ADJACENT DUPLICATES FROM t_tickets COMPARING object_id process_type.

      LOOP AT t_tickets ASSIGNING <fs_table>.
        " Get status text
        get_requestsCHANGING cs_result <fs_table> ).
      ENDLOOP.

      IF t_tickets_reportn IS NOT INITIAL.
        CLEAR t_tickets.
        t_tickets t_tickets_reportn.
      ENDIF.

    ENDIF.

    " Export to memory
    EXPORT data =  t_tickets TO MEMORY ID sy-cprog.


**   Hide columns
*    lo_columns = o_alv->get_columns( ).
*    IF iv_list_f EQ abap_true.
*
*      lo_column ?= lo_columns->get_column( 'strkorr' ).
*      lo_column->set_visible( abap_false ).
*
*      lo_column ?= lo_columns->get_column( 'tarsystem' ).
*      lo_column->set_visible( abap_false ).
*
*    ENDIF.


  ENDMETHOD.                    "process_tickets

  METHOD get_requests.

    DATABEGIN OF rep_data_get,
                 solution_get       TYPE char1,
                 project_get        TYPE char1,
                 crm_get            TYPE char1,
                 tasklist_get       TYPE char1,
                 system_get         TYPE char1,
                 patch_get          TYPE char1,
                 note_get           TYPE char1,
                 request_get        TYPE char1,
                 object_get         TYPE char1,
          END OF rep_data_get.

    TYPES:  BEGIN OF ts_tty,
              sign                   TYPE tvarv_sign,
              option                 TYPE tvarv_opti,
              low                    TYPE crmt_report_orderadm_h-template_type,
              high                   TYPE crmt_report_orderadm_h-template_type,
            END OF ts_tty,
            tt_tty                   TYPE STANDARD TABLE OF ts_tty,
            BEGIN OF ts_obje,
              sign                   TYPE tvarv_sign,
              option                 TYPE tvarv_opti,
              low                    TYPE crmt_report_orderadm_h-object_id,
              high                   TYPE crmt_report_orderadm_h-object_id,
            END OF ts_obje,
            tt_obje                  TYPE STANDARD TABLE OF ts_obje,
            BEGIN OF ts_proc,
              sign                   TYPE tvarv_sign,
              option                 TYPE tvarv_opti,
              low                    TYPE crmt_report_orderadm_h-process_type,
              high                   TYPE crmt_report_orderadm_h-process_type,
            END OF ts_proc,
            tt_proc                  TYPE STANDARD TABLE OF ts_proc.


    DATA gr_preprocessor TYPE  REF TO /tmwflow/rep_cl_preprocessor.

    DATA" screen data
    pstatus3                         TYPE flag" originally checkbox
    phase_shift_in_crm               TYPE flag,
    sh_ttyp                          TYPE tt_tty,
    sh_obje                          TYPE tt_obje,
    sh_proc                          TYPE tt_proc,
    ls_obje                          LIKE LINE OF sh_obje,
    ls_proc                          LIKE LINE OF sh_proc,

    gv_has_input                     TYPE flag,
    gv_question                      TYPE REF TO cl_crm_report_question,
    gr_crm                           TYPE REF TO /tmwflow/rep_cl_crm,
    lv_need_additioanl_info          TYPE char1,
    ls_object_type                   TYPE crmt_report_range_obj_type,
    lt_object_type_h                 TYPE crmt_report_range_obj_type_ta,
    ls_template_type                 TYPE crmt_report_rng_temp_type,
    lt_guid                          TYPE crmt_report_guidlist_ta,
    ls_guid                          TYPE crmt_report_guidlist,
    ls_crm_info                      TYPE crmt_dno_service_monitor,
    lt_rep_guid_tskl                 TYPE /tmwflow/rep_id_selection_tt,
    gt_rep_guid_tskl                 TYPE /tmwflow/rep_id_selection_tt,
    gt_crm_guid_nor                  TYPE /tmwflow/rep_id_selection_tt,
    gt_crm_guid_exp                  TYPE /tmwflow/rep_id_selection_tt,
    gt_guid_tskl                     TYPE /tmwflow/rep_id_export_tt,
    gt_rep_tskl                      TYPE  /tmwflow/rep_id_selection_tt,
    gt_tskl                          TYPE /tmwflow/rep_tt_tskl_prnt,
    gt_appointment                   TYPE TABLE OF crmt_report_appointments,
    gt_locatorlist                   TYPE crmt_report_locatorlist_ta,
    " FORM export_data_for_normal.
    lt_project_data                  TYPE /tmwflow/rep2_disp_projects_tt,
    lt_request_data                  TYPE /tmwflow/rep2_exp_requests_tt,
    lt_system_data                   TYPE /tmwflow/rep_exp_systems_tt,
    lt_patch_data                    TYPE /tmwflow/rep_exp_patches_tt,
    lt_note_data                     TYPE /tmwflow/rep_exp_notes_tt,
    lt_object_data                   TYPE /tmwflow/rep_exp_req_obj_tt,
    lt_crm_data                      TYPE crmt_dno_service_monitor_tab,
    lt_guid_has_chain                TYPE /tmwflow/rep2_chain_exist_tt.


    " CLASS_CONSTRUCTOR (/TMWFLOW/CL_CS_SCMA_GENERAL)
    phase_shift_in_crm abap_true.

    " cm_collector_settings
    rep_data_get-project_get  abap_true.
    rep_data_get-tasklist_get abap_true.
    rep_data_get-request_get  'T'" exp_type-tracking.

*    "Default and recommended way is to use CRM for phase shift
*    "There are lots of status dependencies customized and customizable between SMMN
*    "and the corresponding change documents SMHF, SMMJ, SMTM ect.
*    "Only in CRM UI,these checks are executed and warnings are displayed
*    phase_shift_in_crm = abap_true.

    IF gr_preprocessor IS INITIAL.
      CREATE OBJECT gr_preprocessor
        EXPORTING
          im_c_p_pose '1'" p_pose.
    ENDIF.

*  form SEARCH_EXECUTE_FOR_CRM
    pstatus3 abap_true.
    gv_has_input 'X'.

*  form OBJECT_TYPE_DETERMINE
    ls_object_type-low 'BUS2000116'"Service Process
    ls_object_type-sign 'I'.
    ls_object_type-option 'EQ'.
    APPEND ls_object_type
           TO lt_object_type_h.
    "<Added by FW time='2012-07-19' reason='include CRM Service Request-incident'>
    ls_object_type-low 'BUS2000223'"CRM Service Request
    ls_object_type-sign 'I'.
    ls_object_type-option 'EQ'.
    APPEND ls_object_type
           TO lt_object_type_h.

*   from SEARCH_EXECUTE
    ls_template_type-sign   'I'.
    ls_template_type-option 'EQ'.
    ls_template_type-low    ' '.
    APPEND ls_template_type
           TO sh_ttyp.

*   Object - ticket num.
    ls_obje-sign   'I'.
    ls_obje-option 'EQ'.
    ls_obje-low    cs_result-object_id.
    APPEND ls_obje TO sh_obje.

*   Process type.
    ls_proc-sign   'I'.
    ls_proc-option 'EQ'.
    ls_proc-low    cs_result-process_type.
    APPEND ls_proc TO sh_proc.


*   form search_execute - part
    CALL FUNCTION 'CRM_REPORT_CALL_RF'
      EXPORTING
        iv_item_select          abap_false
        iv_only_main_item       abap_false
        iv_maximum_hits         500 " p_hits /  p_maxhit
        iv_stat_open            abap_false " pstatus1
        iv_stat_completed       abap_false " pstatus2
*       ir_catalogue_h          = sh_catl[]
*       ir_catalogue_i          = si_catl[]
*       ir_category             = sh_categ[]
*       ir_changed_at           = lt_changed_at
*       ir_changed_by           = sh_chby[]
*       ir_created_at           = lt_created_at
*       ir_created_by           = sh_crea[]
*       ir_code_h               = sh_code[]
*       ir_code_i               = si_code[]
*       ir_code_group_h         = sh_codg[]
*       ir_code_group_i         = si_codg[]
*       ir_description          = sh_desc[]
*       ir_direction            = sh_direc[]
*       ir_ext_code_h           = sh_exco[]
*       ir_ext_code_i           = si_exco[]
        ir_object_id            sh_obje[]
*       it_guidlist             = ph_guids[]
        ir_object_type_h        lt_object_type_h
*       ir_objective            = sh_goal[]
*       ir_partner_id_h_or_i    = lt_partner_id_h_or_i
*       ir_partner_id_h         = lt_partner_id_h
*       ir_partner_id_i         = lt_partner_id_i
*       ir_partner_fct_h_or_i   = lt_partner_fct_h_or_i
*       ir_partner_fct_h        = lt_partner_fct_h
*       ir_partner_fct_i        = lt_partner_fct_i
*       ir_po_number            = sh_exte[]
*       ir_posting_date         = sh_post[]
*       ir_priority             = sh_prio[]
*       ir_product_id           = si_oprod[]
*       ir_process_type         = sh_proc[] "Do the check for transaction type
*       ir_ref_obj_ibase        = sh_ibase[]"ibase and component later considering
*       ir_ref_obj_ib_comp      = sh_inst[] "Freeman's API - Ray - 2010.04.27
*       ir_ref_obj_iobject      = sh_rfobi[]
*       ir_ref_obj_product_id   = sh_pdobi[]
*       ir_ref_obj_ibase_i      = si_ibase[]
*       ir_ref_obj_ib_comp_i    = si_inst[]
*       ir_ref_obj_iobject_i    = si_rfobi[]
*       ir_ref_obj_product_id_i = si_pdobi[]
*       ir_req_type             = sh_rtyp[]
*       ir_sales_org            = sh_saorg[]
*       ir_service_id           = sh_srid[]
*       ir_service_org          = sh_seorg[]
*       ir_status_h             = sh_stat[]
*       ir_status_i             = si_stat[]
        ir_template_type        sh_ttyp[]
      IMPORTING
        ev_question             gv_question
      EXCEPTIONS
        parameter_error_partner 1
        OTHERS                  2.
    IF sy-subrc <> 0.
*   MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*           WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
    ENDIF.


    IF gv_question IS NOT INITIAL AND gv_question->gt_guidlist IS NOT INITIAL.

      CALL FUNCTION '/TMWFLOW/REP_GET_LOCATORLIST'
        EXPORTING
          im_question      gv_question
        IMPORTING
          ex_t_locatorlist gt_locatorlist.

      CALL FUNCTION '/TMWFLOW/REP_GET_APPOINTMENT'
        EXPORTING
          im_question      gv_question
        IMPORTING
          ex_t_appointment gt_appointment.


      lt_guid gv_question->gt_guidlist.


      "Consolidate the data by transaction type
      LOOP AT lt_guid INTO ls_guid.
        CLEAR ls_crm_info.
        CALL FUNCTION '/TMWFLOW/REP_EXPORT_BY_CRM'
          EXPORTING
            im_guid          ls_guid-guid
            im_t_locatorlist gt_locatorlist
            im_t_appointment gt_appointment
          IMPORTING
            ex_crm_data      ls_crm_info.

        IF ls_crm_info IS NOT INITIAL.
          IF sh_proc IS NOT INITIAL."Filter by transaction type
            IF ls_crm_info-process_type NOT IN sh_proc[].
              DELETE lt_guid.
              CONTINUE.
            ENDIF.
          ENDIF.

          lv_need_additioanl_info 'X'"Add smcr info to global table

        ELSE.
          DELETE lt_guid.
        ENDIF.
      ENDLOOP.

    ENDIF" gv_question


    CREATE OBJECT gr_crm
      EXPORTING
        it_guid lt_guid.

    CALL METHOD gr_crm->/tmwflow/rep_if_reporting~get_rep_tskl
      IMPORTING
        ex_t_rep_guid_tskl lt_rep_guid_tskl
*       ex_t_rep_tskl      =
      .
    APPEND LINES OF lt_rep_guid_tskl TO gt_rep_guid_tskl.
    REFRESH lt_rep_guid_tskl.

    CALL FUNCTION '/TMWFLOW/REP2_SEPARATE_GUIDS'
      EXPORTING
        im_guid     gt_rep_guid_tskl
      IMPORTING
        ex_exp_guid gt_crm_guid_exp
        ex_nor_guid gt_crm_guid_nor.
    " after the function, refresh the grobal variables that will not be used later!
    REFRESH gt_rep_guid_tskl.


    "Change because of update of search controller- 2008.11.14
    IF gt_crm_guid_nor IS NOT INITIAL OR gt_rep_tskl IS NOT INITIAL.

      "Search Controller"     ----   Conformance Check
      CALL FUNCTION '/TMWFLOW/REP_CONTROLLER'
        EXPORTING
          it_rep_guid_tskl gt_crm_guid_nor
          it_rep_tskl      gt_rep_tskl
        IMPORTING
          et_guid_tskl     gt_guid_tskl
          et_tskl          gt_tskl
        EXCEPTIONS
          no_hits          1
          OTHERS           2.

      IF sy-subrc <> 0.
*        gv_exit = abap_true.
*        MESSAGE text-950 TYPE 'S'.
        RETURN.
      ENDIF.
    ENDIF.


*      " Export Data to some internal table
*      " Normal Case
*      FORM export_data_for_normal.

    IF gv_question IS NOT INITIAL.
      " the gt_locatorlist and gt_appointment will also be used in the
      " exception_for_crm form
      IF gt_locatorlist IS INITIAL.
        CALL FUNCTION '/TMWFLOW/REP_GET_LOCATORLIST'
          EXPORTING
            im_question      gv_question
          IMPORTING
            ex_t_locatorlist gt_locatorlist.
      ENDIF.

      IF gt_appointment IS INITIAL.
        CALL FUNCTION '/TMWFLOW/REP_GET_APPOINTMENT'
          EXPORTING
            im_question      gv_question
          IMPORTING
            ex_t_appointment gt_appointment.
      ENDIF.
    ENDIF.

    CALL FUNCTION '/TMWFLOW/REP2_EXPORT_DATA'
      EXPORTING
        im_project            rep_data_get-project_get
        im_tasklist           rep_data_get-tasklist_get
        im_system             rep_data_get-system_get
        im_patch              rep_data_get-patch_get
        im_note               rep_data_get-note_get
        im_request            rep_data_get-request_get
        im_object             rep_data_get-object_get
*       im_project_status     = sh_prsta[]
*       im_taskplan_status    = gr_tasklist_status[]
*       im_patch_status       = sh_sysps[]
*       im_note_status        = ntstatus[]
*       im_trkorr             = lt_trkorr           "This is added for request match with user input 2007.07.11
        im_guid_tskl          gt_guid_tskl
        im_tskl               gt_tskl
*       im_projects           = gt_projects
*       im_log_system         = lt_system_input    " im_log_system = gt_log_system
*       im_note_list          = lt_note_input      " im_note_list = gt_note
*       im_patch_list         = lt_patch_input     " im_patch_list = gt_patch
        im_t_locatorlist      gt_locatorlist
        im_t_appointment      gt_appointment
*       im_t_special_guid_rel = gt_spe_crm_tra_rel
*       im_t_special_guid     = gt_spe_crm_tra
      IMPORTING
        ex_project_data       lt_project_data
        ex_system_data        lt_system_data
        ex_patch_data         lt_patch_data
        ex_note_data          lt_note_data
        ex_request_data       lt_request_data
        ex_object_data        lt_object_data
        ex_crm_data           lt_crm_data
        ex_guid_chains        lt_guid_has_chain.

    FIELD-SYMBOLS<fs_crm_data>          LIKE LINE OF lt_crm_data.
    IF lt_crm_data IS NOT INITIAL.
      READ TABLE lt_crm_data INDEX ASSIGNING <fs_crm_data>" we have just one ticket/obj id each time

      IF <fs_crm_data> IS ASSIGNED.
        cs_result-concatstatuser       =  <fs_crm_data>-concatstatuser.
        cs_result-process_type_txt     =  <fs_crm_data>-process_type_txt.
        cs_result-omnitracker          =  <fs_crm_data>-po_number_sold.
        cs_result-person_resp_list     =  <fs_crm_data>-person_resp_list.
        cs_result-sales_employee_list  =  <fs_crm_data>-sales_employee_list.
        cs_result-object_type          =  <fs_crm_data>-object_type.
        cs_result-itm_type             =  <fs_crm_data>-itm_type.
        cs_result-concatstatuser_item  =  <fs_crm_data>-concatstatuser_item.

      ENDIF.
    ENDIF.


    IF lt_request_data IS NOT INITIAL.

      FIELD-SYMBOLS <fs_request_data> TYPE /tmwflow/rep2_exp_requests.

      DATA lt_project_map TYPE /tmwflow/tr_projects.
      DATA ls_project_map TYPE /tmwflow/tr_project.
      DATA ls_trkorr_no_result TYPE char1 VALUE abap_false.
      DATA lv_project TYPE /tmwflow/smi_project.

      LOOP AT lt_request_data ASSIGNING <fs_request_data>.
*      CLEAR ls_request_data_new.
        CLEAR ls_trkorr_no_result.

        "For System and Client
        "(1)Modified Transport request
        IF <fs_request_data>-trkorr IS NOT INITIAL AND rep_data_get-request_get <> 'T'.
          SELECT SINGLE sysname client status FROM /tmwflow/track INTO
              (<fs_request_data>-sysname,
              <fs_request_data>-srcclient,
              <fs_request_data>-tracking_status)
          WHERE obj_name <fs_request_data>-trkorr.

          IF sy-subrc <> 0.
            ls_trkorr_no_result abap_true.
          ENDIF.
        ELSEIF <fs_request_data>-trkorr IS NOT INITIAL" special handling for tracking
          SELECT SINGLE trorder_system trorder_client FROM /tmwflow/trordhc INTO
            (<fs_request_data>-sysname<fs_request_data>-srcclient)
            WHERE trorder_number <fs_request_data>-trkorr.

          IF sy-subrc <> 0.
            ls_trkorr_no_result abap_true.
          ENDIF.
        ELSE.
          ls_trkorr_no_result abap_true.
        ENDIF.

        IF ls_trkorr_no_result abap_true AND <fs_request_data>-strkorr IS NOT INITIAL.
          "Get the system and client
          REFRESH lt_project_map.
          CLEAR  ls_project_map.
          CALL FUNCTION '/TMWFLOW/TR_PROJECT_GET'
            EXPORTING
              tr_number         <fs_request_data>-strkorr
            TABLES
              project_reference lt_project_map
            EXCEPTIONS
              no_entry_found    1
              OTHERS            2.
          IF sy-subrc EQ 0.
            IF lt_project_map IS NOT INITIAL.
              READ TABLE lt_project_map INTO ls_project_map INDEX 1.
              <fs_request_data>-sysname ls_project_map-source_system.
              <fs_request_data>-srcclient ls_project_map-source_client.

              IF <fs_request_data>-tracking_status IS INITIAL.
                SELECT SINGLE status FROM /tmwflow/track
                  INTO <fs_request_data>-tracking_status
                WHERE obj_name <fs_request_data>-strkorr
                AND sysname ls_project_map-source_system
                AND client ls_project_map-source_client.
              ENDIF.
            ENDIF.
          ENDIF.

          "Get the type for this transport request, WD 10/02/23
          SELECT SINGLE trfunction FROM /tmwflow/trordhc
            INTO <fs_request_data>-trfunction
            WHERE trorder_number <fs_request_data>-strkorr.
        ENDIF.

        "Search for role type
        IF <fs_request_data>-sysname IS NOT INITIAL AND
           <fs_request_data>-srcclient IS NOT INITIAL.
          CLEAR lv_project.
          SELECT SINGLE smi_project FROM /tmwflow/projctc INTO lv_project
            WHERE tasklist <fs_request_data>-tasklist.
          IF lv_project IS NOT INITIAL.
            SELECT SINGLE role_type sys_role FROM /tmwflow/ttrckec
              INTO (<fs_request_data>-role_type <fs_request_data>-system_role)
            WHERE sysname <fs_request_data>-sysname
                  AND client  =  <fs_request_data>-srcclient
                  AND smi_project lv_project.
          ENDIF.
        ENDIF.

      ENDLOOP.
    ENDIF.


    UNASSIGN <fs_request_data>.
    DATA ls_tickets_reportn LIKE LINE OF t_tickets_reportn.

    IF lt_request_data IS INITIAL.
      " There are no requests --> preserve header info from SQL selection
      MOVE-CORRESPONDING cs_result TO ls_tickets_reportn.
      APPEND ls_tickets_reportn TO t_tickets_reportn.

    ELSE.
      " There are requests --> use reportn header info
      LOOP AT lt_request_data ASSIGNING <fs_request_data>.

        CLEAR ls_tickets_reportn.
        MOVE-CORRESPONDING cs_result TO ls_tickets_reportn.

        ls_tickets_reportn-strkorr <fs_request_data>-strkorr.
        ls_tickets_reportn-tarsystem <fs_request_data>-tarsystem.
        ls_tickets_reportn-trfunction <fs_request_data>-trfunction.
        ls_tickets_reportn-trstatus <fs_request_data>-trstatus.
        ls_tickets_reportn-sysname <fs_request_data>-sysname.

        IF <fs_request_data>-trfunction NE 'T'.
          APPEND ls_tickets_reportn TO t_tickets_reportn.
        ENDIF.
      ENDLOOP.
    ENDIF.

    REFRESH gt_locatorlist.
    REFRESH gt_appointment.

  ENDMETHOD.                    "get_requests

  METHOD sql_selopt_to_where.

    DATA:
      ls_selopt     TYPE ers_range_option,
      ls_options    TYPE rfc_db_opt,
      lv_first_sign TYPE i,
      lv_first_pos  TYPE i,
      lv_and        TYPE string,
      lv_not        TYPE string,
      lv_or         TYPE string,
      lv_oper       TYPE string.

    SORT ct_selopt BY sign DESCENDING.

    lv_first_sign 1.

    LOOP AT ct_selopt INTO ls_selopt.

      AT FIRST.
        IF linesct_where_cond 0.
          ls_selopt '('.
        ELSE.
          ls_selopt 'AND ('.
        ENDIF.
        APPEND ls_selopt TO ct_where_cond.
      ENDAT.

      AT NEW sign.
        IF lv_first_sign 1.
          lv_and ''.
          lv_first_sign 0.
        ELSE.
          lv_and 'AND'.
        ENDIF.

        IF ls_selopt-sign 'I'.
          lv_not ''.
        ELSE.
          lv_not 'NOT'.
        ENDIF.

        ls_options '#AND #NOT ('.
        REPLACE SUBSTRING '#AND' IN ls_options WITH lv_and.
        REPLACE SUBSTRING '#NOT' IN ls_options WITH lv_not.
        CONDENSE ls_options.
        APPEND ls_options TO ct_where_cond.
        lv_first_pos 1.
      ENDAT.

*   for every row
      IF lv_first_pos 1.
        lv_or ''.
        lv_first_pos 0.
      ELSE.
        lv_or 'OR'.
      ENDIF.

      CASE ls_selopt-option.

        WHEN 'EQ'
          OR 'NE'
          OR 'GE'
          OR 'GT'
          OR 'LE'
          OR 'LT'.

          sql_operator_map(
            EXPORTING iv_option   ls_selopt-option
            CHANGING  cv_operator lv_oper
          ).

          ls_options '#OR #FLD #OP1 ''#VA1'''.
          REPLACE SUBSTRING '#OP1' IN ls_options WITH lv_oper.
          REPLACE SUBSTRING '#VA1' IN ls_options WITH ls_selopt-low.

        WHEN 'CP'
          OR 'NP'.
          ls_options '#OR #FLD #NOT #OP1 ''#VA1'''.
          IF ls_selopt-option 'CP'.
            lv_not ''.
          ELSE.
            lv_not 'NOT'.
          ENDIF.
          REPLACE SUBSTRING '#NOT' IN ls_options WITH lv_not.
          REPLACE SUBSTRING '#OP1' IN ls_options WITH 'LIKE'.
          REPLACE ALL OCCURRENCES OF SUBSTRING '*'    IN ls_selopt-low WITH '%'.
          REPLACE ALL OCCURRENCES OF SUBSTRING '+'    IN ls_selopt-low WITH '_'.
          REPLACE SUBSTRING '#VA1' IN ls_options WITH ls_selopt-low.

        WHEN 'BT'
          OR 'NB'.
          IF ls_selopt-option 'BT'.
            lv_not ''.
          ELSE.
            lv_not 'NOT'.
          ENDIF.
          ls_options '#OR #FLD #NOT #OP1 ''#VA1'' #OP2 ''#VA2'''.
          REPLACE SUBSTRING '#NOT' IN ls_options WITH lv_not.
          REPLACE SUBSTRING '#OP1' IN ls_options WITH 'BETWEEN'.
          REPLACE SUBSTRING '#VA1' IN ls_options WITH ls_selopt-low.
          REPLACE SUBSTRING '#OP2' IN ls_options WITH 'AND'.
          REPLACE SUBSTRING '#VA2' IN ls_options WITH ls_selopt-high.
      ENDCASE.

      REPLACE SUBSTRING '#OR'  IN ls_options WITH lv_or.
      REPLACE SUBSTRING '#FLD' IN ls_options WITH iv_field.
      CONDENSE ls_options.
      APPEND ls_options TO ct_where_cond.

      AT END OF sign.
        ls_options ')'.
        APPEND ls_options TO ct_where_cond.
      ENDAT.

      AT LAST.
        ls_options ')'.
        APPEND ls_options TO ct_where_cond.
      ENDAT.
    ENDLOOP.

  ENDMETHOD.                    "sql_selopt_to_where

  METHOD sql_operator_map.

    CASE iv_option.
      WHEN 'EQ'.
        cv_operator '='.
      WHEN 'NE'.
        cv_operator '<>'.
      WHEN 'GT'.
        cv_operator '>'.
      WHEN 'LT'.
        cv_operator '<'.
      WHEN 'GE'.
        cv_operator '>='.
      WHEN 'LE'.
        cv_operator '<='.
    ENDCASE.

  ENDMETHOD.                    "sql_operator_map

  METHOD alv_generate.

    DATAlo_dock       TYPE REF TO cl_gui_docking_container,
          lo_cont       TYPE REF TO cl_gui_container,
          lo_columns    TYPE REF TO cl_salv_columns_table,
          lo_column     TYPE REF TO cl_salv_column_table.

*   Import output table from the memory and free afterwards
    IMPORT data t_tickets FROM MEMORY ID sy-cprog.
    FREE MEMORY ID sy-cprog.

*   Only if there is some data
    CHECK t_tickets IS NOT INITIAL.

*   Create a docking control at bottom
    CHECK lo_dock IS INITIAL.
    CREATE OBJECT lo_dock
      EXPORTING
        repid sy-cprog
        dynnr sy-dynnr
        ratio 80
        side  cl_gui_docking_container=>dock_at_bottom
        name  'DOCK_CONT'.
    IF sy-subrc <> 0.
      MESSAGE 'Error in the Docking control' TYPE 'S'.
    ENDIF.

*   Create a SALV for output
    CHECK o_alv IS INITIAL.
    TRY.

        lo_cont ?= lo_dock.

*       SALV Table Display on the Docking container
        CALL METHOD cl_salv_table=>factory
          EXPORTING
            list_display   if_salv_c_bool_sap=>false
            r_container    lo_cont
            container_name 'DOCK_CONT'
          IMPORTING
            r_salv_table   o_alv
          CHANGING
            t_table        t_tickets.
      CATCH cx_salv_msg.
    ENDTRY.

*   Pf status - functions
    DATAlo_functions TYPE REF TO cl_salv_functions_list.
    lo_functions o_alv->get_functions).
    lo_functions->set_allabap_true )" Including Excel export

*   Total counter header
    DATAlo_display TYPE REF TO cl_salv_display_settings,
          lv_string TYPE lvc_title.

    lo_display o_alv->get_display_settings).
    lv_string linest_tickets ).
    CONDENSE lv_string.
    CONCATENATE 'Total tickets: ' lv_string INTO lv_string SEPARATED BY space.
    lo_display->set_list_headerlv_string ).

*   Optimize columns width
    lo_columns o_alv->get_columns).
    lo_columns->set_optimize).

*   output display
    o_alv->display).

  ENDMETHOD.                    "alv_generate

ENDCLASS.                    "lcl_main