采购订单逐级取消审批增强

业务描述 :在采购订单审批完成后,想要做到逐级取消审批,因为现在SAP的逻辑是,不需要上级先取消审批,下级就可以取消审批,不太符合绝大多数公司的业务需求。业务人员想通过增强的方式加以控制,确保审批可以逐级取消。

具体实现:

增强点:包含文件->LMERELVICI1

主要部分代码

ENHANCEMENT 1  ZLMERELVICI1_CHECK.    "active version
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(36) Klasse LCL_RELVIEW_MM, Methode HOTSPOT_CLICK, Anfang, Erweiterung ZLMERELVICI1_CHECK, Anfang                                                     A
*
  DATA: ls_data1 LIKE LINE OF my_grid_data1,
        l_line1  TYPE i.
  IF  SY-TCODE = 'ME29N'.
     CHECK my_grid_layout EQ 1.
    l_line1 = e_row_id-index.
    IF l_line1 = '1'.
    READ TABLE my_grid_data1 INTO ls_data1 INDEX 2.
     IF sy-subrc = 0.
        my_tmp_rel_code = ls_data1-rel_code.
      CASE  'ICON'."e_column_id-fieldname.
      WHEN 'ICON'.
        CASE ls_data1-ICON.
         WHEN my_icon_reject  .
         WHEN my_icon_allow .
         WHEN MY_ICON_CHECKED.
             MESSAGE '采购经理还未取消审批!' TYPE 'S' DISPLAY LIKE 'E'.
             EXIT.
          WHEN my_icon_set_state.
        ENDCASE.
      WHEN 'STEXT'.
     ENDCASE.
    ENDIF.
    ELSEIF l_line1 = '2' .
READ TABLE my_grid_data1 INTO ls_data1 INDEX 3.
     IF sy-subrc = 0.
        my_tmp_rel_code = ls_data1-rel_code.
      CASE  'ICON'."e_column_id-fieldname.
      WHEN 'ICON'.
        CASE ls_data1-ICON.
         WHEN my_icon_reject  .
         WHEN my_icon_allow .
         WHEN MY_ICON_CHECKED.
             MESSAGE '主管还未取消审批!' TYPE 'S' DISPLAY LIKE 'E'.
             EXIT.
          WHEN my_icon_set_state.
        ENDCASE.
      WHEN 'STEXT'.
     ENDCASE.
    ENDIF.
   ENDIF.
  ENDIF.
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(37) Klasse LCL_RELVIEW_MM, Methode HOTSPOT_CLICK, Anfang, Erweiterung ZLMERELVICI1_CHECK, Ende                                                       A
ENDENHANCEMENT.

全部代码:

*---------------------------------------------------------------------*
*       CLASS lcl_relview_mm IMPLEMENTATION
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
CLASS lcl_relview_mm IMPLEMENTATION.

*----------------------------------------------------------------------*
*
*  Class contructor: build icons
*
*----------------------------------------------------------------------*
  METHOD class_constructor.
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(2) Klasse LCL_RELVIEW_MM, Methode CLASS_CONSTRUCTOR, Anfang                                                                                          A

    DATA: l_info TYPE icont-quickinfo.

    l_info = text-007.                 " freigegeben
    CALL FUNCTION 'ICON_CREATE'
      EXPORTING
        name   = icon_checked
        info   = l_info
      IMPORTING
        result = my_icon_checked
      EXCEPTIONS
        OTHERS = 0.

    l_info = text-013.                 "Endfreigabe
    CALL FUNCTION 'ICON_CREATE'
      EXPORTING
        name   = icon_element
        info   = l_info
      IMPORTING
        result = my_icon_element
      EXCEPTIONS
        OTHERS = 0.

    l_info = text-008.                 "Frg moeglich
    CALL FUNCTION 'ICON_CREATE'
      EXPORTING
        name   = icon_led_yellow
        info   = l_info
      IMPORTING
        result = my_led_yellow
      EXCEPTIONS
        OTHERS = 0.

    l_info = text-005.                 "Freigabemöglichkeiten
    CALL FUNCTION 'ICON_CREATE'
      EXPORTING
        name   = icon_toggle_function
        info   = l_info
      IMPORTING
        result = my_icon_toggle1_function
      EXCEPTIONS
        OTHERS = 0.

    l_info = text-010.                 "Kombi. Endfreigabe
    CALL FUNCTION 'ICON_CREATE'
      EXPORTING
        name   = icon_toggle_function
        info   = l_info
      IMPORTING
        result = my_icon_toggle2_function
      EXCEPTIONS
        OTHERS = 0.

    l_info =  text-012.                "Simulation
    CALL FUNCTION 'ICON_CREATE'
      EXPORTING
        name   = icon_simulate
        info   = l_info
      IMPORTING
        result = my_icon_simulate
      EXCEPTIONS
        OTHERS = 0.

    l_info = text-004.                 "Freigabestrategie
    CALL FUNCTION 'ICON_CREATE'
      EXPORTING
        name   = icon_release
        info   = l_info
      IMPORTING
        result = my_icon_release
      EXCEPTIONS
        OTHERS = 0.

    l_info = text-015.                 "Ablehnen
    CALL FUNCTION 'ICON_CREATE'
      EXPORTING
        name   = icon_reject
        info   = l_info
      IMPORTING
        result = my_icon_reject
      EXCEPTIONS
        OTHERS = 0.

    l_info =  text-016.                "Rücksetzen Ablehnung
    CALL FUNCTION 'ICON_CREATE'
      EXPORTING
        name   = icon_system_undo
        info   = l_info
      IMPORTING
        result = my_icon_allow
      EXCEPTIONS
        OTHERS = 0.

    l_info = text-004.                 "Freigabe
    CALL FUNCTION 'ICON_CREATE'
      EXPORTING
        name   = icon_set_state
        info   = l_info
      IMPORTING
        result = my_icon_set_state
      EXCEPTIONS
        OTHERS = 0.

    l_info =  text-018.                "Rücksetzen Freigabe
    CALL FUNCTION 'ICON_CREATE'
      EXPORTING
        name   = icon_system_undo
        info   = l_info
      IMPORTING
        result = my_icon_system_undo
      EXCEPTIONS
        OTHERS = 0.

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(3) Klasse LCL_RELVIEW_MM, Methode CLASS_CONSTRUCTOR, Ende                                                                                            A
  ENDMETHOD.                    "class_constructor

