欢迎来到萧静默的博客

书山有路勤为径,学海无涯苦作舟。

ABAP不需要开发请求的代码修改--用于简单逻辑或者字段的修改

直接上代码

*&使用方法:
*&1. 可以在QAS或者PRD创建本地程序,然后将本代码粘贴激活运行即可;或者在DEV通过开发请求传输
*&2. 支持修改SE38程序、SE37函数、SE24类方法、CMOD增强等自开发程序
*&3. 切勿利用本程序的BUG或其它技术手段去修改SAP系统标准程序!!!
*&免责声明
*&1. 用户在使用本程序时应自行承担风险。用户应负责确保本程序的使用符合所有适用的法律法规,并承担因使用本程序而产生的所有后果。
*&---------------------------------------------------------------------*
*&变更记录:                                                          *
*&DATE        DEVELOPER           REQNO       DESCRIPTIONS            *
*& ==========  =================== ==========  ========================*
*&
*&---------------------------------------------------------------------*
REPORT ZMODIFY.
TABLES: RS38M,RS38L,SEOCLASS,SEOCPDKEY.

DATA:GS_HEADER TYPE HEADER_FB.
DATA:GT_RESULT TYPE TABLE OF SEOP_METHOD_W_INCLUDE.
DATA:GS_RESULT TYPE SEOP_METHOD_W_INCLUDE.

DATA:GV_ERROR TYPE ABAP_BOOL.
DATA:GV_SUBRC LIKE SY-SUBRC.

SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE T01.
  PARAMETERS: P_PROG RADIOBUTTON GROUP RG1 USER-COMMAND UC1 DEFAULT 'X'.  "SE38
  PARAMETERS: P_FUNC RADIOBUTTON GROUP RG1.                               "SE37
  PARAMETERS: P_CLAS RADIOBUTTON GROUP RG1.                               "SE24
SELECTION-SCREEN END OF BLOCK B1.

SELECTION-SCREEN BEGIN OF BLOCK B2 WITH FRAME TITLE T02.
  PARAMETERS: PROGRAMM TYPE RS38M-PROGRAMM MODIF ID G1 MATCHCODE OBJECT SEDT_PROGRAMS.
  PARAMETERS: FUNCTION TYPE RS38L-NAME MODIF ID G2 MATCHCODE OBJECT SFUNC_MODULES.
  PARAMETERS: CLSNAME TYPE SEOCLASS-CLSNAME MODIF ID G3 MATCHCODE OBJECT SEO_CLASSES_INTERFACES.
  PARAMETERS: CPDNAME TYPE SEOCPDKEY-CPDNAME MODIF ID G3.
SELECTION-SCREEN END OF BLOCK B2.

INITIALIZATION.
  %_P_PROG_%_APP_%-TEXT = '程序'.
  %_P_FUNC_%_APP_%-TEXT = '函数'.
  %_P_CLAS_%_APP_%-TEXT = ''.
  %_PROGRAMM_%_APP_%-TEXT = '报表名称'.
  %_FUNCTION_%_APP_%-TEXT = '函数名称'.
  %_CLSNAME_%_APP_%-TEXT = '类名称'.
  %_CPDNAME_%_APP_%-TEXT = '方法名称'.
  T01 = '功能选择'.
  T02 = '条件选择'.

AT SELECTION-SCREEN OUTPUT.
  LOOP AT SCREEN.
    CASE ABAP_TRUE.
      WHEN P_PROG.
        CASE SCREEN-GROUP1.
          WHEN'G1'.
            SCREEN-REQUIRED = 2.
          WHEN'G2' OR 'G3'.
            SCREEN-ACTIVE = 0.
        ENDCASE.
      WHEN P_FUNC.
        CASE SCREEN-GROUP1.
          WHEN'G1' OR 'G3'.
            SCREEN-ACTIVE = 0.
          WHEN'G2'.
            SCREEN-REQUIRED = 2.
        ENDCASE.
      WHEN P_CLAS.
        CASE SCREEN-GROUP1.
          WHEN'G1' OR 'G2'.
            SCREEN-ACTIVE = 0.
          WHEN'G3'.
            SCREEN-REQUIRED = 2.
        ENDCASE.
    ENDCASE.
    MODIFY SCREEN.
  ENDLOOP.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR CPDNAME.
  PERFORM F4_CPDNAME.


START-OF-SELECTION.
  PERFORM CHECK_INPUT.
  PERFORM EDIT_REPORT.


