多级审批的采购订单,在取消审批时,理论上需要从最后一级开始逐级取消审批(用户一般也是这么要求的,毕竟领导取消审批后,采购主管才能取消审批)。
但是,在SAP标准系统中,取消审批采购订单,系统允许在最后一级未取消审批的情况下,第一级可以直接取消审批,实际上,第一级取消审批后,整个采购订单即取消审批,无需经过最后一级取消审批。
这与用户的需求有很大差异,所以需要做增强控制,必须最后一级领导开始逐级取消审批。
在本项目中,采购订单需要两级审批:1 采购主管审批 2 财务审批。
增强代码示例如下:
Enhancem. Technique: Source Code Plug-In
Description ME29N-取消审批操作增强
Enhanced Development Object: MERELVI
Enhancement Implementation ZME29N_UPDATE
包含文件 LMERELVICI1 活动
*---------------------------------------------------------------------*
* CLASS lcl_relview_mm IMPLEMENTATION
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
CLASS lcl_relview_mm IMPLEMENTATION.
*----------------------------------------------------------------------*
*
* Class contructor: build icons
*
*----------------------------------------------------------------------*
METHOD class_constructor.
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.
ENDMETHOD. "class_constructor
*----------------------------------------------------------------------*
* Set the model. Dependent objects my_strategy and my_state
* have to be determined
*----------------------------------------------------------------------*
METHOD set_model.
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 ).
ENDMETHOD. "set_model
*----------------------------------------------------------------------*
* Fcode handling
*----------------------------------------------------------------------*
METHOD execute.
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.
ENDMETHOD. "execute
*----------------------------------------------------------------------*
* init_control is triggered during the PBO of the subscreen
*----------------------------------------------------------------------*
METHOD init_control.
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.
ENDMETHOD. "init_control
*----------------------------------------------------------------------*
* changes of group, strategy or state triggers the redetermination
* of the field selection
*----------------------------------------------------------------------*
METHOD subject_changed.
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.
ENDMETHOD. "subject_changed
*----------------------------------------------------------------------*
METHOD transport_from_model.
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.
ENDMETHOD. "transport_from_model
*----------------------------------------------------------------------*
METHOD transport_to_dynp.
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.
ENDMETHOD. "transport_to_dynp
*----------------------------------------------------------------------*
* build field selection table "my_fieldselection"
*----------------------------------------------------------------------*
METHOD fs_get.
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.
*
* 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.
*
* 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.
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.
ENDMETHOD. "fs_get
*----------------------------------------------------------------------*
* Modify Screen
*----------------------------------------------------------------------*
METHOD modify_screen.
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.
ENDMETHOD. "modify_screen
*----------------------------------------------------------------------*
* get the subobjects of my_model: the strategy and the state
*----------------------------------------------------------------------*
METHOD get_extended_model.
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.
ENDMETHOD. "get_extended_model
*----------------------------------------------------------------------*
* create a grid object and remove the old one of present
*----------------------------------------------------------------------*
METHOD create_grid.
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>.
ENDMETHOD. "create_grid
*----------------------------------------------------------------------*
* model changed: update grid display
*----------------------------------------------------------------------*
METHOD update_grid.
IF NOT my_grid IS INITIAL.
CALL METHOD my_grid->refresh_table_display.
ENDIF.
ENDMETHOD. "update_grid
*----------------------------------------------------------------------*
* define grid layout
*----------------------------------------------------------------------*
METHOD set_layout.
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.
ENDMETHOD. "set_layout
*----------------------------------------------------------------------*
* dynamically build field catalog.
*----------------------------------------------------------------------*
METHOD build_field_catalog.
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.
ENDMETHOD. "build_field_catalog
*----------------------------------------------------------------------*
* build grid data
*----------------------------------------------------------------------*
METHOD build_grid_data.
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.
ENDMETHOD. "build_grid_data
*----------------------------------------------------------------------*
METHOD build_layout.
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.
ENDMETHOD. "build_layout
*----------------------------------------------------------------------*
METHOD can_release.
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.
ENDMETHOD. "can_release
*----------------------------------------------------------------------*
METHOD hotspot_click.
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(1) Class LCL_RELVIEW_MM, Method HOTSPOT_CLICK, Start A
*$*$-Start: (1)---------------------------------------------------------------------------------$*$*
ENHANCEMENT 1 ZME29N_UPDATE. "active version
"取消审批流程 处理
* my_icon_checked TYPE iconname,
* my_led_yellow TYPE iconname,
* my_icon_element TYPE iconname,
* my_icon_toggle1_function TYPE iconname,
* my_icon_toggle2_function TYPE iconname,
* my_icon_simulate TYPE iconname,
* my_icon_release TYPE iconname,
* my_icon_reject TYPE iconname,
* my_icon_allow TYPE iconname,
* my_icon_system_undo type iconname,
* my_icon_set_State type iconname.
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 A000(ZCOMM) WITH '财务还未取消审批!'.
EXIT.
"MESSAGE S000(ZCOMM) WITH '财务还未取消审批!'.
WHEN my_icon_set_state.
ENDCASE.
WHEN 'STEXT'.
ENDCASE.
ENDIF.
ENDIF.
ENDIF.
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.
ENDMETHOD. "hotspot_click
*----------------------------------------------------------------------*
ENDCLASS. "lcl_relview_mm IMPLEMENTATION