*----------------------------------------------------------------------*
* Set the model. Dependent objects my_strategy and my_state
* have to be determined
*----------------------------------------------------------------------*
  METHOD set_model.
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(4) Klasse LCL_RELVIEW_MM, Methode SET_MODEL, Anfang                                                                                                  A

    CALL METHOD get_extended_model
      EXPORTING
        im_model    = im_model
      IMPORTING
        ex_strategy = my_strategy
        ex_state    = my_state.

    CALL METHOD set_layout( 1 ).

    CALL METHOD super->set_model( im_model ).

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(5) Klasse LCL_RELVIEW_MM, Methode SET_MODEL, Ende                                                                                                    A
  ENDMETHOD.                    "set_model

*----------------------------------------------------------------------*
*  Fcode handling
*----------------------------------------------------------------------*
  METHOD execute.
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(6) Klasse LCL_RELVIEW_MM, Methode EXECUTE, Anfang                                                                                                    A

    DATA: l_releasable TYPE REF TO if_releasable_mm,
          l_all        TYPE mmpur_bool VALUE mmpur_no,
          l_ok     TYPE mmpur_bool,
          l_reset  TYPE mmpur_bool.

    CALL METHOD super->execute
      CHANGING
        im_fcode = im_fcode.

    CASE  im_fcode.

* Anzeige toggeln
      WHEN 'MEPO_REL_GENERAL_FIN'.
        IF my_grid_layout = 1.
          CALL METHOD set_layout( 2 ).
        ELSEIF my_grid_layout = 2.
          CALL METHOD set_layout( 1 ).
        ENDIF.
        CALL METHOD fs_get( im_model = my_model ).

* Simulation an/aus
      WHEN 'MEPO_REL_GENERAL_SIM'.
        IF my_grid_layout = 1 OR
           my_grid_layout = 2.
          CALL METHOD set_layout( 3 ).
        ELSE.
          CALL METHOD set_layout( 1 ).
        ENDIF.
        CALL METHOD fs_get( im_model = my_model ).

* Freigeben
      WHEN 'MERELEASE'.
        mmpur_dynamic_cast l_releasable my_model.
        IF NOT l_releasable IS INITIAL AND
           is_active( ) EQ mmpur_yes.
          IF my_tmp_rel_code IS INITIAL.
            l_all = mmpur_yes.
          ENDIF.
          CALL METHOD l_releasable->initiate_release
            EXPORTING
              im_code  = my_tmp_rel_code
              im_all   = l_all
              im_reset = mmpur_no
            EXCEPTIONS
              failed   = 1.
          IF sy-subrc EQ 1.
            MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno
                    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
          ELSEIF l_all EQ mmpur_no.
            MESSAGE s106(me) WITH my_tmp_rel_code.
          ELSE.
            MESSAGE s804(mepo).
          ENDIF.
        ENDIF.
        CLEAR my_tmp_rel_code.

* Zurücksetzen Freigabe
      WHEN 'MERESET'.
        mmpur_dynamic_cast l_releasable my_model.
        IF NOT l_releasable IS INITIAL AND
           is_active( ) EQ mmpur_yes.
          IF my_tmp_rel_code IS INITIAL.
            l_all = mmpur_yes.
          ENDIF.
          CALL METHOD l_releasable->initiate_release
            EXPORTING
              im_code  = my_tmp_rel_code
              im_all   = l_all
              im_reset = mmpur_yes
            EXCEPTIONS
              failed   = 1.
          IF sy-subrc EQ 1.
            MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno
                    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
          ELSE.
            MESSAGE s107(me) WITH my_tmp_rel_code.
          ENDIF.
        ENDIF.
        CLEAR my_tmp_rel_code.

* Ablehnen
      WHEN 'MEREJECT'.
        mmpur_dynamic_cast l_releasable my_model.
        IF NOT l_releasable IS INITIAL AND
           is_active( ) EQ mmpur_yes.
          IF l_releasable->is_rejection_allowed( ) EQ mmpur_yes.
            l_ok = mmpur_yes. l_reset = mmpur_no.
          ELSEIF l_releasable->is_reset_rej_allowed( ) EQ mmpur_yes.
            l_ok = mmpur_yes. l_reset = mmpur_yes.
          ENDIF.
          IF l_ok EQ mmpur_yes.
            CALL METHOD l_releasable->reject
              EXPORTING
                im_reset = l_reset
              EXCEPTIONS
                failed   = 1.
            IF sy-subrc EQ 1.
              MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno
                      WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
            ELSEIF l_reset EQ mmpur_no.
              MESSAGE s817(mepo).
            ELSE.
              MESSAGE s818(mepo).
            ENDIF.
          ENDIF.
        ENDIF.
      WHEN 'MEEXPANDACTORS'.

    ENDCASE.

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(7) Klasse LCL_RELVIEW_MM, Methode EXECUTE, Ende                                                                                                      A
  ENDMETHOD.                    "execute