FORM CHECK_INPUT.
  CASE ABAP_TRUE.
    WHEN P_PROG.
      PERFORM CHECK_PROGRAM USING PROGRAMM.
      IF GV_ERROR = ABAP_TRUE.
        MESSAGE S017(DS) WITH PROGRAMM DISPLAY LIKE 'E'.
        LEAVE LIST-PROCESSING.
      ENDIF.
    WHEN P_FUNC.
      PERFORM CHECK_FUNCTION USING FUNCTION.
      IF GV_ERROR = ABAP_TRUE.
        MESSAGE S110(FL) WITH FUNCTION DISPLAY LIKE 'E'.
        LEAVE LIST-PROCESSING.
      ENDIF.
    WHEN P_CLAS.
      PERFORM CHECK_METHOD.
      CASE GV_SUBRC.
        WHEN 1.
          MESSAGE S003(OO) WITH '' CLSNAME DISPLAY LIKE 'E'.
          LEAVE LIST-PROCESSING.
        WHEN 2.
          MESSAGE S003(OO) WITH '方法' CPDNAME DISPLAY LIKE 'E'.
          LEAVE LIST-PROCESSING.
        WHEN 3.
          MESSAGE S003(OO) WITH '' '方法' DISPLAY LIKE 'E'.
          LEAVE LIST-PROCESSING.
      ENDCASE.
  ENDCASE.
ENDFORM.

FORM EDIT_REPORT.
  DATA: BEGIN OF SRC OCCURS 1,
          TXT(255) TYPE C,
        END OF        SRC.

  READ REPORT PROGRAMM INTO SRC.
  EDITOR-CALL FOR SRC.

  IF SY-SUBRC = 0.
    INSERT REPORT PROGRAMM FROM SRC.
  ENDIF.
ENDFORM.

FORM CHECK_PROGRAM USING NAME TYPE RS38M-PROGRAMM.
  CLEAR: FUNCTION,CLSNAME,CPDNAME.
  GV_ERROR = ABAP_TRUE.
  IF NAME IS INITIAL.
    MESSAGE'报表名称不可为空' TYPE 'S' DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING.
  ENDIF.
*CHECK name(1) = 'Z'.
  "检查程序是否存在
  SELECT SINGLE * INTO @DATA(LS_PROGDIR) FROM PROGDIR WHERE NAME = @NAME.
  IF SY-SUBRC <> 0.
    RETURN.
  ENDIF.
  "检查程序开发包
  SELECT SINGLE * INTO @DATA(LS_APPL_PROG) FROM APPL_PROG WHERE PROG = @NAME.
  IF SY-SUBRC = 0.
    IF LS_APPL_PROG-DEVCLASS(1) <> 'Z' AND LS_APPL_PROG-DEVCLASS <> '$TMP'.
      RETURN.
    ENDIF.
  ELSE.
    IF NAME(4) = 'SAPL'.
      "函数组
      SELECT COUNT( * ) FROM TADIR WHERE OBJ_NAME = @NAME+4(*) AND ( DEVCLASS LIKE 'Z%' OR DEVCLASS = '$TMP'  ).
      IF SY-SUBRC <> 0.
        RETURN.
      ENDIF.
    ELSE.
      "检查是否为类方法的包含程序
      DATA(RESULT) = FIND( VAL = NAME SUB = '=' ).
      IF RESULT > 0.
        CLSNAME = NAME(RESULT).
        SELECT COUNT( * ) FROM SEOCLASS WHERE CLSNAME = @CLSNAME.
        IF SY-SUBRC = 0.
          CL_OO_CLASSNAME_SERVICE=>GET_ALL_METHOD_INCLUDES( EXPORTING  CLSNAME            = CLSNAME
          RECEIVING RESULT             = GT_RESULT
          EXCEPTIONS CLASS_NOT_EXISTING = 1
          OTHERS             = 2 ).
          READ TABLE GT_RESULT INTO GS_RESULT WITH KEY INCNAME = NAME.
          IF SY-SUBRC = 0.
            CPDNAME = GS_RESULT-CPDKEY-CPDNAME.
            PERFORM CHECK_METHOD.
            IF GV_ERROR = ABAP_TRUE.
              RETURN.
            ENDIF.
          ELSE.
            RETURN.
          ENDIF.
        ENDIF.
      ENDIF.
      "检查程序名是否存在于TADIR,如CMOD的增强程序
      SELECT SINGLE * INTO @DATA(LS_TADIR) FROM TADIR WHERE OBJ_NAME = @NAME.
      IF SY-SUBRC = 0.
        IF LS_TADIR-DEVCLASS(1) <> 'Z' AND LS_TADIR-DEVCLASS <> '$TMP'.
          RETURN.
        ENDIF.
      ELSE.
        "检查是否为SE38程序或者SE37函数的包含程序
        SELECT SINGLE * INTO @DATA(LS_D010INC) FROM D010INC
        WHERE INCLUDE = @NAME AND
        EXISTS ( SELECT NAME FROM PROGDIR WHERE NAME = D010INC~MASTER ).
        IF SY-SUBRC = 0.
          PERFORM CHECK_PROGRAM USING LS_D010INC-MASTER.
          IF GV_ERROR = ABAP_TRUE.
            RETURN.
          ENDIF.
        ELSE.
          RETURN.
        ENDIF.
      ENDIF.
    ENDIF.
  ENDIF.
  GV_ERROR = ABAP_FALSE.
ENDFORM.

