*&---------------------------------------------------------------------* *& Include zabapgit_requirements *&---------------------------------------------------------------------* "! Helper class for checking requirements / dependencies CLASS lcl_requirement_helper DEFINITION FINAL. PUBLIC SECTION. TYPES: BEGIN OF gty_status, met TYPE abap_bool, component TYPE dlvunit, description TYPE text80, installed_release TYPE saprelease, installed_patch TYPE sappatchlv, required_release TYPE saprelease, required_patch TYPE sappatchlv, END OF gty_status, gty_status_tab TYPE STANDARD TABLE OF gty_status WITH DEFAULT KEY. CLASS-METHODS: "! Check if the given requirements are met with user interaction "!

"! Shows a popup if requested and asks the user if he wants to continue if there are unmet "! requirements. If not an exception is raised. "!

"! @parameter it_requirements | The requirements to check "! @parameter iv_show_popup | Show popup with requirements "! @raising lcx_exception | Cancelled by user or internal error check_requirements IMPORTING it_requirements TYPE lcl_dot_abapgit=>ty_requirement_tab iv_show_popup TYPE abap_bool DEFAULT abap_true RAISING lcx_exception, "! Get a table with information about each requirement "! @parameter it_requirements | Requirements "! @parameter rt_status | Result "! @raising lcx_exception | Internal error get_requirement_met_status IMPORTING it_requirements TYPE lcl_dot_abapgit=>ty_requirement_tab RETURNING VALUE(rt_status) TYPE gty_status_tab RAISING lcx_exception. PROTECTED SECTION. PRIVATE SECTION. CLASS-METHODS: show_requirement_popup IMPORTING it_requirements TYPE gty_status_tab RAISING lcx_exception, version_greater_or_equal IMPORTING is_status TYPE gty_status RETURNING VALUE(rv_true) TYPE abap_bool. ENDCLASS. CLASS lcl_requirement_helper IMPLEMENTATION. METHOD check_requirements. DATA: lt_met_status TYPE gty_status_tab, lv_answer TYPE c LENGTH 1. lt_met_status = get_requirement_met_status( it_requirements ). IF iv_show_popup = abap_true. show_requirement_popup( lt_met_status ). ENDIF. LOOP AT lt_met_status TRANSPORTING NO FIELDS WHERE met = abap_false. EXIT. ENDLOOP. IF sy-subrc = 0. CALL FUNCTION 'POPUP_TO_CONFIRM' EXPORTING text_question = 'The project has unmet requirements. Install anyways?' IMPORTING answer = lv_answer. IF lv_answer <> '1'. lcx_exception=>raise( 'Cancelling because of unmet requirements.' ). ENDIF. ENDIF. ENDMETHOD. METHOD get_requirement_met_status. DATA: lt_installed TYPE STANDARD TABLE OF cvers_sdu. FIELD-SYMBOLS: TYPE lcl_dot_abapgit=>ty_requirement, TYPE gty_status, TYPE cvers_sdu. CALL FUNCTION 'DELIVERY_GET_INSTALLED_COMPS' TABLES tt_comptab = lt_installed EXCEPTIONS no_release_found = 1 OTHERS = 2. IF sy-subrc <> 0. lcx_exception=>raise( |Error from DELIVERY_GET_INSTALLED_COMPS { sy-subrc }| ) ##NO_TEXT. ENDIF. LOOP AT it_requirements ASSIGNING . APPEND INITIAL LINE TO rt_status ASSIGNING . -component = -component. -required_release = -min_release. -required_patch = -min_patch. READ TABLE lt_installed WITH KEY component = -component ASSIGNING . IF sy-subrc = 0. -installed_release = -release. -installed_patch = -extrelease. -description = -desc_text. -met = version_greater_or_equal( ). ENDIF. UNASSIGN . ENDLOOP. ENDMETHOD. METHOD version_greater_or_equal. DATA: lv_number TYPE numc4. TRY. MOVE EXACT: is_status-installed_release TO lv_number, is_status-installed_patch TO lv_number, is_status-required_release TO lv_number, is_status-required_patch TO lv_number. CATCH cx_sy_conversion_error. " Cannot compare by number, assume requirement not fullfilled (user can force install " anyways if this was an error) rv_true = abap_false. RETURN. ENDTRY. " Check if versions are comparable by number IF is_status-installed_release > is_status-required_release OR ( is_status-installed_release = is_status-required_release AND ( is_status-required_patch IS INITIAL OR is_status-installed_patch >= is_status-required_patch ) ). rv_true = abap_true. ENDIF. ENDMETHOD. METHOD show_requirement_popup. CONSTANTS: lc_color_column_name TYPE lvc_fname VALUE 'COLOR'. DATA: lo_alv TYPE REF TO cl_salv_table, lo_column TYPE REF TO cl_salv_column, lr_colored_table TYPE REF TO data, lo_tab_descr TYPE REF TO cl_abap_tabledescr, lo_struct_descr TYPE REF TO cl_abap_structdescr, lo_enh_struct_descr TYPE REF TO cl_abap_structdescr, lo_enh_tab_descr TYPE REF TO cl_abap_tabledescr, lt_comps TYPE cl_abap_structdescr=>component_table, lt_color_neg TYPE lvc_t_scol, lt_color_pos TYPE lvc_t_scol, ls_color TYPE lvc_s_scol, lx_ex TYPE REF TO cx_root. FIELD-SYMBOLS: TYPE abap_componentdescr, TYPE STANDARD TABLE, TYPE data, TYPE lvc_t_scol, TYPE abap_bool. ls_color-color-col = col_negative. APPEND ls_color TO lt_color_neg. ls_color-color-col = col_positive. APPEND ls_color TO lt_color_pos. CLEAR ls_color. lo_tab_descr ?= cl_abap_typedescr=>describe_by_data( it_requirements ). lo_struct_descr ?= lo_tab_descr->get_table_line_type( ). lt_comps = lo_struct_descr->get_components( ). APPEND INITIAL LINE TO lt_comps ASSIGNING . -name = lc_color_column_name. -type ?= cl_abap_typedescr=>describe_by_name( 'LVC_T_SCOL' ). lo_enh_struct_descr = cl_abap_structdescr=>get( lt_comps ). lo_enh_tab_descr = cl_abap_tabledescr=>get( lo_enh_struct_descr ). CREATE DATA lr_colored_table TYPE HANDLE lo_enh_tab_descr. ASSERT lr_colored_table IS BOUND. ASSIGN lr_colored_table->* TO . ASSERT IS ASSIGNED. MOVE-CORRESPONDING it_requirements TO . LOOP AT ASSIGNING . ASSIGN COMPONENT 'MET' OF STRUCTURE TO . ASSERT IS ASSIGNED. ASSIGN COMPONENT lc_color_column_name OF STRUCTURE TO . ASSERT IS ASSIGNED. IF = abap_false. = lt_color_neg. ELSE. = lt_color_pos. ENDIF. UNASSIGN: , . ENDLOOP. UNASSIGN . TRY. cl_salv_table=>factory( IMPORTING r_salv_table = lo_alv CHANGING t_table = ). lo_alv->get_columns(: )->get_column( 'MET' )->set_short_text( 'Met' ), )->set_color_column( lc_color_column_name ), )->set_optimize( ), ). lo_column = lo_alv->get_columns( )->get_column( 'REQUIRED_RELEASE' ). lo_column->set_fixed_header_text( 'S'). lo_column->set_short_text( 'Req. Rel.' ). lo_column = lo_alv->get_columns( )->get_column( 'REQUIRED_PATCH' ). lo_column->set_fixed_header_text( 'S'). lo_column->set_short_text( 'Req. SP L.' ). lo_alv->set_screen_popup( start_column = 30 end_column = 100 start_line = 10 end_line = 20 ). lo_alv->get_display_settings( )->set_list_header( 'Requirements' ). lo_alv->display( ). CATCH cx_salv_msg cx_salv_not_found cx_salv_data_error INTO lx_ex. RAISE EXCEPTION TYPE lcx_exception EXPORTING iv_text = lx_ex->get_text( ) ix_previous = lx_ex. ENDTRY. ENDMETHOD. ENDCLASS.