*----------------------------------------------------------------------*
*  init_control is triggered during the PBO of the subscreen
*----------------------------------------------------------------------*
  METHOD init_control.
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(8) Klasse LCL_RELVIEW_MM, Methode INIT_CONTROL, Anfang                                                                                               A

    DATA: l_fieldcatalog LIKE my_fieldcatalog.

    CALL METHOD super->init_control.

    IF changed EQ mmpur_yes.
      CALL METHOD transport_from_model.
    ENDIF.

    IF my_grid IS INITIAL OR
       my_layout_changed EQ mmpur_yes.

      CALL METHOD build_grid_data.
      CALL METHOD build_field_catalog
        IMPORTING
          ex_catalog = my_fieldcatalog.
      CALL METHOD create_grid.
      my_layout_changed = mmpur_no.

    ELSEIF changed EQ mmpur_yes.

      CALL METHOD build_grid_data.
      CALL METHOD build_field_catalog
        IMPORTING
          ex_catalog = l_fieldcatalog.
      IF l_fieldcatalog NE my_fieldcatalog.
        my_fieldcatalog = l_fieldcatalog.
        CALL METHOD create_grid.
      ELSE.
        CALL METHOD update_grid.
      ENDIF.

    ENDIF.

    changed = mmpur_no.

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(9) Klasse LCL_RELVIEW_MM, Methode INIT_CONTROL, Ende                                                                                                 A
  ENDMETHOD.                    "init_control

*----------------------------------------------------------------------*
* changes of group, strategy or state triggers the redetermination
* of the field selection
*----------------------------------------------------------------------*
  METHOD subject_changed.
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(10) Klasse LCL_RELVIEW_MM, Methode SUBJECT_CHANGED, Anfang                                                                                           A

    DATA: l_result    TYPE mmpur_bool,
          l_dirty_fs TYPE mmpur_bool.

    FIELD-SYMBOLS: <ch_entry> LIKE LINE OF changelist.


* 1. handle general information in a super class
    CALL METHOD super->subject_changed( sender = sender
      changelist = changelist ).

* 2. special treatment for that class
    IF sender EQ my_model.

      LOOP AT changelist ASSIGNING <ch_entry>
                         WHERE model  EQ my_model AND
                               action EQ mmchp_chp_update.
        IF <ch_entry>-metafield EQ mmmfd_rel_group OR
           <ch_entry>-metafield EQ mmmfd_rel_strat OR
           <ch_entry>-metafield EQ mmmfd_rel_ind.
          l_dirty_fs = mmpur_yes.
          EXIT.
        ENDIF.
      ENDLOOP.

      IF l_dirty_fs EQ mmpur_yes.

        CALL METHOD fs_get( im_model = my_model ).
        l_result = has_visible_fields( ).
        IF l_result EQ mmpur_no.
          CALL METHOD deactivate.
        ELSE.
          CALL METHOD activate.
        ENDIF.

      ENDIF.
    ENDIF.

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(11) Klasse LCL_RELVIEW_MM, Methode SUBJECT_CHANGED, Ende                                                                                             A
  ENDMETHOD.                    "subject_changed

*----------------------------------------------------------------------*

  METHOD   transport_from_model.
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(12) Klasse LCL_RELVIEW_MM, Methode TRANSPORT_FROM_MODEL, Anfang                                                                                      A

    DATA: l_releasable TYPE REF TO if_releasable_mm,
          ls_code      LIKE LINE OF codes,
          ls_actor     LIKE LINE OF my_actors.

    CLEAR: mepo_rel_general_pbo.
    CLEAR my_actors.
    CLEAR: codes, code_desc, prerequisites, final, have_released.
    consistent = no_strategy = released = mmpur_no.

    CALL METHOD get_extended_model
      EXPORTING
        im_model    = my_model
      IMPORTING
        ex_strategy = my_strategy
        ex_state    = my_state.

    IF NOT my_strategy IS INITIAL.
* get general strategy information
      CALL METHOD my_strategy->get_info
        IMPORTING
          ex_group            = mepo_rel_general_pbo-frggr
          ex_group_desc       = mepo_rel_general_pbo-frggt
          ex_strategy         = mepo_rel_general_pbo-frgsx
          ex_strategy_desc    = mepo_rel_general_pbo-frgxt
          ex_external_release = mepo_rel_general_pbo-frgex
          ex_codes            = codes
          ex_prerequisites    = prerequisites
          ex_final            = final
          ex_consistent       = consistent.

      code_desc = my_strategy->get_info_for_code( codes ).

* get the actors
      mmpur_dynamic_cast l_releasable my_model.
      IF NOT l_releasable IS INITIAL.
        LOOP AT codes INTO ls_code.
          ls_actor-actortab = l_releasable->get_responsible( ls_code-rel_code ).
          ls_actor-code     = ls_code-rel_code.
          IF NOT ls_actor-actortab IS INITIAL.
            INSERT ls_actor INTO TABLE my_actors.
          ENDIF.
        ENDLOOP.
      ENDIF.

* get state information
      have_released = my_state->get_state( ).
      CALL METHOD my_state->get_indicator
        IMPORTING
          ex_indicator      = mepo_rel_general_pbo-frgkx
          ex_indicator_desc = mepo_rel_general_pbo-frget.

      released = my_state->is_released( ).
    ELSE.

      no_strategy = mmpur_yes.

    ENDIF.

    CLEAR mepo_rel_general_pbo-info.
