abap 修改class method 和 se38 程序

介绍了一个ABAP自定义程序,该程序允许用户直接修改SE38中可访问的所有程序代码,无需生成传输请求号。此外,还支持通过指定类名和方法名来修改特定的类方法代码,并会生成传输请求号。
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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值