FORM CHECK_FUNCTION USING NAME.
  GV_ERROR = ABAP_TRUE.
  IF NAME IS INITIAL.
    MESSAGE'函数名称不可为空' TYPE 'S' DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING.
  ENDIF.
  CL_FB_FUNCTION_UTILITY=>METH_GET_HEADER_FB( EXPORTING  IM_NAME             = CONV #( NAME )
  IMPORTING EX_HEADER           = GS_HEADER
  EXCEPTIONS ERROR_OCCURED       = 1
  OBJECT_NOT_EXISTING = 2
  OTHERS              = 3 ).
  IF SY-SUBRC <> 0 OR ( GS_HEADER-DEVCLASS(1) <> 'Z' AND GS_HEADER-DEVCLASS <> '$TMP' ).
    RETURN.
  ENDIF.
  "使用函数的包含程序名称来编辑源码
  PROGRAMM = GS_HEADER-INCLUDE.
  GV_ERROR = ABAP_FALSE.
ENDFORM.

FORM CHECK_METHOD.
  GV_ERROR = ABAP_TRUE.
  IF CLSNAME IS INITIAL OR CPDNAME IS INITIAL.
    MESSAGE'类和方法名名称不可为空' TYPE 'S' DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING.
  ENDIF.
  SELECT SINGLE * INTO @DATA(LS_TADIR) FROM TADIR WHERE OBJ_NAME = @CLSNAME AND ( DEVCLASS LIKE 'Z%' OR DEVCLASS = '$TMP'  ).
  IF  SY-SUBRC <> 0.
    GV_SUBRC = 3.
    RETURN.
  ENDIF.
  CL_OO_CLASSNAME_SERVICE=>GET_METHOD_INCLUDE( EXPORTING  MTDKEY              = VALUE #( CLSNAME = CLSNAME CPDNAME = CPDNAME )
  RECEIVING RESULT              = PROGRAMM
  EXCEPTIONS CLASS_NOT_EXISTING  = 1
  METHOD_NOT_EXISTING = 2
  OTHERS              = 3 ).
  GV_SUBRC = SY-SUBRC.
  IF SY-SUBRC <> 0 .
    RETURN.
  ENDIF.
  GV_ERROR = ABAP_FALSE.
ENDFORM.

FORM F4_CPDNAME.
  TYPES: BEGIN OF LTY_CPDNAME,
           CPDNAME TYPE SEOCPDKEY-CPDNAME,
         END OF       LTY_CPDNAME.
  DATA :LT_CPDNAME TYPE TABLE OF LTY_CPDNAME.
  DATA: LT_DYNPREAD TYPE STANDARD TABLE OF DYNPREAD,
        LS_DYNPREAD TYPE DYNPREAD.


  LS_DYNPREAD-FIELDNAME = 'CLSNAME'.
  APPEND LS_DYNPREAD TO LT_DYNPREAD.
  CALL FUNCTION 'DYNP_VALUES_READ'
    EXPORTING
      DYNAME               = SY-REPID
      DYNUMB               = SY-DYNNR
    TABLES
      DYNPFIELDS           = LT_DYNPREAD
    EXCEPTIONS
      INVALID_ABAPWORKAREA = 1
      INVALID_DYNPROFIELD  = 2
      INVALID_DYNPRONAME   = 3
      INVALID_DYNPRONUMMER = 4
      INVALID_REQUEST      = 5
      NO_FIELDDESCRIPTION  = 6
      INVALID_PARAMETER    = 7
      UNDEFIND_ERROR       = 8
      DOUBLE_CONVERSION    = 9
      STEPL_NOT_FOUND      = 10
      OTHERS               = 11.
  IF SY-SUBRC <> 0.
*MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.
  CLSNAME = LT_DYNPREAD[ 1 ]-FIELDVALUE.
  CHECK CLSNAME IS NOT INITIAL.
  CL_OO_CLASSNAME_SERVICE=>GET_ALL_METHOD_INCLUDES( EXPORTING  CLSNAME            = CLSNAME
  RECEIVING RESULT             = GT_RESULT
  EXCEPTIONS CLASS_NOT_EXISTING = 1
  OTHERS             = 2 ).
  IF SY-SUBRC <> 0.
    MESSAGE S003(OO) WITH '' CLSNAME DISPLAY LIKE 'E'.
    RETURN.
  ENDIF.
  LT_CPDNAME = CORRESPONDING #( GT_RESULT MAPPING CPDNAME = CPDKEY-CPDNAME   ).
  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      RETFIELD        = 'CPDNAME'
      VALUE_ORG       = 'S'
      DYNPPROG        = SY-REPID
      DYNPNR          = SY-DYNNR
      DYNPROFIELD     = 'CPDNAME'
    TABLES
      VALUE_TAB       = LT_CPDNAME
    EXCEPTIONS
      PARAMETER_ERROR = 1
      NO_VALUES_FOUND = 2
      OTHERS          = 3.
ENDFORM.

修改程序

image

 修改函数

image

 修改类方法

image

 

posted @ 2025-08-05 09:53  萧静默  阅读(65)  评论(0)    收藏  举报