* in the case of any failure build info line
    IF consistent EQ mmpur_no.
      mepo_rel_general_pbo-info = text-002.
    ENDIF.
    IF no_strategy EQ mmpur_yes.
      mepo_rel_general_pbo-info = text-003.
    ENDIF.

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(13) Klasse LCL_RELVIEW_MM, Methode TRANSPORT_FROM_MODEL, Ende                                                                                        A
  ENDMETHOD.                    "transport_from_model

*----------------------------------------------------------------------*
  METHOD transport_to_dynp.
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(14) Klasse LCL_RELVIEW_MM, Methode TRANSPORT_TO_DYNP, Anfang                                                                                         A

    DATA: l_releasable TYPE REF TO if_releasable_mm.

* Button icons
    CASE my_grid_layout.
      WHEN 1.                          "Anzeige Codes
        mepo_rel_general_pbo-icon_sim    = my_icon_simulate.
        mepo_rel_general_pbo-icon_final  = my_icon_toggle2_function.
      WHEN 2.                          "Endfreigaben
        mepo_rel_general_pbo-icon_sim    = my_icon_simulate.
        mepo_rel_general_pbo-icon_final  = my_icon_toggle1_function.
      WHEN 3.                          "Simulation
        mepo_rel_general_pbo-icon_sim    = my_icon_release.
        mepo_rel_general_pbo-icon_final  = my_icon_toggle2_function.
    ENDCASE.

    mmpur_dynamic_cast l_releasable my_model.
    IF NOT l_releasable IS INITIAL.
      IF l_releasable->is_rejection_allowed( ) EQ mmpur_yes.
        mepo_rel_general_pbo-icon_reject = my_icon_reject.
      ELSEIF l_releasable->is_reset_rej_allowed( ) EQ mmpur_yes.
        mepo_rel_general_pbo-icon_reject = my_icon_allow.
      ELSE.
        CLEAR mepo_rel_general_pbo-icon_reject.
      ENDIF.
    ENDIF.

* general dynpro information is transported here. Grid information
* in method update_grid.

    mepo_rel_general = mepo_rel_general_pbo.

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(15) Klasse LCL_RELVIEW_MM, Methode TRANSPORT_TO_DYNP, Ende                                                                                           A
  ENDMETHOD.                    "transport_to_dynp


*----------------------------------------------------------------------*
* build field selection table "my_fieldselection"
*----------------------------------------------------------------------*
  METHOD fs_get.
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(16) Klasse LCL_RELVIEW_MM, Methode FS_GET, Anfang                                                                                                    A

    DATA: wa           LIKE LINE OF my_dynpro_fields,
          l_fs_entry   LIKE LINE OF my_fieldselection,
          l_releasable TYPE REF TO if_releasable_mm,
          l_strategy   TYPE REF TO if_release_strategy_mm,
          l_state      TYPE REF TO if_release_state_mm,
          l_frggr      TYPE t16fg-frggr,
          l_allowed TYPE mmpur_bool VALUE mmpur_no.

    DATA: lv_rel_det_type TYPE char_01.
*
* in the case of a changed model, the current release information
* has to be redetermined.
*
    IF changed EQ mmpur_yes.

      CALL METHOD get_extended_model
        EXPORTING
          im_model    = my_model
        IMPORTING
          ex_strategy = l_strategy
          ex_state    = l_state.
    ELSE.

      l_strategy = my_strategy.
      l_state    = my_state.

    ENDIF.

    CALL METHOD cl_mmpur_simpl_suite_switch=>release_determination
      RECEIVING
        rv_rel_det_type = lv_rel_det_type.

*
* the fieldselection depends on the existence of a strategy object.
*
    CLEAR my_fieldselection[].

    IF l_strategy IS INITIAL.

      default_field_status = '-'.

    ELSE.

      CALL METHOD l_strategy->get_info
        IMPORTING
          ex_group = l_frggr.

      default_field_status = '*'.

      LOOP AT my_dynpro_fields INTO wa WHERE metafield NE 0.

        CLEAR l_fs_entry.

        CASE wa-metafield.

          WHEN mmmfd_rel_info.
            IF mepo_rel_general_pbo-info NE space.
              l_fs_entry-fieldstatus = '*'.
            ELSE.
              l_fs_entry-fieldstatus = '-'.
            ENDIF.

          WHEN mmmfd_rel_icon_sim.    l_fs_entry-fieldstatus = '-'.

          WHEN mmmfd_rel_icon_fin.
            IF l_frggr IS INITIAL.
              l_fs_entry-fieldstatus = '-'.
            ELSE.
              IF my_grid_layout EQ 3.  "Simulation
                l_fs_entry-fieldstatus = '*'.
              ELSE.
                l_fs_entry-fieldstatus = '.'.
              ENDIF.
            ENDIF.
            IF lv_rel_det_type = cl_mmpur_constants=>if_mmpur_constants_func_switch~release_det_simplified.
              l_fs_entry-fieldstatus = '-'.
            ENDIF.

          WHEN mmmfd_rel_code.        l_fs_entry-fieldstatus = '-'.

          WHEN mmmfd_rel_cod_tx.      l_fs_entry-fieldstatus = '-'.

          WHEN mmmfd_rel_group.
            IF l_frggr IS INITIAL.
              l_fs_entry-fieldstatus = '-'.
            ELSE.
              l_fs_entry-fieldstatus = '*'.
            ENDIF.

          WHEN mmmfd_rel_icon_reject.
            mmpur_dynamic_cast l_releasable my_model.
            IF NOT l_releasable IS INITIAL.
              IF l_releasable->is_rejection_allowed( ) EQ mmpur_yes OR
                 l_releasable->is_reset_rej_allowed( ) EQ mmpur_yes.
                l_allowed = mmpur_yes.
              ENDIF.
            ENDIF.
            IF l_allowed EQ mmpur_yes.
              l_fs_entry-fieldstatus = '.'.
            ELSE.
              l_fs_entry-fieldstatus = '-'.
            ENDIF.

          WHEN OTHERS.                l_fs_entry-fieldstatus = '*'.

        ENDCASE.

        l_fs_entry-metafield = wa-metafield.
        INSERT l_fs_entry INTO TABLE my_fieldselection.

      ENDLOOP.

    ENDIF.

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(17) Klasse LCL_RELVIEW_MM, Methode FS_GET, Ende                                                                                                      A
  ENDMETHOD.                    "fs_get

