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.
修改程序

修改函数

修改类方法


浙公网安备 33010602011771号