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
给定引用中未提及ABAP Web SE的相关信息,下面基于通用知识进行介绍。 ### 功能介绍 ABAP Web SE(SAP NetWeaver Application Server ABAP Web Services and XML Engine)是SAP系统中用于开发运行Web服务的重要组件,它为企业提供了在ABAP环境下创建、发布消费Web服务的能力。可以将企业内部的业务逻辑封装成标准的Web服务接口,使得不同系统之间能够通过网络进行数据交换业务交互。支持基于SOAPREST协议的Web服务开发,满足不同场景下的集成需求。 ### 使用方法 #### 创建Web服务提供者 - **定义接口**:在ABAP开发工具中,使用SE80或SE24等事务码创建一个类,实现特定的接口,该接口定义了Web服务对外提供的方法数据结构。 - **发布服务**:通过事务码SICF(SAP Internet Communication Framework)在SAP系统中创建一个服务节点,并将之前定义的类与该服务节点关联。然后在SOA管理界面(如[SOA网址](https://mysap.goodsap.cn:44300/sap/bc/webdynpro/sap/appl_soap_management ))中发布该Web服务,使其可以被外部系统访问。 #### 创建Web服务消费者 - **创建服务代理**:使用事务码SICF或相关工具创建一个服务消费者代理,该代理会根据目标Web服务的WSDL文件生成对应的ABAP方法,用于调用外部Web服务。 - **配置连接信息**:创建RFC连接,设置逻辑端口,指定目标Web服务的URL、用户名密码等信息。可以在SOA网址上进行相关配置。 - **调用服务**:在ABAP程序中调用服务消费者代理生成的方法,传递必要的参数并处理返回结果。 ### 代码示例 #### Web服务提供者示例代码 ```abap * 定义一个类实现Web服务接口 REPORT zws_provider_demo. CLASS zcl_my_web_service DEFINITION. PUBLIC SECTION. INTERFACES: if_http_extension. METHODS: handle_request FOR INTERFACE if_http_extension~handle_request. ENDCLASS. CLASS zcl_my_web_service IMPLEMENTATION. METHOD if_http_extension~handle_request. DATA: lv_response TYPE string. lv_response = 'Hello, this is a Web service response!'. cl_http_response=>set_text( EXPORTING text = lv_response ). ENDMETHOD. ENDCLASS. ``` #### Web服务消费者示例代码 ```abap * 调用外部Web服务 REPORT zws_consumer_demo. DATA: lo_proxy TYPE REF TO zif_my_web_service_proxy, lv_result TYPE string. CREATE OBJECT lo_proxy. CALL METHOD lo_proxy->my_web_service_method IMPORTING ev_result = lv_result. WRITE: / 'Web service result:', lv_result. ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值