REPORT ZZ_program_edit.
"1 该程序可以直接修改 SE38 能打开的所有程序代码而不会产生传输请求号, 慎用!
*2 可以输入CLASS名称,回车后,选择对应的method 直接修改程序代码,会产生传输请求号, 慎用!
*&---"author: lijq21@qq.com
DATA: int_tab TYPE STANDARD TABLE OF string WITH HEADER LINE,
ls_mtdkey TYPE seocpdkey,
lv_incname LIKE trdir-name,
p_obj TYPE seu_objtyp VALUE 'OM'.
SELECTION-SCREEN: BEGIN OF BLOCK b2 WITH FRAME TITLE text3.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: rad_1 TYPE c RADIOBUTTON GROUP g1 DEFAULT 'X' USER-COMMAND a.
SELECTION-SCREEN COMMENT 3(25) text1.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN: BEGIN OF BLOCK b1 WITH FRAME." TITLE text1.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 5(15) text2.
PARAMETERS: p_prog LIKE trdir-name."LIKE sy-repid . "程序名称
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN: END OF BLOCK b1.
SELECTION-SCREEN SKIP.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: rad_2 TYPE c RADIOBUTTON GROUP g1.
SELECTION-SCREEN COMMENT 3(25) text4.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN: BEGIN OF BLOCK b3 WITH FRAME." TITLE text4.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 5(15) text5.
PARAMETERS: p_cls TYPE seoclsname.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 5(15) text6.
PARAMETERS: p_method TYPE seocpdname.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 5(1) text9.
PARAMETERS: p_edit TYPE char1 AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN COMMENT 10(45) text8.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 5(1) text10.
PARAMETERS: p_chk TYPE char1 AS CHECKBOX.
SELECTION-SCREEN COMMENT 10(45) text7.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN: END OF BLOCK b3.
SELECTION-SCREEN: END OF BLOCK b2.
*-----------------------------------------------------------------------*
*AT SELECTION-SCREEN
*------------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_prog.
CALL FUNCTION 'REPOSITORY_INFO_SYSTEM_F4'
EXPORTING
object_type = 'PROG' "表EUOBJ EUOBJT
object_name = p_prog
suppress_selection = 'X'
use_alv_grid = ''
without_personal_list = ''
IMPORTING
object_name_selected = p_prog
EXCEPTIONS
cancel = 1.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_method.
PERFORM findclassmethods USING p_cls
p_method.
*---------------------------------------------------------------------------------*
*AT SELECTION-SCREEN.
*---------------------------------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT.
IF rad_1 EQ 'X'.
LOOP AT SCREEN.
IF screen-name CP '*P_PROG*'.
screen-input = 1.
MODIFY SCREEN.
ENDIF.
IF screen-name CP '*P_CLS*' OR screen-name CP '*P_METHOD*' OR
screen-name CP '*P_CHK*' OR screen-name CP '*P_EDIT*'.
screen-input = 0.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
* CLEAR:p_cls,p_method,p_chk.
ELSE.
LOOP AT SCREEN.
IF screen-name CP '*P_PROG*'."
screen-input = 0.
MODIFY SCREEN.
ENDIF.
IF screen-name CP '*P_CLS*' OR screen-name CP '*P_METHOD*' OR
screen-name CP '*P_CHK*' OR screen-name CP '*P_EDIT*'.
screen-input = 1.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
* CLEAR:p_prog.
ENDIF.
*------------------------------------------------------------------------*
* INITIALISATION
*------------------------------------------------------------------------*
INITIALIZATION.
* Parameter screen texts.
text1 = 'Change program code'.
text2 = 'program'.
text3 = 'Option'.
text4 = 'Change Calss-methods'.
text5 = 'Class Name'.
text6 = 'Method Name'.
text7 = 'Display Method''s Program Name'.
text8 = 'Edit Method code'.
*------------------------------------------------------------------------*
*START-OF-SELECTION.
*------------------------------------------------------------------------*
START-OF-SELECTION.
CLEAR:lv_incname.
IF rad_1 = 'X'.
lv_incname = p_prog.
ELSE.
CLEAR:ls_mtdkey.
ls_mtdkey-clsname = p_cls.
ls_mtdkey-cpdname = p_method.
CALL METHOD cl_wb_cleditor=>convert_type_and_name "底层代码cl_oo_classname_service=>get_method_include
EXPORTING
object_type = p_obj
mtdkey = ls_mtdkey
IMPORTING
incname = lv_incname
EXCEPTIONS
not_converted = 1
OTHERS = 2.
ENDIF.
CHECK lv_incname IS NOT INITIAL.
IF rad_1 = 'X' OR rad_2 = 'X' AND p_edit = 'X'.
CLEAR int_tab .
READ REPORT lv_incname INTO int_tab.
EDITOR-CALL FOR int_tab .
INSERT REPORT lv_incname FROM int_tab.
MESSAGE s000(oo) WITH '修改完成'.
ENDIF.
IF rad_2 = 'X' AND p_chk = 'X'.
WRITE: / lv_incname.
ENDIF.
END-OF-SELECTION.
*------------------------------------------------------------------------
* findClassMethods... Finds the methods of a class.
*------------------------------------------------------------------------
FORM findclassmethods USING VALUE(p_cls)
VALUE(p_method).
"the code for get methods copy from FM SEO_METHOD_F4_EXIT in search help OO_METHOD_F4 .
DATA: BEGIN OF mtdkeys,
mtdname TYPE seomtdname,
descr TYPE seodescr,
END OF mtdkeys.
DATA: mtdkeyt LIKE TABLE OF mtdkeys,
cl_inst TYPE REF TO cl_oo_class_components_flat,
components TYPE REF TO if_oo_clif_components_flat,
clskey TYPE seoclskey,
method_flat TYPE seometflat.
CHECK p_cls IS NOT INITIAL.
* ec:with enhancement_componets mitgeben
clskey-clsname = p_cls.
CREATE OBJECT cl_inst
EXPORTING
clskey = clskey
with_interface_components = 'X'
with_inherited_components = 'X'
with_enhancement_components = 'X'.
components ?= cl_inst.
CLEAR:mtdkeyt.
LOOP AT components->methods INTO method_flat.
CLEAR:mtdkeys.
mtdkeys-mtdname = method_flat-cpdname.
mtdkeys-descr = method_flat-descript.
IF mtdkeys-mtdname = 'CONSTRUCTOR' OR
mtdkeys-mtdname = 'CLASS_CONSTRUCTOR' OR
mtdkeys-mtdname = 'DESTRUCTOR'.
CONTINUE.
ELSE.
APPEND mtdkeys TO mtdkeyt.
ENDIF.
ENDLOOP.
IF mtdkeyt IS NOT INITIAL.
SORT mtdkeyt BY mtdname.
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
retfield = 'MTDNAME'
dynpprog = sy-repid
dynpnr = sy-dynnr
dynprofield = 'P_METHOD'
value_org = 'S'
TABLES
value_tab = mtdkeyt
EXCEPTIONS
parameter_error = 1
no_values_found = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDIF.
ENDFORM. "findClassMethods
"1 该程序可以直接修改 SE38 能打开的所有程序代码而不会产生传输请求号, 慎用!
*2 可以输入CLASS名称,回车后,选择对应的method 直接修改程序代码,会产生传输请求号, 慎用!
*&---"author: lijq21@qq.com
DATA: int_tab TYPE STANDARD TABLE OF string WITH HEADER LINE,
ls_mtdkey TYPE seocpdkey,
lv_incname LIKE trdir-name,
p_obj TYPE seu_objtyp VALUE 'OM'.
SELECTION-SCREEN: BEGIN OF BLOCK b2 WITH FRAME TITLE text3.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: rad_1 TYPE c RADIOBUTTON GROUP g1 DEFAULT 'X' USER-COMMAND a.
SELECTION-SCREEN COMMENT 3(25) text1.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN: BEGIN OF BLOCK b1 WITH FRAME." TITLE text1.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 5(15) text2.
PARAMETERS: p_prog LIKE trdir-name."LIKE sy-repid . "程序名称
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN: END OF BLOCK b1.
SELECTION-SCREEN SKIP.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: rad_2 TYPE c RADIOBUTTON GROUP g1.
SELECTION-SCREEN COMMENT 3(25) text4.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN: BEGIN OF BLOCK b3 WITH FRAME." TITLE text4.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 5(15) text5.
PARAMETERS: p_cls TYPE seoclsname.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 5(15) text6.
PARAMETERS: p_method TYPE seocpdname.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 5(1) text9.
PARAMETERS: p_edit TYPE char1 AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN COMMENT 10(45) text8.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 5(1) text10.
PARAMETERS: p_chk TYPE char1 AS CHECKBOX.
SELECTION-SCREEN COMMENT 10(45) text7.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN: END OF BLOCK b3.
SELECTION-SCREEN: END OF BLOCK b2.
*-----------------------------------------------------------------------*
*AT SELECTION-SCREEN
*------------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_prog.
CALL FUNCTION 'REPOSITORY_INFO_SYSTEM_F4'
EXPORTING
object_type = 'PROG' "表EUOBJ EUOBJT
object_name = p_prog
suppress_selection = 'X'
use_alv_grid = ''
without_personal_list = ''
IMPORTING
object_name_selected = p_prog
EXCEPTIONS
cancel = 1.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_method.
PERFORM findclassmethods USING p_cls
p_method.
*---------------------------------------------------------------------------------*
*AT SELECTION-SCREEN.
*---------------------------------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT.
IF rad_1 EQ 'X'.
LOOP AT SCREEN.
IF screen-name CP '*P_PROG*'.
screen-input = 1.
MODIFY SCREEN.
ENDIF.
IF screen-name CP '*P_CLS*' OR screen-name CP '*P_METHOD*' OR
screen-name CP '*P_CHK*' OR screen-name CP '*P_EDIT*'.
screen-input = 0.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
* CLEAR:p_cls,p_method,p_chk.
ELSE.
LOOP AT SCREEN.
IF screen-name CP '*P_PROG*'."
screen-input = 0.
MODIFY SCREEN.
ENDIF.
IF screen-name CP '*P_CLS*' OR screen-name CP '*P_METHOD*' OR
screen-name CP '*P_CHK*' OR screen-name CP '*P_EDIT*'.
screen-input = 1.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
* CLEAR:p_prog.
ENDIF.
*------------------------------------------------------------------------*
* INITIALISATION
*------------------------------------------------------------------------*
INITIALIZATION.
* Parameter screen texts.
text1 = 'Change program code'.
text2 = 'program'.
text3 = 'Option'.
text4 = 'Change Calss-methods'.
text5 = 'Class Name'.
text6 = 'Method Name'.
text7 = 'Display Method''s Program Name'.
text8 = 'Edit Method code'.
*------------------------------------------------------------------------*
*START-OF-SELECTION.
*------------------------------------------------------------------------*
START-OF-SELECTION.
CLEAR:lv_incname.
IF rad_1 = 'X'.
lv_incname = p_prog.
ELSE.
CLEAR:ls_mtdkey.
ls_mtdkey-clsname = p_cls.
ls_mtdkey-cpdname = p_method.
CALL METHOD cl_wb_cleditor=>convert_type_and_name "底层代码cl_oo_classname_service=>get_method_include
EXPORTING
object_type = p_obj
mtdkey = ls_mtdkey
IMPORTING
incname = lv_incname
EXCEPTIONS
not_converted = 1
OTHERS = 2.
ENDIF.
CHECK lv_incname IS NOT INITIAL.
IF rad_1 = 'X' OR rad_2 = 'X' AND p_edit = 'X'.
CLEAR int_tab .
READ REPORT lv_incname INTO int_tab.
EDITOR-CALL FOR int_tab .
INSERT REPORT lv_incname FROM int_tab.
MESSAGE s000(oo) WITH '修改完成'.
ENDIF.
IF rad_2 = 'X' AND p_chk = 'X'.
WRITE: / lv_incname.
ENDIF.
END-OF-SELECTION.
*------------------------------------------------------------------------
* findClassMethods... Finds the methods of a class.
*------------------------------------------------------------------------
FORM findclassmethods USING VALUE(p_cls)
VALUE(p_method).
"the code for get methods copy from FM SEO_METHOD_F4_EXIT in search help OO_METHOD_F4 .
DATA: BEGIN OF mtdkeys,
mtdname TYPE seomtdname,
descr TYPE seodescr,
END OF mtdkeys.
DATA: mtdkeyt LIKE TABLE OF mtdkeys,
cl_inst TYPE REF TO cl_oo_class_components_flat,
components TYPE REF TO if_oo_clif_components_flat,
clskey TYPE seoclskey,
method_flat TYPE seometflat.
CHECK p_cls IS NOT INITIAL.
* ec:with enhancement_componets mitgeben
clskey-clsname = p_cls.
CREATE OBJECT cl_inst
EXPORTING
clskey = clskey
with_interface_components = 'X'
with_inherited_components = 'X'
with_enhancement_components = 'X'.
components ?= cl_inst.
CLEAR:mtdkeyt.
LOOP AT components->methods INTO method_flat.
CLEAR:mtdkeys.
mtdkeys-mtdname = method_flat-cpdname.
mtdkeys-descr = method_flat-descript.
IF mtdkeys-mtdname = 'CONSTRUCTOR' OR
mtdkeys-mtdname = 'CLASS_CONSTRUCTOR' OR
mtdkeys-mtdname = 'DESTRUCTOR'.
CONTINUE.
ELSE.
APPEND mtdkeys TO mtdkeyt.
ENDIF.
ENDLOOP.
IF mtdkeyt IS NOT INITIAL.
SORT mtdkeyt BY mtdname.
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
retfield = 'MTDNAME'
dynpprog = sy-repid
dynpnr = sy-dynnr
dynprofield = 'P_METHOD'
value_org = 'S'
TABLES
value_tab = mtdkeyt
EXCEPTIONS
parameter_error = 1
no_values_found = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDIF.
ENDFORM. "findClassMethods
介绍了一个ABAP自定义程序,该程序允许用户直接修改SE38中可访问的所有程序代码,无需生成传输请求号。此外,还支持通过指定类名和方法名来修改特定的类方法代码,并会生成传输请求号。
3079

被折叠的 条评论
为什么被折叠?