*----------------------------------------------------------------------*
* Modify Screen
*----------------------------------------------------------------------*
  METHOD modify_screen.
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(18) Klasse LCL_RELVIEW_MM, Methode MODIFY_SCREEN, Anfang                                                                                             A

    DATA: l_dynpro_field LIKE LINE OF my_dynpro_fields,
          l_name         LIKE l_dynpro_field-screenname.

    CALL METHOD super->modify_screen( ).

    CHECK released EQ mmpur_yes.

    LOOP AT SCREEN.

      l_name = screen-name.
      READ TABLE my_dynpro_fields INTO l_dynpro_field
                                WITH TABLE KEY screenname = l_name.
      CHECK l_dynpro_field-metafield EQ mmmfd_rel_ind OR
            l_dynpro_field-metafield EQ mmmfd_rel_ind_tx.
      screen-intensified = 1.
      MODIFY SCREEN.
    ENDLOOP.

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(19) Klasse LCL_RELVIEW_MM, Methode MODIFY_SCREEN, Ende                                                                                               A
  ENDMETHOD.                    "modify_screen

*----------------------------------------------------------------------*
* get the subobjects of my_model: the strategy and the state
*----------------------------------------------------------------------*
  METHOD get_extended_model.
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(20) Klasse LCL_RELVIEW_MM, Methode GET_EXTENDED_MODEL, Anfang                                                                                        A

    DATA: l_releasable TYPE REF TO if_releasable_mm.

    mmpur_dynamic_cast l_releasable im_model.

    IF NOT l_releasable IS INITIAL.
      CALL METHOD l_releasable->get_data
        IMPORTING
          ex_strategy = ex_strategy
          ex_state    = ex_state.
    ELSE.
      CLEAR ex_strategy.
      CLEAR ex_state.
    ENDIF.

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(21) Klasse LCL_RELVIEW_MM, Methode GET_EXTENDED_MODEL, Ende                                                                                          A
  ENDMETHOD.                    "get_extended_model

*----------------------------------------------------------------------*
* create a grid object and remove the old one of present
*----------------------------------------------------------------------*
  METHOD create_grid.
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(22) Klasse LCL_RELVIEW_MM, Methode CREATE_GRID, Anfang                                                                                               A

    DATA: l_layout         TYPE lvc_s_layo,
    l_old_grid             TYPE REF TO cl_gui_alv_grid.

    FIELD-SYMBOLS: <table> TYPE STANDARD TABLE.

    CHECK NOT my_gui_container IS INITIAL.
    CHECK NOT my_strategy IS INITIAL.

    l_old_grid = my_grid.

    CREATE OBJECT my_grid
      EXPORTING
        i_parent = my_gui_container.
    SET HANDLER hotspot_click FOR my_grid.

* Layout
    l_layout = build_layout( ).

    CASE my_grid_layout.
      WHEN 1. ASSIGN my_grid_data1 TO <table>.
      WHEN 2. ASSIGN my_grid_data2 TO <table>.
      WHEN 3. ASSIGN my_grid_data1 TO <table>.
    ENDCASE.

* remove old grid

    IF NOT l_old_grid IS INITIAL AND
       l_old_grid NE my_grid.
      CALL METHOD l_old_grid->free.
    ENDIF.

    CALL METHOD my_grid->set_table_for_first_display
      EXPORTING
        is_layout       = l_layout
      CHANGING
        it_fieldcatalog = my_fieldcatalog
        it_outtab       = <table>.


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(23) Klasse LCL_RELVIEW_MM, Methode CREATE_GRID, Ende                                                                                                 A
  ENDMETHOD.                    "create_grid
*----------------------------------------------------------------------*
* model changed: update grid display
*----------------------------------------------------------------------*
  METHOD update_grid.
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(24) Klasse LCL_RELVIEW_MM, Methode UPDATE_GRID, Anfang                                                                                               A

    IF NOT my_grid IS INITIAL.

      CALL METHOD my_grid->refresh_table_display.

    ENDIF.

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(25) Klasse LCL_RELVIEW_MM, Methode UPDATE_GRID, Ende                                                                                                 A
  ENDMETHOD.                    "update_grid
*----------------------------------------------------------------------*
* define grid layout
*----------------------------------------------------------------------*
  METHOD set_layout.
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(26) Klasse LCL_RELVIEW_MM, Methode SET_LAYOUT, Anfang                                                                                                A

    DATA: l_grid_layout LIKE my_grid_layout.
*
    IF NOT im_layout BETWEEN 1 AND 3.
      l_grid_layout = 1.
    ELSE.
      l_grid_layout = im_layout.
    ENDIF.

    IF l_grid_layout NE my_grid_layout.
      my_grid_layout = l_grid_layout.
      my_layout_changed = mmpur_yes.
      IF my_grid_layout EQ 3.
        label = 'Freigabesimulation'(012).
      ELSE.
        label = 'Freigabestrategie'(001).
      ENDIF.

    ENDIF.

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(27) Klasse LCL_RELVIEW_MM, Methode SET_LAYOUT, Ende                                                                                                  A
  ENDMETHOD.                    "set_layout
