diff --git a/.abapgit.xml b/.abapgit.xml
new file mode 100644
index 0000000..7c0506a
--- /dev/null
+++ b/.abapgit.xml
@@ -0,0 +1,10 @@
+
+
+
+
+ E
+ /src/
+ PREFIX
+
+
+
diff --git a/src/package.devc.xml b/src/package.devc.xml
new file mode 100644
index 0000000..64651fe
--- /dev/null
+++ b/src/package.devc.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+ Transport Checking Tool
+
+
+
+
diff --git a/src/zev_tp_checktool.doct.xml b/src/zev_tp_checktool.doct.xml
new file mode 100644
index 0000000..1202ccf
--- /dev/null
+++ b/src/zev_tp_checktool.doct.xml
@@ -0,0 +1,255 @@
+
+
+
+
+
+
+
+ TX
+
+ E
+ E
+ 0002
+ X
+ 00045
+ A
+
+
+ DOKU
+ ZEV_TP_CHECKTOOL
+ TX
+ E
+ S_DOCU_SHOW
+ S_DOCUS1
+ 00002
+ 072
+
+
+
+ U2
+ ZTCT - SAP ABAP Transport Checking Tool (Object Level)
+
+
+ *
+
+
+ /=
+ Transport Checking Tool: Analyze transports before
+
+
+ =
+ moving them to production.
+
+
+ =
+ Determine the proper order and highlight risks.
+
+
+ =
+ AbapGit is highly recommended to install this tool and to
+
+
+ =
+ keep it up to date.
+
+
+ =
+ Saplink is outdated and no longer maintained.
+
+
+ *
+
+
+ /=
+ NOTE: This README is just a very short summary. For a more
+
+
+ =
+ detailed explanation, please check out the Blog on SCN or
+
+
+ =
+ the manual included here on GitHub.
+
+
+ *
+
+
+ /=
+ BLOG:
+
+
+ =
+ http://scn.sap.com/community/abap/blog/2013/05/31/
+
+
+ =
+ transport-checking-tool-object-level
+
+
+ *
+
+
+ U2
+ INTRODUCTION
+
+
+ *
+
+
+ U3
+ Why this tool
+
+
+ *
+
+
+ /=
+ Transporting a project to Production gets more complicated
+
+
+ =
+ with increasing numbers of developers and transports. With the
+
+
+ =
+ final Go-Live date in sight, it is vital to have a correct list
+
+
+ =
+ of transports that can be moved with minimal risk.
+
+
+ *
+
+
+ U3
+ Short Description
+
+
+ *
+
+
+ /=
+ This tool checks if transports can be moved from one environment
+
+
+ =
+ they have been transported to (usually this will be Test or Acceptance)
+
+
+ =
+ to the next environment. The check is performed on object level. All
+
+
+ =
+ objects in the selected transports are checked.
+
+
+ *
+
+
+ U3
+ Checks
+
+
+ *
+
+
+ /=
+ Are there newer version in production that will be overwritten? Are
+
+
+ =
+ there older versions existing in Acceptance that are not included in
+
+
+ =
+ your list? Are there objects that use DDIC objects that are not
+
+
+ =
+ existing in Production and are not included in your list? And more...
+
+
+ *
+
+
+ U3
+ Other options
+
+
+ *
+
+
+ /=
+ It is possible to save your list so you can continue the check later.
+
+
+ =
+ You can merge lists, add single transports, add transports that contain
+
+
+ =
+ conflicting objects or delete rows. Each time objects are added or
+
+
+ =
+ removed, the same objects that remain in the list are checked again
+
+
+ =
+ to ensure that the list stays up to date.
+
+
+ *
+
+
+ U3
+ Notes
+
+
+ *
+
+
+ /=
+ This tool was initially developed for use in a 3-Tier
+
+
+ =
+ system (DEV-->QAS-->PRD), to check if transports can
+
+
+ =
+ safely be moved to Production. However, it can also be used
+
+
+ =
+ to check if transports can be moved to other environments. For
+
+
+ =
+ example: If the company uses a 4-tier system
+
+
+ =
+ (DEV --> TST --> QAS --> PRD),
+
+
+ =
+ a check can be done on the route DEV --> TST --> QAS,
+
+
+ =
+ DEV--> QAS --> PRD or
+
+
+ =
+ DEV --> TST --> PRD.
+
+
+
+
+
+
+
diff --git a/src/zev_tp_checktool.prog.abap b/src/zev_tp_checktool.prog.abap
new file mode 100644
index 0000000..16e92ad
--- /dev/null
+++ b/src/zev_tp_checktool.prog.abap
@@ -0,0 +1,5477 @@
+REPORT zev_tp_checktool.
+*--------------------------------------------------------------------*
+* Report : ZEV_TP_CHECKTOOL *
+*--------------------------------------------------------------------*
+* Copyright (c) 2012, E.Vleeshouwers *
+*--------------------------------------------------------------------*
+* Program Details *
+*--------------------------------------------------------------------*
+* Title : Transport checking tool (on object level) *
+* Purpose : Check transport objects before moving to production *
+*--------------------------------------------------------------------*
+* SOURCE: https://github.com/ZEdwin/ZTCT *
+* BLOG (SCN): *
+* http://scn.sap.com/community/abap/blog/2013/05/31/transport- *
+* checking-tool-object-level *
+*--------------------------------------------------------------------*
+* INSTALLATION *
+*--------------------------------------------------------------------*
+* Use of ABAPGIT is recommended. SAPLINK is no longer maintained *
+*--------------------------------------------------------------------*
+* Class for handling Events
+CLASS lcl_eventhandler_ztct DEFINITION DEFERRED.
+CLASS lcl_ztct DEFINITION DEFERRED.
+
+* CTS: Header
+DATA e070 TYPE e070.
+* CTS: Object Entries Requests/Task
+DATA e071 TYPE e071.
+* Assignm. of CTS Proj. to Ext. Proj.
+DATA ctsproject TYPE ctsproject.
+
+*--------------------------------------------------------------------*
+* Data definitions
+*--------------------------------------------------------------------*
+* Fields on selection screens
+TABLES sscrfields.
+
+CONSTANTS co_langu TYPE ddlanguage VALUE 'E'.
+
+DATA lt_range_project_trkorrs TYPE RANGE OF ctsproject-trkorr ##NEEDED.
+DATA ls_range_project_trkorrs LIKE LINE OF lt_range_project_trkorrs ##NEEDED.
+DATA ra_systems TYPE RANGE OF tmscsys-sysnam ##NEEDED.
+DATA ls_systems LIKE LINE OF ra_systems ##NEEDED.
+
+* Global data declarations:
+DATA tp_prefix TYPE char5 ##NEEDED.
+DATA st_tcesyst TYPE tcesyst ##NEEDED.
+DATA st_smp_dyntxt TYPE smp_dyntxt ##NEEDED.
+* To check existence of documentation
+DATA tp_dokl_object TYPE doku_obj ##NEEDED.
+
+DATA ta_trkorr_range TYPE RANGE OF e070-trkorr ##NEEDED.
+DATA st_trkorr_range LIKE LINE OF ta_trkorr_range ##NEEDED.
+DATA ta_project_range TYPE RANGE OF ctsproject-trkorr ##NEEDED.
+DATA lt_excluded_objects TYPE RANGE OF trobj_name ##NEEDED.
+DATA ta_transport_descr TYPE STANDARD TABLE OF as4text ##NEEDED.
+DATA tp_transport_descr TYPE as4text ##NEEDED.
+DATA tp_descr_exists TYPE abap_bool ##NEEDED.
+DATA tp_tabix TYPE sytabix ##NEEDED.
+DATA tp_project_reference TYPE trvalue ##NEEDED.
+* Process type is used to identify if a list is build (1),
+* uploaded (2) or the program is used for version checking (3)
+DATA tp_process_type TYPE i ##NEEDED.
+DATA ta_targets TYPE trsysclis ##NEEDED.
+DATA st_target TYPE trsyscli ##NEEDED.
+DATA tp_sysname TYPE sysname ##NEEDED.
+DATA tp_msg TYPE string ##NEEDED.
+
+*--------------------------------------------------------------------*
+* Data - ALV
+*--------------------------------------------------------------------*
+* Declaration for ALV Grid
+DATA rf_table TYPE REF TO cl_salv_table ##NEEDED.
+DATA rf_table_xls TYPE REF TO cl_salv_table ##NEEDED.
+DATA rf_conflicts TYPE REF TO cl_salv_table ##NEEDED.
+DATA rf_table_keys TYPE REF TO cl_salv_table ##NEEDED.
+DATA rf_handle_events TYPE REF TO lcl_eventhandler_ztct ##NEEDED.
+DATA rf_events_table TYPE REF TO cl_salv_events_table ##NEEDED.
+
+* Exception handling
+DATA rf_root TYPE REF TO cx_root ##NEEDED.
+DATA rf_ztct TYPE REF TO lcl_ztct ##NEEDED.
+
+*----------------------------------------------------------------------*
+* CLASS lcl_eventhandler_ztct DEFINITION
+*----------------------------------------------------------------------*
+CLASS lcl_eventhandler_ztct DEFINITION FINAL FRIENDS lcl_ztct.
+
+ PUBLIC SECTION.
+
+ CLASS-METHODS on_function_click
+ FOR EVENT if_salv_events_functions~added_function
+ OF cl_salv_events_table IMPORTING e_salv_function.
+
+ CLASS-METHODS on_double_click
+ FOR EVENT double_click
+ OF cl_salv_events_table IMPORTING row column.
+
+ CLASS-METHODS on_link_click
+ FOR EVENT link_click
+ OF cl_salv_events_table IMPORTING row column.
+
+ CLASS-METHODS on_double_click_popup
+ FOR EVENT double_click
+ OF cl_salv_events_table IMPORTING row column.
+
+ CLASS-METHODS on_link_click_popup
+ FOR EVENT link_click
+ OF cl_salv_events_table IMPORTING row column.
+
+ PRIVATE SECTION.
+ CLASS-DATA:
+ rf_conflicts TYPE REF TO cl_salv_table,
+ rf_table_keys TYPE REF TO cl_salv_table.
+
+ENDCLASS.
+
+*----------------------------------------------------------------------*
+* CLASS lcl_ztct DEFINITION
+*----------------------------------------------------------------------*
+CLASS lcl_ztct DEFINITION FINAL FRIENDS lcl_eventhandler_ztct.
+
+ PUBLIC SECTION.
+
+ TYPES ty_range_trkorr TYPE RANGE OF trkorr.
+ TYPES ty_range_excluded_objects TYPE RANGE OF trobj_name.
+ TYPES: BEGIN OF ty_request_details,
+ trkorr TYPE trkorr,
+ checked TYPE icon_l4,
+ info TYPE icon_l4,
+ tr_descr TYPE as4text,
+ dev TYPE icon_l4,
+ qas TYPE icon_l4,
+ retcode TYPE char04,
+ prd TYPE icon_l4,
+ warning_lvl TYPE icon_d,
+* Warning_rank: The higher the number,
+* the more serious the error
+ warning_rank TYPE numc4,
+ warning_txt TYPE text74,
+ pgmid TYPE pgmid,
+ object TYPE trobjtype,
+ obj_name TYPE trobj_name,
+ objkey TYPE trobj_name,
+ keyobject TYPE trobjtype,
+ keyobjname TYPE tabname,
+ tabkey TYPE tabkey,
+ checked_by TYPE syuname,
+ as4date TYPE as4date,
+ as4time TYPE as4time,
+ as4user TYPE as4user,
+ status_text TYPE char20,
+ trfunction_txt TYPE val_text,
+ project TYPE cts_id,
+ project_descr TYPE as4text,
+ objfunc TYPE objfunc,
+ flag TYPE flag,
+ trstatus TYPE trstatus,
+ trfunction TYPE trfunction,
+ re_import TYPE char20.
+ TYPES: t_color TYPE lvc_t_scol,
+ END OF ty_request_details.
+
+ TYPES ty_request_details_tt TYPE STANDARD TABLE OF ty_request_details
+ WITH KEY trkorr obj_name.
+
+ TYPES: BEGIN OF ty_tables_with_keys,
+ tabname TYPE trobj_name,
+ ddtext TYPE as4text,
+ counter TYPE i,
+ END OF ty_tables_with_keys.
+
+* Methods
+ METHODS constructor.
+ METHODS execute.
+ METHODS refresh_alv.
+ METHODS docu_call IMPORTING im_object TYPE doku_obj
+ im_id TYPE dokhl-id
+ im_display TYPE abap_bool OPTIONAL
+ im_displ_mode TYPE c OPTIONAL.
+ METHODS get_tp_prefix IMPORTING im_dev TYPE sysname OPTIONAL
+ RETURNING VALUE(re_tp_prefix) TYPE char5.
+ METHODS get_filename RETURNING VALUE(re_file) TYPE string.
+ METHODS set_check_flag IMPORTING im_check_flag TYPE abap_bool OPTIONAL.
+ METHODS set_check_tabkeys IMPORTING im_check_tabkeys TYPE abap_bool OPTIONAL.
+ METHODS set_clear_checked IMPORTING im_clear_checked TYPE abap_bool OPTIONAL.
+ METHODS set_buffer_chk IMPORTING im_buffer_chk TYPE abap_bool OPTIONAL.
+ METHODS set_buffer_remove_tp IMPORTING im_buffer_remove_tp TYPE abap_bool OPTIONAL.
+ METHODS set_trkorr_range IMPORTING im_trkorr_range TYPE ty_range_trkorr OPTIONAL.
+ METHODS set_project_range IMPORTING im_project_range TYPE ty_range_trkorr OPTIONAL.
+ METHODS set_excluded_objects IMPORTING im_excluded_objects TYPE ty_range_excluded_objects OPTIONAL.
+ METHODS set_user_layout IMPORTING im_user_layout TYPE abap_bool OPTIONAL.
+ METHODS set_process_type IMPORTING im_process_type TYPE i.
+ METHODS set_skiplive IMPORTING im_skiplive TYPE abap_bool OPTIONAL.
+ METHODS set_filename IMPORTING im_filename TYPE string OPTIONAL.
+ METHODS set_systems IMPORTING im_dev_system TYPE sysname
+ im_qas_system TYPE sysname
+ im_prd_system TYPE sysname.
+ METHODS set_building_conflict_popup IMPORTING im_building_conflict_popup TYPE abap_bool OPTIONAL.
+ METHODS go_back_months IMPORTING im_backmonths TYPE numc3
+ im_currdate TYPE sydatum
+ RETURNING VALUE(re_date) TYPE sydatum.
+
+ PRIVATE SECTION.
+
+ TYPES: BEGIN OF ty_tms_mgr_buffer,
+ request TYPE tmsbuffer-trkorr,
+ target_system TYPE tmscsys-sysnam,
+ request_infos TYPE stms_wbo_requests,
+ END OF ty_tms_mgr_buffer.
+ TYPES ty_tms_mgr_buffer_tt TYPE HASHED TABLE OF ty_tms_mgr_buffer
+ WITH UNIQUE KEY request target_system.
+
+ DATA tms_mgr_buffer TYPE ty_tms_mgr_buffer_tt.
+ DATA tms_mgr_buffer_line TYPE ty_tms_mgr_buffer.
+
+ TYPES: BEGIN OF ty_ddic_e071,
+ trkorr TYPE trkorr,
+ pgmid TYPE pgmid,
+ object TYPE trobjtype,
+ obj_name TYPE trobj_name,
+ END OF ty_ddic_e071.
+ TYPES ty_ddic_e071_tt TYPE STANDARD TABLE OF ty_ddic_e071.
+
+ TYPES: BEGIN OF ty_ddic_objects,
+ object TYPE rollname,
+ END OF ty_ddic_objects.
+ TYPES ty_ddic_objects_tt TYPE STANDARD TABLE OF ty_ddic_objects.
+
+ DATA ddic_objects TYPE ty_ddic_objects_tt.
+ DATA ddic_objects_sub TYPE string_table.
+ DATA ls_excluded_objects LIKE LINE OF lt_excluded_objects.
+ DATA table_keys TYPE TABLE OF ty_tables_with_keys.
+ DATA table_keys_line TYPE ty_tables_with_keys.
+* Attributes
+ DATA main_list TYPE ty_request_details_tt.
+ DATA main_list_line TYPE ty_request_details.
+ DATA main_list_xls TYPE ty_request_details_tt.
+ DATA main_list_line_xls TYPE ty_request_details.
+ DATA conflicts TYPE ty_request_details_tt.
+ DATA st_request TYPE ctslg_request_info.
+ DATA st_steps TYPE ctslg_step.
+ DATA st_actions TYPE ctslg_action.
+ DATA tp_tabkey TYPE trobj_name.
+ DATA tp_tab TYPE char1
+ VALUE cl_abap_char_utilities=>horizontal_tab.
+ DATA lp_save_restriction TYPE salv_de_layout_restriction.
+ CONSTANTS:
+* ICON_INFORMATION
+ co_info TYPE icon_d VALUE '@AH@',
+* ICON_LED_RED
+ co_error TYPE icon_d VALUE '@F1@',
+* ICON_SYSTEM_CANCEL
+ co_tp_fail TYPE icon_d VALUE '@2O@',
+* ICON_INCOMPLETE
+ co_ddic TYPE icon_d VALUE '@CY@',
+* ICON_LED_YELLOW
+ co_warn TYPE icon_d VALUE '@5D@',
+* ICON_LED_GREEN
+ co_okay TYPE icon_d VALUE '@5B@',
+* ICON_CHECKED
+ co_checked TYPE icon_d VALUE '@01@',
+* ICON_HINT
+ co_hint TYPE icon_d VALUE '@AI@',
+* ICON_FAILURE
+ co_alert TYPE icon_d VALUE '@03@',
+* ICON_SCRAP
+ co_scrap TYPE icon_d VALUE '@K3@',
+* ICON_PROTOCOL
+ co_docu TYPE icon_d VALUE '@DH@',
+* ICON_LED_INACTIVE
+ co_inact TYPE icon_d VALUE '@BZ@'.
+ CONSTANTS:
+* ICON_FAILURE
+ co_alert0_rank TYPE i VALUE 25,
+* ICON_FAILURE
+ co_alert1_rank TYPE i VALUE 26,
+* ICON_FAILURE
+ co_alert2_rank TYPE i VALUE 27,
+* ICON_FAILURE
+ co_alert3_rank TYPE i VALUE 28,
+* ICON_HINT
+ co_hint2_rank TYPE i VALUE 12,
+* ICON_HINT
+ co_hint3_rank TYPE i VALUE 14,
+* ICON_INFORMATION
+ co_info_rank TYPE i VALUE 20,
+* ICON_LED_YELLOW
+ co_warn_rank TYPE i VALUE 50,
+* ICON_SYSTEM_CANCEL
+ co_tp_fail_rank TYPE i VALUE 97,
+* ICON_INCOMPLETE
+ co_ddic_rank TYPE i VALUE 98,
+* ICON_LED_RED
+ co_error_rank TYPE i VALUE 99.
+ CONSTANTS co_non_charlike TYPE string VALUE 'h'.
+
+ DATA lp_alert0_text TYPE text74.
+ DATA lp_alert1_text TYPE text74.
+ DATA lp_alert2_text TYPE text74.
+ DATA lp_alert3_text TYPE text74.
+ DATA lp_hint1_text TYPE text74.
+ DATA lp_hint2_text TYPE text74.
+ DATA lp_hint3_text TYPE text74.
+ DATA lp_hint4_text TYPE text74.
+ DATA lp_info_text TYPE text74.
+ DATA lp_fail_text TYPE text74.
+ DATA lp_warn_text TYPE text74.
+ DATA lp_error_text TYPE text74.
+ DATA lp_ddic_text TYPE text74.
+
+* Attributes
+ DATA project_trkorrs TYPE ty_range_trkorr.
+ DATA prefix TYPE char5.
+ DATA aggr_tp_list_of_objects TYPE ty_request_details_tt.
+ DATA add_to_main TYPE ty_request_details_tt.
+ DATA tab_delimited TYPE table_of_strings.
+ DATA conflict_line TYPE ty_request_details.
+ DATA line_found_in_list TYPE ty_request_details.
+ DATA total TYPE sytabix.
+ DATA ddic_e071 TYPE ty_ddic_e071_tt.
+ DATA ddic_e071_line TYPE ty_ddic_e071.
+ DATA where_used TYPE sci_findlst.
+ DATA where_used_line TYPE rsfindlst.
+ DATA check_flag TYPE abap_bool.
+ DATA check_ddic TYPE abap_bool.
+ DATA check_tabkeys TYPE abap_bool.
+ DATA clear_checked TYPE abap_bool.
+ DATA buffer_chk TYPE abap_bool.
+ DATA buffer_remove_tp TYPE abap_bool.
+ DATA trkorr_range TYPE ty_range_trkorr.
+ DATA project_range TYPE ty_range_trkorr.
+ DATA excluded_objects TYPE ty_range_excluded_objects.
+ DATA user_layout TYPE abap_bool.
+ DATA process_type TYPE i.
+ DATA skiplive TYPE abap_bool.
+ DATA filename TYPE string.
+ DATA dev_system TYPE sysname.
+ DATA qas_system TYPE sysname.
+ DATA prd_system TYPE sysname.
+ DATA systems_range TYPE RANGE OF tmscsys-sysnam.
+ DATA building_conflict_popup TYPE flag.
+
+ METHODS refresh_import_queues.
+ METHODS handle_error IMPORTING im_oref TYPE REF TO cx_root.
+ METHODS flag_for_process IMPORTING im_rows TYPE salv_t_row
+ im_cell TYPE salv_s_cell.
+ METHODS get_main_transports IMPORTING im_trkorr_range TYPE gtabkey_trkorrt.
+ METHODS get_added_objects IMPORTING im_to_add TYPE ty_range_trkorr
+ RETURNING VALUE(re_to_add) TYPE ty_request_details_tt.
+ METHODS get_vrsd_objects IMPORTING im_table TYPE ty_request_details_tt
+ RETURNING VALUE(re_vrsd) TYPE ty_request_details_tt.
+ METHODS get_tp_info IMPORTING im_trkorr TYPE trkorr
+ im_obj_name TYPE trobj_name
+ RETURNING VALUE(re_line) TYPE ty_request_details.
+ METHODS add_to_list IMPORTING im_list TYPE ty_request_details_tt
+ im_to_add TYPE ty_request_details_tt
+ RETURNING VALUE(re_main) TYPE ty_request_details_tt.
+ METHODS build_conflict_popup IMPORTING im_rows TYPE salv_t_row
+ im_cell TYPE salv_s_cell.
+ METHODS delete_tp_from_list IMPORTING im_rows TYPE salv_t_row.
+ METHODS flag_same_objects CHANGING ch_main_list TYPE ty_request_details_tt.
+ METHODS mark_all_tp_records IMPORTING im_cell TYPE salv_s_cell
+ CHANGING ch_rows TYPE salv_t_row.
+ METHODS main_to_tab_delimited IMPORTING im_main_list TYPE ty_request_details_tt
+ RETURNING VALUE(re_tab_delimited) TYPE table_of_strings.
+ METHODS tab_delimited_to_main IMPORTING im_tab_delimited TYPE table_of_strings.
+ METHODS display_transport IMPORTING im_trkorr TYPE trkorr.
+ METHODS display_user IMPORTING im_user TYPE syuname.
+ METHODS display_docu IMPORTING im_trkorr TYPE trkorr.
+ METHODS check_if_in_list IMPORTING im_line TYPE ty_request_details
+ im_tabix TYPE sytabix
+ RETURNING VALUE(re_line) TYPE ty_request_details.
+ METHODS check_documentation IMPORTING im_trkorr TYPE trkorr
+ CHANGING ch_table TYPE ty_request_details_tt.
+ METHODS clear_flags.
+ METHODS column_settings IMPORTING im_column_ref TYPE salv_t_column_ref
+ im_rf_columns_table TYPE REF TO cl_salv_columns_table
+ im_table TYPE REF TO cl_salv_table.
+ METHODS is_empty_column IMPORTING im_column TYPE lvc_fname
+ im_table TYPE ty_request_details_tt
+ RETURNING VALUE(re_is_empty) TYPE abap_bool.
+ METHODS display_excel IMPORTING im_table TYPE ty_request_details_tt.
+ METHODS set_tp_prefix IMPORTING im_dev TYPE sysname OPTIONAL.
+ METHODS top_of_page RETURNING VALUE(re_form_element) TYPE REF TO cl_salv_form_element.
+ METHODS check_newer_transports IMPORTING im_newer_transports TYPE ty_request_details_tt
+ im_main_list TYPE ty_request_details_tt
+ CHANGING ch_conflicts TYPE ty_request_details_tt
+ ch_main TYPE ty_request_details.
+ METHODS check_older_transports IMPORTING im_older_transports TYPE ty_request_details_tt
+ im_main_list TYPE ty_request_details_tt
+ CHANGING ch_conflicts TYPE ty_request_details_tt
+ ch_main TYPE ty_request_details.
+ METHODS check_if_same_object IMPORTING im_line TYPE ty_request_details
+ im_newer_older TYPE ty_request_details
+ EXPORTING ex_tabkey TYPE trobj_name
+ ex_return TYPE c.
+ METHODS sort_list CHANGING ch_list TYPE ty_request_details_tt.
+ METHODS determine_warning_text IMPORTING im_highest_rank TYPE numc4
+ RETURNING VALUE(re_highest_text) TYPE text74.
+ METHODS get_tps_for_same_object IMPORTING im_line TYPE ty_request_details
+ EXPORTING ex_newer TYPE ty_request_details_tt
+ ex_older TYPE ty_request_details_tt.
+ METHODS progress_indicator IMPORTING im_counter TYPE sytabix
+ im_object TYPE trobj_name
+ im_total TYPE sytabix
+ im_text TYPE itex132
+ im_flag TYPE c.
+ METHODS alv_xls_init EXPORTING ex_rf_table TYPE REF TO cl_salv_table
+ CHANGING ch_table TYPE STANDARD TABLE.
+ METHODS alv_xls_output.
+ METHODS prepare_ddic_check.
+ METHODS set_ddic_objects.
+ METHODS do_ddic_check CHANGING ch_main_list TYPE ty_request_details_tt.
+ METHODS set_properties_conflicts IMPORTING im_table TYPE ty_request_details_tt
+ RETURNING VALUE(re_xend) TYPE i.
+ METHODS get_data IMPORTING im_trkorr_range TYPE gtabkey_trkorrt.
+ METHODS check_for_conflicts CHANGING ch_main_list TYPE ty_request_details_tt.
+ METHODS build_table_keys_popup.
+ METHODS add_table_keys_to_list CHANGING ch_table TYPE ty_request_details_tt.
+ METHODS get_additional_tp_info CHANGING ch_table TYPE ty_request_details_tt.
+ METHODS gui_upload IMPORTING im_filename TYPE string
+ RETURNING VALUE(re_cancelled) TYPE abap_bool.
+ METHODS determine_col_width IMPORTING im_field TYPE any
+ CHANGING ch_colwidth TYPE lvc_outlen.
+ METHODS check_colwidth IMPORTING im_name TYPE abap_compname
+ im_colwidth TYPE lvc_outlen
+ RETURNING VALUE(re_colwidth) TYPE lvc_outlen.
+ METHODS remove_tp_in_prd.
+ METHODS alv_init.
+ METHODS set_color.
+ METHODS alv_set_properties IMPORTING im_table TYPE REF TO cl_salv_table.
+ METHODS alv_set_lr_tooltips IMPORTING im_table TYPE REF TO cl_salv_table.
+ METHODS alv_output.
+ METHODS set_where_used.
+ METHODS get_import_datetime_qas IMPORTING im_trkorr TYPE trkorr
+ EXPORTING ex_as4time TYPE as4time
+ ex_as4date TYPE as4date
+ ex_return TYPE sysubrc.
+ METHODS exclude_all_tables.
+ METHODS ofc_goon IMPORTING im_rows TYPE salv_t_row
+ CHANGING ch_table TYPE REF TO cl_salv_table.
+ METHODS ofc_abr CHANGING ch_conflicts TYPE REF TO cl_salv_table.
+ METHODS ofc_ddic.
+ METHODS ofc_add_tp.
+ METHODS ofc_save.
+ METHODS ofc_nconf IMPORTING im_selections TYPE REF TO cl_salv_selections
+ CHANGING ch_cell TYPE salv_s_cell.
+ METHODS get_additional_info IMPORTING im_indexinc TYPE sytabix
+ CHANGING ch_main_list_line TYPE ty_request_details
+ ch_table TYPE ty_request_details_tt.
+ENDCLASS.
+
+*--------------------------------------------------------------------*
+* Selection screen Build
+*--------------------------------------------------------------------*
+
+* Possibility to add a button on the selection screen application
+* toolbar (If required, uncomment). Function text and icon is filled
+* in AT SELECTION-SCREEN OUTPUT
+SELECTION-SCREEN: FUNCTION KEY 1.
+
+* B10: Selection range / Upload file
+*---------------------------------------
+SELECTION-SCREEN BEGIN OF BLOCK box1 WITH FRAME TITLE sc_b10.
+PARAMETERS p_sel RADIOBUTTON GROUP mod DEFAULT 'X'
+ USER-COMMAND sel.
+PARAMETERS p_upl RADIOBUTTON GROUP mod.
+SELECTION-SCREEN END OF BLOCK box1.
+
+* B20: Selection criteria or Upload file
+*---------------------------------------
+SELECTION-SCREEN BEGIN OF BLOCK box2 WITH FRAME TITLE sc_b20.
+SELECT-OPTIONS s_korr FOR e070-strkorr MODIF ID sel.
+PARAMETERS p_str TYPE as4text VISIBLE LENGTH 41
+ MODIF ID sel.
+SELECTION-SCREEN SKIP 1.
+SELECTION-SCREEN BEGIN OF LINE.
+SELECTION-SCREEN COMMENT 1(20) sc_c21 MODIF ID sel.
+SELECTION-SCREEN POSITION 30.
+SELECT-OPTIONS s_user FOR sy-uname DEFAULT sy-uname
+ MATCHCODE OBJECT user_addr
+ MODIF ID sel.
+SELECTION-SCREEN PUSHBUTTON 71(5) sc_name
+ USER-COMMAND name
+ MODIF ID sel. "#EC NEEDED
+SELECTION-SCREEN END OF LINE.
+SELECT-OPTIONS s_date FOR e070-as4date MODIF ID sel.
+SELECTION-SCREEN PUSHBUTTON 69(7) sc_date
+ USER-COMMAND date
+ MODIF ID sel. "#EC NEEDED
+SELECT-OPTIONS s_proj FOR ctsproject-trkorr MODIF ID sel.
+SELECTION-SCREEN BEGIN OF LINE.
+SELECTION-SCREEN COMMENT 1(20) sc_c22 MODIF ID upl.
+SELECTION-SCREEN POSITION POS_LOW.
+PARAMETERS p_file TYPE string MODIF ID upl.
+SELECTION-SCREEN END OF LINE.
+SELECTION-SCREEN END OF BLOCK box2.
+
+* B30: Transport Track
+*---------------------------------------
+SELECTION-SCREEN BEGIN OF BLOCK box3 WITH FRAME TITLE sc_b30.
+SELECTION-SCREEN BEGIN OF LINE.
+* C31 - Route
+SELECTION-SCREEN COMMENT 1(20) sc_c31.
+SELECTION-SCREEN POSITION POS_LOW.
+PARAMETERS p_dev TYPE sysname DEFAULT 'DEV' ##SEL_WRONG.
+* C32 - -->
+SELECTION-SCREEN COMMENT 45(3) sc_c32.
+SELECTION-SCREEN POSITION 51.
+PARAMETERS p_qas TYPE sysname DEFAULT 'QAS'.
+* C33 - -->
+SELECTION-SCREEN COMMENT 63(3) sc_c33.
+SELECTION-SCREEN POSITION 69.
+PARAMETERS p_prd TYPE sysname DEFAULT 'PRD'.
+SELECTION-SCREEN END OF LINE.
+SELECTION-SCREEN END OF BLOCK box3.
+
+* B40: Check options
+*---------------------------------------
+SELECTION-SCREEN BEGIN OF BLOCK box4 WITH FRAME TITLE sc_b40.
+SELECTION-SCREEN BEGIN OF LINE.
+PARAMETERS p_noprd AS CHECKBOX DEFAULT 'X' ##SEL_WRONG.
+* C40 - Do not select transports already in production
+SELECTION-SCREEN COMMENT 4(63) sc_c40.
+SELECTION-SCREEN END OF LINE.
+
+SELECTION-SCREEN BEGIN OF LINE.
+PARAMETERS p_user AS CHECKBOX DEFAULT ' '.
+* C41 - Use User specific layout
+SELECTION-SCREEN COMMENT 4(63) sc_c41.
+SELECTION-SCREEN END OF LINE.
+
+SELECTION-SCREEN BEGIN OF LINE.
+PARAMETERS p_buff AS CHECKBOX DEFAULT 'X' USER-COMMAND buf ##SEL_WRONG.
+* C42 - Check transport buffer
+SELECTION-SCREEN COMMENT 4(22) sc_c42.
+PARAMETERS p_buffd AS CHECKBOX DEFAULT 'X' MODIF ID buf ##SEL_WRONG.
+SELECTION-SCREEN COMMENT 29(35) sc_c45 MODIF ID buf.
+SELECTION-SCREEN PUSHBUTTON (4) sc_buff
+ USER-COMMAND buff
+ MODIF ID buf
+ VISIBLE LENGTH 2. "#EC NEEDED
+SELECTION-SCREEN END OF LINE.
+
+SELECTION-SCREEN BEGIN OF LINE.
+PARAMETERS p_cofile AS CHECKBOX DEFAULT ' '.
+* C46 - Message if co-file is missing
+SELECTION-SCREEN COMMENT 4(63) sc_c46.
+SELECTION-SCREEN END OF LINE.
+
+SELECTION-SCREEN BEGIN OF LINE.
+PARAMETERS p_chkky AS CHECKBOX DEFAULT 'X' MODIF ID chk
+ USER-COMMAND key.
+* C43 - Check table keys
+SELECTION-SCREEN COMMENT 4(16) sc_c43 MODIF ID chk.
+SELECTION-SCREEN PUSHBUTTON 65(4) sc_ckey
+ USER-COMMAND ckey
+ MODIF ID chk
+ VISIBLE LENGTH 2. "#EC NEEDED
+SELECTION-SCREEN END OF LINE.
+SELECTION-SCREEN BEGIN OF LINE.
+PARAMETERS p_chd AS CHECKBOX DEFAULT ' ' MODIF ID upl.
+* C44 - Reset 'Checked' field
+SELECTION-SCREEN COMMENT 4(16) sc_c44 MODIF ID upl.
+SELECTION-SCREEN END OF LINE.
+SELECTION-SCREEN END OF BLOCK box4.
+
+* B50: Exclude from check
+*---------------------------------------
+SELECTION-SCREEN BEGIN OF BLOCK box5 WITH FRAME TITLE sc_b50.
+*C51 - Objects in the range will not be taken into account when checking
+* the
+SELECTION-SCREEN COMMENT /1(74) sc_c51 MODIF ID chk.
+*C52 - transports. Useful to exclude common customizing tables (like
+* SWOTICE for
+SELECTION-SCREEN COMMENT /1(74) sc_c52 MODIF ID chk.
+* C53 - workflow or the tables for Pricing procedures).
+SELECTION-SCREEN COMMENT /1(74) sc_c53 MODIF ID chk.
+SELECT-OPTIONS s_exobj FOR e071-obj_name NO INTERVALS
+ MODIF ID chk.
+SELECTION-SCREEN END OF BLOCK box5.
+
+*--------------------------------------------------------------------*
+* Initialize
+*--------------------------------------------------------------------*
+INITIALIZATION.
+
+* To be able to use methods on the selection screen
+ IF rf_ztct IS NOT BOUND.
+ TRY.
+ rf_ztct = NEW #( ).
+ CATCH cx_root INTO rf_root ##CATCH_ALL.
+ tp_msg = rf_root->get_text( ).
+ CONCATENATE 'ERROR:'(038) tp_msg INTO tp_msg SEPARATED BY space.
+ MESSAGE tp_msg TYPE 'E'.
+ ENDTRY.
+ ENDIF.
+* icon_terminated_position.
+ sc_name = '@L8@'.
+ sc_date = 'Clear'(025).
+ IF s_date IS INITIAL.
+ sc_date = 'Clear'(025).
+ s_date-sign = 'I'.
+ s_date-option = 'BT'.
+ s_date-high = sy-datum.
+ s_date-low = rf_ztct->go_back_months( im_currdate = sy-datum
+ im_backmonths = 6 ).
+ APPEND s_date TO s_date.
+ ELSE.
+ sc_date = 'Def.'(026).
+ FREE s_date.
+ ENDIF.
+
+* Set selection texts (to link texts to selection screen):
+* This is done to facilitate (love that word...) the copying of this
+* program to other environments without losing all the texts.
+ sc_b10 = 'Selection range / Upload file'(b10).
+ sc_b30 = 'Transport Track'(b30).
+ sc_b40 = 'Check options'(b40).
+ sc_b50 = 'Exclude from check'(b50).
+ sc_c21 = 'User'(c21).
+ sc_c22 = 'File name'(c22).
+ sc_c31 = 'Route'(c31).
+ sc_c32 = '-->'(c32).
+ sc_c33 = sc_c32.
+ sc_c40 = 'Do not select transports already in production'(c40).
+ sc_c41 = 'Use User specific layout'(c41).
+ sc_c42 = 'Check transport buffer'(c42).
+ sc_c43 = 'Check table keys'(c43).
+ sc_c44 = 'Reset `Checked` field'(c44).
+ sc_c45 = 'Remove transports not in buffer'(c45).
+ sc_c46 = 'Message if cofiles are missing'(c46).
+ sc_c51 = 'Objects in the range will not be taken into account when checking the'(c51).
+ sc_c52 = 'transports. Useful to exclude common customizing tables (like SWOTICE for'(c52).
+ sc_c53 = 'workflow or the tables for Pricing procedures).'(c53).
+
+ WRITE icon_information AS ICON TO sc_buff.
+ WRITE icon_information AS ICON TO sc_ckey.
+
+* Create a range table containing all project numbers:
+ SELECT 'E' AS sign,
+ 'EQ' AS option,
+ trkorr AS low
+ FROM ctsproject
+ INTO CORRESPONDING FIELDS OF TABLE @lt_range_project_trkorrs
+ ORDER BY low. "#EC CI_SGLSELECT #EC CI_SUBRC
+
+* Get the transport track
+ tp_sysname = sy-sysid.
+ CALL FUNCTION 'TR_GET_LIST_OF_TARGETS'
+ EXPORTING
+ iv_src_system = tp_sysname
+ IMPORTING
+ et_targets = ta_targets
+ EXCEPTIONS
+ tce_config_error = 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.
+ p_dev = sy-sysid.
+ LOOP AT ta_targets INTO st_target.
+ CASE sy-tabix.
+ WHEN 1.
+ p_qas = st_target.
+ WHEN 2.
+ p_prd = st_target.
+ ENDCASE.
+ ENDLOOP.
+
+* Default values for s_exobj. These objects will not be checked!
+* Exclude Single values:
+ s_exobj-sign = 'E'.
+ s_exobj-option = 'EQ'.
+* Index of Frozen DDIC Structures
+ s_exobj-low = 'SWOTICE'.
+ APPEND s_exobj TO s_exobj.
+* View Directory
+ s_exobj-low = 'TVDIR'.
+ APPEND s_exobj TO s_exobj.
+* Maintenance Areas for Tables
+ s_exobj-low = 'TDDAT'.
+ APPEND s_exobj TO s_exobj.
+*--------------------------------------------------------------------*
+* Selection screen Checks
+*--------------------------------------------------------------------*
+AT SELECTION-SCREEN.
+ CASE sy-ucomm.
+ WHEN 'FC01'.
+ tp_dokl_object = 'ZEV_TP_CHECKTOOL'.
+ rf_ztct->docu_call( im_object = tp_dokl_object
+ im_id = 'TX'
+ im_display = abap_true
+ im_displ_mode = '2' ).
+ WHEN 'BUFF'.
+ tp_dokl_object = 'ZEV_TP_CHECKTOOL_BUFF'.
+ rf_ztct->docu_call( im_object = tp_dokl_object
+ im_id = 'TX'
+ im_display = abap_true
+ im_displ_mode = '2' ).
+ WHEN 'CKEY'.
+ tp_dokl_object = 'ZEV_TP_CHECKTOOL_CKEY'.
+ rf_ztct->docu_call( im_object = tp_dokl_object
+ im_id = 'TX'
+ im_display = abap_true
+ im_displ_mode = '2' ).
+ WHEN 'NAME'.
+ IF s_user IS NOT INITIAL.
+ FREE s_user.
+ CLEAR s_user.
+ sc_name = '@LD@'.
+ ELSE.
+ s_user-option = 'EQ'.
+ s_user-sign = 'I'.
+ s_user-low = sy-uname.
+ APPEND s_user TO s_user.
+ sc_name = '@L8@'.
+ ENDIF.
+ WHEN 'DATE'.
+ IF s_date IS INITIAL.
+ sc_date = 'Clear'(025).
+ IF s_date[] IS INITIAL.
+ s_date-sign = 'I'.
+ s_date-option = 'BT'.
+ s_date-high = sy-datum.
+ s_date-low = rf_ztct->go_back_months( im_currdate = sy-datum
+ im_backmonths = 6 ).
+ APPEND s_date TO s_date.
+ ENDIF.
+ ELSE.
+ sc_date = 'Def.'(026).
+ FREE s_date.
+ ENDIF.
+ ENDCASE.
+
+AT SELECTION-SCREEN ON p_dev.
+ SELECT SINGLE sysname FROM tcesyst INTO @tp_sysname
+ WHERE sysname = @p_dev ##WARN_OK.
+ IF sy-subrc <> 0.
+ MESSAGE e000(db) DISPLAY LIKE 'E'
+ WITH 'System'(057) p_dev 'does not exist...'(058).
+ ENDIF.
+
+AT SELECTION-SCREEN ON p_qas.
+ SELECT SINGLE sysname FROM tcesyst INTO @tp_sysname
+ WHERE sysname = @p_qas ##WARN_OK.
+ IF sy-subrc <> 0.
+ MESSAGE e000(db) DISPLAY LIKE 'E'
+ WITH 'System'(057) p_qas 'does not exist...'(058).
+ ENDIF.
+
+AT SELECTION-SCREEN ON p_prd.
+ SELECT SINGLE sysname FROM tcesyst INTO @tp_sysname
+ WHERE sysname = @p_prd ##WARN_OK.
+ IF sy-subrc <> 0.
+ MESSAGE e000(db) DISPLAY LIKE 'E'
+ WITH 'System'(057) p_prd 'does not exist...'(058).
+ ENDIF.
+
+AT SELECTION-SCREEN OUTPUT.
+* This commented out code can be used to add a function on the toolbar:
+ st_smp_dyntxt-text = 'Information'(027) ##TEXT_DUP.
+ st_smp_dyntxt-icon_id = '@0S@'.
+ st_smp_dyntxt-icon_text = 'Info'(024).
+ st_smp_dyntxt-quickinfo = 'General Info'(028).
+ st_smp_dyntxt-path = 'I'.
+ sscrfields-functxt_01 = st_smp_dyntxt.
+
+ LOOP AT SCREEN.
+ CASE screen-group1.
+ WHEN 'SEL'.
+ IF p_sel = 'X'.
+ screen-active = '1'.
+ sc_b20 = 'Selection criteria'(b21).
+ ELSE.
+ screen-active = '0'.
+ sc_b20 = 'File upload'(b22).
+ ENDIF.
+ MODIFY SCREEN.
+ WHEN 'CHK'.
+ IF p_sel = 'X'.
+ screen-active = '1'.
+ ELSE.
+ screen-active = '0'.
+ ENDIF.
+ MODIFY SCREEN.
+ WHEN 'BUF'.
+ IF p_buff = 'X'.
+ screen-active = '1'.
+ ELSE.
+ screen-active = '0'.
+ ENDIF.
+ MODIFY SCREEN.
+ WHEN 'DIC'.
+ IF p_sel = 'X'.
+ screen-active = '1'.
+ ELSE.
+ screen-active = '0'.
+ ENDIF.
+ MODIFY SCREEN.
+ WHEN 'KEY'.
+ IF p_chkky = 'X' AND p_sel = 'X'.
+ screen-active = '1'.
+ ELSE.
+ screen-active = '0'.
+ ENDIF.
+ MODIFY SCREEN.
+ WHEN 'UPL'.
+ IF p_upl = 'X'.
+ screen-active = '1'.
+ ELSE.
+ screen-active = '0'.
+ ENDIF.
+ MODIFY SCREEN.
+ WHEN 'GRY'.
+ screen-input = '0'.
+ MODIFY SCREEN.
+ ENDCASE.
+ ENDLOOP.
+
+* If the user range is initial (removed manually), set the correct Icon:
+AT SELECTION-SCREEN ON s_user.
+ IF s_user[] IS INITIAL.
+ sc_name = '@LD@'.
+ ENDIF.
+
+AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
+ p_file = rf_ztct->get_filename( ).
+
+*--------------------------------------------------------------------*
+* CLASS lcl_eventhandler_ztct IMPLEMENTATION
+*--------------------------------------------------------------------*
+CLASS lcl_eventhandler_ztct IMPLEMENTATION.
+
+ METHOD on_function_click.
+ TYPES ty_string TYPE string.
+ DATA lt_range_transports_to_add TYPE RANGE OF e070-trkorr.
+ DATA ls_range_transports_to_add LIKE LINE OF lt_range_transports_to_add.
+* Selected rows
+ DATA lr_selections TYPE REF TO cl_salv_selections.
+ DATA lt_rows TYPE salv_t_row.
+ DATA ls_cell TYPE salv_s_cell.
+
+* Inline data declarations. Preferred by AbapLint, but should not be
+* declared within conditional blocks (IF, ELSE, CASE).
+ DATA(lp_filename) = VALUE ty_string( ).
+
+* Which popup are we displaying? Conflicts or Table keys?
+ FIELD-SYMBOLS TYPE REF TO cl_salv_table.
+ IF rf_conflicts IS BOUND.
+ ASSIGN rf_conflicts TO . "#EC CI_SUBRC
+ ELSEIF rf_table_keys IS BOUND.
+ ASSIGN rf_table_keys TO . "#EC CI_SUBRC
+ ELSE.
+ ASSIGN rf_table TO . "#EC CI_SUBRC
+ ENDIF.
+ IF IS ASSIGNED.
+* Get current row
+ lr_selections = ->get_selections( ).
+ lt_rows = lr_selections->get_selected_rows( ).
+ ls_cell = lr_selections->get_current_cell( ).
+ IF e_salv_function <> 'GOON' AND e_salv_function <> 'ABR'.
+ TRY.
+ rf_ztct->main_list_line = rf_ztct->main_list[ ls_cell-row ].
+ CATCH cx_root INTO rf_root ##CATCH_ALL.
+ ENDTRY.
+ ENDIF.
+ CASE e_salv_function.
+ WHEN 'GOON'.
+ rf_ztct->ofc_goon( EXPORTING im_rows = lt_rows
+ CHANGING ch_table = ).
+ WHEN 'ABR'.
+ rf_ztct->ofc_abr( CHANGING ch_conflicts = rf_conflicts ).
+ WHEN 'RECHECK'.
+ rf_ztct->set_building_conflict_popup( abap_false ).
+ rf_ztct->refresh_import_queues( ).
+ rf_ztct->flag_for_process( im_rows = lt_rows
+ im_cell = ls_cell ).
+ rf_ztct->add_table_keys_to_list( CHANGING ch_table = rf_ztct->main_list ).
+ rf_ztct->get_additional_tp_info( CHANGING ch_table = rf_ztct->main_list ).
+ rf_ztct->flag_same_objects( CHANGING ch_main_list = rf_ztct->main_list ).
+ rf_ztct->check_for_conflicts( CHANGING ch_main_list = rf_ztct->main_list ).
+ WHEN 'DDIC'.
+ rf_ztct->ofc_ddic( ).
+ WHEN '&ADD'.
+ rf_ztct->set_building_conflict_popup( ).
+* Here, we want to give the option to the user to select the
+* transports to be added. Display a popup with the option to select the
+* transports to be added with checkboxes.
+ rf_ztct->flag_for_process( im_rows = lt_rows
+ im_cell = ls_cell ).
+ rf_ztct->flag_same_objects( CHANGING ch_main_list = rf_ztct->main_list ).
+ rf_ztct->check_for_conflicts( CHANGING ch_main_list = rf_ztct->main_list ).
+ rf_ztct->build_conflict_popup( im_rows = lt_rows
+ im_cell = ls_cell ).
+ WHEN '&ADD_TP'.
+ rf_ztct->ofc_add_tp( ).
+ WHEN '&ADD_FILE'.
+ rf_ztct->clear_flags( ).
+ lp_filename = rf_ztct->get_filename( ).
+ rf_ztct->gui_upload( lp_filename ).
+ tp_dokl_object = 'ZEV_TP_CHECKTOOL_ADD_FILE'.
+ rf_ztct->docu_call( im_object = tp_dokl_object
+ im_id = 'TX'
+ im_display = abap_true
+ im_displ_mode = '2' ).
+ rf_ztct->check_for_conflicts( CHANGING ch_main_list = rf_ztct->main_list ).
+ WHEN '&DEL'.
+* Mark all records for the selected transport(s)
+ rf_ztct->clear_flags( ).
+ rf_ztct->mark_all_tp_records( EXPORTING im_cell = ls_cell
+ CHANGING ch_rows = lt_rows ).
+ rf_ztct->flag_for_process( im_rows = lt_rows
+ im_cell = ls_cell ).
+ rf_ztct->flag_same_objects( CHANGING ch_main_list = rf_ztct->main_list ).
+ rf_ztct->delete_tp_from_list( lt_rows ).
+ rf_ztct->check_for_conflicts( CHANGING ch_main_list = rf_ztct->main_list ).
+ WHEN '&IMPORT'.
+* Re-transport a request (transport already in production)
+ rf_ztct->clear_flags( ).
+ rf_ztct->flag_for_process( im_rows = lt_rows
+ im_cell = ls_cell ).
+ FREE lt_range_transports_to_add.
+ CLEAR ls_range_transports_to_add.
+ ls_range_transports_to_add-sign = 'I'.
+ ls_range_transports_to_add-option = 'EQ'.
+ LOOP AT rf_ztct->main_list INTO rf_ztct->main_list_line
+ WHERE flag = 'X'
+ AND prd = rf_ztct->co_okay.
+ ls_range_transports_to_add-low = rf_ztct->main_list_line-trkorr.
+ APPEND ls_range_transports_to_add TO lt_range_transports_to_add.
+ ENDLOOP.
+ IF lt_range_transports_to_add IS INITIAL.
+ MESSAGE i000(db) WITH 'No records selected that can be re-imported'(m11).
+ RETURN.
+ ENDIF.
+ LOOP AT rf_ztct->main_list INTO rf_ztct->main_list_line
+ WHERE trkorr IN lt_range_transports_to_add.
+ rf_ztct->main_list_line-flag = 'X'.
+ rf_ztct->main_list_line-prd = rf_ztct->co_scrap.
+ MODIFY rf_ztct->main_list FROM rf_ztct->main_list_line.
+ ENDLOOP.
+ rf_ztct->flag_same_objects( CHANGING ch_main_list = rf_ztct->main_list ).
+ rf_ztct->check_for_conflicts( CHANGING ch_main_list = rf_ztct->main_list ).
+ WHEN '&DOC'.
+ tp_dokl_object = rf_ztct->main_list_line-trkorr.
+ rf_ztct->docu_call( im_object = tp_dokl_object
+ im_id = 'TA' ).
+ rf_ztct->check_documentation( EXPORTING im_trkorr = rf_ztct->main_list_line-trkorr
+ CHANGING ch_table = rf_ztct->main_list ).
+ WHEN '&PREP_XLS'.
+ IF rf_table_xls IS BOUND.
+ RETURN.
+ ENDIF.
+ rf_ztct->display_excel( rf_ztct->main_list ).
+ WHEN '&SAVE'.
+ rf_ztct->ofc_save( ).
+ WHEN '&NCONF'.
+ rf_ztct->ofc_nconf( EXPORTING im_selections = lr_selections
+ CHANGING ch_cell = ls_cell ).
+ ENDCASE.
+ IF rf_table IS BOUND.
+ rf_ztct->refresh_alv( ).
+ ENDIF.
+ ENDIF.
+ ENDMETHOD.
+
+ METHOD on_double_click.
+ DATA lr_selections TYPE REF TO cl_salv_selections.
+* Selected rows
+ DATA lt_rows TYPE salv_t_row.
+ DATA ls_cell TYPE salv_s_cell.
+
+ lr_selections = rf_table->get_selections( ).
+ lt_rows = lr_selections->get_selected_rows( ).
+ ls_cell = lr_selections->get_current_cell( ).
+
+* Only display the details when the list is the MAIN list (Object level
+* not when the list is on Header level (XLS)
+ IF rf_table_xls IS BOUND.
+ RETURN.
+ ELSE.
+ TRY.
+ rf_ztct->main_list_line = rf_ztct->main_list[ row ].
+ CASE column.
+ WHEN 'TRKORR'.
+ rf_ztct->display_transport( rf_ztct->main_list_line-trkorr ).
+ WHEN 'AS4USER'.
+ rf_ztct->display_user( rf_ztct->main_list_line-as4user ).
+ WHEN 'CHECKED_BY'.
+ rf_ztct->display_user( rf_ztct->main_list_line-checked_by ).
+* Documentation
+ WHEN 'INFO'.
+ rf_ztct->display_docu( rf_ztct->main_list_line-trkorr ).
+ rf_ztct->refresh_alv( ).
+ WHEN 'WARNING_LVL'.
+* Display popup with the conflicting transports/objects
+ IF rf_ztct->main_list_line-warning_lvl IS NOT INITIAL.
+ rf_ztct->build_conflict_popup( im_rows = lt_rows
+ im_cell = ls_cell ).
+ rf_ztct->refresh_alv( ).
+ ENDIF.
+ ENDCASE.
+ CATCH cx_root INTO rf_root ##CATCH_ALL.
+ tp_msg = rf_root->get_text( ).
+ ENDTRY.
+ ENDIF.
+ ENDMETHOD.
+
+ METHOD on_double_click_popup.
+ TRY.
+ rf_ztct->conflict_line = rf_ztct->conflicts[ row ].
+ CASE column.
+ WHEN 'TRKORR'.
+ rf_ztct->display_transport( rf_ztct->conflict_line-trkorr ).
+ WHEN 'AS4USER'.
+ rf_ztct->display_user( rf_ztct->conflict_line-as4user ).
+ WHEN 'CHECKED_BY'.
+ rf_ztct->display_user( rf_ztct->conflict_line-checked_by ).
+* Documentation
+ WHEN 'INFO'.
+ rf_ztct->display_docu( rf_ztct->conflict_line-trkorr ).
+ rf_ztct->refresh_alv( ).
+ ENDCASE.
+ CATCH cx_root INTO rf_root ##CATCH_ALL.
+ tp_msg = rf_root->get_text( ).
+ ENDTRY.
+ ENDMETHOD.
+
+ METHOD on_link_click.
+* Which table are we displaying? Object level or Header level (XLS)?
+ IF rf_table_xls IS BOUND.
+ rf_ztct->main_list_line = rf_ztct->main_list_xls[ row ].
+ ELSE.
+ rf_ztct->main_list_line = rf_ztct->main_list[ row ].
+ ENDIF.
+ CASE column.
+ WHEN 'TRKORR'.
+ rf_ztct->display_transport( rf_ztct->main_list_line-trkorr ).
+ WHEN 'OBJ_NAME'.
+ CALL FUNCTION 'TR_OBJECT_JUMP_TO_TOOL'
+ EXPORTING
+ iv_pgmid = rf_ztct->main_list_line-pgmid
+ iv_object = rf_ztct->main_list_line-object
+ iv_obj_name = rf_ztct->main_list_line-obj_name
+ iv_action = 'SHOW'
+ EXCEPTIONS
+ OTHERS = 1.
+ IF sy-subrc <> 0.
+ CALL FUNCTION 'TR_OBJECT_JUMP_TO_TOOL'
+ EXPORTING
+ iv_pgmid = 'LIMU'
+ iv_object = rf_ztct->main_list_line-object
+ iv_obj_name = rf_ztct->main_list_line-obj_name
+ iv_action = 'SHOW'
+ EXCEPTIONS
+ OTHERS = 1.
+ IF sy-subrc <> 0.
+ MESSAGE i000(db) WITH 'Object cannot be displayed...'(m14).
+ ENDIF.
+ ENDIF.
+ ENDCASE.
+ ENDMETHOD.
+
+ METHOD on_link_click_popup.
+ rf_ztct->conflict_line = rf_ztct->conflicts[ row ].
+ IF column = 'TRKORR'.
+ rf_ztct->display_transport( rf_ztct->conflict_line-trkorr ).
+ ENDIF.
+ ENDMETHOD.
+
+ENDCLASS.
+
+*--------------------------------------------------------------------*
+* CLASS lcl_ztct IMPLEMENTATION
+*--------------------------------------------------------------------*
+CLASS lcl_ztct IMPLEMENTATION.
+
+ METHOD constructor.
+ lp_alert0_text = 'Log couldn''t be read or TP not released'(w16).
+ lp_alert1_text = 'Transport not released'(w19).
+ lp_alert2_text = 'Release started'(w20).
+ lp_alert3_text = 'Transport not in Transport Buffer'(m12).
+ lp_hint1_text = 'Newer version in test environment, but in list'(w22).
+ lp_hint2_text = 'Conflicts are dealt with'(w04).
+ lp_hint3_text = 'Couldn''t read log, but object in list'(w21).
+ lp_hint4_text = 'Overwrites version(s), newer version in list'(w11).
+ lp_warn_text = 'Previous transport not transported'(w17).
+ lp_error_text = 'Newer version in target environment!'(w01).
+ lp_ddic_text = 'Uses object not in list or target environment'(w03).
+ lp_info_text = 'Newer version in test environment'(w23).
+ lp_fail_text = 'Transport not possible'(w24).
+* Create a range table containing all project transport numbers.
+* When selecting transports, these can be skipped.
+* Create a range table containing all project numbers:
+ SELECT 'I' AS sign,
+ 'EQ' AS option,
+ trkorr AS low
+ FROM ctsproject
+ INTO CORRESPONDING FIELDS OF TABLE @project_trkorrs
+ ORDER BY low. "#EC CI_SGLSELECT #EC CI_SUBRC
+* Ensure that the range cannot be empty
+ IF project_trkorrs IS INITIAL.
+ project_trkorrs = VALUE ty_range_trkorr( ( sign = 'I'
+ option = 'EQ'
+ low = 'DUMMY' ) ).
+ ENDIF.
+ ENDMETHOD.
+
+ METHOD execute.
+ IF process_type = 1.
+ get_data( trkorr_range ).
+ get_additional_tp_info( CHANGING ch_table = main_list ).
+* First selection: If the flag to exclude transport that are already
+* in production is set, remove all these transports from the main
+* list.
+ IF skiplive IS NOT INITIAL.
+ remove_tp_in_prd( ).
+ ENDIF.
+* Table checks not possible for version checking.
+ IF process_type = 1.
+ build_table_keys_popup( ).
+ FREE rf_table_keys.
+ add_table_keys_to_list( CHANGING ch_table = main_list ).
+ ENDIF.
+* Reason to check data dictionary objects:
+* If objects in the transport list contain DDIC objects that do NOT
+* exist in production and do NOT exist in the transport list, errors
+* (DUMPS) will happen when the transports are moved to production.
+* Checking steps:
+* 1. Get all Z-objects in tables DD01L, DD02L and DD04L (Domains,
+* Tables, Elements)
+* 2. Get all transports from E071 containing these objects
+* 3. Store the link between Transports and Objects in attribute WHERE_USED
+* 4. Remove from the table all records for objects/transports that have
+* been transported to production
+* 5. Execute a Where-Used on all remaining objects
+* 6. If there are Objects in the main transport list, that are ALSO in
+* the Where-Used list then THE TRANSPORT CANNOT GO TO PRODUCTION!
+ IF check_ddic = abap_true.
+ prepare_ddic_check( ).
+ ENDIF.
+ check_for_conflicts( CHANGING ch_main_list = main_list ).
+ ELSEIF gui_upload( filename ) = abap_true.
+ RETURN.
+ ENDIF.
+
+ set_color( ).
+ alv_init( ).
+ alv_set_properties( rf_table ).
+ alv_set_lr_tooltips( rf_table ).
+ alv_output( ).
+ ENDMETHOD.
+
+ METHOD get_data.
+ refresh_import_queues( ).
+ get_main_transports( im_trkorr_range ).
+ ENDMETHOD.
+
+ METHOD get_tp_prefix.
+ IF prefix IS INITIAL.
+* Build transport prefix
+ IF im_dev IS SUPPLIED.
+ set_tp_prefix( im_dev ).
+ ELSE.
+ set_tp_prefix( ).
+ ENDIF.
+ ENDIF.
+ re_tp_prefix = prefix.
+ ENDMETHOD.
+
+ METHOD set_tp_prefix.
+* Build transport prefix:
+ IF im_dev IS SUPPLIED.
+ CONCATENATE im_dev 'K%' INTO prefix.
+ ELSE.
+ CONCATENATE sy-sysid 'K%' INTO prefix.
+ ENDIF.
+ ENDMETHOD.
+
+ METHOD refresh_import_queues.
+ CALL FUNCTION 'TMS_MGR_REFRESH_IMPORT_QUEUES'.
+ ENDMETHOD.
+
+ METHOD flag_for_process.
+ DATA ls_row TYPE int4.
+ IF im_rows IS INITIAL AND im_cell IS INITIAL.
+ MESSAGE i000(db) WITH 'Please select records or put the cursor on a row'(m10).
+ RETURN.
+ ENDIF.
+* First clear all the flags:
+ clear_flags( ).
+* If the DDIC check is OFF, but there ARE DDIC warnings in the list,
+* then we need to flag these records to be checked. If that is not
+* done then the DDIC warning icon would stay, even if the missing
+* DDIC object would be added to the list...
+ IF check_ddic = abap_false.
+ LOOP AT main_list INTO main_list_line
+ WHERE warning_lvl = co_ddic.
+ main_list_line-flag = abap_true.
+ MODIFY main_list FROM main_list_line INDEX sy-tabix TRANSPORTING flag.
+ ENDLOOP.
+ ENDIF.
+* If row(s) are selected, use the table
+ LOOP AT im_rows INTO ls_row.
+ main_list_line-flag = abap_true.
+ MODIFY main_list FROM main_list_line INDEX ls_row TRANSPORTING flag.
+ ENDLOOP.
+* If no rows were selected, take the current cell instead
+ IF sy-subrc <> 0.
+ TRY.
+ main_list_line = main_list[ im_cell-row ].
+ main_list_line-flag = abap_true.
+ MODIFY main_list FROM main_list_line INDEX im_cell-row TRANSPORTING flag.
+ CATCH cx_root INTO rf_root ##CATCH_ALL.
+ ENDTRY.
+ ENDIF.
+ ENDMETHOD.
+
+ METHOD check_for_conflicts.
+ DATA lp_counter TYPE i.
+ DATA lp_tabix TYPE sytabix.
+ DATA ls_main TYPE ty_request_details.
+ DATA lt_newer_transports TYPE ty_request_details_tt.
+ DATA lt_older_transports TYPE ty_request_details_tt.
+ DATA lp_domnam TYPE char10.
+ DATA lp_highest_lvl TYPE icon_d.
+ DATA lp_highest_rank TYPE numc4.
+ DATA lp_highest_text TYPE text74.
+ DATA lp_highest_col TYPE lvc_t_scol.
+
+ FREE conflicts.
+ CLEAR conflict_line.
+ CLEAR total.
+ IF check_flag = abap_false.
+ RETURN.
+ ENDIF.
+ sort_list( CHANGING ch_list = main_list ).
+* For each transports, all the objects in the transport will be checked.
+* If there is a newer version of an object in prd, then a warning will
+* be displayed. Also if a newer version that was in prd was actually
+* overwritten or if an object could not be checked.
+* Total for progress indicator: How many will be checked?
+ CLEAR lp_counter.
+ LOOP AT ch_main_list INTO ls_main WHERE prd <> co_okay
+ AND dev <> co_error
+ AND flag = abap_true.
+ total = total + 1.
+ ENDLOOP.
+
+* Check each object in the main list, that has been flagged (also allow
+* checking of transports in prd, those may have been added for transport
+* again):
+ LOOP AT ch_main_list INTO ls_main WHERE prd <> co_okay
+ AND dev <> co_error
+ AND flag = abap_true.
+ CLEAR conflict_line.
+ CLEAR ls_main-warning_lvl.
+ CLEAR ls_main-warning_rank.
+ CLEAR ls_main-warning_txt.
+ lp_tabix = sy-tabix.
+* Show the progress indicator
+ lp_counter = lp_counter + 1.
+ progress_indicator( im_counter = lp_counter
+ im_object = ls_main-obj_name
+ im_total = total
+ im_text = 'Objects checked'(011)
+ im_flag = ' ' ).
+* The CHECKED flag is useful to check if the check has been carried
+* out. On the selection screen, you can choose to clear the flags
+* (which can be useful if the file is old and needs to be rechecked)
+* This flag will aid the user when the user checks the list in
+* stages (Example: Half today and the other half tomorrow).
+* st_main-checked is set here to 'X'. It will be updated later when
+* the check has been executed and the main list updated with the
+* change.
+ ls_main-checked = co_checked.
+ MODIFY ch_main_list FROM ls_main TRANSPORTING checked.
+* Check for documentation:
+ check_documentation( EXPORTING im_trkorr = ls_main-trkorr
+ CHANGING ch_table = ch_main_list ).
+* Now check the object:
+ get_tps_for_same_object( EXPORTING im_line = ls_main
+ IMPORTING ex_newer = lt_newer_transports
+ ex_older = lt_older_transports ).
+* Compare version in QAS with version in prd
+* If a newer version/request is found in prd, then add a warning and
+* continue with the next.
+ IF lt_newer_transports[] IS NOT INITIAL.
+ check_newer_transports( EXPORTING im_newer_transports = lt_newer_transports
+ im_main_list = ch_main_list
+ CHANGING ch_conflicts = conflicts
+ ch_main = ls_main ).
+ ENDIF.
+* Select all the transports that are older. These will be checked to
+* see if they have been moved to prd. If the older version has been
+* transported, it is okay.
+* If not, then add a warning and continue with the next record.
+ IF lt_older_transports[] IS NOT INITIAL.
+ check_older_transports( EXPORTING im_older_transports = lt_older_transports
+ im_main_list = ch_main_list
+ CHANGING ch_conflicts = conflicts
+ ch_main = ls_main ).
+ ENDIF.
+* Determine highest warning level in conflict list
+* Only when NOT building the conflict popup
+ IF building_conflict_popup = abap_false.
+ CLEAR: lp_highest_lvl,
+ lp_highest_rank,
+ lp_highest_text,
+ lp_highest_col.
+ LOOP AT conflicts INTO conflict_line.
+ IF conflict_line-warning_rank > lp_highest_rank.
+ lp_highest_lvl = conflict_line-warning_lvl.
+ lp_highest_rank = conflict_line-warning_rank.
+ lp_highest_col = conflict_line-t_color.
+ lp_highest_text = determine_warning_text( lp_highest_rank ).
+ ENDIF.
+ ENDLOOP.
+ ls_main-warning_lvl = lp_highest_lvl.
+ ls_main-warning_rank = lp_highest_rank.
+ ls_main-warning_txt = lp_highest_text.
+ ls_main-t_color = lp_highest_col.
+ MODIFY ch_main_list FROM ls_main TRANSPORTING warning_lvl
+ warning_rank
+ warning_txt
+ t_color.
+ ENDIF.
+* Refresh the conflict table. But, if the conflict popup is being build
+* for one or more lines, then do NOT refresh the conflict table. Display
+* ALL conflicts for all selected lines.
+ IF building_conflict_popup = abap_false.
+ FREE conflicts.
+ ENDIF.
+ ENDLOOP.
+
+* Update the conflict table and the main list with DDIC information
+ do_ddic_check( CHANGING ch_main_list = ch_main_list ).
+
+* Check if the transport is in Transport Buffer
+* TMS_MGR_REFRESH_IMPORT_QUEUES updates this table
+ CLEAR lp_counter.
+* When checking the buffer, but never when building popup
+* (buffer_chk = abap_true AND building_conflict_popup = abap_false)
+ IF buffer_chk = abap_true AND building_conflict_popup = abap_false.
+ LOOP AT ch_main_list ASSIGNING FIELD-SYMBOL()
+ WHERE prd <> co_okay
+ AND prd <> co_scrap
+ AND dev <> co_error
+ AND flag = abap_true.
+* Show the progress indicator
+ lp_counter = lp_counter + 1.
+ progress_indicator( im_counter = lp_counter
+ im_object = -obj_name
+ im_total = total
+ im_text = 'Checking buffer'(050)
+ im_flag = ' ' ).
+ CLEAR lp_domnam.
+ SELECT SINGLE domnam INTO @lp_domnam FROM tmsbuffer
+ WHERE trkorr = @-trkorr
+ AND sysnam = @prd_system ##WARN_OK.
+ IF sy-subrc = 4.
+ IF buffer_remove_tp = abap_true.
+ DELETE ch_main_list INDEX sy-tabix.
+ ELSE.
+ -warning_lvl = co_alert.
+ -warning_rank = co_alert3_rank.
+ -warning_txt = lp_alert3_text.
+ ENDIF.
+ ENDIF.
+ ENDLOOP.
+ ENDIF.
+* Sort ta_conflicts by date time stamp, descending. Most recent should
+* be displayed first:
+ SORT conflicts BY as4date DESCENDING
+ as4time DESCENDING
+ trkorr DESCENDING.
+ DELETE ADJACENT DUPLICATES FROM conflicts
+ COMPARING trkorr object obj_name.
+ ENDMETHOD.
+
+ METHOD build_table_keys_popup.
+* A popup is displayed with all tables found in the main list, that
+* have keys. The user has now the option to include them in the
+* checking procedure. This is the only place where the user has a
+* complete overview of the tables that have been found...
+* Declaration for ALV Columns
+ DATA lr_columns_table TYPE REF TO cl_salv_columns_table.
+ DATA lr_column_table TYPE REF TO cl_salv_column_table.
+ DATA lt_t_column_ref TYPE salv_t_column_ref.
+ DATA ls_s_column_ref TYPE salv_s_column_ref.
+ DATA lr_events TYPE REF TO cl_salv_events_table.
+* Declaration for Global Display Settings
+ DATA lr_display_settings TYPE REF TO cl_salv_display_settings.
+* Declaration for Table Selection settings
+ DATA lr_selections TYPE REF TO cl_salv_selections.
+ DATA lp_title TYPE lvc_title.
+ DATA lp_tp_prefix TYPE char5.
+ DATA lp_xstart TYPE i VALUE 26.
+ DATA lp_ystart TYPE i VALUE 7.
+ DATA lp_cw_tabname TYPE lvc_outlen.
+ DATA lp_cw_counter TYPE lvc_outlen.
+ DATA lp_cw_ddtext TYPE lvc_outlen.
+* Texts
+ DATA lp_short_text TYPE char10.
+ DATA lp_medium_text TYPE char20.
+ DATA lp_long_text TYPE char40.
+
+ DATA(lp_xend) = 0.
+
+* Only if the option to check for table keys is switched ON and
+* checking is active
+ IF check_flag = abap_false.
+ RETURN.
+ ENDIF.
+ lp_title = 'Select the tables for which the keys must be checked'(t06).
+* Determine the transport prefix (if not done already)
+ lp_tp_prefix = get_tp_prefix( dev_system ).
+* Fill the internal table to be displayed in the popup:
+ LOOP AT main_list INTO main_list_line
+ WHERE objfunc = 'K'
+ AND keyobject IS INITIAL
+ AND keyobjname IS INITIAL
+ AND obj_name IN excluded_objects.
+ CLEAR table_keys_line.
+ SELECT SINGLE ddtext FROM dd02t
+ INTO @table_keys_line-ddtext
+ WHERE ddlanguage = @co_langu
+ AND tabname = @main_list_line-obj_name. "#EC CI_SUBRC
+* Count the keys...
+ SELECT COUNT(*)
+ FROM e071k INTO @table_keys_line-counter
+ WHERE trkorr = @main_list_line-trkorr
+ AND mastertype = @main_list_line-object
+ AND trkorr NOT IN @project_trkorrs
+ AND trkorr LIKE @lp_tp_prefix
+ AND objname IN @excluded_objects. "#EC CI_SUBRC
+ table_keys_line-tabname = main_list_line-obj_name.
+ COLLECT table_keys_line INTO table_keys.
+ ENDLOOP.
+
+ DELETE table_keys WHERE counter = 0.
+ IF table_keys[] IS INITIAL.
+ RETURN.
+ ENDIF.
+ SORT table_keys BY counter DESCENDING.
+
+* Only display the popup if the user selected the option 'Check table keys'
+* on the selection screen. If not, the popup does not need to be displayed,
+* but the tables still need to be added to the list of excluded objects.
+* If the user will NOT check the table keys, all tables need to be added to
+* the excluded object list (Tables will NOT be checked).
+ IF check_tabkeys = abap_false.
+ LOOP AT table_keys INTO table_keys_line.
+ ls_excluded_objects-sign = 'E'.
+ ls_excluded_objects-option = 'EQ'.
+ ls_excluded_objects-low = table_keys_line-tabname.
+ APPEND ls_excluded_objects TO excluded_objects.
+ ENDLOOP.
+ RETURN.
+ ENDIF.
+
+* Determine total width
+ LOOP AT table_keys INTO table_keys_line.
+ determine_col_width( EXPORTING im_field = table_keys_line-tabname
+ CHANGING ch_colwidth = lp_cw_tabname ).
+ determine_col_width( EXPORTING im_field = table_keys_line-ddtext
+ CHANGING ch_colwidth = lp_cw_ddtext ).
+ ENDLOOP.
+
+ lp_xend = lp_cw_tabname + lp_cw_counter + lp_cw_ddtext.
+
+ TRY.
+ cl_salv_table=>factory(
+ IMPORTING
+ r_salv_table = rf_table_keys
+ CHANGING
+ t_table = table_keys ).
+* Global display settings
+ lr_display_settings = rf_table_keys->get_display_settings( ).
+* Activate Striped Pattern
+ lr_display_settings->set_striped_pattern( if_salv_c_bool_sap=>true ).
+* Report header
+ lr_display_settings->set_list_header( lp_title ).
+* Table Selection Settings
+ lr_selections = rf_table_keys->get_selections( ).
+ IF lr_selections IS NOT INITIAL.
+* Allow row and column Selection (Adds checkbox)
+ lr_selections->set_selection_mode( if_salv_c_selection_mode=>row_column ).
+ ENDIF.
+* Get the columns from ALV Table
+ lr_columns_table = rf_table_keys->get_columns( ).
+ IF lr_columns_table IS NOT INITIAL.
+ FREE lt_t_column_ref.
+ lt_t_column_ref = lr_columns_table->get( ).
+* Get columns properties
+ lr_columns_table->set_optimize( if_salv_c_bool_sap=>true ).
+ lr_columns_table->set_key_fixation( if_salv_c_bool_sap=>true ).
+* Individual Column Properties.
+ LOOP AT lt_t_column_ref INTO ls_s_column_ref.
+ TRY.
+ lr_column_table ?=
+ lr_columns_table->get_column( ls_s_column_ref-columnname ).
+ CATCH cx_salv_not_found INTO rf_root.
+ handle_error( rf_root ).
+ ENDTRY.
+ IF lr_column_table->get_columnname( ) = 'COUNTER'.
+ lp_short_text = 'Counter'(040).
+ lp_medium_text = 'Counter'(040).
+ lp_long_text = 'Counter'(040).
+ lr_column_table->set_short_text( lp_short_text ).
+ lr_column_table->set_medium_text( lp_medium_text ).
+ lr_column_table->set_long_text( lp_long_text ).
+ lr_column_table->set_alignment( if_salv_c_alignment=>centered ).
+ ENDIF.
+ ENDLOOP.
+ ENDIF.
+* Register handler for actions
+ lr_events = rf_table_keys->get_event( ).
+ SET HANDLER lcl_eventhandler_ztct=>on_function_click FOR lr_events.
+* Save reference to access object from handler
+ lcl_eventhandler_ztct=>rf_table_keys = rf_table_keys.
+* Use gui-status ST850 from program SAPLKKB
+ rf_table_keys->set_screen_status( pfstatus = 'ST850'
+ report = 'SAPLKKBL' ).
+* Determine the size of the popup window:
+ lp_xend = lp_xend + lp_xstart + 5.
+ DATA(lp_yend) = lines( table_keys ) + lp_ystart.
+ IF lp_yend > 30.
+ lp_yend = 30.
+ ENDIF.
+* Display as popup
+ rf_table_keys->set_screen_popup( start_column = lp_xstart
+ end_column = lp_xend
+ start_line = lp_ystart
+ end_line = lp_yend ).
+ rf_table_keys->display( ).
+ CATCH cx_salv_msg INTO rf_root.
+ handle_error( rf_root ).
+ ENDTRY.
+
+ ENDMETHOD.
+
+ METHOD add_table_keys_to_list.
+ TYPES: BEGIN OF ty_keys,
+ trkorr TYPE trkorr,
+ object TYPE trobjtype,
+ obj_name TYPE trobj_name,
+ keyobject TYPE trobjtype,
+ keyobjname TYPE tabname,
+ tabkey TYPE tabkey,
+ END OF ty_keys.
+ TYPES ty_keys_tt TYPE STANDARD TABLE OF ty_keys.
+ DATA lt_keys_main TYPE ty_request_details_tt.
+ DATA ls_keys_main TYPE ty_request_details.
+ DATA lt_keys TYPE ty_keys_tt.
+ DATA ls_keys TYPE ty_keys.
+* Only if the option to check for table keys is switched ON, on the
+* selection screen:
+ IF check_tabkeys = abap_false.
+ RETURN.
+ ENDIF.
+* Check if keys exist in table E071K. Only do this for the records
+* that have not been added already (without key object and name)
+* Remove the entries for which that is the case and add the objects
+* with the keys.
+* s_exobj contains all tables that we do not want to check.
+ LOOP AT ch_table INTO ls_keys_main WHERE objfunc = 'K'
+ AND keyobject IS INITIAL
+ AND keyobjname IS INITIAL
+ AND obj_name IN excluded_objects.
+ APPEND ls_keys_main TO lt_keys_main.
+ DELETE TABLE ch_table FROM ls_keys_main.
+ ENDLOOP.
+* Collect all the keys for all the transports in the list
+ IF lt_keys_main IS NOT INITIAL.
+ SELECT e071k~trkorr,
+ e071k~mastertype AS object,
+ e071k~mastername AS obj_name,
+ e071k~object AS keyobject,
+ e071k~objname AS keyobjname,
+ e071k~tabkey
+ FROM e071k
+ INNER JOIN e070 ON e070~trkorr = e071k~trkorr
+ INTO CORRESPONDING FIELDS OF TABLE @lt_keys
+ FOR ALL ENTRIES IN @lt_keys_main
+ WHERE e071k~trkorr = @lt_keys_main-trkorr
+ AND e071k~trkorr NOT IN @project_trkorrs
+ AND e071k~trkorr LIKE @prefix
+ AND e070~trfunction <> 'T'
+ AND e071k~mastertype = @lt_keys_main-object
+ AND e071k~mastername = @lt_keys_main-obj_name(40)
+ AND e071k~objname IN @excluded_objects. "#EC CI_SUBRC
+* Add all the keys to the table (keeping all other fields in workarea the same)
+ LOOP AT lt_keys_main INTO ls_keys_main.
+ LOOP AT lt_keys INTO ls_keys
+ WHERE trkorr = ls_keys_main-trkorr
+ AND object = ls_keys_main-object
+ AND obj_name = ls_keys_main-obj_name.
+ ls_keys_main-keyobject = ls_keys-keyobject.
+ ls_keys_main-keyobjname = ls_keys-keyobjname.
+ ls_keys_main-tabkey = ls_keys-tabkey.
+ APPEND ls_keys_main TO ch_table.
+ ENDLOOP.
+ ENDLOOP.
+ ENDIF.
+ ENDMETHOD.
+
+ METHOD progress_indicator.
+ DATA lp_gprogtext TYPE char1024.
+ DATA lp_string TYPE string.
+ DATA lp_total TYPE numc10.
+* IM_TOTAL cannot be changed, and we need to remove the leading
+* zero's. That is why intermediate parameter lp_total was added
+ lp_total = im_total.
+ DATA(lp_difference) = lp_total - im_counter.
+ DATA(lp_step) = 1.
+ DATA(lp_counter_reset) = 0.
+* Determine step size
+ IF im_flag = abap_true.
+ IF lp_difference < 100.
+ lp_step = 1.
+ ELSEIF lp_difference < 1000.
+ lp_step = 50.
+ ELSE.
+ lp_step = 100.
+ ENDIF.
+ ENDIF.
+* Number of selected items on GUI:
+ IF lp_step = 0.
+ RETURN.
+ ENDIF.
+ DATA(lp_gproggui) = im_counter MOD lp_step.
+ IF lp_gproggui = 0.
+ WRITE im_counter TO lp_gprogtext LEFT-JUSTIFIED.
+ IF lp_total <> 0.
+ SHIFT lp_total LEFT DELETING LEADING '0'.
+ CONCATENATE lp_gprogtext 'of' lp_total
+ INTO lp_gprogtext SEPARATED BY ' '.
+ ENDIF.
+ IF im_object IS NOT INITIAL.
+ CONCATENATE '(' im_object ')'
+ INTO lp_string.
+ CONDENSE lp_string.
+ ENDIF.
+ CONCATENATE lp_gprogtext im_text lp_string
+ INTO lp_gprogtext
+ SEPARATED BY ' '.
+ CONDENSE lp_gprogtext.
+
+ cl_progress_indicator=>progress_indicate(
+ i_text = lp_gprogtext
+ i_processed = im_counter
+ i_total = im_total
+ i_output_immediately = abap_true ).
+
+ ENDIF.
+
+* To avoid timeouts
+ IF check_tabkeys = abap_true.
+ lp_counter_reset = im_counter MOD 5.
+ ELSE.
+ lp_counter_reset = im_counter MOD 50.
+ ENDIF.
+
+ IF lp_counter_reset = 0.
+ CALL FUNCTION 'TH_REDISPATCH'.
+ ENDIF.
+
+ ENDMETHOD.
+
+ METHOD get_main_transports.
+ DATA lt_main_list_vrsd TYPE ty_request_details_tt.
+ FIELD-SYMBOLS TYPE ty_request_details.
+
+ FREE lt_main_list_vrsd.
+
+ cl_progress_indicator=>progress_indicate( i_text = 'Selecting data...'(014) ).
+
+* Join over E070, E071:
+* Description is read later to prevent complicated join and
+* increased runtime
+ SELECT a~trkorr, a~trfunction, a~trstatus,
+ a~as4user, a~as4date, a~as4time,
+ b~pgmid, b~object, b~obj_name,
+ b~objfunc
+ INTO CORRESPONDING FIELDS OF TABLE @main_list
+ FROM e070 AS a JOIN e071 AS b
+ ON a~trkorr = b~trkorr
+ WHERE a~trkorr IN @im_trkorr_range
+ AND strkorr = ''
+ AND a~trkorr LIKE @prefix
+ AND ( pgmid = 'LIMU' OR
+ pgmid = 'R3TR' )
+ ORDER BY a~trkorr ##TOO_MANY_ITAB_FIELDS. "#EC CI_SUBRC
+ IF sy-subrc <> 0.
+ RETURN.
+ ENDIF.
+ IF main_list[] IS NOT INITIAL.
+ LOOP AT main_list ASSIGNING .
+* If the transports should be checked, flag it.
+ -flag = abap_true.
+* Read transport description:
+ SELECT SINGLE as4text
+ FROM e07t
+ INTO @-tr_descr
+ WHERE trkorr = @-trkorr. "#EC CI_SUBRC
+ ENDLOOP.
+ ENDIF.
+ SORT main_list.
+ DELETE ADJACENT DUPLICATES FROM main_list.
+* Check if project is in selection range:
+ IF project_range IS NOT INITIAL.
+ LOOP AT main_list ASSIGNING .
+ SELECT SINGLE reference
+ FROM e070a
+ INTO @-project
+ WHERE trkorr = @-trkorr
+ AND attribute = 'SAP_CTS_PROJECT'
+ AND reference IN @project_range. "#EC CI_SUBRC
+ IF sy-subrc <> 0.
+ DELETE main_list INDEX sy-tabix.
+ ENDIF.
+ ENDLOOP.
+ ENDIF.
+* Only continue if there are transports left to check
+ IF main_list IS NOT INITIAL.
+ lt_main_list_vrsd = get_vrsd_objects( main_list ).
+* Add the VRSD entries to the list
+ APPEND LINES OF lt_main_list_vrsd TO main_list.
+ sort_list( CHANGING ch_list = main_list ).
+ ENDIF.
+ ENDMETHOD.
+
+
+ METHOD get_added_objects.
+ DATA lp_tabix TYPE sytabix.
+ DATA ls_main TYPE ty_request_details.
+ DATA lt_main_list_vrsd TYPE ty_request_details_tt.
+ DATA ls_added TYPE ty_request_details.
+ FIELD-SYMBOLS TYPE ty_request_details.
+ FREE re_to_add.
+ FREE lt_main_list_vrsd.
+ CLEAR ls_main.
+* Select all requests (not tasks) in the range. Objects belonging to
+* the request are included in the table.
+ SELECT a~trkorr, a~trfunction, a~trstatus,
+ a~as4user, a~as4date, a~as4time,
+ b~pgmid, b~object, b~obj_name,
+ b~objfunc
+ INTO CORRESPONDING FIELDS OF TABLE @re_to_add
+ FROM e070 AS a JOIN e071 AS b
+ ON a~trkorr = b~trkorr
+ WHERE a~trkorr IN @im_to_add
+ AND a~strkorr = ''
+ AND ( b~pgmid = 'LIMU' OR
+ b~pgmid = 'R3TR' OR
+ b~pgmid = 'R3OB' OR
+ b~pgmid = 'LANG' )
+ ORDER BY a~trkorr ASCENDING, b~as4pos ASCENDING ##TOO_MANY_ITAB_FIELDS.
+ IF sy-subrc <> 0.
+ RETURN.
+ ENDIF.
+* Read transport description:
+ IF re_to_add[] IS NOT INITIAL.
+ LOOP AT re_to_add ASSIGNING .
+ -flag = abap_true.
+ SELECT SINGLE as4text
+ FROM e07t
+ INTO @-tr_descr
+ WHERE trkorr = @-trkorr. "#EC CI_SUBRC
+ ENDLOOP.
+ ENDIF.
+* Also read from the version table VRSD. This table contains all
+* dependent objects. For example: If from E071 a function group
+* is retrieved, VRSD will contain all functions too.
+ IF re_to_add[] IS NOT INITIAL.
+ lt_main_list_vrsd = get_vrsd_objects( re_to_add ).
+* Add the VRSD entries to the list
+ APPEND LINES OF lt_main_list_vrsd TO re_to_add.
+ ENDIF.
+ add_table_keys_to_list( CHANGING ch_table = re_to_add ).
+* Only add the records that are not yet existing in the main list.
+* Do not add the records that already exist in the main list.
+ LOOP AT re_to_add INTO ls_added.
+ lp_tabix = sy-tabix.
+ IF line_exists( main_list[ trkorr = ls_added-trkorr
+ object = ls_added-object
+ obj_name = ls_added-obj_name
+ keyobject = ls_added-keyobject
+ keyobjname = ls_added-keyobjname
+ tabkey = ls_added-tabkey ] ).
+* If the added transports are already in the list, but in prd, they
+* will be 'invisible', because the records with prd icon = co_okay
+* are filtered out. So, the prd icon needs to be changed to co_scrap
+* to become visible. Make sure that all records for this
+* transport are made visible.
+ LOOP AT main_list INTO main_list_line
+ WHERE trkorr = ls_added-trkorr
+ AND object = ls_added-object
+ AND obj_name = ls_added-obj_name
+ AND keyobject = ls_added-keyobject
+ AND keyobjname = ls_added-keyobjname
+ AND tabkey = ls_added-tabkey
+ AND prd = co_okay.
+ main_list_line-prd = co_scrap.
+ MODIFY main_list FROM main_list_line
+ INDEX sy-tabix
+ TRANSPORTING prd.
+ ENDLOOP.
+* No need to add this transport again:
+ DELETE re_to_add INDEX lp_tabix.
+ ENDIF.
+ ENDLOOP.
+ SORT re_to_add.
+ DELETE ADJACENT DUPLICATES FROM re_to_add COMPARING ALL FIELDS.
+ ENDMETHOD.
+
+ METHOD get_vrsd_objects.
+ DATA lt_main_list_vrsd TYPE ty_request_details_tt.
+
+ FREE lt_main_list_vrsd.
+* Also read from the version table VRSD. This table contains all
+* dependent objects. For example: If from E071 a function group
+* is retrieved, VRSD will contain all functions too.
+ SELECT objtype AS object,
+ objname AS obj_name,
+ versno,
+ korrnum AS trkorr,
+ author AS as4user,
+ datum AS as4date,
+ zeit AS as4time
+ FROM vrsd
+ INTO CORRESPONDING FIELDS OF TABLE @lt_main_list_vrsd
+ FOR ALL ENTRIES IN @im_table
+ WHERE korrnum = @im_table-trkorr ORDER BY PRIMARY KEY. "#EC CI_SUBRC
+ LOOP AT lt_main_list_vrsd ASSIGNING FIELD-SYMBOL().
+* Only append if the object from VRSD does not already exist in
+* the main list
+ IF line_exists( im_table[ trkorr = -trkorr
+ object = -object
+ obj_name = -obj_name ] ).
+ DELETE lt_main_list_vrsd INDEX sy-tabix.
+ ELSE.
+* Copy all data for the main line, enrich the data with relevant
+* object data from VRSD. Table LT_MAIN_LIST_VRSD will then have all
+* the data needed
+ TRY.
+ main_list_line = im_table[ trkorr = -trkorr ].
+ main_list_line-object = -object.
+ main_list_line-obj_name = -obj_name.
+ main_list_line-as4user = -as4user.
+ main_list_line-as4date = -as4date.
+ main_list_line-as4time = -as4time.
+ main_list_line-flag = abap_true.
+ = CORRESPONDING #( main_list_line ).
+ CATCH cx_root INTO rf_root ##CATCH_ALL.
+ ENDTRY.
+ ENDIF.
+ ENDLOOP.
+* Duplicates may exist if the same object exists in different tasks
+* belonging to the same request:
+ SORT lt_main_list_vrsd DESCENDING.
+ DELETE ADJACENT DUPLICATES FROM lt_main_list_vrsd
+ COMPARING trkorr object obj_name.
+ re_vrsd[] = lt_main_list_vrsd[].
+ ENDMETHOD.
+
+ METHOD get_tp_info.
+* Join over E070, E071:
+* Description is read later to prevent complicated join and
+* increased runtime
+ SELECT SINGLE a~trkorr, a~trfunction, a~trstatus,
+ a~as4user, a~as4date, a~as4time,
+ b~object, b~obj_name
+ INTO (@re_line-trkorr,
+ @re_line-trfunction,
+ @re_line-trstatus,
+ @re_line-as4user,
+ @re_line-as4date,
+ @re_line-as4time,
+ @re_line-object,
+ @re_line-obj_name)
+ FROM e070 AS a JOIN e071 AS b
+ ON a~trkorr = b~trkorr
+ WHERE a~trkorr = @im_trkorr
+ AND strkorr = ''
+ AND b~obj_name = @im_obj_name. "#EC CI_SUBRC
+* Read transport description:
+ SELECT SINGLE as4text
+ FROM e07t
+ INTO @re_line-tr_descr
+ WHERE trkorr = @im_trkorr. "#EC CI_SUBRC
+ re_line-checked_by = sy-uname.
+* First get the descriptions (Status/Type/Project):
+* Retrieve texts for Status Description
+ SELECT SINGLE ddtext
+ FROM dd07t
+ INTO @re_line-status_text
+ WHERE domname = 'TRSTATUS'
+ AND ddlanguage = @co_langu
+ AND domvalue_l = @re_line-trstatus. "#EC CI_SUBRC
+* Retrieve texts for Description of request/task type
+ SELECT SINGLE ddtext
+ FROM dd07t
+ INTO @re_line-trfunction_txt
+ WHERE domname = 'TRFUNCTION'
+ AND ddlanguage = @co_langu
+ AND domvalue_l = @re_line-trfunction. "#EC CI_SUBRC
+* Retrieve the project number (and description):
+ SELECT SINGLE reference
+ FROM e070a
+ INTO @re_line-project
+ WHERE trkorr = @re_line-trkorr
+ AND attribute = 'SAP_CTS_PROJECT'.
+ IF sy-subrc = 0.
+ SELECT SINGLE descriptn
+ FROM ctsproject
+ INTO @re_line-project_descr
+ WHERE trkorr = @re_line-project. "#EC CI_SUBRC
+ ENDIF.
+* Retrieve the description of the status
+ SELECT SINGLE ddtext
+ FROM dd07t
+ INTO @re_line-trstatus
+ WHERE domname = 'TRSTATUS'
+ AND ddlanguage = @co_langu
+ AND domvalue_l = @re_line-trstatus. "#EC CI_SUBRC
+
+ ENDMETHOD.
+
+ METHOD get_additional_tp_info.
+ DATA lp_counter TYPE i.
+ DATA lp_index TYPE sytabix.
+ DATA lp_indexinc TYPE sytabix.
+ DATA lp_trkorr TYPE trkorr.
+ DATA ls_main_backup TYPE ty_request_details.
+ CLEAR: lp_counter,
+ total.
+* The CHECKED_BY field is always going to be filled. If it is empty,
+* then this subroutine has not yet been executed for the record, and has
+* to be executed. Additional info ONLY needs to be gathered once.
+* This needs to be checked because transports can be added. If that
+* happened, additional info only needs to be retrieved for the added
+* transports.
+ LOOP AT ch_table INTO main_list_line
+ WHERE flag = abap_true.
+ total = total + 1.
+ ENDLOOP.
+ LOOP AT ch_table INTO main_list_line
+ WHERE flag = abap_true.
+* Show the progress indicator
+ IF main_list_line-prd <> co_okay.
+ lp_counter = lp_counter + 1.
+ progress_indicator( im_counter = lp_counter
+ im_object = main_list_line-obj_name
+ im_total = total
+ im_text = 'Object data retrieved...'(010)
+ im_flag = abap_true ).
+ ENDIF.
+ lp_index = sy-tabix.
+* To check next lines for same object
+ lp_indexinc = lp_index + 1.
+* Only need to retrieve the additional info once, when a new transport
+* is encountered. This info is then copied to all the records (each
+* object) for the same request. So, only if the transport number is
+* different from the previous one.
+ IF lp_trkorr <> main_list_line-trkorr.
+ lp_trkorr = main_list_line-trkorr.
+
+ get_additional_info( EXPORTING im_indexinc = lp_indexinc
+ CHANGING ch_main_list_line = main_list_line
+ ch_table = ch_table ).
+* Update the main table from the workarea.
+ MODIFY ch_table FROM main_list_line
+ INDEX lp_index
+ TRANSPORTING checked_by
+ status_text
+ trfunction_txt
+ trstatus
+ tr_descr
+ retcode
+ info
+ warning_lvl
+ warning_txt
+ dev
+ qas
+ prd
+ as4time
+ as4date
+ project
+ project_descr.
+* Keep the workarea for the other objects within the same transport.
+* No need to select the same data for each objetc because it is the
+* same for all the transport objects (data retrieved on transport
+* level).
+ ls_main_backup = main_list_line.
+ ELSE.
+* Update the main table from the workarea.
+ MODIFY ch_table FROM ls_main_backup
+ INDEX lp_index
+ TRANSPORTING checked_by
+ status_text
+ trfunction_txt
+ trstatus
+ tr_descr
+ retcode
+ info
+ warning_lvl
+ warning_txt
+ dev
+ qas
+ prd
+ as4time
+ as4date
+ project
+ project_descr.
+ ENDIF.
+ ENDLOOP.
+ ENDMETHOD.
+
+ METHOD add_to_list.
+ re_main = im_list.
+* Add the records:
+ APPEND LINES OF im_to_add TO re_main.
+ ENDMETHOD.
+
+ METHOD build_conflict_popup.
+ DATA lr_events TYPE REF TO cl_salv_events_table.
+ DATA ls_conflict TYPE ty_request_details ##NEEDED.
+ DATA lp_xstart TYPE i VALUE 50.
+ DATA lp_ystart TYPE i VALUE 7.
+* Prevent the conflicts popup to be build multiple times
+ IF rf_conflicts IS NOT INITIAL.
+ RETURN.
+ ENDIF.
+* Because we are going to only display the popup, the main list
+* does not need to be checked. So we set a flag. This makes sure
+* that all conflicting transports are added to the conflict list
+* and the main list is NOT checked again.
+ set_building_conflict_popup( ).
+ flag_for_process( im_rows = im_rows
+ im_cell = im_cell ).
+ check_for_conflicts( CHANGING ch_main_list = main_list ).
+* If the button to add conflicts is clicked (not a double-click), then
+* remove from the popup all low-level warning messages
+ IF sy-ucomm = '&ADD'.
+ LOOP AT conflicts INTO ls_conflict
+ WHERE warning_rank < co_info_rank.
+ DELETE conflicts INDEX sy-tabix.
+ ENDLOOP.
+ ENDIF.
+* Check if there are entries in the conflicts. If not, display a
+* message
+ IF conflicts IS INITIAL.
+ MESSAGE i000(db)
+ WITH 'No transports need to be added'(019)
+ 'To see the conflicts, doubleclick the warning'(020).
+ RETURN.
+ ENDIF.
+ TRY.
+ cl_salv_table=>factory(
+ IMPORTING
+ r_salv_table = rf_conflicts
+ CHANGING
+ t_table = conflicts ).
+* Set ALV properties
+ DATA(lp_xend) = set_properties_conflicts( conflicts ).
+* Set lr_tooltips
+ alv_set_lr_tooltips( rf_conflicts ).
+* Register handler for actions
+ lr_events = rf_conflicts->get_event( ).
+ SET HANDLER lcl_eventhandler_ztct=>on_function_click FOR lr_events.
+* Save reference to access object from handler
+ lcl_eventhandler_ztct=>rf_conflicts = rf_conflicts.
+* Use gui-status ST850 from program SAPLKKB
+ rf_conflicts->set_screen_status( pfstatus = 'ST850'
+ report = 'SAPLKKBL' ).
+* Determine the size of the popup window:
+ lp_xend = lp_xend + lp_xstart + 5.
+ DATA(lp_yend) = lines( conflicts ).
+ IF lp_yend < 5.
+ lp_yend = 5.
+ ENDIF.
+ lp_yend = lp_yend + lp_ystart + 1.
+* Display as popup
+ rf_conflicts->set_screen_popup( start_column = lp_xstart
+ end_column = lp_xend
+ start_line = lp_ystart
+ end_line = lp_yend ).
+ rf_conflicts->display( ).
+ CATCH cx_salv_msg INTO rf_root.
+ handle_error( rf_root ).
+ ENDTRY.
+ FREE rf_conflicts.
+ set_building_conflict_popup( abap_false ).
+ ENDMETHOD.
+
+ METHOD delete_tp_from_list.
+ DATA lt_range_trkorr TYPE RANGE OF trkorr.
+ DATA ls_range_trkorr LIKE LINE OF lt_range_trkorr.
+ DATA ls_row TYPE int4.
+* If row(s) are selected, use the table
+* Add transports to range
+ IF im_rows[] IS INITIAL.
+ RETURN.
+ ENDIF.
+ ls_range_trkorr-sign = 'I'.
+ ls_range_trkorr-option = 'EQ'.
+ LOOP AT im_rows INTO ls_row.
+ main_list_line = main_list[ ls_row ].
+ ls_range_trkorr-low = main_list_line-trkorr.
+ APPEND ls_range_trkorr TO lt_range_trkorr.
+ ENDLOOP.
+ SORT lt_range_trkorr.
+ DELETE ADJACENT DUPLICATES FROM lt_range_trkorr.
+ DELETE main_list WHERE trkorr IN lt_range_trkorr.
+ ENDMETHOD.
+
+ METHOD flag_same_objects.
+ DATA lt_main_list_copy TYPE ty_request_details_tt.
+* Only relevant if there is a check to be done
+ IF check_flag = abap_false.
+ RETURN.
+ ENDIF.
+* Set check flag for all transports that are going to be refreshed
+* because all of these need to be checked again.
+ lt_main_list_copy[] = ch_main_list[].
+ LOOP AT ch_main_list INTO main_list_line
+ WHERE flag = abap_true.
+* Also flag all the objects already existing in the main table
+* that are in the added list: They need to be checked again.
+ LOOP AT lt_main_list_copy INTO main_list_line
+ WHERE object = main_list_line-object
+ AND obj_name = main_list_line-obj_name
+ AND keyobject = main_list_line-keyobject
+ AND keyobjname = main_list_line-keyobjname
+ AND tabkey = main_list_line-tabkey
+ AND flag = abap_false.
+ main_list_line-flag = abap_true.
+ MODIFY lt_main_list_copy FROM main_list_line
+ INDEX sy-tabix
+ TRANSPORTING flag.
+ ENDLOOP.
+ ENDLOOP.
+ ch_main_list[] = lt_main_list_copy[].
+ FREE lt_main_list_copy.
+
+ ENDMETHOD.
+
+ METHOD mark_all_tp_records.
+ DATA lt_range_trkorr TYPE RANGE OF trkorr.
+ DATA ls_range_trkorr LIKE LINE OF lt_range_trkorr.
+ DATA ls_row TYPE int4.
+* Add transports to range
+ ls_range_trkorr-sign = 'I'.
+ ls_range_trkorr-option = 'EQ'.
+* If row(s) are selected, use the table
+ LOOP AT ch_rows INTO ls_row.
+ main_list_line = main_list[ ls_row ].
+ ls_range_trkorr-low = main_list_line-trkorr.
+ APPEND ls_range_trkorr TO lt_range_trkorr.
+ ENDLOOP.
+* If no rows were selected, take the current cell instead
+ IF sy-subrc <> 0.
+ TRY.
+ main_list_line = main_list[ im_cell-row ].
+ ls_range_trkorr-low = main_list_line-trkorr.
+ APPEND ls_range_trkorr TO lt_range_trkorr.
+ CATCH cx_root INTO rf_root ##CATCH_ALL.
+ tp_msg = rf_root->get_text( ).
+ ENDTRY.
+ ENDIF.
+ IF lt_range_trkorr IS INITIAL.
+ RETURN.
+ ENDIF.
+ SORT lt_range_trkorr.
+ DELETE ADJACENT DUPLICATES FROM lt_range_trkorr.
+* Mark all records for all marked transports
+ LOOP AT main_list INTO main_list_line
+ WHERE trkorr IN lt_range_trkorr.
+ APPEND sy-tabix TO ch_rows.
+ ENDLOOP.
+ SORT ch_rows.
+ DELETE ADJACENT DUPLICATES FROM ch_rows.
+ ENDMETHOD.
+
+ METHOD clear_flags.
+ LOOP AT main_list INTO main_list_line
+ WHERE flag = abap_true.
+ CLEAR main_list_line-flag.
+ MODIFY main_list FROM main_list_line
+ INDEX sy-tabix
+ TRANSPORTING flag.
+ ENDLOOP.
+ ENDMETHOD.
+
+ METHOD get_filename.
+ DATA lp_rc TYPE i.
+ DATA lp_desktop TYPE string.
+ DATA lt_filetable TYPE filetable.
+* Finding desktop
+ cl_gui_frontend_services=>get_desktop_directory(
+ CHANGING
+ desktop_directory = lp_desktop
+ EXCEPTIONS
+ cntl_error = 1
+ error_no_gui = 2
+ not_supported_by_gui = 3
+ OTHERS = 4 ).
+ IF sy-subrc <> 0.
+ MESSAGE e001(00) WITH 'Desktop not found'(008) ##MG_MISSING.
+ ENDIF.
+* Update View
+ cl_gui_cfw=>update_view(
+ EXCEPTIONS
+ cntl_system_error = 1
+ cntl_error = 2
+ OTHERS = 3 ).
+ DATA(lp_window_title) = |{ 'Select a transportlist'(013) }|.
+ cl_gui_frontend_services=>file_open_dialog(
+ EXPORTING
+ window_title = lp_window_title
+ default_extension = 'TXT'
+ default_filename = 'ZTCT_FILE'
+ file_filter = '.TXT'
+ initial_directory = lp_desktop
+ CHANGING
+ file_table = lt_filetable
+ rc = lp_rc
+ EXCEPTIONS
+ file_open_dialog_failed = 1
+ cntl_error = 2
+ error_no_gui = 3
+ not_supported_by_gui = 4
+ OTHERS = 5 ).
+ IF sy-subrc <> 0.
+ MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
+ WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
+ ENDIF.
+ TRY.
+ DATA(lp_file) = lt_filetable[ 1 ].
+ re_file = lp_file.
+ CATCH cx_root INTO rf_root ##CATCH_ALL.
+ re_file = 'No file selected'(061).
+ ENDTRY.
+ ENDMETHOD.
+
+ METHOD main_to_tab_delimited.
+ DATA lp_string TYPE string.
+ DATA lp_type TYPE char01.
+ FIELD-SYMBOLS TYPE any.
+
+* Determine the number of fields in the structure
+ DATA lr_tabledescr TYPE REF TO cl_abap_tabledescr.
+ DATA lr_typedescr TYPE REF TO cl_abap_typedescr.
+ DATA lr_structdescr TYPE REF TO cl_abap_structdescr.
+ DATA lt_abap_component_tab TYPE abap_component_tab.
+ DATA ls_abap_component TYPE abap_componentdescr.
+
+ TRY.
+ lr_typedescr = cl_abap_tabledescr=>describe_by_data( p_data = main_list ).
+ lr_tabledescr ?= lr_typedescr.
+ lr_structdescr ?= lr_tabledescr->get_table_line_type( ).
+ CATCH cx_sy_move_cast_error INTO rf_root.
+ handle_error( rf_root ).
+ CATCH cx_root INTO rf_root ##CATCH_ALL.
+ handle_error( rf_root ).
+ ENDTRY.
+
+* Build header line
+ FREE re_tab_delimited.
+ lt_abap_component_tab = lr_structdescr->get_components( ).
+ LOOP AT lt_abap_component_tab INTO ls_abap_component.
+ CONCATENATE lp_string tp_tab ls_abap_component-name INTO lp_string.
+ ENDLOOP.
+ SHIFT lp_string LEFT DELETING LEADING tp_tab.
+ APPEND lp_string TO re_tab_delimited.
+* Now modify the lines of the main list to a tab delimited list
+ LOOP AT im_main_list INTO main_list_line.
+ CLEAR lp_string.
+ DO.
+ ASSIGN COMPONENT sy-index OF STRUCTURE main_list_line TO .
+ IF sy-subrc <> 0.
+ EXIT.
+ ELSE.
+ DESCRIBE FIELD TYPE lp_type.
+ IF sy-index = 1.
+ lp_string = .
+ ELSEIF lp_type NA co_non_charlike.
+ CONCATENATE lp_string tp_tab INTO lp_string.
+ ENDIF.
+ ENDIF.
+ ENDDO.
+ APPEND lp_string TO re_tab_delimited.
+ ENDLOOP.
+ ENDMETHOD.
+
+ METHOD display_transport.
+ CALL FUNCTION 'TMS_UI_SHOW_TRANSPORT_REQUEST'
+ EXPORTING
+ iv_request = im_trkorr
+ EXCEPTIONS
+ show_transport_request_failed = 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.
+ LEAVE SCREEN.
+ ENDMETHOD.
+
+ METHOD display_user.
+ DATA lp_return TYPE bapiret2.
+ CALL FUNCTION 'BAPI_USER_DISPLAY'
+ EXPORTING
+ username = im_user
+ IMPORTING
+ return = lp_return.
+ IF lp_return-type CA 'EA'.
+ CALL FUNCTION 'SUSR_SHOW_USER_DETAILS'
+ EXPORTING
+ bname = im_user.
+ ENDIF.
+ ENDMETHOD.
+
+ METHOD display_docu.
+ DATA lp_dokl_object TYPE doku_obj.
+ lp_dokl_object = im_trkorr.
+ docu_call( im_object = lp_dokl_object
+ im_id = 'TA' ).
+ check_documentation( EXPORTING im_trkorr = im_trkorr
+ CHANGING ch_table = main_list ).
+ ENDMETHOD.
+
+ METHOD refresh_alv.
+* Declaration for Top of List settings
+ DATA lr_form_element TYPE REF TO cl_salv_form_element.
+
+ lr_form_element = top_of_page( ).
+ rf_table->set_top_of_list( lr_form_element ).
+ set_color( ).
+ alv_set_lr_tooltips( rf_table ).
+ rf_table->refresh( ).
+ ENDMETHOD.
+
+ METHOD tab_delimited_to_main.
+ TYPES: BEGIN OF ty_upl_line,
+ field TYPE fieldname,
+ value TYPE string,
+ END OF ty_upl_line.
+ DATA lt_items TYPE TABLE OF ty_upl_line.
+ DATA ls_item TYPE ty_upl_line.
+ DATA lt_main_upl TYPE ty_request_details_tt.
+ DATA ls_main_line_upl TYPE ty_request_details.
+ DATA ls_main TYPE ty_request_details.
+ DATA lp_type TYPE char01.
+ FIELD-SYMBOLS TYPE any.
+* Determine the number of fields in the structure
+ DATA lr_o_tabledescr TYPE REF TO cl_abap_tabledescr.
+ DATA lr_o_typedescr TYPE REF TO cl_abap_typedescr.
+ DATA lr_o_structdescr TYPE REF TO cl_abap_structdescr.
+ DATA ls_component TYPE abap_compdescr.
+ TRY.
+ lr_o_typedescr = cl_abap_tabledescr=>describe_by_data( p_data = main_list ).
+ lr_o_tabledescr ?= lr_o_typedescr.
+ lr_o_structdescr ?= lr_o_tabledescr->get_table_line_type( ).
+ CATCH cx_sy_move_cast_error INTO rf_root.
+ handle_error( rf_root ).
+ CATCH cx_root INTO rf_root ##CATCH_ALL.
+ handle_error( rf_root ).
+ ENDTRY.
+* First line contains the name of the fields
+* Now modify the lines of the main list to a tab delimited list
+ TRY.
+ DATA(lp_header) = im_tab_delimited[ 1 ].
+ CATCH cx_root INTO rf_root ##CATCH_ALL.
+ tp_msg = rf_root->get_text( ).
+ CONCATENATE 'ERROR:'(038) tp_msg INTO tp_msg SEPARATED BY space.
+ MESSAGE tp_msg TYPE 'I' DISPLAY LIKE 'E'.
+ RETURN.
+ ENDTRY.
+* Build list of fields, in order of uploaded file
+ DO.
+ SPLIT lp_header AT tp_tab INTO ls_item-field lp_header.
+ IF ls_item-field IS INITIAL.
+ EXIT.
+ ENDIF.
+ APPEND ls_item TO lt_items.
+ ENDDO.
+* Skip the header line, start at line 2
+ LOOP AT im_tab_delimited FROM 2
+ INTO lp_header.
+ CLEAR ls_item.
+* First put all values for this record in the value table
+* Build list of fields, in order of uploaded file
+ DO.
+* Get the corresponding line from the table containing
+* the fields and values (to be updated with the value)
+ TRY.
+ ls_item = lt_items[ sy-index ].
+ CATCH cx_root INTO rf_root ##CATCH_ALL.
+ EXIT.
+ ENDTRY.
+ SPLIT lp_header AT tp_tab INTO ls_item-value lp_header.
+ MODIFY lt_items FROM ls_item
+ INDEX sy-index
+ TRANSPORTING value.
+ ENDDO.
+* Map the fields from the uploaded line to the correct component
+* of the main list
+ DO.
+* Get corresponding fieldname for file column
+ TRY.
+ ls_item = lt_items[ sy-index ].
+ CATCH cx_root INTO rf_root ##CATCH_ALL.
+ EXIT.
+ ENDTRY.
+* Get information about where the column is in the structure
+* Get the lenght and position from the structure definition:
+ READ TABLE lr_o_structdescr->components
+ INTO ls_component
+ WITH KEY name = ls_item-field.
+ IF sy-subrc = 0.
+ ASSIGN COMPONENT ls_component-name OF STRUCTURE ls_main_line_upl TO .
+ IF sy-subrc <> 0.
+ EXIT.
+ ELSE.
+ DESCRIBE FIELD TYPE lp_type.
+ IF lp_type NA co_non_charlike.
+ = ls_item-value.
+ ENDIF.
+ ENDIF.
+ ENDIF.
+ ENDDO.
+ APPEND ls_main_line_upl TO lt_main_upl.
+ CLEAR ls_main_line_upl.
+ ENDLOOP.
+
+* Now move the lines of the uploaded list to the main list and
+* if another file is added to the main list (&ADD_FILE), then
+* Automatically RE-Check the objects in the existing main list
+ total = lines( lt_main_upl ).
+ LOOP AT lt_main_upl INTO ls_main.
+ progress_indicator( im_counter = sy-tabix
+ im_object = ''
+ im_total = total
+ im_text = 'records read and added.'(022)
+ im_flag = abap_true ).
+* Check if the record is already in the main list:
+ IF NOT line_exists( main_list[ trkorr = ls_main-trkorr
+ object = ls_main-object
+ obj_name = ls_main-obj_name
+ keyobject = ls_main-keyobject
+ keyobjname = ls_main-keyobjname
+ tabkey = ls_main-tabkey ] ).
+* If a file is uploaded to be merged (&ADD_FILE), then we need to
+* check all the records that are going to be added to the main list,
+* as well as all the records in the main list that contain an object
+* also in the loaded list:
+ IF sy-ucomm = '&ADD_FILE'.
+ ls_main-flag = abap_true.
+ LOOP AT main_list ASSIGNING FIELD-SYMBOL()
+ WHERE object = ls_main-object
+ AND obj_name = ls_main-obj_name
+ AND keyobject = ls_main-keyobject
+ AND keyobjname = ls_main-keyobjname
+ AND tabkey = ls_main-tabkey.
+ -flag = abap_true.
+ ENDLOOP.
+ ENDIF.
+ APPEND ls_main TO main_list.
+ ENDIF.
+ ENDLOOP.
+ sort_list( CHANGING ch_list = main_list ).
+ ENDMETHOD.
+
+ METHOD gui_upload.
+ DATA lt_tab_delimited TYPE table_of_strings.
+ DATA lt_temp_table TYPE table_of_strings.
+ CLEAR re_cancelled.
+ cl_gui_frontend_services=>gui_upload(
+ EXPORTING
+ filename = im_filename
+ filetype = 'ASC'
+ CHANGING
+ data_tab = lt_temp_table
+ EXCEPTIONS
+ file_open_error = 1
+ file_read_error = 2
+ no_batch = 3
+ gui_refuse_filetransfer = 4
+ invalid_type = 5
+ no_authority = 6
+ unknown_error = 7
+ bad_data_format = 8
+ header_not_allowed = 9
+ separator_not_allowed = 10
+ header_too_long = 11
+ unknown_dp_error = 12
+ access_denied = 13
+ dp_out_of_memory = 14
+ disk_full = 15
+ dp_timeout = 16
+ not_supported_by_gui = 17
+ error_no_gui = 18
+ OTHERS = 19 ).
+ IF sy-subrc <> 0.
+ re_cancelled = abap_true.
+ CASE sy-subrc.
+ WHEN 1.
+ IF im_filename IS INITIAL.
+ MESSAGE i000(db) WITH 'Cancelled by user'(031).
+ ELSE.
+ MESSAGE i000(db) DISPLAY LIKE 'E' WITH 'Error occurred'(029).
+ ENDIF.
+ WHEN OTHERS.
+ MESSAGE i000(db) DISPLAY LIKE 'E' WITH 'Error occurred'(029).
+ ENDCASE.
+ ELSE.
+ lt_tab_delimited[] = lt_temp_table[].
+* Now convert the tab delimited file to the main list field order:
+ tab_delimited_to_main( lt_tab_delimited ).
+ total = lines( main_list ).
+* Always reset the Check flag when uploading. Reason is that
+* when combining multiple ZTCT files, these SHOULD be corrected
+* already. First ythe user collects and combines ALL the files.
+* When all files have been combined/uploaded, the user can use
+* the RECHECK button to do a final check on all transports.
+ clear_flags( ).
+ LOOP AT main_list INTO main_list_line.
+ progress_indicator( im_counter = sy-tabix
+ im_object = main_list_line-obj_name
+ im_total = total
+ im_text = 'records checked (documentation)'(023)
+ im_flag = abap_true ).
+ check_documentation( EXPORTING im_trkorr = main_list_line-trkorr
+ CHANGING ch_table = main_list ).
+ ENDLOOP.
+ ENDIF.
+* A simple check on the internal table. If a warning is found, then
+* we assume that the check parameter needs to be switched ON.
+ LOOP AT main_list INTO main_list_line
+ WHERE warning_lvl IS NOT INITIAL.
+ set_check_flag( ).
+ EXIT.
+ ENDLOOP.
+* Check if the Checked icon needs to be cleared:
+ IF clear_checked = abap_true.
+ LOOP AT main_list INTO main_list_line
+ WHERE checked = co_checked.
+ CLEAR main_list_line-checked.
+ MODIFY main_list FROM main_list_line
+ INDEX sy-tabix
+ TRANSPORTING checked.
+ ENDLOOP.
+ ENDIF.
+ ENDMETHOD.
+
+ METHOD check_if_in_list.
+ CLEAR re_line.
+* This subroutine checks if the conflicting transport/object is found
+* further down in the list (in a later transport):
+ DATA(lp_tabix) = im_tabix + 1.
+ LOOP AT main_list INTO re_line FROM lp_tabix
+ WHERE trkorr = im_line-trkorr
+ AND object = im_line-object
+ AND obj_name = im_line-obj_name
+ AND keyobject = im_line-keyobject
+ AND keyobjname = im_line-keyobjname
+ AND tabkey = im_line-tabkey
+ AND prd <> co_okay.
+ EXIT.
+ ENDLOOP.
+ ENDMETHOD.
+
+ METHOD check_newer_transports.
+ DATA lt_stms_wbo_requests TYPE TABLE OF stms_wbo_request.
+ DATA ls_stms_wbo_requests TYPE stms_wbo_request.
+ DATA lp_tabix TYPE sytabix.
+ DATA lp_return TYPE c.
+ DATA ls_line_temp TYPE ty_request_details.
+ DATA ls_newer_line TYPE ty_request_details.
+ DATA lt_e07t TYPE e07t_t.
+ DATA ls_e07t TYPE e07t.
+ DATA lp_target TYPE tmssysnam.
+
+ DATA(lp_exit) = abap_false.
+
+ FREE lt_e07t.
+
+* The check is only relevant if transport is in QAS or DEV! Check is
+* skipped for the transports, already in prd.
+ IF ch_main-qas = co_okay.
+ lp_target = prd_system.
+ ENDIF.
+
+ IF im_newer_transports[] IS NOT INITIAL.
+ SELECT trkorr, langu, as4text
+ FROM e07t INTO CORRESPONDING FIELDS OF TABLE @lt_e07t
+ FOR ALL ENTRIES IN @im_newer_transports
+ WHERE trkorr = @im_newer_transports-trkorr
+ ORDER BY PRIMARY KEY. "#EC CI_SUBRC
+ ENDIF.
+ LOOP AT im_newer_transports INTO ls_newer_line.
+* Get transport description
+ READ TABLE lt_e07t INTO ls_e07t
+ WITH KEY trkorr = ls_newer_line-trkorr.
+ IF sy-subrc = 0.
+ ls_newer_line-tr_descr = ls_e07t-as4text.
+ ENDIF.
+* Check if it has been transported to the target system
+ FREE lt_stms_wbo_requests.
+ CLEAR lt_stms_wbo_requests.
+ READ TABLE tms_mgr_buffer INTO tms_mgr_buffer_line
+ WITH TABLE KEY request = ls_newer_line-trkorr
+ target_system = lp_target.
+ IF sy-subrc = 0.
+ lt_stms_wbo_requests = tms_mgr_buffer_line-request_infos.
+ ELSE.
+ CALL FUNCTION 'TMS_MGR_READ_TRANSPORT_REQUEST'
+ EXPORTING
+ iv_request = ls_newer_line-trkorr
+ iv_target_system = lp_target
+ iv_header_only = 'X'
+ iv_monitor = ' '
+ IMPORTING
+ et_request_infos = lt_stms_wbo_requests
+ EXCEPTIONS
+ read_config_failed = 1
+ table_of_requests_is_empty = 2
+ system_not_available = 3
+ OTHERS = 4.
+ IF sy-subrc <> 0.
+ MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
+ WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
+ ELSE.
+ tms_mgr_buffer_line-request = ls_newer_line-trkorr.
+ tms_mgr_buffer_line-target_system = lp_target.
+ tms_mgr_buffer_line-request_infos = lt_stms_wbo_requests.
+ INSERT tms_mgr_buffer_line INTO TABLE tms_mgr_buffer.
+ ENDIF.
+ ENDIF.
+
+ TRY.
+ ls_stms_wbo_requests = lt_stms_wbo_requests[ 1 ].
+ CATCH cx_root INTO rf_root ##CATCH_ALL.
+ tp_msg = rf_root->get_text( ).
+ MESSAGE tp_msg TYPE 'I' DISPLAY LIKE 'E'.
+ ENDTRY.
+ IF ls_stms_wbo_requests-e070 IS NOT INITIAL.
+* Only display the warning if the preceding transport is not
+* one of the selected transports (and in an earlier
+* position)
+ check_if_same_object( EXPORTING im_line = ch_main
+ im_newer_older = ls_newer_line
+ IMPORTING ex_tabkey = tp_tabkey
+ ex_return = lp_return ).
+ CHECK lp_return = abap_true.
+* Fill conflict list
+ conflict_line = CORRESPONDING #( ls_newer_line ).
+ conflict_line-warning_lvl = co_error.
+ conflict_line-warning_rank = co_error_rank.
+ conflict_line-warning_txt = lp_error_text.
+ conflict_line-objkey = tp_tabkey.
+* Get the last date the object was imported
+ get_import_datetime_qas( EXPORTING im_trkorr = ls_newer_line-trkorr
+ IMPORTING ex_as4time = conflict_line-as4time
+ ex_as4date = conflict_line-as4date ).
+* Check if the transport is in the list
+* Display the warning if the preceding transport is not
+* in the main list. If it is, then display the hint icon.
+ READ TABLE im_main_list
+ INTO ls_line_temp
+ WITH KEY trkorr = ls_newer_line-trkorr
+ TRANSPORTING prd.
+ IF sy-subrc = 0.
+ IF ls_line_temp-prd = co_scrap.
+* This newer version is in the list and made visible:
+ conflict_line-warning_lvl = co_scrap.
+ ENDIF.
+ ELSE.
+ APPEND conflict_line TO conflicts.
+ CLEAR conflict_line.
+ ENDIF.
+ ELSE.
+ line_found_in_list = check_if_in_list( im_line = ls_newer_line
+ im_tabix = lp_tabix ).
+ IF line_found_in_list IS NOT INITIAL.
+* Even if the transport is only in QAS and not in prd (so a
+* newer transport exists, but will not be overwritten), we still
+* want to let the user now about it. To prevent that a newer
+* development exists and should go to production, but it might
+* be forgotten if not selected...
+ ch_main-warning_lvl = co_hint.
+ ls_newer_line-warning_lvl = co_hint.
+ ch_main-warning_rank = co_hint2_rank.
+ ls_newer_line-warning_rank = co_hint2_rank.
+ ch_main-warning_txt = lp_hint2_text.
+ ls_newer_line-warning_txt = lp_hint2_text.
+* No need to check further. A newer transport was found but because
+* that newer transport is in the list, we can stop checking for newer
+* transports because that will be done for the transport that is in
+* the list.
+ lp_exit = abap_true.
+ ELSE.
+* The transport is not yet transported, but if it is found
+* further down in the list, it is okay. Change the warning level
+* from ERROR to INFO.
+ ch_main-warning_lvl = co_info.
+ ls_newer_line-warning_lvl = co_info.
+ ch_main-warning_rank = co_info_rank.
+ ls_newer_line-warning_rank = co_info_rank.
+ ch_main-warning_txt = lp_info_text.
+ ls_newer_line-warning_txt = lp_info_text.
+ ENDIF.
+ conflict_line = CORRESPONDING #( ls_newer_line ).
+ APPEND conflict_line TO conflicts.
+ CLEAR conflict_line.
+ IF lp_exit = abap_true.
+ EXIT.
+ ENDIF.
+ ENDIF.
+ ENDLOOP.
+ ch_conflicts = conflicts.
+ ENDMETHOD.
+
+ METHOD check_older_transports.
+ DATA lt_stms_wbo_requests TYPE TABLE OF stms_wbo_request.
+ DATA ls_stms_wbo_requests TYPE stms_wbo_request.
+ DATA lp_return TYPE c.
+ DATA ls_older_line TYPE ty_request_details.
+ DATA lt_e07t TYPE e07t_t.
+ DATA ls_e07t TYPE e07t.
+ DATA lp_target TYPE tmssysnam.
+
+ FREE lt_e07t.
+
+* The check is only relevant if transport is in QAS or DEV! Check is
+* skipped for the transports, already in prd.
+ IF ch_main-qas = co_okay.
+ lp_target = prd_system.
+ ENDIF.
+
+ IF im_older_transports[] IS NOT INITIAL.
+ SELECT trkorr, langu, as4text
+ FROM e07t INTO CORRESPONDING FIELDS OF TABLE @lt_e07t
+ FOR ALL ENTRIES IN @im_older_transports
+ WHERE trkorr = @im_older_transports-trkorr
+ ORDER BY PRIMARY KEY. "#EC CI_SUBRC
+ ENDIF.
+ LOOP AT im_older_transports INTO ls_older_line.
+* Get transport description
+ ls_e07t = lt_e07t[ trkorr = ls_older_line-trkorr ].
+ ls_older_line-tr_descr = ls_e07t-as4text.
+* Check if it has been transported to QAS
+ FREE lt_stms_wbo_requests.
+ CLEAR lt_stms_wbo_requests.
+ READ TABLE tms_mgr_buffer INTO tms_mgr_buffer_line
+ WITH TABLE KEY request = ls_older_line-trkorr
+ target_system = lp_target.
+ IF sy-subrc = 0.
+ lt_stms_wbo_requests = tms_mgr_buffer_line-request_infos.
+ ELSE.
+ CALL FUNCTION 'TMS_MGR_READ_TRANSPORT_REQUEST'
+ EXPORTING
+ iv_request = ls_older_line-trkorr
+ iv_target_system = lp_target
+ iv_header_only = 'X'
+ iv_monitor = ' '
+ IMPORTING
+ et_request_infos = lt_stms_wbo_requests
+ EXCEPTIONS
+ read_config_failed = 1
+ table_of_requests_is_empty = 2
+ system_not_available = 3
+ OTHERS = 4.
+ IF sy-subrc <> 0.
+ MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
+ WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
+ ELSE.
+ tms_mgr_buffer_line-request = ls_older_line-trkorr.
+ tms_mgr_buffer_line-target_system = lp_target.
+ tms_mgr_buffer_line-request_infos = lt_stms_wbo_requests.
+ INSERT tms_mgr_buffer_line INTO TABLE tms_mgr_buffer.
+ ENDIF.
+ ENDIF.
+* Was an older transport found that has not yet gone to EEP?
+ READ TABLE lt_stms_wbo_requests INDEX 1
+ INTO ls_stms_wbo_requests.
+ IF sy-subrc = 0 AND ls_stms_wbo_requests-e070 IS INITIAL.
+ check_if_same_object( EXPORTING im_line = ch_main
+ im_newer_older = ls_older_line
+ IMPORTING ex_tabkey = tp_tabkey
+ ex_return = lp_return ).
+* Yes, same object!
+ IF lp_return = abap_true.
+ conflict_line = CORRESPONDING #( ls_older_line ).
+* Get the last date the object was imported
+ get_import_datetime_qas( EXPORTING im_trkorr = ls_older_line-trkorr
+ IMPORTING ex_as4time = conflict_line-as4time
+ ex_as4date = conflict_line-as4date ).
+ conflict_line-warning_lvl = co_warn.
+ conflict_line-warning_rank = co_warn_rank.
+ main_list_line-warning_txt = lp_warn_text.
+ conflict_line-objkey = tp_tabkey.
+* Check if the transport is in the list
+* Display the warning if the preceding transport is not
+* in the main list. If it is, then display the hint icon.
+ IF line_exists( im_main_list[ trkorr = ls_older_line-trkorr ] ).
+* There is a warning but the conflicting transport is
+* ALSO in the list. Display the HINT Icon. The other
+* transport will be checked too, sooner or later...
+ conflict_line-warning_lvl = co_hint.
+ conflict_line-warning_rank = co_hint2_rank.
+ conflict_line-warning_txt = lp_hint2_text.
+ ENDIF.
+* Check if transport has been released.
+* D - Modifiable
+* L - Modifiable, protected
+* A - Modifiable, protected
+* O - Release started
+* R - Released
+* N - Released (with import protection for repaired objects)
+ FREE lt_stms_wbo_requests.
+ CLEAR lt_stms_wbo_requests.
+ READ TABLE tms_mgr_buffer INTO tms_mgr_buffer_line
+ WITH TABLE KEY request = ls_older_line-trkorr
+ target_system = dev_system.
+ IF sy-subrc = 0.
+ lt_stms_wbo_requests = tms_mgr_buffer_line-request_infos.
+ ELSE.
+ CALL FUNCTION 'TMS_MGR_READ_TRANSPORT_REQUEST'
+ EXPORTING
+ iv_request = ls_older_line-trkorr
+ iv_target_system = dev_system
+ iv_header_only = 'X'
+ iv_monitor = ' '
+ IMPORTING
+ et_request_infos = lt_stms_wbo_requests
+ EXCEPTIONS
+ read_config_failed = 1
+ table_of_requests_is_empty = 2
+ system_not_available = 3
+ OTHERS = 4.
+ IF sy-subrc <> 0.
+ MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
+ WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
+ ELSE.
+ tms_mgr_buffer_line-request = ls_older_line-trkorr.
+ tms_mgr_buffer_line-target_system = lp_target.
+ tms_mgr_buffer_line-request_infos = lt_stms_wbo_requests.
+ INSERT tms_mgr_buffer_line INTO TABLE tms_mgr_buffer.
+ ENDIF.
+ ENDIF.
+ READ TABLE lt_stms_wbo_requests INDEX 1
+ INTO ls_stms_wbo_requests.
+ IF sy-subrc = 0.
+ IF ls_stms_wbo_requests-e070-trstatus NA 'NR'.
+ conflict_line-warning_lvl = co_alert.
+ conflict_line-warning_rank = co_alert1_rank.
+ conflict_line-warning_txt = lp_alert1_text.
+ ELSEIF ls_stms_wbo_requests-e070-trstatus = 'O'.
+ conflict_line-warning_lvl = co_alert.
+ conflict_line-warning_rank = co_alert2_rank.
+ conflict_line-warning_txt = lp_alert2_text.
+ ENDIF.
+ ENDIF.
+ IF conflict_line IS NOT INITIAL.
+ APPEND conflict_line TO conflicts.
+ CLEAR conflict_line.
+ ENDIF.
+ ENDIF.
+ ELSE.
+* When the first earlier transported version is found,
+* the check must be ended.
+ EXIT.
+ ENDIF.
+ ENDLOOP.
+ ch_conflicts = conflicts.
+ ENDMETHOD.
+
+ METHOD check_if_same_object.
+* Although there is already a warning (older transport not moved or
+* newer transport was moved), it must be the exact same object. If it's
+* an entry in a table, it should not be checked if the table was
+* changed, but if it's the same entry that was changed... This perform
+* check the key entries.
+ DATA ls_e071k TYPE e071k.
+ CLEAR: ex_tabkey,
+ ex_return.
+* The check on object (if the same) can either be done on key level (for
+* tables) or just on object level... Depends on the OBJFUNC field.
+ CASE im_line-objfunc.
+ WHEN 'K'.
+* Key fields available
+ SELECT SINGLE tabkey, objname
+ FROM e071k
+ INTO CORRESPONDING FIELDS OF @ls_e071k
+ WHERE trkorr = @im_newer_older-trkorr
+ AND tabkey = @im_line-tabkey. "#EC CI_SUBRC
+* Now check if in both transports an object exists with the
+* same key
+ IF ls_e071k IS INITIAL.
+* No key found. Treat as if it's the same object...
+ IF im_newer_older-object = im_line-object
+ AND im_newer_older-obj_name = im_line-obj_name.
+ ex_return = abap_true.
+ ENDIF.
+ ELSE.
+* There are records to be compared, only if the record is for the
+* same key, accept the warning as true (return = 'X').
+ ex_return = abap_true.
+ CONCATENATE ls_e071k-tabkey ' ('
+ ls_e071k-objname ')'
+ INTO ex_tabkey.
+ ENDIF.
+ WHEN OTHERS.
+ IF im_newer_older-object = im_line-object
+ AND im_newer_older-obj_name = im_line-obj_name.
+ ex_return = abap_true.
+ ENDIF.
+ ENDCASE.
+ ENDMETHOD.
+
+ METHOD check_documentation.
+* Documentation - text lines
+ DATA ls_doktl TYPE doktl.
+ tp_dokl_object = im_trkorr.
+ SELECT SINGLE id, object
+ FROM doktl
+ INTO CORRESPONDING FIELDS OF @ls_doktl
+ WHERE id = 'TA'
+ AND object = @tp_dokl_object
+ AND typ = 'T'
+ AND dokformat <> 'L'
+ AND doktext <> ''. "#EC CI_SUBRC
+ IF sy-subrc = 0.
+* There is documentation: Display Doc Icon
+ main_list_line-info = co_docu.
+ ELSE.
+* There is no documentation: Remove Doc Icon
+ CLEAR main_list_line-info.
+ ENDIF.
+ MODIFY ch_table FROM main_list_line
+ TRANSPORTING info
+ WHERE trkorr = im_trkorr.
+ ENDMETHOD.
+
+ METHOD alv_init.
+ CLEAR rf_table.
+ TRY.
+ cl_salv_table=>factory(
+ EXPORTING
+ list_display = if_salv_c_bool_sap=>false
+ IMPORTING
+ r_salv_table = rf_table
+ CHANGING
+ t_table = main_list ).
+ CATCH cx_salv_msg INTO rf_root.
+ handle_error( rf_root ).
+ ENDTRY.
+ IF rf_table IS INITIAL.
+ MESSAGE 'Error Creating ALV Grid'(t03) TYPE 'A' DISPLAY LIKE 'E'.
+ ENDIF.
+ ENDMETHOD.
+
+ METHOD alv_xls_init.
+ TRY.
+ cl_salv_table=>factory(
+ EXPORTING
+ list_display = if_salv_c_bool_sap=>false
+ IMPORTING
+ r_salv_table = ex_rf_table
+ CHANGING
+ t_table = ch_table ).
+ CATCH cx_salv_msg INTO rf_root.
+ handle_error( rf_root ).
+ ENDTRY.
+ IF rf_table_xls IS INITIAL.
+ MESSAGE 'Error Creating ALV Grid'(t03) TYPE 'A' DISPLAY LIKE 'E'.
+ ENDIF.
+ ENDMETHOD.
+
+ METHOD set_color.
+* Color Structure of columns
+ DATA lt_scol TYPE lvc_t_scol.
+ DATA ls_scol TYPE lvc_s_scol.
+
+ LOOP AT main_list ASSIGNING FIELD-SYMBOL().
+* Init
+ FREE lt_scol.
+ CLEAR ls_scol.
+ -t_color = lt_scol.
+* Add color
+ IF -warning_rank >= co_info_rank.
+ FREE lt_scol.
+ CLEAR ls_scol.
+ ls_scol-color-col = 3.
+ ls_scol-color-int = 0.
+ ls_scol-color-inv = 0.
+ ls_scol-fname = 'WARNING_TXT'.
+ APPEND ls_scol TO lt_scol.
+ ls_scol-fname = 'WARNING_LVL'.
+ APPEND ls_scol TO lt_scol.
+ -t_color = lt_scol.
+ ENDIF.
+ IF -warning_rank >= co_warn_rank.
+ FREE lt_scol.
+ CLEAR ls_scol.
+ ls_scol-color-col = 7.
+ ls_scol-color-int = 0.
+ ls_scol-color-inv = 0.
+ ls_scol-fname = 'WARNING_TXT'.
+ APPEND ls_scol TO lt_scol.
+ ls_scol-fname = 'WARNING_LVL'.
+ APPEND ls_scol TO lt_scol.
+ -t_color = lt_scol.
+ ENDIF.
+ IF -warning_rank >= co_error_rank.
+ FREE lt_scol.
+ CLEAR ls_scol.
+ ls_scol-color-col = 6.
+ ls_scol-color-int = 0.
+ ls_scol-color-inv = 0.
+ ls_scol-fname = 'WARNING_TXT'.
+ APPEND ls_scol TO lt_scol.
+ ls_scol-fname = 'WARNING_LVL'.
+ APPEND ls_scol TO lt_scol.
+ -t_color = lt_scol.
+ ENDIF.
+ ENDLOOP.
+ ENDMETHOD.
+
+ METHOD set_check_flag.
+ IF im_check_flag IS SUPPLIED.
+ check_flag = im_check_flag.
+ ELSE.
+ check_flag = abap_true.
+ ENDIF.
+ ENDMETHOD.
+
+ METHOD set_check_tabkeys.
+ IF im_check_tabkeys IS SUPPLIED.
+ check_tabkeys = im_check_tabkeys.
+ ELSE.
+ check_tabkeys = abap_true.
+ ENDIF.
+ ENDMETHOD.
+
+ METHOD set_clear_checked.
+ IF im_clear_checked IS SUPPLIED.
+ clear_checked = im_clear_checked.
+ ELSE.
+ clear_checked = abap_true.
+ ENDIF.
+ ENDMETHOD.
+
+ METHOD set_buffer_chk.
+ IF im_buffer_chk IS SUPPLIED.
+ buffer_chk = im_buffer_chk.
+ ELSE.
+ buffer_chk = abap_true.
+ ENDIF.
+ ENDMETHOD.
+
+ METHOD set_buffer_remove_tp.
+ IF im_buffer_remove_tp IS SUPPLIED.
+ buffer_remove_tp = im_buffer_remove_tp.
+ ELSE.
+ buffer_remove_tp = abap_true.
+ ENDIF.
+ ENDMETHOD.
+
+ METHOD set_trkorr_range.
+ trkorr_range = im_trkorr_range.
+ ENDMETHOD.
+
+ METHOD set_project_range.
+ project_range = im_project_range.
+ ENDMETHOD.
+
+ METHOD set_excluded_objects.
+ excluded_objects = im_excluded_objects.
+ ENDMETHOD.
+
+ METHOD set_user_layout.
+ user_layout = im_user_layout.
+ ENDMETHOD.
+
+ METHOD set_process_type.
+ process_type = im_process_type.
+ ENDMETHOD.
+
+ METHOD set_skiplive.
+ IF im_skiplive IS SUPPLIED.
+ skiplive = im_skiplive.
+ ELSE.
+ skiplive = abap_true.
+ ENDIF.
+ ENDMETHOD.
+
+ METHOD set_filename.
+ filename = im_filename.
+ ENDMETHOD.
+
+ METHOD set_systems.
+ dev_system = im_dev_system.
+ qas_system = im_qas_system.
+ prd_system = im_prd_system.
+* Move to range:
+ APPEND INITIAL LINE TO systems_range ASSIGNING FIELD-SYMBOL().
+ -sign = 'I'.
+ -option = 'EQ'.
+ -low = dev_system.
+ APPEND INITIAL LINE TO systems_range ASSIGNING .
+ -sign = 'I'.
+ -option = 'EQ'.
+ -low = qas_system.
+ APPEND INITIAL LINE TO systems_range ASSIGNING .
+ -sign = 'I'.
+ -option = 'EQ'.
+ -low = prd_system.
+ ENDMETHOD.
+
+ METHOD set_building_conflict_popup.
+ IF im_building_conflict_popup IS SUPPLIED.
+ building_conflict_popup = im_building_conflict_popup.
+ ELSE.
+ building_conflict_popup = abap_true.
+ ENDIF.
+ ENDMETHOD.
+
+ METHOD alv_set_properties.
+* Declaration for ALV Columns
+ DATA lr_columns_table TYPE REF TO cl_salv_columns_table.
+ DATA lt_t_column_ref TYPE salv_t_column_ref.
+ DATA lr_functions_list TYPE REF TO cl_salv_functions_list.
+* Declaration for Layout Settings
+ DATA lr_layout TYPE REF TO cl_salv_layout.
+ DATA ls_layout_key TYPE salv_s_layout_key.
+* Declaration for Aggregate Function Settings
+ DATA lr_aggregations TYPE REF TO cl_salv_aggregations ##NEEDED.
+* Declaration for Sort Function Settings
+ DATA lr_sorts TYPE REF TO cl_salv_sorts.
+* Declaration for Table Selection settings
+ DATA lr_selections TYPE REF TO cl_salv_selections.
+* Declaration for Global Display Settings
+ DATA lr_display_settings TYPE REF TO cl_salv_display_settings.
+ DATA lp_class TYPE xuclass.
+ DATA lp_accnt TYPE xuaccnt.
+
+ CONSTANTS: lc_class TYPE xuclass VALUE 'NLD_T_040',
+ lc_accnt TYPE xuaccnt VALUE 'I210218 0079'.
+
+ ASSIGN im_table TO FIELD-SYMBOL().
+ IF IS NOT ASSIGNED.
+ RETURN.
+ ENDIF.
+* Set status
+* Copy the status from program SAPLSLVC_FULLSCREEN and delete the
+* buttons you do not need. Add extra buttons for use in USER_COMMAND
+ ->set_screen_status( pfstatus = 'STANDARD_FULLSCREEN'
+ report = sy-repid ).
+* Get functions details
+ lr_functions_list = ->get_functions( ).
+* Activate All Buttons in Tool Bar
+ lr_functions_list->set_all( if_salv_c_bool_sap=>true ).
+* If necessary, deactivate functions
+ IF check_flag = abap_false.
+ TRY.
+ lr_functions_list->set_function( name = 'RECHECK'
+ boolean = if_salv_c_bool_sap=>false ).
+ CATCH cx_root INTO rf_root ##CATCH_ALL.
+ handle_error( rf_root ).
+ ENDTRY.
+ ENDIF.
+* Layout Settings
+ CLEAR lr_layout.
+ CLEAR ls_layout_key.
+* Set Report ID as Layout Key
+ ls_layout_key-report = sy-repid.
+* Get Layout of Table
+ lr_layout = ->get_layout( ).
+* To allow DEFAULT layout
+ lr_layout->set_default( if_salv_c_bool_sap=>true ).
+* Set Report Id to Layout
+ lr_layout->set_key( ls_layout_key ).
+* If the user is part of a specific class, then the user can
+* maintain all layouts. Otherwise only the user specific layout.
+ SELECT SINGLE class, accnt
+ FROM usr02
+ INTO (@lp_class,
+ @lp_accnt)
+ WHERE bname = @sy-uname.
+* Hardcoded: Change this to allow certain group of users to change
+* the default layout for all users
+ IF sy-subrc = 0 AND lp_class = lc_class AND lp_accnt = lc_accnt.
+ lp_save_restriction = if_salv_c_layout=>restrict_none.
+ ELSE.
+ lp_save_restriction = if_salv_c_layout=>restrict_user_dependant.
+ ENDIF.
+* If the flag is set the default layout will be the default user
+* specific layout
+ IF user_layout = abap_false.
+ lr_layout->set_initial_layout( '/DEFAULT' ).
+ ENDIF.
+
+ lr_layout->set_save_restriction( lp_save_restriction ).
+* Global Display Settings
+ CLEAR: lr_display_settings.
+* Global display settings
+ lr_display_settings = ->get_display_settings( ).
+* Activate Striped Pattern
+ lr_display_settings->set_striped_pattern( if_salv_c_bool_sap=>true ).
+* Report header
+ lr_display_settings->set_list_header( sy-title ).
+* Aggregate Function Settings
+ lr_aggregations = ->get_aggregations( ).
+* Sort Functions
+ lr_sorts = ->get_sorts( ).
+ IF lr_sorts IS NOT INITIAL.
+ TRY.
+ lr_sorts->add_sort( columnname = 'AS4DATE'
+ position = 1
+ sequence = if_salv_c_sort=>sort_up
+ subtotal = if_salv_c_bool_sap=>false
+ obligatory = if_salv_c_bool_sap=>false ).
+ CATCH cx_salv_not_found INTO rf_root.
+ handle_error( rf_root ).
+ CATCH cx_salv_existing INTO rf_root.
+ handle_error( rf_root ).
+ CATCH cx_salv_data_error INTO rf_root.
+ handle_error( rf_root ).
+ ENDTRY.
+ TRY.
+ lr_sorts->add_sort( columnname = 'AS4TIME'
+ position = 2
+ sequence = if_salv_c_sort=>sort_up
+ subtotal = if_salv_c_bool_sap=>false
+ group = if_salv_c_sort=>group_none
+ obligatory = if_salv_c_bool_sap=>false ).
+ CATCH cx_salv_not_found INTO rf_root.
+ handle_error( rf_root ).
+ CATCH cx_salv_existing INTO rf_root.
+ handle_error( rf_root ).
+ CATCH cx_salv_data_error INTO rf_root.
+ handle_error( rf_root ).
+ ENDTRY.
+ ENDIF.
+* Table Selection Settings
+ lr_selections = ->get_selections( ).
+ IF lr_selections IS NOT INITIAL.
+* Allow row Selection
+ lr_selections->set_selection_mode( if_salv_c_selection_mode=>row_column ).
+ ENDIF.
+* Event Register settings
+ rf_events_table = ->get_event( ).
+ rf_handle_events = NEW #( ).
+ SET HANDLER lcl_eventhandler_ztct=>on_function_click FOR rf_events_table.
+ SET HANDLER lcl_eventhandler_ztct=>on_double_click FOR rf_events_table.
+ SET HANDLER lcl_eventhandler_ztct=>on_link_click FOR rf_events_table.
+* Get the columns from ALV Table
+ lr_columns_table = ->get_columns( ).
+ IF lr_columns_table IS NOT INITIAL.
+ FREE lt_t_column_ref.
+ lt_t_column_ref = lr_columns_table->get( ).
+* Get columns properties
+ lr_columns_table->set_optimize( if_salv_c_bool_sap=>true ).
+ lr_columns_table->set_key_fixation( if_salv_c_bool_sap=>true ).
+ TRY.
+ lr_columns_table->set_color_column( 'T_COLOR' ).
+ CATCH cx_salv_data_error INTO rf_root.
+ handle_error( rf_root ).
+ ENDTRY.
+* Individual Column Properties.
+ column_settings( im_column_ref = lt_t_column_ref
+ im_rf_columns_table = lr_columns_table
+ im_table = ).
+ ENDIF.
+ ENDMETHOD.
+
+ METHOD alv_set_lr_tooltips.
+* Fill the symbols, colors in to table and set lr_tooltips
+ DATA lr_tooltips TYPE REF TO cl_salv_tooltips.
+ DATA lr_settings TYPE REF TO cl_salv_functional_settings.
+ DATA lp_text TYPE lvc_tip.
+ FREE lr_settings.
+ FREE lr_tooltips.
+ lr_settings = im_table->get_functional_settings( ).
+ lr_tooltips = lr_settings->get_tooltips( ).
+ TRY.
+ lp_text = 'Newer version in test environment'(w23).
+ lr_tooltips->add_tooltip( type = cl_salv_tooltip=>c_type_symbol
+ value = '@AH@'
+ tooltip = lp_text ).
+ CATCH cx_salv_existing INTO rf_root ##NO_HANDLER.
+ ENDTRY.
+ TRY.
+ lp_text = 'Previous transport not transported'(w17).
+ lr_tooltips->add_tooltip( type = cl_salv_tooltip=>c_type_symbol
+ value = '@5D@'
+ tooltip = lp_text ).
+ CATCH cx_salv_existing INTO rf_root ##NO_HANDLER.
+ ENDTRY.
+ TRY.
+ lp_text = 'Conflicts are dealt with'(w04).
+ lr_tooltips->add_tooltip( type = cl_salv_tooltip=>c_type_symbol
+ value = '@AI@'
+ tooltip = lp_text ).
+ CATCH cx_salv_existing INTO rf_root ##NO_HANDLER.
+ ENDTRY.
+ TRY.
+ lp_text = 'Marked for re-import to target environment'(w18).
+ lr_tooltips->add_tooltip( type = cl_salv_tooltip=>c_type_symbol
+ value = '@K3@'
+ tooltip = lp_text ).
+ CATCH cx_salv_existing INTO rf_root ##NO_HANDLER.
+ ENDTRY.
+ TRY.
+ lp_text = 'Newer version in target environment!'(w01).
+ lr_tooltips->add_tooltip( type = cl_salv_tooltip=>c_type_symbol
+ value = '@F1@'
+ tooltip = lp_text ).
+ CATCH cx_salv_existing INTO rf_root ##NO_HANDLER.
+ ENDTRY.
+ TRY.
+ lp_text = 'Object missing in list and target environment!'(w05).
+ lr_tooltips->add_tooltip( type = cl_salv_tooltip=>c_type_symbol
+ value = '@CY@'
+ tooltip = lp_text ).
+ CATCH cx_salv_existing INTO rf_root ##NO_HANDLER.
+ ENDTRY.
+ ENDMETHOD.
+
+ METHOD alv_output.
+* Declaration for Top of List settings
+ DATA lr_form_element TYPE REF TO cl_salv_form_element.
+ lr_form_element = top_of_page( ).
+ rf_table->set_top_of_list( lr_form_element ).
+* Display the ALV output
+ rf_table->display( ).
+ ENDMETHOD.
+
+ METHOD alv_xls_output.
+* Declaration for Top of List settings
+ DATA lr_form_element TYPE REF TO cl_salv_form_element.
+ lr_form_element = top_of_page( ).
+ rf_table_xls->set_top_of_list( lr_form_element ).
+* Display the ALV output
+ rf_table_xls->display( ).
+ ENDMETHOD.
+
+ METHOD column_settings.
+ TYPES: BEGIN OF ty_field_ran,
+ sign TYPE c LENGTH 1,
+ option TYPE c LENGTH 2,
+ low TYPE fieldname,
+ high TYPE fieldname,
+ END OF ty_field_ran.
+
+ DATA ls_reference TYPE salv_s_ddic_reference.
+ DATA ls_s_column_ref TYPE salv_s_column_ref.
+ DATA lr_column_table TYPE REF TO cl_salv_column_table.
+ DATA ls_colo TYPE lvc_s_colo.
+* Declaration for Aggregate Function Settings
+ DATA lr_aggregations TYPE REF TO cl_salv_aggregations ##NEEDED.
+* Remove some columns for the XLS output
+ DATA lt_range_fieldname TYPE RANGE OF ty_field_ran.
+ DATA ls_fieldname TYPE ty_field_ran.
+* Hide columns when empty
+ DATA lt_range_hide_when_empty TYPE RANGE OF ty_field_ran.
+ DATA ls_hide_when_empty TYPE ty_field_ran.
+
+ DATA lp_sys_s TYPE REF TO data.
+ DATA lp_sys_m TYPE REF TO data.
+ DATA lp_sys_l TYPE REF TO data.
+
+ DATA(lp_return) = abap_false.
+
+* Instantiate data references for column headers
+ CREATE DATA lp_sys_s TYPE scrtext_s.
+ CREATE DATA lp_sys_m TYPE scrtext_m.
+ CREATE DATA lp_sys_l TYPE scrtext_l.
+ ASSIGN lp_sys_s->* TO FIELD-SYMBOL(). "#EC CI_SUBRC
+ ASSIGN lp_sys_m->* TO FIELD-SYMBOL(). "#EC CI_SUBRC
+ ASSIGN lp_sys_l->* TO FIELD-SYMBOL(). "#EC CI_SUBRC
+
+* Build range for all unwanted columns:
+ CASE im_table.
+ WHEN rf_table_xls.
+ ls_fieldname-option = 'EQ'.
+ ls_fieldname-sign = 'I'.
+ ls_fieldname-low = 'CHECKED'.
+ APPEND ls_fieldname TO lt_range_fieldname.
+ ls_fieldname-low = 'OBJECT'.
+ APPEND ls_fieldname TO lt_range_fieldname.
+ ls_fieldname-low = 'OBJ_NAME'.
+ APPEND ls_fieldname TO lt_range_fieldname.
+ ls_fieldname-low = 'OBJKEY'.
+ APPEND ls_fieldname TO lt_range_fieldname.
+ ls_fieldname-low = 'KEYOBJECT'.
+ APPEND ls_fieldname TO lt_range_fieldname.
+ ls_fieldname-low = 'KEYOBJNAME'.
+ APPEND ls_fieldname TO lt_range_fieldname.
+ ls_fieldname-low = 'TABKEY'.
+ APPEND ls_fieldname TO lt_range_fieldname.
+ ls_fieldname-low = 'PGMID'.
+ APPEND ls_fieldname TO lt_range_fieldname.
+ ls_fieldname-low = 'DEV'.
+ APPEND ls_fieldname TO lt_range_fieldname.
+ ls_fieldname-low = 'QAS'.
+ APPEND ls_fieldname TO lt_range_fieldname.
+ ls_fieldname-low = 'PRD'.
+ APPEND ls_fieldname TO lt_range_fieldname.
+ ls_fieldname-low = 'STATUS_TEXT'.
+ APPEND ls_fieldname TO lt_range_fieldname.
+ WHEN rf_table.
+ ls_fieldname-option = 'EQ'.
+ ls_fieldname-sign = 'I'.
+ ls_fieldname-low = 'RE_IMPORT'.
+ APPEND ls_fieldname TO lt_range_fieldname.
+ ENDCASE.
+* Always remove the following colums, regardless of which table is used
+ ls_fieldname-option = 'EQ'.
+ ls_fieldname-sign = 'I'.
+ ls_fieldname-low = 'TRSTATUS'.
+ APPEND ls_fieldname TO lt_range_fieldname.
+ ls_fieldname-low = 'TRFUNCTION'.
+ APPEND ls_fieldname TO lt_range_fieldname.
+ ls_fieldname-low = 'TROBJ_NAME '.
+ APPEND ls_fieldname TO lt_range_fieldname.
+ ls_fieldname-low = 'FLAG'.
+ APPEND ls_fieldname TO lt_range_fieldname.
+ ls_fieldname-low = 'OBJFUNC'.
+ APPEND ls_fieldname TO lt_range_fieldname.
+ ls_fieldname-low = 'CHECKED_BY'.
+ APPEND ls_fieldname TO lt_range_fieldname.
+ ls_fieldname-low = 'WARNING_RANK'.
+ APPEND ls_fieldname TO lt_range_fieldname.
+
+* Hide when empty
+ ls_hide_when_empty-option = 'EQ'.
+ ls_hide_when_empty-sign = 'I'.
+ ls_hide_when_empty-low = 'OBJKEY'.
+ APPEND ls_hide_when_empty TO lt_range_hide_when_empty.
+ ls_hide_when_empty-low = 'KEYOBJECT'.
+ APPEND ls_hide_when_empty TO lt_range_hide_when_empty.
+ ls_hide_when_empty-low = 'KEYOBJNAME'.
+ APPEND ls_hide_when_empty TO lt_range_hide_when_empty.
+ ls_hide_when_empty-low = 'TABKEY'.
+ APPEND ls_hide_when_empty TO lt_range_hide_when_empty.
+ ls_hide_when_empty-low = 'PROJECT'.
+ APPEND ls_hide_when_empty TO lt_range_hide_when_empty.
+ ls_hide_when_empty-low = 'PROJECT_DESCR'.
+ APPEND ls_hide_when_empty TO lt_range_hide_when_empty.
+
+ LOOP AT im_column_ref INTO ls_s_column_ref.
+ TRY.
+ lr_column_table ?=
+ im_rf_columns_table->get_column( ls_s_column_ref-columnname ).
+ CATCH cx_salv_not_found INTO rf_root.
+ handle_error( rf_root ).
+ ENDTRY.
+ IF lr_column_table IS NOT INITIAL.
+* Make Mandt column invisible
+ IF lr_column_table->get_ddic_datatype( ) = 'CLNT'.
+ lr_column_table->set_technical( if_salv_c_bool_sap=>true ).
+ ENDIF.
+* Create Aggregate function total for All Numeric/Currency Fields
+ IF lr_column_table->get_ddic_inttype( ) = 'P'
+ OR lr_column_table->get_ddic_datatype( ) = 'CURR'.
+ IF lr_aggregations IS NOT INITIAL.
+ TRY.
+ lr_aggregations->add_aggregation(
+ columnname = ls_s_column_ref-columnname
+ aggregation = if_salv_c_aggregation=>total ).
+ CATCH cx_salv_data_error INTO rf_root.
+ handle_error( rf_root ).
+ CATCH cx_salv_not_found INTO rf_root.
+ handle_error( rf_root ).
+ CATCH cx_salv_existing INTO rf_root.
+ handle_error( rf_root ).
+ ENDTRY.
+ ENDIF.
+ ENDIF.
+* Create Check box for fields with domain "XFELD"
+ IF lr_column_table->get_ddic_domain( ) = 'XFELD'.
+ lr_column_table->set_cell_type( if_salv_c_cell_type=>checkbox ).
+ ENDIF.
+* Set color to Date Columns
+ IF lr_column_table->get_ddic_datatype( ) = 'DATS'
+ OR lr_column_table->get_ddic_datatype( ) = 'TIMS'.
+ CLEAR ls_colo.
+ ls_colo-col = 2.
+ ls_colo-int = 1.
+ ls_colo-inv = 1.
+ lr_column_table->set_color( ls_colo ).
+ ENDIF.
+* Remove columns that are not required
+ IF lr_column_table->get_columnname( ) IN lt_range_fieldname.
+ lr_column_table->set_technical( if_salv_c_bool_sap=>true ).
+ ENDIF.
+* Remove columns that are not required when empty
+ IF lr_column_table->get_columnname( ) IN lt_range_hide_when_empty.
+ lp_return = is_empty_column( im_column = ls_s_column_ref-columnname
+ im_table = main_list ).
+ IF lp_return = abap_true.
+ lr_column_table->set_technical( if_salv_c_bool_sap=>true ).
+ ENDIF.
+ ENDIF.
+ CASE lr_column_table->get_columnname( ).
+ WHEN 'TRKORR'.
+* Add Hotspot & Hyper Link
+ lr_column_table->set_cell_type( if_salv_c_cell_type=>hotspot ).
+ lr_column_table->set_key( if_salv_c_bool_sap=>true ).
+ WHEN 'OBJ_NAME'.
+* Add Hotspot & Hyper Link
+ lr_column_table->set_cell_type( if_salv_c_cell_type=>hotspot ).
+ WHEN 'CHECKED'.
+ IF check_flag = abap_true.
+ = 'Checked'(044).
+ = 'Checked'(044).
+ = 'Checked'(044).
+ lr_column_table->set_short_text( ).
+ lr_column_table->set_medium_text( ).
+ lr_column_table->set_long_text( ).
+ lr_column_table->set_alignment( if_salv_c_alignment=>centered ).
+ ELSE.
+ lr_column_table->set_technical( ).
+ ENDIF.
+ WHEN 'INFO'.
+ ls_reference-table = 'RSPRINT'.
+ ls_reference-field = 'DOKU'.
+ lr_column_table->set_ddic_reference( ls_reference ).
+ lr_column_table->set_alignment( if_salv_c_alignment=>centered ).
+ lr_column_table->set_icon( ).
+ WHEN 'CHECKED_BY'.
+ IF check_flag = ''.
+ lr_column_table->set_technical( ).
+ ENDIF.
+ WHEN 'RETCODE'.
+ = 'RC'(015).
+ = 'Return Code'(016).
+ = 'Return Code'(016).
+ lr_column_table->set_short_text( ).
+ lr_column_table->set_medium_text( ).
+ lr_column_table->set_long_text( ).
+ WHEN 'STATUS_TEXT'.
+ = 'Descript.'(017).
+ = 'Description'(018).
+ = 'Description'(018).
+ lr_column_table->set_short_text( ).
+ lr_column_table->set_medium_text( ).
+ lr_column_table->set_long_text( ).
+ WHEN 'WARNING_LVL'.
+ IF check_flag = abap_true.
+ = 'Warning'(045).
+ = 'Warning'(045).
+ = 'Warning'(045).
+ lr_column_table->set_short_text( ).
+ lr_column_table->set_medium_text( ).
+ lr_column_table->set_long_text( ).
+ lr_column_table->set_icon( ).
+ ELSE.
+ lr_column_table->set_technical( ).
+ ENDIF.
+ WHEN 'WARNING_TXT'.
+ IF check_flag = abap_true.
+ = 'Warn. text'(046).
+ = 'Warning message'(054).
+ = 'Warning message'(054).
+ lr_column_table->set_short_text( ).
+ lr_column_table->set_medium_text( ).
+ lr_column_table->set_long_text( ).
+ ELSE.
+ lr_column_table->set_technical( ).
+ ENDIF.
+ WHEN 'PROJECT'.
+ = 'Project Nr'(055).
+ = 'Project Number'(056).
+ = 'Project Number'(056).
+ lr_column_table->set_short_text( ).
+ lr_column_table->set_medium_text( ).
+ lr_column_table->set_long_text( ).
+ WHEN 'STATUS'.
+ ls_reference-table = 'TRHEADER'.
+ ls_reference-field = 'TRSTATUS'.
+ lr_column_table->set_ddic_reference( ls_reference ).
+ lr_column_table->set_key( ).
+ WHEN 'DEV'.
+ = dev_system.
+ = dev_system.
+ = dev_system.
+ lr_column_table->set_short_text( ).
+ lr_column_table->set_medium_text( ).
+ lr_column_table->set_long_text( ).
+ lr_column_table->set_icon( ).
+ WHEN 'QAS'.
+ = qas_system.
+ = qas_system.
+ = qas_system.
+ lr_column_table->set_short_text( ).
+ lr_column_table->set_medium_text( ).
+ lr_column_table->set_long_text( ).
+ lr_column_table->set_icon( ).
+ WHEN 'PRD'.
+ = prd_system.
+ = prd_system.
+ = prd_system.
+ lr_column_table->set_short_text( ).
+ lr_column_table->set_medium_text( ).
+ lr_column_table->set_long_text( ).
+ lr_column_table->set_icon( ).
+ WHEN 'RE_IMPORT'.
+ = 'Import again'(059).
+ = 'Import again'(059).
+ = 'Import again'(059).
+ lr_column_table->set_short_text( ).
+ lr_column_table->set_medium_text( ).
+ lr_column_table->set_long_text( ).
+ ENDCASE.
+ ENDIF.
+ ENDLOOP.
+ ENDMETHOD.
+
+ METHOD is_empty_column.
+ DATA ls_line TYPE ty_request_details.
+ FIELD-SYMBOLS TYPE any.
+ re_is_empty = abap_true.
+ LOOP AT im_table INTO ls_line.
+ ASSIGN COMPONENT im_column OF STRUCTURE ls_line TO .
+ IF sy-subrc = 0 AND IS NOT INITIAL.
+ re_is_empty = abap_false.
+ EXIT.
+ ENDIF.
+ ENDLOOP.
+ ENDMETHOD.
+
+ METHOD docu_call.
+
+ DATA lv_langu TYPE ddlanguage.
+
+* Get used language for existing documentation
+ SELECT SINGLE langu
+ FROM dokil
+ INTO @lv_langu
+ WHERE object = @im_object
+ AND id = @im_id ##WARN_OK.
+ IF sy-subrc <> 0.
+ lv_langu = co_langu.
+ ENDIF.
+
+* Call the documentation
+ CALL FUNCTION 'DOCU_CALL'
+ EXPORTING
+ displ = im_display
+ displ_mode = im_displ_mode
+ id = im_id
+ langu = lv_langu
+ object = im_object
+ EXCEPTIONS
+ wrong_name = 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.
+ ENDMETHOD.
+
+ METHOD determine_col_width.
+* This method determines the width of a column in the detailed output
+* lists (for conflicts or no-checks overviews). The length of the
+* largest value is used as column width. This column width is then used
+* in the fielddif table for function "STC1_POPUP_WITH_TABLE_CONTROL".
+* This is done to downsize the width of the column as much as possible.
+ DATA(lp_value) = 0.
+ IF im_field IS NOT INITIAL.
+ lp_value = strlen( im_field ).
+ IF lp_value > ch_colwidth.
+ ch_colwidth = lp_value.
+ ENDIF.
+ ENDIF.
+ ENDMETHOD.
+
+ METHOD determine_warning_text.
+ CASE im_highest_rank.
+ WHEN 0.
+* ICON_LED_GREEN
+ CLEAR re_highest_text.
+ WHEN 5.
+* ICON_FAILURE
+ re_highest_text = lp_alert0_text.
+ WHEN 6.
+* ICON_FAILURE
+ re_highest_text = lp_alert1_text.
+ WHEN 7.
+* ICON_FAILURE
+ re_highest_text = lp_alert2_text.
+ WHEN 8.
+* ICON_FAILURE
+ re_highest_text = lp_alert3_text.
+ WHEN 10.
+* ICON_HINT
+ re_highest_text = lp_hint1_text.
+ WHEN 12.
+* ICON_HINT
+ re_highest_text = lp_hint2_text.
+ WHEN 14.
+* ICON_HINT
+ re_highest_text = lp_hint3_text.
+ WHEN 16.
+* ICON_HINT
+ re_highest_text = lp_hint4_text.
+ WHEN 20.
+* ICON_INFORMATION
+ re_highest_text = lp_info_text.
+ WHEN 50.
+* ICON_LED_YELLOW
+ re_highest_text = lp_warn_text.
+ WHEN 98.
+* ICON_INCOMPLETE
+ re_highest_text = lp_ddic_text.
+ WHEN 99.
+* ICON_LED_RED
+ re_highest_text = lp_error_text.
+ WHEN OTHERS.
+ CLEAR re_highest_text.
+ ENDCASE.
+ ENDMETHOD.
+
+ METHOD get_tps_for_same_object.
+
+ DATA lt_aggr_tp_list_of_objects TYPE ty_request_details_tt.
+ DATA ls_tp_same_object TYPE ty_request_details.
+ DATA lp_index TYPE sytabix.
+ DATA lp_return TYPE sysubrc.
+
+ FREE ex_newer.
+ FREE ex_older.
+
+* First check if the transports for the object have already been read
+* and stored in the table. If so, then we do not need to retrieve all
+* the transports again (to speed things up a bit).
+ SORT aggr_tp_list_of_objects BY object
+ obj_name
+ keyobject
+ keyobjname
+ tabkey.
+ READ TABLE aggr_tp_list_of_objects
+ WITH KEY object = im_line-object
+ obj_name = im_line-obj_name
+ keyobject = im_line-keyobject
+ keyobjname = im_line-keyobjname
+ tabkey = im_line-tabkey
+ TRANSPORTING NO FIELDS
+ BINARY SEARCH.
+ IF sy-subrc <> 0.
+* The transports for this object have not been retrieved yet, so we
+* do that now:
+ SELECT a~trkorr, b~object, b~obj_name, b~objfunc,
+ a~as4user, a~as4date, a~as4time
+ FROM e070 AS a JOIN e071 AS b
+ ON a~trkorr = b~trkorr
+ APPENDING CORRESPONDING FIELDS OF TABLE @lt_aggr_tp_list_of_objects
+ WHERE a~trkorr NOT IN @project_trkorrs
+ AND a~trfunction <> 'T'
+ AND b~obj_name IN @excluded_objects
+ AND a~strkorr = ''
+ AND a~trkorr LIKE @prefix
+ AND b~object = @im_line-object
+ AND b~obj_name = @im_line-obj_name
+ ORDER BY a~trkorr. "#EC CI_SUBRC
+
+* Also read from version table, because in some case, the object can
+* be part of a 'bigger' group.
+* Example 1: - a Function Module (FUNC) is transported in one
+* transport, but the entire functiongroup (FUGR) in
+* another (this also transports the FM)
+* Example 2: - A table (TABL) is part of a table definition (TABD), so
+* should also be treated as the same object.
+ CLEAR ls_tp_same_object.
+ SELECT korrnum AS trkorr,
+ objtype AS object,
+ objname AS obj_name,
+ author AS as4user
+ FROM vrsd
+ INNER JOIN e070 ON vrsd~korrnum = e070~trkorr
+ APPENDING CORRESPONDING FIELDS OF TABLE @lt_aggr_tp_list_of_objects
+ WHERE korrnum NOT IN @project_trkorrs
+ AND objname IN @excluded_objects
+ AND korrnum <> @im_line-trkorr
+ AND korrnum LIKE @prefix
+ AND korrnum <> ''
+ AND objtype = @im_line-object
+ AND objname = @im_line-obj_name "#EC CI_NOFIELD
+ AND e070~trfunction <> 'T'
+ ORDER BY korrnum, objtype, objname, author. "#EC CI_SUBRC
+
+* Remove duplicates:
+ SORT lt_aggr_tp_list_of_objects[] BY trkorr object obj_name.
+ DELETE ADJACENT DUPLICATES FROM lt_aggr_tp_list_of_objects
+ COMPARING trkorr object obj_name.
+
+* If the object is a table, we need to be able to check the keys.
+* Replace the entry with all entries containing the keys.
+ IF im_line-objfunc = 'K'.
+ add_table_keys_to_list( CHANGING ch_table = lt_aggr_tp_list_of_objects ).
+ ENDIF.
+
+* Now get the last date the object was imported:
+ LOOP AT lt_aggr_tp_list_of_objects INTO ls_tp_same_object.
+ lp_index = sy-tabix.
+* Remove all transports from a source system not known (usually an
+* SAP system, not one of our systems).
+ IF ls_tp_same_object-trkorr(3) NOT IN systems_range.
+ DELETE lt_aggr_tp_list_of_objects INDEX sy-tabix.
+ CONTINUE.
+ ENDIF.
+* Now get the global information on the transport:
+* Get the last date the object was imported
+ get_import_datetime_qas( EXPORTING im_trkorr = ls_tp_same_object-trkorr
+ IMPORTING ex_as4time = ls_tp_same_object-as4time
+ ex_as4date = ls_tp_same_object-as4date
+ ex_return = lp_return ).
+ IF lp_return = 0.
+ MODIFY lt_aggr_tp_list_of_objects FROM ls_tp_same_object
+ INDEX lp_index
+ TRANSPORTING as4time as4date. "#EC CI_SUBRC
+ ELSE.
+ DELETE lt_aggr_tp_list_of_objects INDEX lp_index.
+ ENDIF.
+ ENDLOOP.
+* Add the newly retrieved lines to the internal table:
+ APPEND LINES OF lt_aggr_tp_list_of_objects TO aggr_tp_list_of_objects.
+ ENDIF.
+
+* Move newer transports for this object to the relevant internal table:
+ LOOP AT aggr_tp_list_of_objects INTO ls_tp_same_object
+ WHERE object = im_line-object
+ AND obj_name = im_line-obj_name
+ AND keyobject = im_line-keyobject
+ AND keyobjname = im_line-keyobjname
+ AND tabkey = im_line-tabkey
+ AND trkorr <> im_line-trkorr.
+* If on the same date, check if the time is later
+ IF ls_tp_same_object-as4date = im_line-as4date.
+ IF ls_tp_same_object-as4time >= im_line-as4time.
+ APPEND ls_tp_same_object TO ex_newer.
+ ELSE.
+ APPEND ls_tp_same_object TO ex_older.
+ ENDIF.
+ ELSEIF ls_tp_same_object-as4date > im_line-as4date.
+ APPEND ls_tp_same_object TO ex_newer.
+ ELSE.
+ APPEND ls_tp_same_object TO ex_older.
+ ENDIF.
+ ENDLOOP.
+
+ SORT ex_newer BY as4date DESCENDING as4time DESCENDING.
+ SORT ex_older BY as4date DESCENDING as4time DESCENDING.
+
+ ENDMETHOD.
+
+ METHOD handle_error.
+ DATA(lp_msg) = im_oref->get_text( ).
+ CONCATENATE 'ERROR:'(038) lp_msg INTO lp_msg SEPARATED BY space.
+ MESSAGE lp_msg TYPE 'E'.
+ ENDMETHOD.
+
+ METHOD check_colwidth.
+ DATA lp_as4text TYPE as4text.
+ SELECT SINGLE scrtext_s
+ FROM dd04t INTO @lp_as4text
+ WHERE rollname = @im_name
+ AND ddlanguage = @co_langu. "#EC CI_SUBRC
+ IF lp_as4text IS INITIAL.
+ SELECT SINGLE scrtext_m
+ FROM dd04t INTO @lp_as4text
+ WHERE rollname = @im_name
+ AND ddlanguage = @co_langu. "#EC CI_SUBRC
+ IF lp_as4text IS INITIAL.
+ SELECT SINGLE scrtext_l
+ FROM dd04t INTO @lp_as4text
+ WHERE rollname = @im_name
+ AND ddlanguage = @co_langu. "#EC CI_SUBRC
+ ENDIF.
+ ENDIF.
+ DATA(lp_len) = strlen( lp_as4text ).
+ IF lp_len > im_colwidth.
+ re_colwidth = lp_len.
+ ELSE.
+ re_colwidth = im_colwidth.
+ ENDIF.
+ ENDMETHOD.
+
+ METHOD remove_tp_in_prd.
+ LOOP AT main_list TRANSPORTING NO FIELDS WHERE prd = co_okay.
+ DELETE main_list INDEX sy-tabix.
+ ENDLOOP.
+ ENDMETHOD.
+
+ METHOD sort_list.
+ SORT ch_list BY as4date ASCENDING
+ as4time ASCENDING
+ trkorr ASCENDING
+ object ASCENDING
+ obj_name ASCENDING
+ objkey ASCENDING
+ keyobject ASCENDING
+ keyobjname ASCENDING
+ tabkey ASCENDING.
+ DELETE ADJACENT DUPLICATES FROM ch_list COMPARING ALL FIELDS.
+ ENDMETHOD.
+
+ METHOD top_of_page.
+ DATA lr_logo TYPE REF TO cl_salv_form_layout_logo.
+ DATA lp_head TYPE char50.
+ DATA lp_file_in TYPE localfile. "#EC NEEDED
+ DATA lp_file_out TYPE localfile.
+ DATA lp_picture TYPE bds_typeid VALUE 'LOGO_MEDIQ_ALV_129X45'.
+ DATA lr_rows TYPE REF TO cl_salv_form_layout_grid.
+ DATA lr_rows_flow TYPE REF TO cl_salv_form_layout_flow.
+ DATA lr_row TYPE REF TO cl_salv_form_layout_flow.
+
+ DATA(lp_records_found) = VALUE numc5( ).
+
+ lr_rows_flow = NEW #( ).
+ lr_rows = lr_rows_flow->create_grid( ).
+ lr_rows->create_grid( row = 4
+ column = 0
+ rowspan = 0
+ colspan = 0 ).
+* Header of Top of Page
+ lp_head = 'Information'(t05) ##TEXT_DUP.
+ lr_row = lr_rows->add_row( ).
+ lr_row->create_header_information( text = lp_head ).
+* Split filename from path
+ IF filename IS NOT INITIAL.
+ lp_file_out = filename.
+ DO.
+ IF lp_file_out CS '\'.
+ SPLIT lp_file_out AT '\' INTO lp_file_in lp_file_out.
+ ELSE.
+ EXIT.
+ ENDIF.
+ ENDDO.
+ lr_row = lr_rows->add_row( ).
+ lr_row = lr_rows->add_row( ).
+ lr_row->create_label( text = 'File uploaded:'(049) ).
+ lr_row->create_text( text = ' ' ).
+ lr_row->create_text( text = lp_file_out(50) ).
+ ENDIF.
+ lr_row = lr_rows->add_row( ).
+ CONCATENATE 'If there is a warning icon in column ''Warning'', double-clicking on the'(h01)
+ 'icon will display a list of objects that should be checked.'(h02)
+ INTO DATA(lp_string) SEPARATED BY space.
+ lr_row->create_text( text = lp_string ).
+ lr_row = lr_rows->add_row( ).
+ CONCATENATE 'You can add these conflicts by means of the button ''Add Conflicts'' in'(h03)
+ 'the application toolbar or doubleclicking the warning.'(h04)
+ INTO lp_string SEPARATED BY space.
+ lr_row->create_text( text = lp_string ).
+ lr_row = lr_rows->add_row( ).
+ lr_row = lr_rows->add_row( ).
+ lr_row->create_label( text = 'No of Records found:'(t04) ).
+ CASE sy-ucomm.
+ WHEN '&PREP_XLS'.
+ lp_records_found = lines( main_list_xls ).
+ WHEN OTHERS.
+ lp_records_found = lines( main_list ).
+ ENDCASE.
+ lr_row->create_text( text = ' ' ).
+ lr_row->create_text(
+ text = lp_records_found
+ tooltip = lp_records_found ).
+* Create logo layout, set grid content on left and logo image on right
+ lr_logo = NEW #( ).
+ lr_logo->set_left_content( lr_rows_flow ).
+ lr_logo->set_right_logo( lp_picture ).
+ re_form_element = lr_logo.
+ ENDMETHOD.
+
+ METHOD display_excel.
+ DATA lp_return TYPE c.
+ DATA lp_tabix TYPE sytabix.
+ DATA lp_highest_lvl TYPE icon_d.
+ DATA lp_highest_rank TYPE numc4.
+ DATA lp_highest_text TYPE text74.
+ DATA lp_highest_col TYPE lvc_t_scol.
+
+* Only when called from the Main Screen (Object Level). Do not build again
+* when the XLS list has been build already.
+ IF main_list_xls IS NOT INITIAL.
+ RETURN.
+ ENDIF.
+* Remove duplicate transport numbers (only need single lines):
+ main_list_xls[] = im_table[].
+ SORT main_list_xls BY trkorr ASCENDING.
+ DELETE ADJACENT DUPLICATES FROM main_list_xls COMPARING trkorr.
+* Extra actions:
+* - Make sure to keep the highest warning level
+* - rename Icons to text
+* - remove transports not in QAS
+ CLEAR lp_return.
+ LOOP AT main_list_xls INTO main_list_line_xls.
+ lp_tabix = sy-tabix.
+ CLEAR: lp_highest_lvl,
+ lp_highest_rank,
+ lp_highest_text,
+ lp_highest_col.
+* Remove transports not in QAS and transports in prd that do not
+* need to be re-transported:
+ IF main_list_line_xls-qas <> co_okay
+ OR main_list_line_xls-prd = co_okay.
+ lp_return = abap_true.
+ LOOP AT main_list ASSIGNING FIELD-SYMBOL()
+ WHERE trkorr = main_list_line_xls-trkorr.
+ -warning_lvl = co_tp_fail.
+ -warning_rank = co_tp_fail_rank.
+ -warning_txt = lp_fail_text.
+ ENDLOOP.
+ ENDIF.
+* Rename Documentation Icon to text
+ IF main_list_line_xls-info = co_docu.
+ main_list_line_xls-info = 'Yes'(037).
+ ENDIF.
+* Make sure to find and keep the highest warning level for the
+* transport
+ LOOP AT main_list INTO main_list_line
+ WHERE trkorr = main_list_line_xls-trkorr.
+ IF main_list_line-warning_rank > lp_highest_rank.
+ lp_highest_rank = main_list_line-warning_rank.
+ lp_highest_lvl = main_list_line-warning_lvl.
+ lp_highest_text = main_list_line-warning_txt.
+ lp_highest_col = main_list_line-t_color.
+ ENDIF.
+ ENDLOOP.
+ refresh_alv( ).
+* Add correct warning and change Warning Lvl Icon to text:
+ IF sy-subrc = 0.
+ main_list_line_xls-warning_lvl = lp_highest_lvl.
+ main_list_line_xls-warning_rank = lp_highest_rank.
+ main_list_line_xls-warning_txt = lp_highest_text.
+ main_list_line_xls-t_color = lp_highest_col.
+ CASE lp_highest_lvl.
+ WHEN co_info OR co_hint.
+ main_list_line_xls-warning_lvl = 'Info'(024).
+ WHEN co_error.
+ main_list_line_xls-warning_lvl = 'ERR.'(033).
+ WHEN co_ddic.
+ main_list_line_xls-warning_lvl = 'ERR.'(033).
+ WHEN co_warn.
+ main_list_line_xls-warning_lvl = 'Warn'(034).
+ WHEN OTHERS.
+ CLEAR main_list_line_xls-warning_lvl.
+ ENDCASE.
+ IF main_list_line-prd = co_scrap.
+ main_list_line_xls-re_import = 'Import again'(059).
+ ENDIF.
+ ENDIF.
+* Apply the changes
+ MODIFY main_list_xls FROM main_list_line_xls
+ INDEX lp_tabix.
+ ENDLOOP.
+* Message if entries were deleted because they were not in QAS:
+ IF lp_return = abap_true.
+ MESSAGE i000(db)
+ WITH 'Some transports will be deleted from the list'(m02)
+ 'because they are missing in Acceptance or are'(m03)
+ 'already in Production but not marked for'(m04)
+ 're-import. Please check the main list.'(m05).
+ FREE rf_table_xls.
+ FREE main_list_xls.
+ RETURN.
+ ENDIF.
+* Display short list for copy to Excel transport list:
+ alv_xls_init( IMPORTING ex_rf_table = rf_table_xls
+ CHANGING ch_table = main_list_xls ).
+ alv_set_properties( rf_table_xls ).
+ alv_xls_output( ).
+ FREE rf_table_xls.
+ FREE main_list_xls.
+ ENDMETHOD.
+
+ METHOD set_properties_conflicts.
+ TYPES: BEGIN OF ty_field_ran,
+ sign TYPE c LENGTH 1,
+ option TYPE c LENGTH 2,
+ low TYPE fieldname,
+ high TYPE fieldname,
+ END OF ty_field_ran.
+ DATA ls_s_column_ref TYPE salv_s_column_ref.
+ DATA lr_column_table TYPE REF TO cl_salv_column_table.
+* Declaration for Aggregate Function Settings
+ DATA lr_aggregations TYPE REF TO cl_salv_aggregations.
+ DATA ls_table TYPE ty_request_details.
+ DATA lp_cw_columns TYPE lvc_outlen.
+ DATA lp_cw_korrnum TYPE lvc_outlen.
+ DATA lp_cw_tr_descr TYPE lvc_outlen.
+ DATA lp_cw_object TYPE lvc_outlen.
+ DATA lp_cw_obj_name TYPE lvc_outlen.
+ DATA lp_cw_tabkey TYPE lvc_outlen.
+ DATA lp_cw_author TYPE lvc_outlen.
+ DATA lp_cw_reimport TYPE lvc_outlen.
+ DATA lp_cw_warning_lvl TYPE lvc_outlen.
+ DATA lp_cw_date TYPE lvc_outlen.
+ DATA lp_cw_time TYPE lvc_outlen.
+ DATA lp_cw_keyobject TYPE lvc_outlen.
+ DATA lp_cw_keyobjname TYPE lvc_outlen.
+ DATA lr_table_des TYPE REF TO cl_abap_structdescr.
+ DATA lt_details TYPE abap_compdescr_tab.
+ DATA ls_details TYPE abap_compdescr.
+ DATA lp_field TYPE string.
+* Declaration for ALV Columns
+ DATA lr_columns_table TYPE REF TO cl_salv_columns_table.
+ DATA lt_t_column_ref TYPE salv_t_column_ref.
+* Declaration for Sort Function Settings
+ DATA lr_sorts TYPE REF TO cl_salv_sorts.
+* Declaration for Table Selection settings
+ DATA lr_selections TYPE REF TO cl_salv_selections.
+* Declaration for Global Display Settings
+ DATA lr_display_settings TYPE REF TO cl_salv_display_settings.
+* Texts
+ DATA lp_short_text TYPE char10.
+ DATA lp_medium_text TYPE char20.
+ DATA lp_long_text TYPE char40.
+
+ DATA(lp_bool) = abap_false.
+
+ FIELD-SYMBOLS TYPE any.
+* To remove some columns from the output
+ DATA lt_range_fieldname TYPE RANGE OF ty_field_ran.
+ DATA ls_fieldname TYPE ty_field_ran.
+* Individual Column Properties.
+* Build range for all columns to be removed
+ ls_fieldname-option = 'EQ'.
+ ls_fieldname-sign = 'I'.
+ ls_fieldname-low = 'INFO'.
+ APPEND ls_fieldname TO lt_range_fieldname.
+ ls_fieldname-low = 'RETCODE'.
+ APPEND ls_fieldname TO lt_range_fieldname.
+ ls_fieldname-low = 'TRSTATUS'.
+ APPEND ls_fieldname TO lt_range_fieldname.
+ ls_fieldname-low = 'STATUS_TEXT'.
+ APPEND ls_fieldname TO lt_range_fieldname.
+ ls_fieldname-low = 'TRFUNCTION'.
+ APPEND ls_fieldname TO lt_range_fieldname.
+ ls_fieldname-low = 'TRFUNCTION_TXT'.
+ APPEND ls_fieldname TO lt_range_fieldname.
+ ls_fieldname-low = 'OBJKEY'.
+ APPEND ls_fieldname TO lt_range_fieldname.
+ ls_fieldname-low = 'OBJFUNC'.
+ APPEND ls_fieldname TO lt_range_fieldname.
+ ls_fieldname-low = 'CHECKED_BY'.
+ APPEND ls_fieldname TO lt_range_fieldname.
+ ls_fieldname-low = 'PROJECT'.
+ APPEND ls_fieldname TO lt_range_fieldname.
+ ls_fieldname-low = 'PROJECT_DESCR'.
+ APPEND ls_fieldname TO lt_range_fieldname.
+ ls_fieldname-low = 'WARNING_TXT'.
+ APPEND ls_fieldname TO lt_range_fieldname.
+ ls_fieldname-low = 'WARNING_RANK'.
+ APPEND ls_fieldname TO lt_range_fieldname.
+ ls_fieldname-low = 'SYSTEMID'.
+ APPEND ls_fieldname TO lt_range_fieldname.
+ ls_fieldname-low = 'STEPID'.
+ APPEND ls_fieldname TO lt_range_fieldname.
+ ls_fieldname-low = 'DEV'.
+ APPEND ls_fieldname TO lt_range_fieldname.
+ ls_fieldname-low = 'QAS'.
+ APPEND ls_fieldname TO lt_range_fieldname.
+ ls_fieldname-low = 'PRD'.
+ APPEND ls_fieldname TO lt_range_fieldname.
+ ls_fieldname-low = 'FLAG'.
+ APPEND ls_fieldname TO lt_range_fieldname.
+ ls_fieldname-low = 'CHECKED'.
+ APPEND ls_fieldname TO lt_range_fieldname.
+* Create the standard output fields.
+* Get the structure of the table.
+ lr_table_des ?=
+ cl_abap_typedescr=>describe_by_data( main_list_line ).
+ lt_details[] = lr_table_des->components[].
+ LOOP AT lt_details INTO ls_details.
+ CONCATENATE '>MAIN_LIST_LINE' '-'
+ ls_details-name INTO lp_field.
+ ASSIGN (lp_field) TO .
+ CHECK IS ASSIGNED.
+ ENDLOOP.
+
+* Determine total width
+ LOOP AT im_table INTO ls_table.
+ determine_col_width( EXPORTING im_field = ls_table-trkorr
+ CHANGING ch_colwidth = lp_cw_korrnum ).
+ determine_col_width( EXPORTING im_field = ls_table-tr_descr
+ CHANGING ch_colwidth = lp_cw_tr_descr ).
+ determine_col_width( EXPORTING im_field = ls_table-warning_lvl
+ CHANGING ch_colwidth = lp_cw_warning_lvl ).
+ determine_col_width( EXPORTING im_field = ls_table-object
+ CHANGING ch_colwidth = lp_cw_object ).
+ determine_col_width( EXPORTING im_field = ls_table-obj_name
+ CHANGING ch_colwidth = lp_cw_obj_name ).
+ determine_col_width( EXPORTING im_field = ls_table-tabkey
+ CHANGING ch_colwidth = lp_cw_tabkey ).
+ determine_col_width( EXPORTING im_field = ls_table-keyobject
+ CHANGING ch_colwidth = lp_cw_keyobject ).
+ determine_col_width( EXPORTING im_field = ls_table-keyobjname
+ CHANGING ch_colwidth = lp_cw_keyobjname ).
+ determine_col_width( EXPORTING im_field = ls_table-as4date
+ CHANGING ch_colwidth = lp_cw_date ).
+ determine_col_width( EXPORTING im_field = ls_table-as4time
+ CHANGING ch_colwidth = lp_cw_time ).
+ determine_col_width( EXPORTING im_field = ls_table-as4user
+ CHANGING ch_colwidth = lp_cw_author ).
+ determine_col_width( EXPORTING im_field = ls_table-re_import
+ CHANGING ch_colwidth = lp_cw_reimport ).
+ ENDLOOP.
+* Global Display Settings
+ CLEAR lr_display_settings.
+* Global display settings
+ lr_display_settings = rf_conflicts->get_display_settings( ).
+* Activate Striped Pattern
+ lr_display_settings->set_striped_pattern( if_salv_c_bool_sap=>true ).
+* Report header
+ lr_display_settings->set_list_header( sy-title ).
+* Aggregate Function Settings
+ lr_aggregations = rf_conflicts->get_aggregations( ).
+* Sort Functions
+ lr_sorts = rf_conflicts->get_sorts( ).
+ IF lr_sorts IS NOT INITIAL.
+ TRY.
+ lr_sorts->add_sort( columnname = 'AS4DATE'
+ position = 1
+ sequence = if_salv_c_sort=>sort_up
+ subtotal = if_salv_c_bool_sap=>false
+ obligatory = if_salv_c_bool_sap=>false ).
+ CATCH cx_salv_not_found INTO rf_root.
+ handle_error( rf_root ).
+ CATCH cx_salv_existing INTO rf_root ##NO_HANDLER.
+ CATCH cx_salv_data_error INTO rf_root.
+ handle_error( rf_root ).
+ ENDTRY.
+ TRY.
+ lr_sorts->add_sort( columnname = 'AS4TIME'
+ position = 2
+ sequence = if_salv_c_sort=>sort_up
+ subtotal = if_salv_c_bool_sap=>false
+ group = if_salv_c_sort=>group_none
+ obligatory = if_salv_c_bool_sap=>false ).
+ CATCH cx_salv_not_found INTO rf_root.
+ handle_error( rf_root ).
+ CATCH cx_salv_existing INTO rf_root ##NO_HANDLER.
+ CATCH cx_salv_data_error INTO rf_root.
+ handle_error( rf_root ).
+ ENDTRY.
+ ENDIF.
+* Table Selection Settings
+ lr_selections = rf_conflicts->get_selections( ).
+ IF lr_selections IS NOT INITIAL.
+* Allow row Selection
+ lr_selections->set_selection_mode( if_salv_c_selection_mode=>row_column ).
+ ENDIF.
+* Event Register settings
+ rf_events_table = rf_conflicts->get_event( ).
+ rf_handle_events = NEW #( ).
+ SET HANDLER lcl_eventhandler_ztct=>on_function_click FOR rf_events_table.
+ SET HANDLER lcl_eventhandler_ztct=>on_double_click_popup FOR rf_events_table.
+ SET HANDLER lcl_eventhandler_ztct=>on_link_click_popup FOR rf_events_table.
+* Get the columns from ALV Table
+ lr_columns_table = rf_conflicts->get_columns( ).
+ IF lr_columns_table IS NOT INITIAL.
+ FREE lt_t_column_ref.
+ lt_t_column_ref = lr_columns_table->get( ).
+* Get columns properties
+ lr_columns_table->set_optimize( if_salv_c_bool_sap=>true ).
+ lr_columns_table->set_key_fixation( if_salv_c_bool_sap=>true ).
+ TRY.
+ lr_columns_table->set_color_column( 'T_COLOR' ).
+ CATCH cx_salv_data_error INTO rf_root.
+ handle_error( rf_root ).
+ ENDTRY.
+
+ LOOP AT lt_t_column_ref INTO ls_s_column_ref.
+ TRY.
+ lr_column_table ?=
+ lr_columns_table->get_column( ls_s_column_ref-columnname ).
+ CATCH cx_salv_not_found INTO rf_root.
+ handle_error( rf_root ).
+ ENDTRY.
+ IF lr_column_table IS NOT INITIAL.
+* Make Mandt column invisible
+ IF lr_column_table->get_ddic_datatype( ) = 'CLNT'.
+ lr_column_table->set_technical( if_salv_c_bool_sap=>true ).
+ ENDIF.
+* Create Aggregate function total for All Numeric/Currency Fields
+ IF lr_column_table->get_ddic_inttype( ) = 'P'
+ OR lr_column_table->get_ddic_datatype( ) = 'CURR'.
+ IF lr_aggregations IS NOT INITIAL.
+ TRY.
+ lr_aggregations->add_aggregation(
+ columnname = ls_s_column_ref-columnname
+ aggregation = if_salv_c_aggregation=>total ).
+ CATCH cx_salv_data_error INTO rf_root.
+ handle_error( rf_root ).
+ CATCH cx_salv_not_found INTO rf_root.
+ handle_error( rf_root ).
+ CATCH cx_salv_existing INTO rf_root.
+ handle_error( rf_root ).
+ ENDTRY.
+ ENDIF.
+ ENDIF.
+* Create Check box for fields with domain "XFELD"
+ IF lr_column_table->get_ddic_domain( ) = 'XFELD'.
+ lr_column_table->set_cell_type( if_salv_c_cell_type=>checkbox ).
+ ENDIF.
+* Add Hotspot&Hyper Link to the column vbeln
+ IF ls_s_column_ref-columnname = 'TRKORR'.
+ lr_column_table->set_cell_type( if_salv_c_cell_type=>hotspot ).
+ lr_column_table->set_key( if_salv_c_bool_sap=>true ).
+ ENDIF.
+* Remove columns that are not required
+ IF lr_column_table->get_columnname( ) IN lt_range_fieldname.
+ lr_column_table->set_technical( if_salv_c_bool_sap=>true ).
+ CONTINUE.
+ ENDIF.
+ CASE lr_column_table->get_columnname( ).
+ WHEN 'TRKORR'.
+ lr_column_table->set_key( if_salv_c_bool_sap=>false ).
+ lp_cw_korrnum = check_colwidth( im_name = 'TRKORR'
+ im_colwidth = lp_cw_korrnum ).
+ lr_column_table->set_output_length( lp_cw_korrnum ).
+ WHEN 'TR_DESCR'.
+ lr_column_table->set_key( if_salv_c_bool_sap=>false ).
+ lp_cw_tr_descr = check_colwidth( im_name = 'TR_DESCR'
+ im_colwidth = lp_cw_tr_descr ).
+ lr_column_table->set_output_length( lp_cw_tr_descr ).
+ WHEN 'WARNING_LVL'.
+ IF check_flag = abap_true.
+ lp_short_text = 'Warning'(045).
+ lp_medium_text = 'Warning'(045).
+ lp_long_text = 'Warning'(045).
+ lr_column_table->set_short_text( lp_short_text ).
+ lr_column_table->set_medium_text( lp_medium_text ).
+ lr_column_table->set_long_text( lp_long_text ).
+ lr_column_table->set_icon( ).
+ lr_column_table->set_output_length( lp_cw_warning_lvl ).
+ ELSE.
+ lr_column_table->set_technical( ).
+ ENDIF.
+ WHEN 'OBJECT'.
+ lr_column_table->set_key( if_salv_c_bool_sap=>false ).
+ lp_cw_object = check_colwidth( im_name = 'OBJECT'
+ im_colwidth = lp_cw_object ).
+ lr_column_table->set_output_length( lp_cw_object ).
+ WHEN 'OBJ_NAME'.
+ lr_column_table->set_key( if_salv_c_bool_sap=>false ).
+ lp_cw_obj_name = check_colwidth( im_name = 'OBJ_NAME'
+ im_colwidth = lp_cw_obj_name ).
+ lr_column_table->set_output_length( lp_cw_obj_name ).
+ WHEN 'TABKEY'.
+ lr_column_table->set_key( if_salv_c_bool_sap=>false ).
+ IF lp_cw_tabkey IS INITIAL.
+ lr_column_table->set_technical( ).
+ ELSE.
+ lp_cw_tabkey = check_colwidth( im_name = 'TABKEY'
+ im_colwidth = lp_cw_tabkey ).
+ lr_column_table->set_output_length( lp_cw_tabkey ).
+ ENDIF.
+ WHEN 'KEYOBJECT'.
+ lr_column_table->set_key( if_salv_c_bool_sap=>false ).
+ IF lp_cw_keyobject IS INITIAL.
+ lr_column_table->set_technical( ).
+ ELSE.
+ lp_cw_keyobject = check_colwidth( im_name = 'KEYOBJECT'
+ im_colwidth = lp_cw_keyobject ).
+ lr_column_table->set_output_length( lp_cw_keyobject ).
+ ENDIF.
+ WHEN 'KEYOBJNAME'.
+ lr_column_table->set_key( if_salv_c_bool_sap=>false ).
+ IF lp_cw_keyobjname IS INITIAL.
+ lr_column_table->set_technical( ).
+ ELSE.
+ lp_cw_keyobjname = check_colwidth( im_name = 'KEYOBJNAME'
+ im_colwidth = lp_cw_keyobjname ).
+ lr_column_table->set_output_length( lp_cw_keyobjname ).
+ ENDIF.
+ WHEN 'AS4DATE'.
+ lr_column_table->set_key( if_salv_c_bool_sap=>false ).
+ lp_cw_date = check_colwidth( im_name = 'AS4DATE'
+ im_colwidth = lp_cw_date ).
+ lr_column_table->set_output_length( lp_cw_date ).
+ WHEN 'AS4TIME'.
+ lr_column_table->set_key( if_salv_c_bool_sap=>false ).
+ lp_cw_time = check_colwidth( im_name = 'AS4TIME'
+ im_colwidth = lp_cw_time ).
+ lr_column_table->set_output_length( lp_cw_time ).
+ WHEN 'AS4USER'.
+ lr_column_table->set_key( if_salv_c_bool_sap=>false ).
+ lp_cw_author = check_colwidth( im_name = 'AS4USER'
+ im_colwidth = lp_cw_author ).
+ lr_column_table->set_output_length( lp_cw_author ).
+ WHEN 'RE_IMPORT'.
+ lr_column_table->set_key( if_salv_c_bool_sap=>false ).
+ lp_cw_reimport = check_colwidth( im_name = 'RE_IMPORT'
+ im_colwidth = lp_cw_reimport ).
+ lr_column_table->set_output_length( lp_cw_reimport ).
+
+ ENDCASE.
+* Count the number of columns that are visible
+ lp_bool = lr_column_table->is_technical( ).
+ IF lp_bool = abap_false.
+ lp_cw_columns = lp_cw_columns + 1.
+ ENDIF.
+ ENDIF.
+ ENDLOOP.
+ ENDIF.
+
+ re_xend = lp_cw_korrnum + lp_cw_tr_descr +
+ lp_cw_warning_lvl + lp_cw_object +
+ lp_cw_obj_name + lp_cw_tabkey +
+ lp_cw_keyobject + lp_cw_keyobjname +
+ lp_cw_date + lp_cw_time +
+ lp_cw_author + lp_cw_reimport +
+ lp_cw_columns.
+ ENDMETHOD.
+
+ METHOD prepare_ddic_check.
+ set_ddic_objects( ).
+ set_where_used( ).
+ ENDMETHOD.
+
+ METHOD set_ddic_objects.
+ TYPES: BEGIN OF ty_tadir,
+ devclass TYPE devclass,
+ obj_name TYPE sobj_name,
+ END OF ty_tadir.
+ TYPES ty_tadir_tt TYPE STANDARD TABLE OF ty_tadir.
+ DATA lt_tadir TYPE ty_tadir_tt.
+
+ TYPES: BEGIN OF ty_dd0xl,
+ object TYPE rollname,
+ as4local TYPE as4local,
+ as4vers TYPE as4vers,
+ END OF ty_dd0xl.
+ TYPES ty_dd0xl_tt TYPE STANDARD TABLE OF ty_dd0xl.
+ DATA lt_dd0xl TYPE ty_dd0xl_tt.
+
+ FREE ddic_objects.
+* Get all objects in Z-devclasses
+ SELECT devclass, obj_name FROM tadir INTO TABLE @lt_tadir
+ WHERE devclass LIKE 'Z%'
+ ORDER BY PRIMARY KEY.
+ IF sy-subrc = 0 AND lt_tadir IS NOT INITIAL.
+* DD01L (Domains)
+ IF lt_tadir[] IS NOT INITIAL.
+ SELECT domname AS object,
+ as4local,
+ as4vers
+ APPENDING CORRESPONDING FIELDS OF TABLE @lt_dd0xl
+ FROM dd01l FOR ALL ENTRIES IN @lt_tadir
+ WHERE domname = @lt_tadir-obj_name(30)
+ ORDER BY PRIMARY KEY. "#EC CI_SUBRC
+ ENDIF.
+* DD02L (SAP-tables)
+ IF lt_tadir[] IS NOT INITIAL.
+ SELECT tabname AS object,
+ as4local,
+ as4vers
+ APPENDING CORRESPONDING FIELDS OF TABLE @lt_dd0xl
+ FROM dd02l FOR ALL ENTRIES IN @lt_tadir
+ WHERE tabname = @lt_tadir-obj_name(30)
+ ORDER BY PRIMARY KEY. "#EC CI_SUBRC
+ ENDIF.
+* DD04L (Data elements)
+ IF lt_tadir[] IS NOT INITIAL.
+ SELECT rollname AS object,
+ as4local,
+ as4vers
+ APPENDING CORRESPONDING FIELDS OF TABLE @lt_dd0xl
+ FROM dd04l FOR ALL ENTRIES IN @lt_tadir
+ WHERE rollname = @lt_tadir-obj_name(30)
+ ORDER BY PRIMARY KEY. "#EC CI_SUBRC
+ ENDIF.
+ SORT lt_dd0xl.
+ APPEND LINES OF lt_dd0xl TO ddic_objects.
+ SORT ddic_objects.
+ DELETE ADJACENT DUPLICATES FROM ddic_objects.
+ ENDIF.
+ ENDMETHOD.
+
+ METHOD do_ddic_check.
+ DATA ls_ddic_conflict_info TYPE ty_request_details.
+ DATA ls_main TYPE ty_request_details.
+ DATA lp_obj_name TYPE trobj_name.
+* Check if the object exists in the where_used list for data
+* dictionary elements that do not yet exist in production.
+* If it is found in the where_used list, then the object MUST
+* also be in the main transport list. If it is not, it is an ERROR,
+* because transporting to production will cause DUMPS.
+* Check is independent of Flags. (Re)Check all objects in the list!
+* Message: "Contains an object that does not exist in prod. and
+* is not in the list"
+ LOOP AT ch_main_list INTO ls_main.
+ LOOP AT where_used INTO where_used_line
+ WHERE object = ls_main-obj_name.
+* If the used object (i.e. element, domain etc) is in the DDIC_E071 list,
+* it means that the used object is NOT in production yet. Transporting
+* the object that uses this used object will cause dumps in production.
+ READ TABLE ddic_e071 INTO ddic_e071_line
+ WITH KEY obj_name = where_used_line-used_obj.
+* The object in this transport contains a DDIC object that is not yet in
+* Production. This will cause dumps, unless the DDIC object can be found
+* as an object in the transport list!
+ IF sy-subrc = 0.
+* Check if the used object can be found in the main list
+ IF NOT line_exists( ch_main_list[ obj_name = where_used_line-used_obj ] ).
+ IF ls_main-flag = abap_true.
+ lp_obj_name = where_used_line-used_obj.
+ ls_ddic_conflict_info = get_tp_info( im_trkorr = ddic_e071_line-trkorr
+ im_obj_name = lp_obj_name ).
+ conflict_line = CORRESPONDING #( ls_ddic_conflict_info ).
+ conflict_line-warning_lvl = co_ddic.
+ conflict_line-warning_rank = co_ddic_rank.
+ conflict_line-warning_txt = lp_ddic_text.
+ APPEND conflict_line TO conflicts.
+ CLEAR conflict_line.
+ ENDIF.
+ ls_main-warning_lvl = co_ddic.
+ ls_main-warning_rank = co_ddic_rank.
+ ls_main-warning_txt = lp_ddic_text.
+ MODIFY ch_main_list FROM ls_main TRANSPORTING warning_lvl
+ warning_rank
+ warning_txt
+ t_color.
+ total = total + 1.
+ ELSEIF ls_main-warning_rank = co_ddic_rank.
+ ls_main-flag = abap_true.
+ MODIFY ch_main_list FROM ls_main TRANSPORTING flag.
+ ENDIF.
+ ENDIF.
+ ENDLOOP.
+ ENDLOOP.
+ ENDMETHOD.
+
+ METHOD set_where_used.
+ TYPES: BEGIN OF ty_objtype,
+ object TYPE versobjtyp,
+ END OF ty_objtype.
+ TYPES ty_objtype_tt TYPE STANDARD TABLE OF ty_objtype.
+ DATA lt_objtype TYPE ty_objtype_tt.
+
+ DATA lt_stms_wbo_requests TYPE TABLE OF stms_wbo_request.
+ DATA ls_stms_wbo_requests TYPE stms_wbo_request.
+ DATA ls_systems TYPE ctslg_system.
+ DATA lp_scope TYPE seu_obj ##NEEDED.
+ DATA lp_answer TYPE char1 ##NEEDED.
+ DATA lp_index TYPE syindex.
+ DATA lp_counter TYPE i.
+ DATA lp_total TYPE sytabix.
+ DATA lp_obj_name TYPE trobj_name.
+ DATA lt_objrangtab TYPE objrangtab.
+ DATA ls_objtyprang TYPE objtyprang.
+ DATA lp_chars TYPE string VALUE '1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ'.
+ DATA lt_where_used_sub TYPE sci_findlst.
+ DATA lp_string TYPE string.
+
+ DATA(ls_ddic_object) = VALUE string( ).
+ DATA(ls_objects) = VALUE string( ).
+ DATA(lp_deleted) = VALUE abap_bool( ).
+
+ FREE ddic_e071.
+* Get all object types
+* Select values for pgmid/object/text from database--------------------
+* Get all object types that have been transported before
+ SELECT DISTINCT object FROM e071
+ INTO CORRESPONDING FIELDS OF TABLE @lt_objtype
+ ORDER BY object.
+ IF sy-subrc = 0.
+ ls_objtyprang-sign = 'I'.
+ ls_objtyprang-option = 'EQ'.
+ LOOP AT lt_objtype INTO ls_objtyprang-low.
+ IF ls_objtyprang-low CN lp_chars.
+ CONTINUE.
+ ENDIF.
+ APPEND ls_objtyprang TO lt_objrangtab.
+ ENDLOOP.
+ ENDIF.
+* Now find ALL transports for the DDIC objects with Program ID R3TR,
+* for the object types found
+ CLEAR lp_counter.
+ lp_total = lines( ddic_objects ).
+ LOOP AT ddic_objects INTO ls_ddic_object.
+ lp_counter = lp_counter + 1.
+ lp_obj_name = ls_ddic_object.
+ progress_indicator( im_counter = lp_counter
+ im_object = lp_obj_name
+ im_total = lp_total
+ im_text = 'Collecting DDIC transports'(053)
+ im_flag = ' ' ).
+ SELECT trkorr, pgmid, object, obj_name
+ FROM e071 APPENDING CORRESPONDING FIELDS OF TABLE @ddic_e071
+ WHERE pgmid = 'R3TR'
+ AND object IN @lt_objrangtab
+ AND obj_name = @ls_ddic_object
+ ORDER BY trkorr. "#EC CI_SEL_NESTED #EC CI_SUBRC
+ ENDLOOP.
+
+* Check if the transport is in production, if it is, then the
+* DDIC object is existing and 'should' not cause problems.
+ CLEAR lp_counter.
+ LOOP AT ddic_e071 INTO ddic_e071_line.
+ lp_index = sy-tabix.
+ lp_deleted = abap_false.
+ IF ddic_e071_line-trkorr(3) NS dev_system.
+* Not a Development transport, check not required
+ DELETE ddic_e071 INDEX lp_index.
+ CONTINUE.
+ ENDIF.
+ FREE lt_stms_wbo_requests.
+ CLEAR lt_stms_wbo_requests.
+ READ TABLE tms_mgr_buffer INTO tms_mgr_buffer_line
+ WITH TABLE KEY request = ddic_e071_line-trkorr
+ target_system = dev_system.
+ IF sy-subrc = 0.
+ lt_stms_wbo_requests = tms_mgr_buffer_line-request_infos.
+ ELSE.
+ CALL FUNCTION 'TMS_MGR_READ_TRANSPORT_REQUEST'
+ EXPORTING
+ iv_request = ddic_e071_line-trkorr
+ iv_target_system = dev_system
+ iv_header_only = 'X'
+ iv_monitor = ' '
+ IMPORTING
+ et_request_infos = lt_stms_wbo_requests
+ EXCEPTIONS
+ read_config_failed = 1
+ table_of_requests_is_empty = 2
+ system_not_available = 3
+ OTHERS = 4.
+ IF sy-subrc <> 0.
+ MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
+ WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
+ ELSE.
+ tms_mgr_buffer_line-request = ddic_e071_line-trkorr.
+ tms_mgr_buffer_line-target_system = dev_system.
+ tms_mgr_buffer_line-request_infos = lt_stms_wbo_requests.
+ INSERT tms_mgr_buffer_line INTO TABLE tms_mgr_buffer.
+ ENDIF.
+ ENDIF.
+ READ TABLE lt_stms_wbo_requests INDEX 1
+ INTO ls_stms_wbo_requests.
+ IF sy-subrc = 0.
+ IF ls_stms_wbo_requests-e070-trstatus NA 'NR'.
+* Transport not released, check not required
+ DELETE ddic_e071 INDEX lp_index.
+ lp_deleted = abap_true.
+ ELSEIF ls_stms_wbo_requests-e070-trstatus = 'O'.
+ MESSAGE e000(db) DISPLAY LIKE 'E'
+ WITH 'Transport being released. Recheck needed!'(060).
+ ELSE.
+* Retrieve the environments where the transport can be found.
+* Read the info of the request (transport log) to determine the
+* highest environment the transport has been moved to.
+ CALL FUNCTION 'TR_READ_GLOBAL_INFO_OF_REQUEST'
+ EXPORTING
+ iv_trkorr = ddic_e071_line-trkorr
+ IMPORTING
+ es_cofile = st_request-cofile.
+ IF st_request-cofile-systems IS INITIAL.
+* Transport log does not exist: not released or log deleted
+ DELETE ddic_e071 INDEX lp_index.
+ lp_deleted = abap_true.
+ ELSE.
+* Now check in which environments the transport can be found
+ LOOP AT st_request-cofile-systems INTO ls_systems.
+* For each environment, set the status icon:
+ IF ls_systems-systemid = prd_system.
+ READ TABLE ls_systems-steps INTO st_steps
+ INDEX lines( ls_systems-steps ).
+ IF sy-subrc = 0 AND st_steps-stepid <> '<'.
+* Transported to production, check not required on this
+* object. Delete all records for this object (not only
+* for this transport but for all transports)
+ DELETE ddic_e071 INDEX lp_index.
+ lp_deleted = abap_true.
+ ENDIF.
+ ENDIF.
+ ENDLOOP.
+ ENDIF.
+ ENDIF.
+ ENDIF.
+* Show the progress indicator
+ IF lp_deleted = abap_false.
+* Only add counter if the line was not deleted...
+ lp_counter = lp_counter + 1.
+ ENDIF.
+ lp_total = lines( ddic_e071 ).
+ progress_indicator( im_counter = lp_counter
+ im_object = ddic_e071_line-obj_name
+ im_total = lp_total
+ im_text = 'DDIC not transported...'(051)
+ im_flag = ' ' ).
+ ENDLOOP.
+* Rebuild ddic_objects list
+ FREE ddic_objects.
+ LOOP AT ddic_e071 INTO ddic_e071_line.
+ APPEND ddic_e071_line-obj_name TO ddic_objects.
+ ENDLOOP.
+ SORT ddic_objects.
+ DELETE ADJACENT DUPLICATES FROM ddic_objects.
+* Show the progress indicator
+ cl_progress_indicator=>progress_indicate( i_text = 'Retrieving Where Used list'(052) ).
+
+* Build the WHERE_USED list for all remaining objects
+ FREE where_used.
+ LOOP AT ddic_objects INTO ls_objects.
+ FREE ddic_objects_sub.
+ APPEND ls_objects TO ddic_objects_sub.
+ CALL FUNCTION 'RS_EU_CROSSREF'
+ EXPORTING
+* 'DE' = Data element
+ i_find_obj_cls = 'DE'
+ no_dialog = 'X'
+ IMPORTING
+ o_scope_obj_cls = lp_scope
+ o_answer = lp_answer
+ TABLES
+ i_findstrings = ddic_objects_sub
+ o_founds = lt_where_used_sub
+ EXCEPTIONS
+ not_executed = 1
+ not_found = 2
+ illegal_object = 3
+ no_cross_for_this_object = 4
+ batch = 5
+ batchjob_error = 6
+ wrong_type = 7
+ object_not_exist = 8
+ OTHERS = 9.
+ IF sy-subrc <> 0.
+ MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
+ WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
+ ENDIF.
+ APPEND LINES OF lt_where_used_sub TO where_used.
+ FREE lt_where_used_sub.
+ ENDLOOP.
+* Remove all entries from the where used list that are not existing
+* in tables DD01L, DD02L or DD04L
+ LOOP AT where_used INTO where_used_line.
+* DD01L (Domains)
+ SELECT SINGLE domname
+ FROM dd01l INTO @lp_string
+ WHERE domname = @where_used_line-used_obj ##WARN_OK.
+ IF sy-subrc <> 0.
+* DD02L (SAP-tables)
+ SELECT SINGLE tabname
+ FROM dd02l INTO @lp_string
+ WHERE tabname = @where_used_line-used_obj ##WARN_OK.
+ IF sy-subrc <> 0.
+* DD04L (Data elements)
+ SELECT SINGLE rollname
+ FROM dd04l INTO @lp_string
+ WHERE rollname = @where_used_line-used_obj ##WARN_OK.
+ ENDIF.
+ ENDIF.
+ IF sy-subrc <> 0.
+ DELETE where_used INDEX sy-tabix.
+ ENDIF.
+ ENDLOOP.
+ ENDMETHOD.
+
+ METHOD get_import_datetime_qas.
+ DATA ls_systems TYPE ctslg_system.
+ CLEAR ex_as4time.
+ CLEAR ex_as4date.
+* Get the last date the object was imported
+ CALL FUNCTION 'TR_READ_GLOBAL_INFO_OF_REQUEST'
+ EXPORTING
+ iv_trkorr = im_trkorr
+ IMPORTING
+ es_cofile = st_request-cofile.
+ LOOP AT st_request-cofile-systems INTO ls_systems
+ WHERE systemid = qas_system.
+* Get the latest import date:
+ READ TABLE ls_systems-steps INTO st_steps
+ INDEX lines( ls_systems-steps ).
+ IF sy-subrc = 0.
+ READ TABLE st_steps-actions INTO st_actions
+ INDEX lines( st_steps-actions ).
+ IF sy-subrc = 0.
+ ex_as4time = st_actions-time.
+ ex_as4date = st_actions-date.
+ ENDIF.
+ ENDIF.
+ ENDLOOP.
+ ex_return = sy-subrc.
+ ENDMETHOD.
+
+ METHOD exclude_all_tables.
+ LOOP AT table_keys INTO table_keys_line.
+ ls_excluded_objects-sign = 'E'.
+ ls_excluded_objects-option = 'EQ'.
+ ls_excluded_objects-low = table_keys_line-tabname.
+ APPEND ls_excluded_objects TO excluded_objects.
+ ENDLOOP.
+ ENDMETHOD.
+
+ METHOD ofc_goon.
+ DATA lt_range_transports_to_add TYPE RANGE OF e070-trkorr.
+ DATA ls_range_transports_to_add LIKE LINE OF lt_range_transports_to_add.
+ DATA ls_row TYPE int4.
+ IF rf_conflicts IS BOUND.
+ rf_conflicts->close_screen( ).
+* Move the conflicts to a range. The transports in this range will
+* be added to the main list:
+ FREE lt_range_transports_to_add.
+ set_building_conflict_popup( abap_false ).
+ CLEAR ls_range_transports_to_add.
+ ls_range_transports_to_add-sign = 'I'.
+ ls_range_transports_to_add-option = 'EQ'.
+* If row(s) are selected, use the table
+ LOOP AT im_rows INTO ls_row.
+ READ TABLE conflicts INTO conflict_line
+ INDEX ls_row.
+ IF sy-subrc = 0.
+ ls_range_transports_to_add-low = conflict_line-trkorr.
+ APPEND ls_range_transports_to_add TO lt_range_transports_to_add.
+ ENDIF.
+ ENDLOOP.
+* Rows MUST be selected
+ IF im_rows[] IS INITIAL.
+ MESSAGE i000(db) WITH 'No rows selected: No transports will be added'(m06).
+ ENDIF.
+ IF lt_range_transports_to_add[] IS NOT INITIAL.
+ add_to_main = get_added_objects( lt_range_transports_to_add ).
+ get_additional_tp_info( CHANGING ch_table = add_to_main ).
+ main_list = add_to_list( im_list = main_list
+ im_to_add = add_to_main ).
+* After the transports have been added, check if there are added
+* transports that are already in prd. If so, make them visible by
+* changing the prd icon to co_scrap.
+ LOOP AT main_list INTO main_list_line
+ WHERE prd = co_okay
+ AND trkorr IN lt_range_transports_to_add.
+ main_list_line-prd = co_scrap.
+ MODIFY main_list FROM main_list_line INDEX sy-tabix.
+ ENDLOOP.
+* After the transports have been added, we need to check again
+ flag_same_objects( CHANGING ch_main_list = main_list ).
+ check_for_conflicts( CHANGING ch_main_list = main_list ).
+ refresh_alv( ).
+ ENDIF.
+ FREE ch_table.
+ ELSEIF rf_table_keys IS BOUND.
+* Not in the Conflicts Popup, but in the Table Key popup. Based on the user decision,
+* the tables that do NOT have to be checked, are added to the excluded object list.
+* If no tables are selected, all tables are excluded from the check.
+* If row(s) are selected, determine the tables to be check from the selected
+* rows. All rows that weren't selected will be added to the excluded object list.
+ ch_table->close_screen( ).
+ IF im_rows[] IS NOT INITIAL.
+ LOOP AT table_keys INTO table_keys_line.
+ IF NOT line_exists( im_rows[ table_line = sy-tabix ] ).
+ ls_excluded_objects-sign = 'E'.
+ ls_excluded_objects-option = 'EQ'.
+ ls_excluded_objects-low = table_keys_line-tabname.
+ APPEND ls_excluded_objects TO excluded_objects.
+ ENDIF.
+ ENDLOOP.
+ ELSE.
+* If user pressed cancel, then add all tables to the excluded object list
+ exclude_all_tables( ).
+ MESSAGE i000(db) WITH 'No rows selected: Table keys will not be checked'(m07).
+ check_tabkeys = abap_false.
+ ENDIF.
+ FREE ch_table.
+ ENDIF.
+ ENDMETHOD.
+
+ METHOD ofc_abr.
+ IF rf_table_keys IS BOUND.
+ rf_table_keys->close_screen( ).
+* If user pressed cancel (Add all tables, do not check any)
+ exclude_all_tables( ).
+ MESSAGE i000(db) WITH 'Cancelled: Table keys will not be checked'(m09).
+ FREE rf_table_keys.
+ check_tabkeys = abap_false.
+ ELSE.
+ ch_conflicts->close_screen( ).
+ FREE ch_conflicts.
+ ENDIF.
+ ENDMETHOD.
+
+ METHOD ofc_ddic.
+ DATA lp_answer TYPE char01.
+ DATA(lp_question) = VALUE string( ).
+ IF where_used[] IS INITIAL.
+ lp_question = 'This will take approx. 5-15 minutes... Continue?'(041).
+ ELSE.
+ lp_question = 'This has already been done. Do again?'(042).
+ ENDIF.
+ CALL FUNCTION 'POPUP_TO_CONFIRM'
+ EXPORTING
+ titlebar = 'Runtime Alert'(039)
+ text_question = lp_question
+ text_button_1 = 'Yes'(037)
+ icon_button_1 = 'ICON_OKAY'
+ text_button_2 = 'No'(043)
+ icon_button_2 = 'ICON_CANCEL'
+ default_button = '2'
+ display_cancel_button = ' '
+ IMPORTING
+ answer = lp_answer
+ EXCEPTIONS
+ text_not_found = 1
+ OTHERS = 2.
+ IF sy-subrc = 0 AND lp_answer = '1'.
+ check_ddic = abap_true.
+ set_ddic_objects( ).
+ set_where_used( ).
+ ENDIF.
+ do_ddic_check( CHANGING ch_main_list = main_list ).
+ MESSAGE i000(db) WITH 'Data Dictionary check finished...'(m15).
+ ENDMETHOD.
+
+ METHOD ofc_add_tp.
+ TYPES ty_sval TYPE sval.
+ TYPES ty_field_tt TYPE STANDARD TABLE OF ty_sval.
+ DATA lt_range_transports_to_add TYPE RANGE OF e070-trkorr.
+ DATA ls_range_transports_to_add LIKE LINE OF lt_range_transports_to_add.
+ DATA lt_fields TYPE ty_field_tt.
+ DATA ls_fields TYPE sval.
+ DATA lp_return TYPE c.
+ FREE lt_fields.
+ CLEAR ls_fields.
+ ls_fields-tabname = 'E070'.
+ ls_fields-fieldname = 'TRKORR'.
+ APPEND ls_fields TO lt_fields.
+ CALL FUNCTION 'POPUP_GET_VALUES_DB_CHECKED'
+ EXPORTING
+ popup_title = 'Selected transports'(t01)
+ IMPORTING
+ returncode = lp_return
+ TABLES
+ fields = lt_fields
+ EXCEPTIONS
+ error_in_fields = 1
+ OTHERS = 2.
+ CASE sy-subrc.
+ WHEN 1.
+ MESSAGE e000(db) WITH 'ERROR: ERROR_IN_FIELDS'(m08).
+ WHEN 2.
+ MESSAGE e000(db) WITH 'Error occurred'(029).
+ ENDCASE.
+* Exit if cancelled:
+ IF lp_return = 'A'.
+ RETURN.
+ ENDIF.
+* Move the conflicts to a range. The transports in this range will
+* be added to the main list:
+ FREE lt_range_transports_to_add.
+ CLEAR ls_range_transports_to_add.
+ ls_range_transports_to_add-sign = 'I'.
+ ls_range_transports_to_add-option = 'EQ'.
+ READ TABLE lt_fields INTO ls_fields INDEX 1. "#EC CI_SUBRC
+ IF ls_fields-value IS INITIAL.
+ RETURN.
+ ENDIF.
+* Is it already in the list?
+ IF line_exists( main_list[ trkorr = ls_fields-value(20) ] ).
+ RETURN.
+ ENDIF.
+* Add transport number to the internal table to add:
+ ls_range_transports_to_add-low = ls_fields-value.
+ APPEND ls_range_transports_to_add TO lt_range_transports_to_add.
+ add_to_main = get_added_objects( lt_range_transports_to_add ).
+ get_additional_tp_info( CHANGING ch_table = add_to_main ).
+ main_list = add_to_list( im_list = main_list
+ im_to_add = add_to_main ).
+* After the transports have been added, check if there are added
+* transports that are already in prd. If so, make them visible by
+* changing the prd icon to co_scrap.
+ LOOP AT main_list INTO main_list_line
+ WHERE prd = co_okay
+ AND trkorr IN lt_range_transports_to_add.
+ main_list_line-prd = co_scrap.
+ MODIFY main_list FROM main_list_line
+ INDEX sy-tabix.
+ ENDLOOP.
+* After the transports have been added, we need to check again
+ flag_same_objects( CHANGING ch_main_list = main_list ).
+ check_for_conflicts( CHANGING ch_main_list = main_list ).
+ ENDMETHOD.
+
+ METHOD ofc_save.
+* Data declarations
+ DATA lp_filelength TYPE i ##NEEDED.
+ DATA lp_filename TYPE string.
+* Selected rows
+ DATA lp_path TYPE string.
+ DATA lp_fullpath TYPE string.
+ DATA lp_desktop TYPE string.
+ DATA lp_timestamp TYPE tzntstmps.
+* Build header
+ tab_delimited = main_to_tab_delimited( main_list ).
+* Finding desktop
+ cl_gui_frontend_services=>get_desktop_directory(
+ CHANGING desktop_directory = lp_desktop
+ EXCEPTIONS
+ cntl_error = 1
+ error_no_gui = 2
+ not_supported_by_gui = 3
+ OTHERS = 4 ).
+ IF sy-subrc <> 0.
+ MESSAGE e001(00) WITH 'Desktop not found'(008) ##MG_MISSING.
+ ENDIF.
+
+ CONVERT DATE sy-datum TIME sy-uzeit
+ INTO TIME STAMP lp_timestamp TIME ZONE sy-zonlo.
+ DATA(lp_default_filename) = |{ lp_timestamp }|.
+ CONCATENATE 'ZTCT-' lp_default_filename INTO lp_default_filename.
+
+ DATA(lp_title) = |{ 'Save Transportlist'(009) }|.
+ cl_gui_frontend_services=>file_save_dialog(
+ EXPORTING
+ window_title = lp_title
+ default_extension = 'TXT'
+ default_file_name = lp_default_filename
+ initial_directory = lp_desktop
+ CHANGING
+ filename = lp_filename
+ path = lp_path
+ fullpath = lp_fullpath
+ EXCEPTIONS
+ cntl_error = 1
+ error_no_gui = 2
+ not_supported_by_gui = 3
+ OTHERS = 4 ).
+ IF sy-subrc <> 0.
+ MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
+ WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
+ ENDIF.
+
+* Display save dialog window
+ cl_gui_frontend_services=>gui_download(
+ EXPORTING
+ filename = lp_fullpath
+ filetype = 'ASC'
+ IMPORTING
+ filelength = lp_filelength
+ CHANGING
+ data_tab = tab_delimited
+ EXCEPTIONS
+ file_write_error = 1
+ no_batch = 2
+ gui_refuse_filetransfer = 3
+ invalid_type = 4
+ no_authority = 5
+ unknown_error = 6
+ header_not_allowed = 7
+ separator_not_allowed = 8
+ filesize_not_allowed = 9
+ header_too_long = 10
+ dp_error_create = 11
+ dp_error_send = 12
+ dp_error_write = 13
+ unknown_dp_error = 14
+ access_denied = 15
+ dp_out_of_memory = 16
+ disk_full = 17
+ dp_timeout = 18
+ file_not_found = 19
+ dataprovider_exception = 20
+ control_flush_error = 21
+ not_supported_by_gui = 22
+ error_no_gui = 23
+ OTHERS = 24 ).
+ IF sy-subrc <> 0.
+ MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
+ WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
+ ENDIF.
+ ENDMETHOD.
+
+ METHOD ofc_nconf.
+ DATA lp_row_found TYPE abap_bool.
+ DATA lp_tabix TYPE sytabix.
+ CLEAR lp_row_found.
+ lp_tabix = ch_cell-row + 1.
+ LOOP AT main_list INTO main_list_line FROM lp_tabix.
+ IF lp_row_found IS INITIAL
+ AND main_list_line-warning_rank >= co_info_rank.
+ ch_cell-row = sy-tabix.
+ ch_cell-columnname = 'WARNING_LVL'.
+ im_selections->set_current_cell( ch_cell ).
+ lp_row_found = abap_true.
+ ENDIF.
+ ENDLOOP.
+ IF lp_row_found IS INITIAL.
+ LOOP AT main_list INTO main_list_line.
+ IF lp_row_found IS INITIAL
+ AND main_list_line-warning_rank >= co_info_rank.
+ ch_cell-row = sy-tabix.
+ ch_cell-columnname = 'WARNING_LVL'.
+ im_selections->set_current_cell( ch_cell ).
+ lp_row_found = abap_true.
+ ENDIF.
+ ENDLOOP.
+ IF lp_row_found IS INITIAL.
+ MESSAGE i000(db) WITH 'No next conflict found'(021).
+ ENDIF.
+ ENDIF.
+ ENDMETHOD.
+
+ METHOD get_additional_info.
+ DATA lt_stms_wbo_requests TYPE TABLE OF stms_wbo_request.
+ DATA ls_stms_wbo_requests TYPE stms_wbo_request.
+ DATA lt_tr_cofilines TYPE tr_cofilines.
+ DATA ls_tstrfcofil TYPE tstrfcofil.
+ DATA ls_systems TYPE ctslg_system.
+ DATA lv_prd_backup TYPE icon_l4.
+ ch_main_list_line-checked_by = sy-uname.
+* First get the descriptions (Status/Type/Project):
+* Retrieve texts for Status Description
+ SELECT SINGLE ddtext
+ FROM dd07t
+ INTO @main_list_line-status_text
+ WHERE domname = 'TRSTATUS'
+ AND ddlanguage = @co_langu
+ AND domvalue_l = @ch_main_list_line-trstatus. "#EC CI_SEL_NESTED #EC CI_SUBRC
+* Retrieve texts for Description of request/task type
+ SELECT SINGLE ddtext
+ FROM dd07t
+ INTO @ch_main_list_line-trfunction_txt
+ WHERE domname = 'TRFUNCTION'
+ AND ddlanguage = @co_langu
+ AND domvalue_l = @ch_main_list_line-trfunction. "#EC CI_SEL_NESTED #EC CI_SUBRC
+* Retrieve the project number (and description):
+ SELECT SINGLE reference
+ FROM e070a
+ INTO @ch_main_list_line-project
+ WHERE trkorr = @ch_main_list_line-trkorr
+ AND attribute = 'SAP_CTS_PROJECT'. "#EC CI_SEL_NESTED
+ IF sy-subrc = 0.
+ SELECT SINGLE descriptn
+ FROM ctsproject
+ INTO @ch_main_list_line-project_descr "#EC CI_SGLSELECT
+ WHERE trkorr = @ch_main_list_line-project. "#EC CI_SEL_NESTED #EC CI_SUBRC
+ ENDIF.
+* Check if transport has been released.
+* D - Modifiable
+* L - Modifiable, protected
+* A - Modifiable, protected
+* O - Release started
+* R - Released
+* N - Released (with import protection for repaired objects)
+ FREE lt_stms_wbo_requests.
+ READ TABLE tms_mgr_buffer INTO tms_mgr_buffer_line
+ WITH TABLE KEY request = ch_main_list_line-trkorr
+ target_system = dev_system.
+ IF sy-subrc = 0.
+ lt_stms_wbo_requests = tms_mgr_buffer_line-request_infos.
+ ELSE.
+ CALL FUNCTION 'TMS_MGR_READ_TRANSPORT_REQUEST'
+ EXPORTING
+ iv_request = ch_main_list_line-trkorr
+ iv_target_system = dev_system
+ iv_header_only = 'X'
+ iv_monitor = ' '
+ IMPORTING
+ et_request_infos = lt_stms_wbo_requests
+ EXCEPTIONS
+ read_config_failed = 1
+ table_of_requests_is_empty = 2
+ system_not_available = 3
+ OTHERS = 4.
+ IF sy-subrc <> 0.
+ MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
+ WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
+ ELSE.
+ tms_mgr_buffer_line-request = ch_main_list_line-trkorr.
+ tms_mgr_buffer_line-target_system = dev_system.
+ tms_mgr_buffer_line-request_infos = lt_stms_wbo_requests.
+ INSERT tms_mgr_buffer_line INTO TABLE tms_mgr_buffer.
+ ENDIF.
+ ENDIF.
+ READ TABLE lt_stms_wbo_requests INDEX 1
+ INTO ls_stms_wbo_requests. "#EC CI_SUBRC
+* Check if there is documentation available
+ CLEAR ch_main_list_line-info.
+ IF ls_stms_wbo_requests-docu[] IS NOT INITIAL.
+ check_documentation( EXPORTING im_trkorr = ch_main_list_line-trkorr
+ CHANGING ch_table = ch_table ).
+ ENDIF.
+* Check the returncode of this transport to QAS
+ CALL FUNCTION 'STRF_READ_COFILE'
+ EXPORTING
+ iv_trkorr = ch_main_list_line-trkorr
+ TABLES
+ tt_cofi_lines = lt_tr_cofilines
+ EXCEPTIONS
+ wrong_call = 1
+ no_info_found = 2
+ OTHERS = 3.
+ IF sy-subrc <> 0 and p_cofile = abap_true.
+ MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno
+ WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
+ ENDIF.
+ READ TABLE lt_tr_cofilines INTO ls_tstrfcofil
+ WITH KEY tarsystem = qas_system
+ function = 'G'. "#EC CI_SUBRC
+ ch_main_list_line-retcode = ls_tstrfcofil-retcode.
+ IF ls_stms_wbo_requests-e070-trstatus NA 'NR'.
+ ch_main_list_line-warning_lvl = co_alert.
+ ch_main_list_line-warning_rank = co_alert1_rank.
+ ch_main_list_line-warning_txt = lp_alert1_text.
+ ELSEIF ls_stms_wbo_requests-e070-trstatus = 'O'.
+ ch_main_list_line-warning_lvl = co_alert.
+ ch_main_list_line-warning_rank = co_alert2_rank.
+ ch_main_list_line-warning_txt = lp_alert2_text.
+ ELSE.
+* Retrieve the environments where the transport can be found.
+* Read the info of the request (transport log) to determine the
+* highest environment the transport has been moved to.
+ CALL FUNCTION 'TR_READ_GLOBAL_INFO_OF_REQUEST'
+ EXPORTING
+ iv_trkorr = ch_main_list_line-trkorr
+ IMPORTING
+ es_cofile = st_request-cofile.
+
+ IF st_request-cofile-systems IS INITIAL.
+* Transport log does not exist: not released or log deleted
+ ch_main_list_line-warning_lvl = co_alert.
+ ch_main_list_line-warning_rank = co_alert0_rank.
+ ch_main_list_line-warning_txt = lp_alert0_text.
+* First check if the object can also be found further down in
+* the list. If it is, then THAT transport will be checked.
+* Because, even if this transport's log can't be read, if the
+* same object is found later in the list, that one will be
+* checked too. We don't have to worry about the fact that the
+* log does not exist for this transport.
+ LOOP AT ch_table INTO line_found_in_list FROM im_indexinc
+ WHERE object = ch_main_list_line-object
+ AND obj_name = ch_main_list_line-obj_name
+ AND keyobject = ch_main_list_line-keyobject
+ AND keyobjname = ch_main_list_line-keyobjname
+ AND tabkey = ch_main_list_line-tabkey
+ AND prd <> co_okay.
+ EXIT.
+ ENDLOOP.
+ IF sy-subrc = 0.
+ ch_main_list_line-warning_lvl = co_hint.
+ ch_main_list_line-warning_rank = co_hint3_rank.
+ ch_main_list_line-warning_txt = lp_hint3_text.
+ ENDIF.
+ ELSE.
+* Initialize environment fields. The environments will be
+* checked and updated with the correct environment later
+ ch_main_list_line-dev = co_inact.
+ ch_main_list_line-qas = co_inact.
+* If a transport is in production and marked for re-import, do not
+* change the SCRAP icon to the OKAY icon
+ lv_prd_backup = ch_main_list_line-prd.
+ ch_main_list_line-prd = co_inact.
+* Now check in which environments the transport can be found
+ LOOP AT st_request-cofile-systems INTO ls_systems.
+* For each environment, set the status icon:
+ CASE ls_systems-systemid.
+ WHEN dev_system.
+* Green - Exists
+ ch_main_list_line-dev = co_okay.
+ WHEN qas_system.
+* Green - Exists
+ ch_main_list_line-qas = co_okay.
+* Get the latest date/time stamp
+ READ TABLE ls_systems-steps INTO st_steps
+ INDEX lines( ls_systems-steps ).
+ IF sy-subrc = 0.
+ CHECK st_steps-stepid <> '<'.
+ READ TABLE st_steps-actions INTO st_actions
+ INDEX lines( st_steps-actions ).
+ IF sy-subrc = 0.
+ ch_main_list_line-as4time = st_actions-time.
+ ch_main_list_line-as4date = st_actions-date.
+ ENDIF.
+ ENDIF.
+ WHEN prd_system.
+ READ TABLE ls_systems-steps INTO st_steps
+ INDEX lines( ls_systems-steps ).
+ IF sy-subrc = 0.
+ CHECK st_steps-stepid <> '<'.
+* Green - Exists
+ IF lv_prd_backup IS NOT INITIAL.
+ ch_main_list_line-prd = lv_prd_backup.
+ ELSE.
+ ch_main_list_line-prd = co_okay.
+ ENDIF.
+ ENDIF.
+ ENDCASE.
+ ENDLOOP.
+ ENDIF.
+ ENDIF.
+ ENDMETHOD.
+
+ METHOD go_back_months.
+ DATA: BEGIN OF ls_dat,
+ jjjj TYPE char4,
+ mm TYPE char2,
+ tt TYPE char2,
+ END OF ls_dat.
+
+ DATA: BEGIN OF ls_hdat,
+ jjjj TYPE char4,
+ mm TYPE char2,
+ tt TYPE char2,
+ END OF ls_hdat.
+
+ WRITE: im_currdate+0(4) TO ls_dat-jjjj,
+ im_currdate+4(2) TO ls_dat-mm,
+ im_currdate+6(2) TO ls_dat-tt.
+ DATA(lv_diffjjjj) = ( ls_dat-mm + ( - im_backmonths ) - 1 ) DIV 12.
+ DATA(lv_newmm) = ( ls_dat-mm + ( - im_backmonths ) - 1 ) MOD 12 + 1.
+ ls_dat-jjjj = ls_dat-jjjj + lv_diffjjjj.
+
+ IF lv_newmm < 10.
+ WRITE '0' TO ls_dat-mm+0(1).
+ WRITE lv_newmm TO ls_dat-mm+1(1).
+ ELSE.
+ WRITE lv_newmm TO ls_dat-mm.
+ ENDIF.
+ IF ls_dat-tt > '28'.
+ ls_hdat-tt = '01'.
+ lv_newmm = ( ls_dat-mm ) MOD 12 + 1.
+ ls_hdat-jjjj = ls_dat-jjjj + ( ( ls_dat-mm ) DIV 12 ).
+
+ IF lv_newmm < 10.
+ WRITE '0' TO ls_hdat-mm+0(1).
+ WRITE lv_newmm TO ls_hdat-mm+1(1).
+ ELSE.
+ WRITE lv_newmm TO ls_hdat-mm.
+ ENDIF.
+
+ IF ls_dat-tt = '31'.
+ re_date = ls_hdat.
+ re_date = re_date - 1.
+ ELSEIF ls_dat-mm = '02'.
+ re_date = ls_hdat.
+ re_date = re_date - 1.
+ ELSE.
+ re_date = ls_dat.
+ ENDIF.
+ ELSE.
+ re_date = ls_dat.
+ ENDIF.
+ ENDMETHOD.
+
+ENDCLASS.
+
+*--------------------------------------------------------------------*
+* DATA SELECT
+*--------------------------------------------------------------------*
+START-OF-SELECTION.
+
+ IF rf_ztct IS NOT BOUND.
+ TRY.
+ rf_ztct = NEW #( ).
+ CATCH cx_root INTO rf_root ##CATCH_ALL.
+ tp_msg = rf_root->get_text( ).
+ CONCATENATE 'ERROR:'(038) tp_msg INTO tp_msg SEPARATED BY space.
+ MESSAGE tp_msg TYPE 'E'.
+ ENDTRY.
+ ENDIF.
+
+ tp_prefix = rf_ztct->get_tp_prefix( p_dev ).
+
+ IF p_sel = abap_true.
+ tp_process_type = 1.
+ ELSE.
+ tp_process_type = 3.
+ ENDIF.
+
+ IF tp_process_type = 1.
+* Get transports
+ cl_progress_indicator=>progress_indicate( i_text = 'Selecting data...'(014) ).
+* Join over E070, E071:
+* Description is read later to prevent complicated join and
+* increased runtime
+ SELECT 'I' AS sign, 'EQ' AS option, a~trkorr AS low, ' ' AS high
+ INTO TABLE @ta_trkorr_range
+ FROM e070 AS a JOIN e071 AS b
+ ON a~trkorr = b~trkorr
+ WHERE a~trkorr IN @s_korr
+ AND a~as4user IN @s_user
+ AND a~as4date IN @s_date
+ AND b~obj_name IN @s_exobj
+ AND strkorr = ''
+ AND a~trkorr LIKE @tp_prefix
+ AND a~trkorr IN @lt_range_project_trkorrs
+ AND ( pgmid = 'LIMU' OR
+ pgmid = 'R3TR' )
+ ORDER BY a~trkorr.
+
+* Read transport description:
+ IF sy-subrc = 0 AND ta_trkorr_range[] IS NOT INITIAL.
+ LOOP AT ta_trkorr_range INTO st_trkorr_range.
+ tp_tabix = sy-tabix.
+* Check if the description contains the search string
+ SELECT as4text FROM e07t INTO TABLE @ta_transport_descr
+ WHERE trkorr = @st_trkorr_range-low
+ ORDER BY trkorr ##WARN_OK.
+ IF sy-subrc = 0.
+ tp_descr_exists = abap_false.
+ LOOP AT ta_transport_descr INTO tp_transport_descr.
+ IF p_str CS '*'.
+ IF tp_transport_descr CP p_str.
+ tp_descr_exists = abap_true.
+ ENDIF.
+ ELSEIF tp_transport_descr CS p_str.
+ tp_descr_exists = abap_true.
+ ENDIF.
+ ENDLOOP.
+ IF tp_descr_exists = abap_false.
+ DELETE ta_trkorr_range INDEX tp_tabix.
+ CONTINUE.
+ ENDIF.
+ ENDIF.
+* Check if the project is in the selection range
+ SELECT SINGLE reference FROM e070a
+ INTO @tp_project_reference
+ WHERE trkorr = @st_trkorr_range-low
+ AND attribute = 'SAP_CTS_PROJECT'. "#EC CI_SUBRC
+ IF sy-subrc = 0 AND tp_project_reference NOT IN s_proj.
+ DELETE ta_trkorr_range INDEX sy-tabix.
+ ENDIF.
+ ENDLOOP.
+ SORT ta_trkorr_range.
+ DELETE ADJACENT DUPLICATES FROM ta_trkorr_range.
+ ENDIF.
+ ENDIF.
+
+ ta_project_range[] = s_proj[].
+ lt_excluded_objects[] = s_exobj[].
+
+END-OF-SELECTION.
+
+*--------------------------------------------------------------------*
+* Main program
+*--------------------------------------------------------------------*
+ IF ta_trkorr_range IS INITIAL AND tp_process_type = 1.
+ MESSAGE i000(db) DISPLAY LIKE 'E'
+ WITH 'No transports found...'(m13).
+ ELSE.
+ PERFORM init_ztct.
+ rf_ztct->execute( ).
+ ENDIF.
+
+*&---------------------------------------------------------------------*
+*& Form INIT_ZTCT
+*&---------------------------------------------------------------------*
+FORM init_ztct.
+ rf_ztct->set_check_flag( p_sel ).
+ rf_ztct->set_check_tabkeys( p_chkky ).
+ rf_ztct->set_clear_checked( p_chd ).
+ rf_ztct->set_buffer_chk( p_buff ).
+ rf_ztct->set_buffer_remove_tp( p_buffd ).
+ rf_ztct->set_skiplive( p_noprd ).
+ rf_ztct->set_user_layout( p_user ).
+ rf_ztct->set_trkorr_range( ta_trkorr_range ).
+ rf_ztct->set_project_range( ta_project_range ).
+ rf_ztct->set_excluded_objects( lt_excluded_objects ).
+ rf_ztct->set_process_type( tp_process_type ).
+ rf_ztct->set_filename( p_file ).
+ rf_ztct->set_systems( im_dev_system = p_dev
+ im_qas_system = p_qas
+ im_prd_system = p_prd ).
+ENDFORM.
diff --git a/src/zev_tp_checktool.prog.xml b/src/zev_tp_checktool.prog.xml
new file mode 100644
index 0000000..16b235b
--- /dev/null
+++ b/src/zev_tp_checktool.prog.xml
@@ -0,0 +1,3446 @@
+
+
+
+
+
+ ZEV_TP_CHECKTOOL
+ 1
+ N
+ X
+ X
+
+
+
+ 000001
+ 000010
+ 000001
+
+
+
+ STANDARD_FULLSCREEN
+ D
+ 000001
+ 000001
+ 0001
+ Standard for generic List Output in Fullscreen Grid
+
+
+
+
+ %ML
+ 001
+ S
+ Folder
+ F
+
+
+ %PC
+ 001
+ S
+ ICON_EXPORT
+ @49@
+ Local File...
+ L
+
+
+ %SC
+ 001
+ S
+ ICON_SEARCH
+ @13@
+ Find
+ N
+
+
+ %SC+
+ 001
+ S
+ ICON_SEARCH_NEXT
+ @4E@
+ Find Next
+
+
+ %SL
+ 001
+ S
+ ICON_MAIL
+ @1S@
+ Mail Recipient
+ M
+
+
+ &ABC
+ 001
+ S
+ ICON_ABC
+ @DL@
+ ABC Analysis
+ A
+
+
+ &ADD
+ 001
+ S
+ ICON_INSERT_MULTIPLE_LINES
+ @GU@
+ Add conflicts
+ Add Conflicts
+ Add conflicts from one or more selected rows
+
+
+ &ADD_FILE
+ 001
+ S
+ ICON_IMPORT
+ @48@
+ Add file
+ Add file
+ Upload another file to be merged with the list
+
+
+ &ADD_TP
+ 001
+ S
+ ICON_INSERT_ROW
+ @17@
+ Add transport
+ Add Transport
+ Add a single transport to the list
+
+
+ &ALL
+ 001
+ S
+ ICON_SELECT_ALL
+ @4B@
+ Select All
+ E
+
+
+ &AQW
+ 001
+ S
+ ICON_WORD_PROCESSING
+ @DK@
+ Word Processing...
+ W
+
+
+ &AUF
+ 001
+ S
+ Define Totals Drilldown...
+ S
+
+
+ &AVE
+ 001
+ S
+ Saving...
+ S
+
+
+ &AVE
+ 002
+ S
+ ICON_ALV_VARIANT_SAVE
+ @DN@
+ Save Layout...
+
+
+ &AVR
+ 001
+ S
+ Mean Value
+ M
+
+
+ &CDF
+ 001
+ S
+ Unfreeze Columns
+ U
+
+
+ &CFI
+ 001
+ S
+ Freeze to Column
+ F
+
+
+ &COUNT
+ 001
+ S
+ Count
+ C
+
+
+ &DEL
+ 001
+ S
+ ICON_DELETE_ROW
+ @18@
+ Remove transport
+ Remove
+ Remove selected transport(s) from the list
+
+
+ &DOC
+ 001
+ S
+ ICON_CHANGE_TEXT
+ @0Q@
+ Edit Doc.
+ Edit Doc.
+ Edit Documentation
+
+
+ &EB9
+ 001
+ S
+ ICON_TABLE_SETTINGS
+ @36@
+ Call Up Report...
+ R
+
+
+ &ELP
+ 001
+ S
+ ICON_SYSTEM_HELP
+ @35@
+ Help
+
+
+ &ERW
+ 001
+ S
+ Manage...
+ M
+
+
+ &ETA
+ 001
+ S
+ ICON_SELECT_DETAIL
+ @16@
+ Details
+
+
+ &F03
+ 001
+ S
+ Back
+ B
+
+
+ &F12
+ 001
+ S
+ ICON_CANCEL
+ @0W@
+ Cancel
+ A
+
+
+ &F15
+ 001
+ S
+ Exit
+ X
+
+
+ &F4
+ 001
+ S
+ Possible Entries
+
+
+ &GRAPH
+ 001
+ S
+ ICON_GRAPHICS
+ @0N@
+ Graphic
+ G
+
+
+ &IC1
+ 001
+ S
+ ICON_SELECT_DETAIL
+ @16@
+ Choose
+
+
+ &ILD
+ 001
+ S
+ ICON_FILTER_UNDO
+ @GD@
+ Delete Filter
+ L
+
+
+ &ILT
+ 001
+ S
+ ICON_FILTER
+ @4G@
+ Set Filter
+ F
+
+
+ &IMPORT
+ 001
+ S
+ ICON_SCRAP
+ @K3@
+ Import Again
+ Re-import
+ Mark transport for re-import
+
+
+ &INFO
+ 001
+ S
+ ICON_INFORMATION
+ @0S@
+ Information
+ Info
+ Information
+
+
+ &MAX
+ 001
+ S
+ Maximum
+ A
+
+
+ &MIN
+ 001
+ S
+ Minimum
+ I
+
+
+ &NCONF
+ 001
+ S
+ ICON_NEXT_STEP
+ @B8@
+ Next Conflict
+ Next Conflict
+ Jump to the next conflict in the list
+
+
+ &OAD
+ 001
+ S
+ Choose...
+ E
+
+
+ &OAD
+ 002
+ S
+ ICON_ALV_VARIANT_CHOOSE
+ @DM@
+ Select Layout...
+
+
+ &ODN
+ 001
+ S
+ ICON_SORT_DOWN
+ @3F@
+ Sort in Descending Order
+ O
+
+
+ &OL0
+ 001
+ S
+ ICON_ALV_VARIANTS
+ @LZ@
+ Change Layout...
+
+
+ &OLX
+ 001
+ S
+ ICON_VARIANTS
+ @0R@
+ Change...
+ C
+
+
+ &OPT
+ 001
+ S
+ Optimize Width
+ P
+
+
+ &OUP
+ 001
+ S
+ ICON_SORT_UP
+ @3E@
+ Sort in Ascending Order
+ I
+
+
+ &PREP_XLS
+ 001
+ S
+ ICON_HISTORY
+ @96@
+ Header view
+ Header view
+ Display the list on Header level (no object info)
+
+
+ &REFRESH
+ 001
+ S
+ ICON_REFRESH
+ @42@
+ Refresh
+
+
+ &RNT
+ 001
+ S
+ ICON_PRINT
+ @0X@
+ Print
+ P
+
+
+ &RNT_PREV
+ 001
+ S
+ ICON_LAYOUT_CONTROL
+ @3G@
+ Print Preview
+ R
+
+
+ &SAL
+ 001
+ S
+ ICON_DESELECT_ALL
+ @4D@
+ Deselect All
+ D
+
+
+ &SAVE
+ 001
+ S
+ ICON_SYSTEM_SAVE
+ @2L@
+ Save
+
+
+ &SUM
+ 001
+ S
+ ICON_INTERMEDIATE_SUM
+ @5V@
+ Subtotals...
+ S
+
+
+ &UMC
+ 001
+ S
+ ICON_SUM
+ @3Z@
+ Total
+ T
+
+
+ &VEXCEL
+ 001
+ S
+ ICON_XLS
+ @J2@
+ Microsoft Excel
+ M
+
+
+ &VGRID
+ 001
+ S
+ SAP List Viewer
+ S
+
+
+ &VLOTUS
+ 001
+ S
+ Lotus 1-2-3
+ L
+
+
+ &XINT
+ 001
+ S
+ Additional Functions of SAP Query
+ E
+
+
+ &XXL
+ 001
+ S
+ ICON_XXL
+ @DJ@
+ Spreadsheet...
+ A
+
+
+ DDIC
+ 001
+ S
+ ICON_TIME_CONTROL
+ @BH@
+ Switch DDIC check ON
+ DDIC Check
+ Switch DDIC check ON (and perform initial run)
+
+
+ EABR
+ 001
+ S
+ S
+ ICON_CANCEL
+ @0W@
+ Exit
+ A
+
+
+ GOON
+ 001
+ S
+ ICON_OKAY
+ @0V@
+ Continue
+
+
+ RECHECK
+ 001
+ S
+ ICON_EXECUTE_OBJECT
+ @15@
+ Recheck transports
+ Recheck
+ Recheck selected transports
+
+
+
+
+ 000001
+ 01
+ F
+ &RNT_PREV
+ 001
+
+
+ 000001
+ 02
+ F
+ &RNT
+ 001
+
+
+ 000001
+ 03
+ S
+
+
+ 000001
+ 04
+ M
+ 000002
+
+
+ 000001
+ 05
+ M
+ 000003
+
+
+ 000001
+ 06
+ S
+
+
+ 000001
+ 07
+ F
+ &F15
+ 001
+
+
+ 000002
+ 01
+ F
+ &AQW
+ 001
+
+
+ 000002
+ 02
+ F
+ &XXL
+ 001
+
+
+ 000002
+ 03
+ F
+ %PC
+ 001
+
+
+ 000002
+ 04
+ F
+ &XINT
+ 001
+
+
+ 000003
+ 01
+ F
+ %SL
+ 001
+
+
+ 000003
+ 02
+ F
+ %ML
+ 001
+
+
+ 000004
+ 01
+ F
+ &ALL
+ 001
+
+
+ 000004
+ 02
+ F
+ &SAL
+ 001
+
+
+ 000004
+ 03
+ S
+
+
+ 000004
+ 04
+ F
+ &ILT
+ 001
+
+
+ 000004
+ 05
+ F
+ &ILD
+ 001
+
+
+ 000004
+ 06
+ S
+
+
+ 000004
+ 07
+ F
+ &OUP
+ 001
+
+
+ 000004
+ 08
+ F
+ &ODN
+ 001
+
+
+ 000004
+ 09
+ S
+
+
+ 000004
+ 10
+ M
+ 000005
+
+
+ 000004
+ 11
+ F
+ &SUM
+ 001
+
+
+ 000004
+ 12
+ S
+
+
+ 000004
+ 13
+ F
+ %SC
+ 001
+
+
+ 000004
+ 14
+ S
+
+
+ 000004
+ 15
+ F
+ &F12
+ 001
+
+
+ 000005
+ 01
+ F
+ &UMC
+ 001
+
+
+ 000005
+ 02
+ F
+ &AVR
+ 001
+
+
+ 000005
+ 03
+ F
+ &MIN
+ 001
+
+
+ 000005
+ 04
+ F
+ &MAX
+ 001
+
+
+ 000005
+ 05
+ F
+ &COUNT
+ 001
+
+
+ 000006
+ 01
+ F
+ &ABC
+ 001
+
+
+ 000006
+ 02
+ S
+
+
+ 000006
+ 03
+ F
+ &F03
+ 001
+
+
+ 000007
+ 01
+ F
+ &VGRID
+ 001
+
+
+ 000007
+ 02
+ F
+ &VEXCEL
+ 001
+
+
+ 000007
+ 03
+ F
+ &VLOTUS
+ 001
+
+
+ 000007
+ 04
+ S
+
+
+ 000007
+ 05
+ F
+ &GRAPH
+ 001
+
+
+ 000008
+ 01
+ M
+ 000009
+
+
+ 000008
+ 02
+ M
+ 000010
+
+
+ 000008
+ 03
+ F
+ &AUF
+ 001
+
+
+ 000009
+ 01
+ F
+ &OLX
+ 001
+
+
+ 000009
+ 02
+ F
+ &OAD
+ 001
+
+
+ 000009
+ 03
+ S
+
+
+ 000009
+ 04
+ F
+ &AVE
+ 001
+
+
+ 000009
+ 05
+ S
+
+
+ 000009
+ 06
+ F
+ &ERW
+ 001
+
+
+ 000010
+ 01
+ F
+ &OPT
+ 001
+
+
+ 000010
+ 02
+ S
+
+
+ 000010
+ 03
+ F
+ &CFI
+ 001
+
+
+ 000010
+ 04
+ F
+ &CDF
+ 001
+
+
+
+
+ 000001
+ S
+ List
+ I
+ Standard Supplement
+
+
+ 000001
+ S
+ List
+ I
+ Standard Supplement
+
+
+ 000002
+ S
+ Export
+ E
+ STANDARD Save
+
+
+ 000003
+ S
+ Send To
+ S
+
+
+ 000004
+ S
+ Edit
+ E
+ STANDARD
+
+
+ 000005
+ S
+ Calculate
+ C
+
+
+ 000006
+ S
+ Goto
+ G
+ STANDARD
+
+
+ 000007
+ S
+ Views
+ V
+
+
+ 000008
+ S
+ Settings
+ S
+ STANDARD_FULLSCREEN
+
+
+ 000009
+ S
+ Layout
+ A
+ Sub STANDARD
+
+
+ 000010
+ S
+ Columns
+ C
+
+
+
+
+ 000001
+ 01
+ 000001
+
+
+ 000001
+ 02
+ 000004
+
+
+ 000001
+ 03
+ 000006
+
+
+ 000001
+ 04
+ 000007
+
+
+ 000001
+ 05
+ 000008
+
+
+
+
+ 000001
+ 0001
+ 01
+ 00
+
+
+ 000001
+ 0001
+ 02
+ 12
+
+
+ 000001
+ 0001
+ 03
+ 39
+
+
+ 000001
+ 0001
+ 04
+ S
+
+
+ 000001
+ 0001
+ 05
+ 05
+
+
+ 000001
+ 0001
+ 06
+ 06
+
+
+ 000001
+ 0001
+ 07
+ S
+
+
+ 000001
+ 0001
+ 08
+ 28
+
+
+ 000001
+ 0001
+ 09
+ 40
+
+
+ 000001
+ 0001
+ 10
+ 29
+
+
+ 000001
+ 0001
+ 11
+ 38
+
+
+ 000001
+ 0001
+ 12
+ S
+
+
+ 000001
+ 0001
+ 13
+ 46
+
+
+ 000001
+ 0001
+ 14
+ S
+
+
+ 000001
+ 0001
+ 15
+ 31
+
+
+ 000001
+ 0001
+ 16
+ S
+
+
+ 000001
+ 0001
+ 17
+ 32
+
+
+ 000001
+ 0001
+ 18
+ 33
+
+
+ 000001
+ 0001
+ 19
+ 34
+
+
+ 000001
+ 0001
+ 20
+ S
+
+
+ 000001
+ 0001
+ 21
+ 36
+
+
+ 000001
+ 0001
+ 22
+ 13
+
+
+ 000001
+ 0001
+ 23
+ 22
+
+
+ 000001
+ 0001
+ 24
+ S
+
+
+ 000001
+ 0001
+ 25
+ 14
+
+
+ 000001
+ 0001
+ 26
+ 16
+
+
+ 000001
+ 0001
+ 27
+ 17
+
+
+ 000001
+ 0001
+ 28
+ 18
+
+
+ 000001
+ 0001
+ 29
+ 19
+
+
+ 000001
+ 0001
+ 30
+ S
+
+
+ 000001
+ 0001
+ 31
+ 21
+
+
+ 000001
+ 0001
+ 32
+ S
+
+
+ 000001
+ 0001
+ 33
+ 23
+
+
+
+
+ 000001
+ 00
+ GOON
+ 001
+
+
+ 000001
+ 00
+ GOON
+ 001
+
+
+ 000001
+ 01
+ &ELP
+ 001
+
+
+ 000001
+ 02
+ &IC1
+ 001
+
+
+ 000001
+ 03
+ &F03
+ 001
+
+
+ 000001
+ 04
+ &F4
+ 001
+
+
+ 000001
+ 05
+ &ALL
+ 001
+
+
+ 000001
+ 06
+ &SAL
+ 001
+
+
+ 000001
+ 08
+ &REFRESH
+ 001
+
+
+ 000001
+ 11
+ &SAVE
+ 001
+
+
+ 000001
+ 12
+ &F12
+ 001
+
+
+ 000001
+ 12
+ EABR
+ 001
+
+
+ 000001
+ 12
+ EABR
+ 001
+
+
+ 000001
+ 13
+ RECHECK
+ 001
+
+
+ 000001
+ 14
+ &ADD
+ 001
+
+
+ 000001
+ 15
+ &F15
+ 001
+
+
+ 000001
+ 16
+ &ADD_TP
+ 001
+
+
+ 000001
+ 17
+ &ADD_FILE
+ 001
+
+
+ 000001
+ 18
+ &DEL
+ 001
+
+
+ 000001
+ 19
+ &IMPORT
+ 001
+
+
+ 000001
+ 20
+ &DOC
+ 001
+
+
+ 000001
+ 21
+ &NCONF
+ 001
+
+
+ 000001
+ 22
+ DDIC
+ 001
+
+
+ 000001
+ 23
+ &PREP_XLS
+ 001
+
+
+ 000001
+ 25
+ &ABC
+ 001
+
+
+ 000001
+ 28
+ &OUP
+ 001
+
+
+ 000001
+ 29
+ &ILT
+ 001
+
+
+ 000001
+ 30
+ &UMC
+ 001
+
+
+ 000001
+ 31
+ %SL
+ 001
+
+
+ 000001
+ 32
+ &OL0
+ 001
+
+
+ 000001
+ 33
+ &OAD
+ 002
+
+
+ 000001
+ 34
+ &AVE
+ 002
+
+
+ 000001
+ 36
+ &INFO
+ 001
+
+
+ 000001
+ 37
+ &EB9
+ 001
+
+
+ 000001
+ 38
+ &ILD
+ 001
+
+
+ 000001
+ 39
+ &ETA
+ 001
+
+
+ 000001
+ 40
+ &ODN
+ 001
+
+
+ 000001
+ 42
+ &SUM
+ 001
+
+
+ 000001
+ 43
+ &VEXCEL
+ 001
+
+
+ 000001
+ 44
+ &AQW
+ 001
+
+
+ 000001
+ 45
+ %PC
+ 001
+
+
+ 000001
+ 46
+ &RNT_PREV
+ 001
+
+
+ 000001
+ 47
+ &GRAPH
+ 001
+
+
+ 000001
+ 71
+ %SC
+ 001
+
+
+ 000001
+ 84
+ %SC+
+ 001
+
+
+ 000001
+ 86
+ &RNT
+ 001
+
+
+
+
+ STANDARD_FULLSCREEN
+ %CH
+
+
+ STANDARD_FULLSCREEN
+ %ML
+
+
+ STANDARD_FULLSCREEN
+ %PC
+
+
+ STANDARD_FULLSCREEN
+ %SC
+
+
+ STANDARD_FULLSCREEN
+ %SC+
+
+
+ STANDARD_FULLSCREEN
+ %SL
+
+
+ STANDARD_FULLSCREEN
+ &ABC
+
+
+ STANDARD_FULLSCREEN
+ &ADD
+
+
+ STANDARD_FULLSCREEN
+ &ADD_FILE
+
+
+ STANDARD_FULLSCREEN
+ &ADD_TP
+
+
+ STANDARD_FULLSCREEN
+ &ALL
+
+
+ STANDARD_FULLSCREEN
+ &AQW
+
+
+ STANDARD_FULLSCREEN
+ &AUF
+
+
+ STANDARD_FULLSCREEN
+ &AVE
+
+
+ STANDARD_FULLSCREEN
+ &AVR
+
+
+ STANDARD_FULLSCREEN
+ &BS
+
+
+ STANDARD_FULLSCREEN
+ &BS+
+
+
+ STANDARD_FULLSCREEN
+ &BS-
+
+
+ STANDARD_FULLSCREEN
+ &CDF
+
+
+ STANDARD_FULLSCREEN
+ &CFI
+
+
+ STANDARD_FULLSCREEN
+ &COUNT
+
+
+ STANDARD_FULLSCREEN
+ &CRB
+
+
+ STANDARD_FULLSCREEN
+ &CRBATCH
+
+
+ STANDARD_FULLSCREEN
+ &CRDESIG
+
+
+ STANDARD_FULLSCREEN
+ &CRE
+
+
+ STANDARD_FULLSCREEN
+ &CRL
+
+
+ STANDARD_FULLSCREEN
+ &CRR
+
+
+ STANDARD_FULLSCREEN
+ &CRTEMPL
+
+
+ STANDARD_FULLSCREEN
+ &CRYSTAL
+
+
+ STANDARD_FULLSCREEN
+ &DAU
+
+
+ STANDARD_FULLSCREEN
+ &DEL
+
+
+ STANDARD_FULLSCREEN
+ &DOC
+
+
+ STANDARD_FULLSCREEN
+ &DOF
+
+
+ STANDARD_FULLSCREEN
+ &DON
+
+
+ STANDARD_FULLSCREEN
+ &EB3
+
+
+ STANDARD_FULLSCREEN
+ &EB9
+
+
+ STANDARD_FULLSCREEN
+ &ELP
+
+
+ STANDARD_FULLSCREEN
+ &ERW
+
+
+ STANDARD_FULLSCREEN
+ &ETA
+
+
+ STANDARD_FULLSCREEN
+ &F03
+
+
+ STANDARD_FULLSCREEN
+ &F12
+
+
+ STANDARD_FULLSCREEN
+ &F15
+
+
+ STANDARD_FULLSCREEN
+ &F4
+
+
+ STANDARD_FULLSCREEN
+ &GRAPH
+
+
+ STANDARD_FULLSCREEN
+ &IC1
+
+
+ STANDARD_FULLSCREEN
+ &ILD
+
+
+ STANDARD_FULLSCREEN
+ &ILT
+
+
+ STANDARD_FULLSCREEN
+ &IMPORT
+
+
+ STANDARD_FULLSCREEN
+ &INFO
+
+
+ STANDARD_FULLSCREEN
+ &KOM
+
+
+ STANDARD_FULLSCREEN
+ &LFO
+
+
+ STANDARD_FULLSCREEN
+ &LIS
+
+
+ STANDARD_FULLSCREEN
+ &MAX
+
+
+ STANDARD_FULLSCREEN
+ &MIN
+
+
+ STANDARD_FULLSCREEN
+ &NCONF
+
+
+ STANDARD_FULLSCREEN
+ &NFO
+
+
+ STANDARD_FULLSCREEN
+ &NTE
+
+
+ STANDARD_FULLSCREEN
+ &OAD
+
+
+ STANDARD_FULLSCREEN
+ &ODN
+
+
+ STANDARD_FULLSCREEN
+ &OL0
+
+
+ STANDARD_FULLSCREEN
+ &OLX
+
+
+ STANDARD_FULLSCREEN
+ &OMP
+
+
+ STANDARD_FULLSCREEN
+ &OPT
+
+
+ STANDARD_FULLSCREEN
+ &OUP
+
+
+ STANDARD_FULLSCREEN
+ &PREP_XLS
+
+
+ STANDARD_FULLSCREEN
+ &REFRESH
+
+
+ STANDARD_FULLSCREEN
+ &RNT
+
+
+ STANDARD_FULLSCREEN
+ &RNT_PREV
+
+
+ STANDARD_FULLSCREEN
+ &SAL
+
+
+ STANDARD_FULLSCREEN
+ &SAVE
+
+
+ STANDARD_FULLSCREEN
+ &SUM
+
+
+ STANDARD_FULLSCREEN
+ &UMC
+
+
+ STANDARD_FULLSCREEN
+ &URL
+
+
+ STANDARD_FULLSCREEN
+ &VCRYSTAL
+
+
+ STANDARD_FULLSCREEN
+ &VEXCEL
+
+
+ STANDARD_FULLSCREEN
+ &VGRID
+
+
+ STANDARD_FULLSCREEN
+ &VLOTUS
+
+
+ STANDARD_FULLSCREEN
+ &XINT
+
+
+ STANDARD_FULLSCREEN
+ &XML
+
+
+ STANDARD_FULLSCREEN
+ &XPA
+
+
+ STANDARD_FULLSCREEN
+ &XXL
+
+
+ STANDARD_FULLSCREEN
+ BAC1
+
+
+ STANDARD_FULLSCREEN
+ BACK
+
+
+ STANDARD_FULLSCREEN
+ BEB1
+
+
+ STANDARD_FULLSCREEN
+ BEB2
+
+
+ STANDARD_FULLSCREEN
+ BEB3
+
+
+ STANDARD_FULLSCREEN
+ BEB9
+
+
+ STANDARD_FULLSCREEN
+ BEBN
+
+
+ STANDARD_FULLSCREEN
+ COL0
+
+
+ STANDARD_FULLSCREEN
+ COLX
+
+
+ STANDARD_FULLSCREEN
+ DDIC
+
+
+ STANDARD_FULLSCREEN
+ DETA
+
+
+ STANDARD_FULLSCREEN
+ DRUK
+
+
+ STANDARD_FULLSCREEN
+ DSAL
+
+
+ STANDARD_FULLSCREEN
+ ENTE
+
+
+ STANDARD_FULLSCREEN
+ EXIT
+
+
+ STANDARD_FULLSCREEN
+ EXPA
+
+
+ STANDARD_FULLSCREEN
+ FILD
+
+
+ STANDARD_FULLSCREEN
+ FILT
+
+
+ STANDARD_FULLSCREEN
+ GLIS
+
+
+ STANDARD_FULLSCREEN
+ GOON
+
+
+ STANDARD_FULLSCREEN
+ HELP
+
+
+ STANDARD_FULLSCREEN
+ INFO
+
+
+ STANDARD_FULLSCREEN
+ KOMP
+
+
+ STANDARD_FULLSCREEN
+ P+
+
+
+ STANDARD_FULLSCREEN
+ P++
+
+
+ STANDARD_FULLSCREEN
+ P-
+
+
+ STANDARD_FULLSCREEN
+ P--
+
+
+ STANDARD_FULLSCREEN
+ PF09
+
+
+ STANDARD_FULLSCREEN
+ PF13
+
+
+ STANDARD_FULLSCREEN
+ PIC1
+
+
+ STANDARD_FULLSCREEN
+ PICK
+
+
+ STANDARD_FULLSCREEN
+ PRI
+
+
+ STANDARD_FULLSCREEN
+ PRIN
+
+
+ STANDARD_FULLSCREEN
+ PRNT
+
+
+ STANDARD_FULLSCREEN
+ RECHECK
+
+
+ STANDARD_FULLSCREEN
+ RW
+
+
+ STANDARD_FULLSCREEN
+ SALL
+
+
+ STANDARD_FULLSCREEN
+ SAUF
+
+
+ STANDARD_FULLSCREEN
+ SAVE
+
+
+ STANDARD_FULLSCREEN
+ SCRB
+
+
+ STANDARD_FULLSCREEN
+ SCRE
+
+
+ STANDARD_FULLSCREEN
+ SCRL
+
+
+ STANDARD_FULLSCREEN
+ SCRR
+
+
+ STANDARD_FULLSCREEN
+ SKOM
+
+
+ STANDARD_FULLSCREEN
+ SODN
+
+
+ STANDARD_FULLSCREEN
+ SOUP
+
+
+ STANDARD_FULLSCREEN
+ SUMC
+
+
+ STANDARD_FULLSCREEN
+ ZSUM
+
+
+
+
+ A
+ 000001
+ D
+ STANDARD_FULLSCREEN
+
+
+ P
+ 000001
+ P
+ STANDARD_FULLSCREEN
+
+
+ B
+ 000001
+ 0001
+ P
+ STANDARD_FULLSCREEN
+
+
+
+
+ 001
+ Transport Checking Tool (Object level) - Version &1
+
+
+
+
+
+ I
+ 008
+ Desktop not found
+ 50
+
+
+ I
+ 009
+ Save Transportlist
+ 50
+
+
+ I
+ 010
+ Object data retrieved...
+ 50
+
+
+ I
+ 011
+ Objects checked
+ 50
+
+
+ I
+ 013
+ Select a transportlist
+ 50
+
+
+ I
+ 014
+ Selecting data...
+ 50
+
+
+ I
+ 015
+ RC
+ 50
+
+
+ I
+ 016
+ Return Code
+ 50
+
+
+ I
+ 017
+ Descript.
+ 50
+
+
+ I
+ 018
+ Description
+ 50
+
+
+ I
+ 019
+ No transports need to be added
+ 50
+
+
+ I
+ 020
+ To see the conflicts, doubleclick the warning
+ 50
+
+
+ I
+ 021
+ No next conflict found
+ 50
+
+
+ I
+ 022
+ records read and added.
+ 50
+
+
+ I
+ 023
+ records checked (documentation)
+ 50
+
+
+ I
+ 024
+ Info
+ 50
+
+
+ I
+ 025
+ Clear
+ 50
+
+
+ I
+ 026
+ Def.
+ 50
+
+
+ I
+ 027
+ Information
+ 50
+
+
+ I
+ 028
+ General Info
+ 50
+
+
+ I
+ 029
+ Error occurred
+ 50
+
+
+ I
+ 031
+ Cancelled by user
+ 50
+
+
+ I
+ 033
+ ERR.
+ 50
+
+
+ I
+ 034
+ Warn
+ 50
+
+
+ I
+ 037
+ Yes
+ 50
+
+
+ I
+ 038
+ ERROR:
+ 50
+
+
+ I
+ 039
+ Runtime Alert
+ 13
+
+
+ I
+ 040
+ Counter
+ 7
+
+
+ I
+ 041
+ This will take approx. 5-15 minutes... Continue?
+ 48
+
+
+ I
+ 042
+ This has already been done. Do again?
+ 37
+
+
+ I
+ 043
+ No
+ 2
+
+
+ I
+ 044
+ Checked
+ 7
+
+
+ I
+ 045
+ Warning
+ 7
+
+
+ I
+ 046
+ Warn. text
+ 10
+
+
+ I
+ 049
+ File uploaded:
+ 14
+
+
+ I
+ 050
+ Checking buffer
+ 15
+
+
+ I
+ 051
+ DDIC not transported...
+ 26
+
+
+ I
+ 052
+ Retrieving Where Used list
+ 26
+
+
+ I
+ 053
+ Collecting DDIC transports
+ 29
+
+
+ I
+ 054
+ Warning message
+ 15
+
+
+ I
+ 055
+ Project Nr
+ 10
+
+
+ I
+ 056
+ Project Number
+ 14
+
+
+ I
+ 057
+ System
+ 6
+
+
+ I
+ 058
+ does not exist...
+ 17
+
+
+ I
+ 059
+ Import again
+ 12
+
+
+ I
+ 060
+ Transport being released. Recheck needed!
+ 50
+
+
+ I
+ 061
+ No file selected
+ 50
+
+
+ I
+ B10
+ Selection range / Upload file
+ 29
+
+
+ I
+ B21
+ Selection criteria
+ 18
+
+
+ I
+ B22
+ File upload
+ 14
+
+
+ I
+ B30
+ Transport Track
+ 15
+
+
+ I
+ B40
+ Check options
+ 13
+
+
+ I
+ B50
+ Exclude from check
+ 18
+
+
+ I
+ C21
+ User
+ 4
+
+
+ I
+ C22
+ File name
+ 9
+
+
+ I
+ C31
+ Route
+ 5
+
+
+ I
+ C32
+ -->
+ 3
+
+
+ I
+ C40
+ Do not select transports already in production
+ 49
+
+
+ I
+ C41
+ Use User specific layout
+ 24
+
+
+ I
+ C42
+ Check transport buffer
+ 27
+
+
+ I
+ C43
+ Check table keys
+ 16
+
+
+ I
+ C44
+ Reset `Checked` field
+ 21
+
+
+ I
+ C45
+ Remove transports not in buffer
+ 50
+
+
+ I
+ C46
+ Message if cofiles are missing
+ 132
+
+
+ I
+ C51
+ Objects in the range will not be taken into account when checking the
+ 132
+
+
+ I
+ C52
+ transports. Useful to exclude common customizing tables (like SWOTICE for
+ 132
+
+
+ I
+ C53
+ workflow or the tables for Pricing procedures).
+ 47
+
+
+ I
+ H01
+ If there is a warning icon in column 'Warning', double-clicking on the
+ 132
+
+
+ I
+ H02
+ icon will display a list of objects that should be checked.
+ 132
+
+
+ I
+ H03
+ You can add these conflicts by means of the button 'Add Conflicts' in
+ 132
+
+
+ I
+ H04
+ the application toolbar or doubleclicking the warning.
+ 132
+
+
+ I
+ M02
+ Some transports will be deleted from the list
+ 50
+
+
+ I
+ M03
+ because they are missing in Acceptance or are
+ 48
+
+
+ I
+ M04
+ already in Production but not marked for
+ 43
+
+
+ I
+ M05
+ re-import. Please check the main list.
+ 41
+
+
+ I
+ M06
+ No rows selected: No transports will be added
+ 50
+
+
+ I
+ M07
+ No rows selected: Table keys will not be checked
+ 48
+
+
+ I
+ M08
+ ERROR: ERROR_IN_FIELDS
+ 22
+
+
+ I
+ M09
+ Cancelled: Table keys will not be checked
+ 41
+
+
+ I
+ M10
+ Please select records or put the cursor on a row
+ 48
+
+
+ I
+ M11
+ No records selected that can be re-imported
+ 43
+
+
+ I
+ M12
+ Transport not in Transport Buffer
+ 36
+
+
+ I
+ M13
+ No transports found...
+ 22
+
+
+ I
+ M14
+ Object cannot be displayed...
+ 29
+
+
+ I
+ M15
+ Data Dictionary check finished...
+ 33
+
+
+ I
+ T01
+ Selected transports
+ 19
+
+
+ I
+ T03
+ Error Creating ALV Grid
+ 23
+
+
+ I
+ T04
+ No of Records found:
+ 20
+
+
+ I
+ T05
+ Information
+ 11
+
+
+ I
+ T06
+ Select the tables for which the keys must be checked
+ 55
+
+
+ I
+ W01
+ Newer version in target environment!
+ 50
+
+
+ I
+ W03
+ Uses object not in list or target environment
+ 50
+
+
+ I
+ W04
+ Conflicts are dealt with
+ 50
+
+
+ I
+ W05
+ Object missing in list and target environment!
+ 49
+
+
+ I
+ W11
+ Overwrites version(s), newer version in list
+ 44
+
+
+ I
+ W16
+ Log couldn't be read or TP not released
+ 40
+
+
+ I
+ W17
+ Previous transport not transported
+ 40
+
+
+ I
+ W18
+ Marked for re-import to target environment
+ 45
+
+
+ I
+ W19
+ Transport not released
+ 40
+
+
+ I
+ W20
+ Release started
+ 40
+
+
+ I
+ W21
+ Couldn't read log, but object in list
+ 40
+
+
+ I
+ W22
+ Newer version in test environment, but in list
+ 49
+
+
+ I
+ W23
+ Newer version in test environment
+ 41
+
+
+ I
+ W24
+ Transport not possible
+ 22
+
+
+ R
+ Transport Checking Tool (Object level)
+ 38
+
+
+ S
+ P_CHD
+ Reset 'Checked' field
+ 29
+
+
+ S
+ P_CHKKY
+ Check table keys
+ 24
+
+
+ S
+ P_FILE
+ File name
+ 17
+
+
+ S
+ P_PRD
+ Production
+ 18
+
+
+ S
+ P_QAS
+ Acceptance
+ 18
+
+
+ S
+ P_SEL
+ Build transport list
+ 28
+
+
+ S
+ P_STR
+ Short Description
+ 25
+
+
+ S
+ P_UPL
+ Upload transport list
+ 29
+
+
+ S
+ P_USER
+ Use User specific layout
+ 32
+
+
+ S
+ S_DATE
+ Date
+ 12
+
+
+ S
+ S_EXOBJ
+ Obj. Name
+ 17
+
+
+ S
+ S_KORR
+ Request number
+ 22
+
+
+ S
+ S_PROJ
+ CTS Project
+ 19
+
+
+ S
+ S_USER
+ User Name
+ 17
+
+
+
+
+ N
+
+
+ I
+ 008
+ Desktop not found
+ 50
+
+
+ I
+ 009
+ Save Transportlist
+ 50
+
+
+ I
+ 010
+ Object data retrieved...
+ 50
+
+
+ I
+ 011
+ Objects checked
+ 50
+
+
+ I
+ 013
+ Select a transportlist
+ 50
+
+
+ I
+ 014
+ Selecting data...
+ 50
+
+
+ I
+ 015
+ RC
+ 50
+
+
+ I
+ 016
+ Return Code
+ 50
+
+
+ I
+ 017
+ Descript.
+ 50
+
+
+ I
+ 018
+ Description
+ 50
+
+
+ I
+ 019
+ No transports need to be added
+ 50
+
+
+ I
+ 020
+ To see the conflicts, doubleclick the warning
+ 50
+
+
+ I
+ 021
+ No next conflict found
+ 50
+
+
+ I
+ 022
+ records read and added.
+ 50
+
+
+ I
+ 023
+ records checked (documentation)
+ 50
+
+
+ I
+ 024
+ Info
+ 50
+
+
+ I
+ 025
+ Clear
+ 50
+
+
+ I
+ 026
+ Def.
+ 50
+
+
+ I
+ 027
+ Information
+ 50
+
+
+ I
+ 028
+ General Info
+ 50
+
+
+ I
+ 029
+ Error occurred
+ 50
+
+
+ I
+ 031
+ Cancelled by user
+ 50
+
+
+ I
+ 033
+ ERR.
+ 50
+
+
+ I
+ 034
+ Warn
+ 50
+
+
+ I
+ 037
+ Yes
+ 50
+
+
+ I
+ 038
+ ERROR:
+ 50
+
+
+ I
+ 039
+ Runtime Alert
+ 13
+
+
+ I
+ 040
+ Counter
+ 7
+
+
+ I
+ 041
+ This will take approx. 5-15 minutes... Continue?
+ 48
+
+
+ I
+ 042
+ This has already been done. Do again?
+ 37
+
+
+ I
+ 043
+ No
+ 2
+
+
+ I
+ 044
+ Checked
+ 7
+
+
+ I
+ 045
+ Warning
+ 7
+
+
+ I
+ 046
+ Warn. text
+ 10
+
+
+ I
+ 049
+ File uploaded:
+ 14
+
+
+ I
+ 050
+ Checking buffer
+ 15
+
+
+ I
+ 051
+ DDIC not transported...
+ 26
+
+
+ I
+ 052
+ Retrieving Where Used list
+ 26
+
+
+ I
+ 053
+ Collecting DDIC transports
+ 29
+
+
+ I
+ 054
+ Warning message
+ 15
+
+
+ I
+ 055
+ Project Nr
+ 10
+
+
+ I
+ 056
+ Project Number
+ 14
+
+
+ I
+ 057
+ System
+ 6
+
+
+ I
+ 058
+ does not exist...
+ 17
+
+
+ I
+ 059
+ Import again
+ 12
+
+
+ I
+ 060
+ Transport being released. Recheck needed!
+ 50
+
+
+ I
+ 061
+ No file selected
+ 50
+
+
+ I
+ B10
+ Selection range / Upload file
+ 29
+
+
+ I
+ B21
+ Selection criteria
+ 18
+
+
+ I
+ B22
+ File upload
+ 14
+
+
+ I
+ B30
+ Transport Track
+ 15
+
+
+ I
+ B40
+ Check options
+ 13
+
+
+ I
+ B50
+ Exclude from check
+ 18
+
+
+ I
+ C21
+ User
+ 4
+
+
+ I
+ C22
+ File name
+ 9
+
+
+ I
+ C31
+ Route
+ 5
+
+
+ I
+ C32
+ -->
+ 3
+
+
+ I
+ C40
+ Do not select transports already in production
+ 49
+
+
+ I
+ C41
+ Use User specific layout
+ 24
+
+
+ I
+ C42
+ Check transport buffer
+ 27
+
+
+ I
+ C43
+ Check table keys
+ 16
+
+
+ I
+ C44
+ Reset `Checked` field
+ 21
+
+
+ I
+ C45
+ Remove transports not in buffer
+ 50
+
+
+ I
+ C46
+ Message if cofiles are missing
+ 132
+
+
+ I
+ C51
+ Objects in the range will not be taken into account when checking the
+ 132
+
+
+ I
+ C52
+ transports. Useful to exclude common customizing tables (like SWOTICE for
+ 132
+
+
+ I
+ C53
+ workflow or the tables for Pricing procedures).
+ 47
+
+
+ I
+ H01
+ If there is a warning icon in column `Warning`, double-clicking on the icon will display a list of objects that should be checked.
+ 132
+
+
+ I
+ H02
+ You can add these conflicts by means of the button 'Add Conflicts' in the application toolbar or doubleclicking the warning.
+ 132
+
+
+ I
+ M02
+ Some transports were deleted from the list because
+ 50
+
+
+ I
+ M03
+ they are missing in Acceptance or are already in
+ 48
+
+
+ I
+ M04
+ Production but not marked for re-import.
+ 43
+
+
+ I
+ M05
+ Please check the main list.
+ 41
+
+
+ I
+ M06
+ No rows selected: No transports will be added
+ 50
+
+
+ I
+ M07
+ No rows selected: Table keys will not be checked
+ 48
+
+
+ I
+ M08
+ ERROR: ERROR_IN_FIELDS
+ 22
+
+
+ I
+ M09
+ Cancelled: Table keys will not be checked
+ 41
+
+
+ I
+ M10
+ Please select records or put the cursor on a row
+ 48
+
+
+ I
+ M11
+ No records selected that can be re-imported
+ 43
+
+
+ I
+ M12
+ Transport not in Transport Buffer
+ 36
+
+
+ I
+ M13
+ No transports found...
+ 22
+
+
+ I
+ M14
+ Object cannot be displayed...
+ 29
+
+
+ I
+ M15
+ Data Dictionary check finished...
+ 33
+
+
+ I
+ T01
+ Selected transports
+ 19
+
+
+ I
+ T03
+ Error Creating ALV Grid
+ 23
+
+
+ I
+ T04
+ No of Records found:
+ 20
+
+
+ I
+ T05
+ Information
+ 11
+
+
+ I
+ T06
+ Select the tables for which
+ 55
+
+
+ I
+ W01
+ Newer version in target environment!
+ 50
+
+
+ I
+ W03
+ Uses object not in list or production
+ 50
+
+
+ I
+ W04
+ Conflicts are dealt with
+ 50
+
+
+ I
+ W05
+ Object missing in list and target environment!
+ 49
+
+
+ I
+ W11
+ Overwrites version(s), newer version in list
+ 44
+
+
+ I
+ W16
+ Log couldn't be read or TP not released
+ 40
+
+
+ I
+ W17
+ Previous transport not transported
+ 40
+
+
+ I
+ W18
+ Marked for re-import to target environment
+ 45
+
+
+ I
+ W19
+ Transport not released
+ 40
+
+
+ I
+ W20
+ Release started
+ 40
+
+
+ I
+ W21
+ Couldn't read log, but object in list
+ 40
+
+
+ I
+ W22
+ Newer version in Acceptance, but in list
+ 49
+
+
+ I
+ W23
+ Newer version in test environment
+ 41
+
+
+ I
+ W24
+ Transport not possible
+ 22
+
+
+ R
+ Transport Checking Tool (Object level)
+ 70
+
+
+ S
+ P_CHD
+ Reset 'Checked' field
+ 29
+
+
+ S
+ P_CHKKY
+ Check table keys
+ 24
+
+
+ S
+ P_FILE
+ File name
+ 17
+
+
+ S
+ P_PRD
+ Production
+ 18
+
+
+ S
+ P_QAS
+ Acceptance
+ 18
+
+
+ S
+ P_SEL
+ Build transport list
+ 28
+
+
+ S
+ P_STR
+ Short Description
+ 25
+
+
+ S
+ P_UPL
+ Upload transport list
+ 29
+
+
+ S
+ P_USER
+ Use User specific layout
+ 32
+
+
+ S
+ S_DATE
+ Date
+ 12
+
+
+ S
+ S_EXOBJ
+ Obj. Name
+ 17
+
+
+ S
+ S_KORR
+ Request number
+ 22
+
+
+ S
+ S_PROJ
+ CTS Project
+ 19
+
+
+ S
+ S_USER
+ User Name
+ 17
+
+
+
+
+
+
+
diff --git a/src/zev_tp_checktool_add_file.doct.xml b/src/zev_tp_checktool_add_file.doct.xml
new file mode 100644
index 0000000..480ae97
--- /dev/null
+++ b/src/zev_tp_checktool_add_file.doct.xml
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+ TX
+
+ E
+ E
+ 0002
+ X
+ 00009
+ A
+
+
+ DOKU
+ ZEV_TP_CHECKTOOL_ADD_FILE
+ TX
+ E
+ S_DOCU_SHOW
+ S_DOCUS1
+ 00002
+ 072
+
+
+
+ U2
+ NOTE:
+
+
+ *
+ Uploading files does NOT automatically recheck the list.
+
+
+ *
+ Reason: When combining multiple ZTCT files, these should be
+
+
+ correct already. When a large number of files is combined, containing
+
+
+ many transports, auto-checking would be too time consuming. Combining
+
+
+ files must be easy and quick.
+
+
+ *
+ First collect and combine ALL the files.
+
+
+ *
+ Then, when all files have been combined use the RECHECK button to do a
+
+
+ final check on all transports.
+
+
+
+
+
+
+
diff --git a/src/zev_tp_checktool_buff.doct.xml b/src/zev_tp_checktool_buff.doct.xml
new file mode 100644
index 0000000..0e3fcfa
--- /dev/null
+++ b/src/zev_tp_checktool_buff.doct.xml
@@ -0,0 +1,85 @@
+
+
+
+
+
+
+
+ TX
+
+ E
+ E
+ 0006
+ X
+ 00015
+ A
+
+
+ DOKU
+ ZEV_TP_CHECKTOOL_BUFF
+ TX
+ E
+ S_DOCU_SHOW
+ S_DOCUS1
+ 00006
+ 072
+
+
+
+ U2
+ Information
+
+
+ *
+ If a transport is no longer in the buffer, the most likely reason will
+
+
+ be that transport has been removed from the buffer.
+
+
+ *
+ E.g. the transport contained an error and a new correction transport was
+
+
+ created to fix the issue. The original transport should never be moved
+
+
+ to production.
+
+
+ *
+ The option to check the buffer is default switched to ON. If a
+
+
+ transportis not found in the buffer, a warning message will be given.
+
+
+ The user can then check if this transport needs to be skipped.
+
+
+ *
+ If there are transports in the output that are no longer in the buffer,
+
+
+ run the program again with the 'Check transport buffer' switched OFF.
+
+
+ *
+ The correction transport for this object should be either in the list as
+
+
+ well (Information message) or already in production (ERROR message).
+
+
+ *
+ There is also an option to automatically remove the transports that are
+
+
+ not in the buffer.
+
+
+
+
+
+
+
diff --git a/src/zev_tp_checktool_ckey.doct.xml b/src/zev_tp_checktool_ckey.doct.xml
new file mode 100644
index 0000000..9e42439
--- /dev/null
+++ b/src/zev_tp_checktool_ckey.doct.xml
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+ TX
+
+ E
+ E
+ 0003
+ X
+ 00018
+ A
+
+
+ DOKU
+ ZEV_TP_CHECKTOOL_CKEY
+ TX
+ E
+ S_DOCU_SHOW
+ S_DOCUS1
+ 00003
+ 072
+
+
+
+ U2
+ Information
+
+
+ *
+ Not all tables will need to be checked. Tables for authorisations (e.g.
+
+
+ UST12) are huge and will often have unique keys anyway. Default setting
+
+
+ is ON.
+
+
+ U2
+ When flagged:
+
+
+ *
+ The program will open a popup window with all the tables that are found
+
+
+ in the transport list.
+
+
+ *
+ In the popup the user has the option to select the rows for which a
+
+
+ check should be done. The program will then check the table entries
+
+
+ found in the transport, using the table keys.
+
+
+ *
+ Advised is to select all tables in the popup, except the ones the user
+
+
+ knows are not important.
+
+
+ U2
+ When NOT flagged:
+
+
+ *
+ Tables that are not selected will not be checked.
+
+
+ *
+ PLEASE NOTE: This does not mean that there won't not be a conflict. The
+
+
+ check on table key is skipped. A warning on a table (e.g. newer
+
+
+ transport in Production) would be meaningless without checking the table
+
+
+ key.
+
+
+
+
+
+
+
diff --git a/src/ztct.tran.xml b/src/ztct.tran.xml
new file mode 100644
index 0000000..fb3dcf7
--- /dev/null
+++ b/src/ztct.tran.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+ ZTCT
+ ZEV_TP_CHECKTOOL
+ 1000
+ gA==
+
+
+ ZTCT
+ X
+
+
+ E
+ ZTCT
+ Transport Checking Tool
+
+
+
+