*----------------------------------------------------------------------*
* dynamically build field catalog.
*----------------------------------------------------------------------*
  METHOD build_field_catalog.
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(28) Klasse LCL_RELVIEW_MM, Methode BUILD_FIELD_CATALOG, Anfang                                                                                       A

    DATA: l_structname TYPE dd02l-tabname,
          lt_fieldcatalog LIKE my_fieldcatalog,
          l_fieldcatalog  LIKE LINE OF lt_fieldcatalog,
          l_code          LIKE LINE OF codes,
          l_index         TYPE sy-tabix,
          l_index2        TYPE sy-tabix,
          l_str(20)       TYPE c,
          l_releasable    TYPE REF TO if_releasable_mm,
          l_allowed       TYPE mmpur_bool VALUE mmpur_no.


    CASE my_grid_layout.
* display "release codes"
      WHEN 1 OR 3.
        l_structname = 'MEREL_S_GRID1'.
* display "final releases"
      WHEN 2.
        l_structname = 'MEREL_S_GRID2'.
    ENDCASE.

    CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
      EXPORTING
        i_structure_name = l_structname
      CHANGING
        ct_fieldcat      = lt_fieldcatalog
      EXCEPTIONS
        OTHERS           = 3.

    CHECK sy-subrc IS INITIAL.

    CASE my_grid_layout.
* display "release codes"
      WHEN 1 OR 3.
* Icon
        LOOP AT lt_fieldcatalog INTO l_fieldcatalog.
          l_index = sy-tabix.

          CASE l_fieldcatalog-fieldname.

            WHEN 'FUNCTION'.
              mmpur_dynamic_cast l_releasable my_model.
              IF NOT l_releasable IS INITIAL.
                IF l_releasable->is_release_allowed( ) EQ mmpur_yes OR
                   l_releasable->is_reset_rel_allowed( ) EQ mmpur_yes.
                  l_allowed = mmpur_yes.
                ENDIF.
              ENDIF.
              IF l_allowed EQ mmpur_no.
                l_fieldcatalog-no_out = 'X'.
              ENDIF.
              l_fieldcatalog-icon    = 'X'.
              l_fieldcatalog-hotspot = 'X'.
              l_fieldcatalog-coltext = text-005.
              l_fieldcatalog-tooltip = text-005.
              l_fieldcatalog-seltext = text-005.
              l_fieldcatalog-datatype    = 'CHAR'.
              l_fieldcatalog-outputlen    = 4.
              MODIFY lt_fieldcatalog FROM l_fieldcatalog INDEX l_index.

            WHEN 'STEXT'.
              IF my_actors IS INITIAL.
                l_fieldcatalog-no_out = 'X'.
              ENDIF.
              l_fieldcatalog-col_pos = 2.
              l_fieldcatalog-outputlen = 15.
              MODIFY lt_fieldcatalog FROM l_fieldcatalog INDEX l_index.


            WHEN 'ICON'.
              l_fieldcatalog-icon      = 'X'.
              l_fieldcatalog-hotspot = ' '.
              l_fieldcatalog-coltext = text-019.
              l_fieldcatalog-tooltip = text-019.
              l_fieldcatalog-seltext = text-019.
              l_fieldcatalog-datatype    = 'CHAR'.
              l_fieldcatalog-outputlen    = 4.
              MODIFY lt_fieldcatalog FROM l_fieldcatalog INDEX l_index.

            WHEN 'REL_CODE'.
              l_fieldcatalog-coltext = text-006. "Code
              l_fieldcatalog-tooltip = text-006.
              l_fieldcatalog-outputlen    = 5.
              MODIFY lt_fieldcatalog FROM l_fieldcatalog INDEX l_index.

            WHEN  'DESCRIPTION'.
              l_fieldcatalog-outputlen    = 18.
              MODIFY lt_fieldcatalog FROM l_fieldcatalog INDEX l_index.
            WHEN OTHERS.
              DELETE lt_fieldcatalog INDEX l_index.

          ENDCASE.

        ENDLOOP.

        ex_catalog = lt_fieldcatalog.

* display final releases
      WHEN 2.
        LOOP AT lt_fieldcatalog INTO l_fieldcatalog.
          l_index = sy-tabix.
* Bezeichnung
          CASE l_fieldcatalog-fieldname.
            WHEN 'TITLE'.
              l_fieldcatalog-coltext = text-006. "Code
              l_fieldcatalog-tooltip = text-006.
              l_fieldcatalog-seltext = text-006.
              l_fieldcatalog-datatype    = 'CHAR'.
              l_fieldcatalog-outputlen    = 15.
              MODIFY lt_fieldcatalog FROM l_fieldcatalog INDEX l_index.

            WHEN OTHERS.
              l_index2 = l_index - 1.
              READ TABLE codes INTO l_code INDEX l_index2.
              IF sy-subrc IS INITIAL.
                CONCATENATE text-006 l_code-rel_code INTO l_str
                            SEPARATED BY space.
                l_fieldcatalog-icon = 'X'.
                l_fieldcatalog-coltext = l_code-rel_code.
                l_fieldcatalog-tooltip = l_str.
                l_fieldcatalog-datatype    = 'CHAR'.
                l_fieldcatalog-outputlen    = 2.
                MODIFY lt_fieldcatalog FROM l_fieldcatalog INDEX l_index.
              ELSE.
                DELETE lt_fieldcatalog INDEX l_index.
              ENDIF.
          ENDCASE.
        ENDLOOP.
        ex_catalog = lt_fieldcatalog.
    ENDCASE.
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(29) Klasse LCL_RELVIEW_MM, Methode BUILD_FIELD_CATALOG, Ende                                                                                         A
  ENDMETHOD.                    "build_field_catalog
*----------------------------------------------------------------------*
* build grid data
*----------------------------------------------------------------------*
  METHOD build_grid_data.
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(30) Klasse LCL_RELVIEW_MM, Methode BUILD_GRID_DATA, Anfang                                                                                           A

    DATA: l_entry1 LIKE LINE OF my_grid_data1,
          l_entry2 LIKE LINE OF my_grid_data2,
          l_code   LIKE LINE OF codes,
          l_desc   LIKE LINE OF code_desc,
          l_ok     TYPE mmpur_bool,
          lt_codes TYPE merel_t_codes,
          l_final  LIKE LINE OF final,
          l_offset TYPE sy-index,
          l_str(4) TYPE c,
          ls_actor_entry LIKE LINE OF my_actors,
          ls_actortab    TYPE actor_text,
          l_releasable   TYPE REF TO if_releasable_mm.



    FIELD-SYMBOLS: <table> TYPE STANDARD TABLE,
                   <fs>    TYPE any.


    CASE my_grid_layout.
      WHEN 1. ASSIGN my_grid_data1 TO <table>.
      WHEN 2. ASSIGN my_grid_data2 TO <table>.
      WHEN 3. ASSIGN my_grid_data1 TO <table>.
    ENDCASE.
    CLEAR <table>.

    CASE my_grid_layout.

*----------------------------------------------------------------------*
* Build grid showing release codes and their state
*----------------------------------------------------------------------*

      WHEN 1 OR 3.

        LOOP AT codes INTO l_code.

          CLEAR l_entry1.
*- release code -------------------------------------------------------*
          l_entry1-rel_code = l_code-rel_code.

*- Description for the release code -----------------------------------*
          READ TABLE code_desc INTO l_desc
                               WITH KEY rel_code = l_code-rel_code.
          IF sy-subrc IS INITIAL.
            l_entry1-description = l_desc-description.
          ENDIF.

*- Description for the actor ------------------------------------------*
          CLEAR l_entry1-stext.
          READ TABLE my_actors INTO ls_actor_entry WITH TABLE KEY
                                       code = l_code-rel_code.
          IF sy-subrc IS INITIAL.
            READ TABLE ls_actor_entry-actortab INTO ls_actortab INDEX 1.
            IF sy-subrc IS INITIAL.
              l_entry1-stext = ls_actortab-stext.
            ENDIF.
          ENDIF.

*- Released? ----------------------------------------------------------*
          READ TABLE have_released WITH
               KEY rel_code = l_code-rel_code TRANSPORTING NO FIELDS.
          IF sy-subrc IS INITIAL.

            l_entry1-icon = my_icon_checked.     "Haken
            mmpur_dynamic_cast l_releasable my_model.
            IF l_code-authority IS INITIAL AND
               l_releasable->is_reset_rel_allowed( ) EQ mmpur_yes.
              l_entry1-function = my_icon_system_undo.   "Undo
            ENDIF.

          ELSE.

* all prerequisites fulfilled? ----------------------------------------*
            l_ok = can_release( l_code-rel_code ).

            IF l_ok = mmpur_yes AND released EQ mmpur_no.

              l_entry1-icon = my_led_yellow.    "Yellow LED
              mmpur_dynamic_cast l_releasable my_model.
              IF l_code-authority IS INITIAL AND
                 l_releasable->is_release_allowed( ) EQ mmpur_yes.
                l_entry1-function = my_icon_set_state.   "Undo
              ENDIF.

            ENDIF.
          ENDIF.
          APPEND l_entry1 TO <table>.
        ENDLOOP.

*----------------------------------------------------------------------*
* Build grid showing final release combinations
*----------------------------------------------------------------------*
      WHEN 2.

        LOOP AT final INTO l_final.
          CLEAR l_entry2.
          l_str = sy-tabix.
          CONCATENATE text-013 l_str INTO
                      l_entry2-title SEPARATED BY space.
          lt_codes = l_final-codes.
          LOOP AT lt_codes INTO l_code.
            READ TABLE codes WITH KEY rel_code = l_code-rel_code
                        TRANSPORTING NO FIELDS.
            IF sy-subrc IS INITIAL.
              l_offset = sy-tabix + 1.
              ASSIGN COMPONENT l_offset OF STRUCTURE l_entry2 TO <fs>.

*- Released? ----------------------------------------------------------*
              READ TABLE have_released WITH
                  KEY rel_code = l_code-rel_code TRANSPORTING NO FIELDS.
              IF sy-subrc IS INITIAL.
                <fs> = my_icon_checked.
              ELSE.
                <fs> = my_icon_element.
              ENDIF.
            ENDIF.
          ENDLOOP.
          APPEND l_entry2 TO <table>.

        ENDLOOP.

    ENDCASE.
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(31) Klasse LCL_RELVIEW_MM, Methode BUILD_GRID_DATA, Ende                                                                                             A
  ENDMETHOD.                    "build_grid_data

*----------------------------------------------------------------------*

  METHOD build_layout.
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(32) Klasse LCL_RELVIEW_MM, Methode BUILD_LAYOUT, Anfang                                                                                              A

    DATA: l_layout TYPE lvc_s_layo.

    CALL METHOD my_grid->get_frontend_layout
      IMPORTING
        es_layout = l_layout.
    l_layout-no_rowmark = mmpur_yes.
    l_layout-no_toolbar = mmpur_yes.
    l_layout-sel_mode   = 'A'.
    IF my_grid_layout EQ 1 OR
       my_grid_layout EQ 3.
      l_layout-zebra      = 'X'.
    ELSE.
      l_layout-no_vgridln = 'X'.
    ENDIF.
    re_layout = l_layout.

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(33) Klasse LCL_RELVIEW_MM, Methode BUILD_LAYOUT, Ende                                                                                                A
  ENDMETHOD.                    "build_layout

*----------------------------------------------------------------------*
  METHOD can_release.
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(34) Klasse LCL_RELVIEW_MM, Methode CAN_RELEASE, Anfang                                                                                               A

    DATA: l_prereq LIKE LINE OF prerequisites,
          lt_codes TYPE merel_t_codes,
          l_code   LIKE LINE OF lt_codes.

    re_result = mmpur_yes.
    READ TABLE prerequisites INTO l_prereq
                      WITH KEY rel_code = im_relcode.
    IF sy-subrc IS INITIAL.
* prerequisites exist, all have to be fulfilled
      lt_codes[] = l_prereq-rel_prereq.
      LOOP AT lt_codes INTO l_code.
        READ TABLE have_released WITH KEY
           rel_code = l_code-rel_code TRANSPORTING NO FIELDS.
        IF NOT sy-subrc IS INITIAL.
          re_result = mmpur_no.
          EXIT.
        ENDIF.
      ENDLOOP.
    ENDIF.

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(35) Klasse LCL_RELVIEW_MM, Methode CAN_RELEASE, Ende                                                                                                 A
  ENDMETHOD.                    "can_release
*----------------------------------------------------------------------*

  METHOD hotspot_click.
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(1) Klasse LCL_RELVIEW_MM, Methode HOTSPOT_CLICK, Anfang                                                                                              A
*$*$-Start: (1)---------------------------------------------------------------------------------$*$*
ENHANCEMENT 1  ZLMERELVICI1_CHECK.    "active version
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(36) Klasse LCL_RELVIEW_MM, Methode HOTSPOT_CLICK, Anfang, Erweiterung ZLMERELVICI1_CHECK, Anfang                                                     A
*
  DATA: ls_data1 LIKE LINE OF my_grid_data1,
        l_line1  TYPE i.
  IF  SY-TCODE = 'ME29N'.
     CHECK my_grid_layout EQ 1.
    l_line1 = e_row_id-index.
    IF l_line1 = '1'.
    READ TABLE my_grid_data1 INTO ls_data1 INDEX 2.
     IF sy-subrc = 0.
        my_tmp_rel_code = ls_data1-rel_code.
      CASE  'ICON'."e_column_id-fieldname.
      WHEN 'ICON'.
        CASE ls_data1-ICON.
         WHEN my_icon_reject  .
         WHEN my_icon_allow .
         WHEN MY_ICON_CHECKED.
             MESSAGE '采购经理还未取消审批!' TYPE 'S' DISPLAY LIKE 'E'.
             EXIT.
             "MESSAGE S000(ZCOMM) WITH '财务还未取消审批!'.
          WHEN my_icon_set_state.
        ENDCASE.
      WHEN 'STEXT'.
     ENDCASE.
    ENDIF.
    ELSEIF l_line1 = '2' .
READ TABLE my_grid_data1 INTO ls_data1 INDEX 3.
     IF sy-subrc = 0.
        my_tmp_rel_code = ls_data1-rel_code.
      CASE  'ICON'."e_column_id-fieldname.
      WHEN 'ICON'.
        CASE ls_data1-ICON.
         WHEN my_icon_reject  .
         WHEN my_icon_allow .
         WHEN MY_ICON_CHECKED.
             MESSAGE '主管还未取消审批!' TYPE 'S' DISPLAY LIKE 'E'.
             EXIT.
             "MESSAGE S000(ZCOMM) WITH '财务还未取消审批!'.
          WHEN my_icon_set_state.
        ENDCASE.
      WHEN 'STEXT'.
     ENDCASE.
    ENDIF.
   ENDIF.
  ENDIF.

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(37) Klasse LCL_RELVIEW_MM, Methode HOTSPOT_CLICK, Anfang, Erweiterung ZLMERELVICI1_CHECK, Ende                                                       A
ENDENHANCEMENT.
*$*$-End:   (1)---------------------------------------------------------------------------------$*$*

    DATA: ls_data LIKE LINE OF my_grid_data1,
          l_line  TYPE i,
          l_fcode TYPE sy-ucomm.

    CHECK my_grid_layout EQ 1.
    l_line = e_row_id-index.
    CHECK NOT l_line IS INITIAL.
    READ TABLE my_grid_data1 INTO ls_data INDEX l_line.
    CHECK sy-subrc IS INITIAL.
    my_tmp_rel_code = ls_data-rel_code.

    CASE e_column_id-fieldname.

      WHEN 'FUNCTION'.
        CASE ls_data-function.
          WHEN my_icon_system_undo.
            l_fcode = 'MERESET'.
          WHEN my_icon_set_state.
            l_fcode = 'MERELEASE'.
        ENDCASE.
        CALL METHOD notify_data_changed( my_model ).            "612189

      WHEN 'STEXT'.
        l_fcode = 'MEEXPANDACTORS'.

    ENDCASE.
    IF NOT l_fcode IS INITIAL.
      CALL METHOD cl_gui_cfw=>set_new_ok_code( new_code = l_fcode ).
    ENDIF.

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(38) Klasse LCL_RELVIEW_MM, Methode HOTSPOT_CLICK, Ende                                                                                               A
  ENDMETHOD.                    "hotspot_click

*----------------------------------------------------------------------*

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(39) Klasse LCL_RELVIEW_MM, Ende                                                                                                                      S
ENDCLASS.                    "lcl_relview_mm IMPLEMENTATION
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(40) Include LMERELVICI1, Ende                                                                                                                        S

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值