使用ABAP代码动态创建一个新的BAdI Enhancement Implementation

简介: 使用ABAP代码动态创建一个新的BAdI Enhancement Implementation

METHOD create_badi_impl.

 DATA: lo_enh_impl TYPE REF TO if_enh_tool,

       lo_badi_impl_tool TYPE REF TO cl_enh_tool_badi_impl,

       lt_existing_badi_impls TYPE enh_badi_impl_data_it,

       ls_badi_impl TYPE enh_badi_impl_data,

       ls_filter_value TYPE enh_badiimpl_filter_value,

       ls_filter_impl TYPE enh_badi_filter_impl,

       ls_filter_root TYPE enh_badiimpl_filter_root,

       ls_filter_id TYPE enh_badiimpl_filter_id,

       lv_natual_number TYPE int4,

       lx_enh_root TYPE REF TO cx_enh_root.

 TRY.

* Try to find whether the enhancement implementation exists.

     lo_enh_impl = cl_enh_factory=>get_enhancement(

         lock                   = abap_true "Must lock it otherwise it cannot be deleted later

*          lock_4_activate        =

         enhancement_id         = iv_enh_impl_name

*        ddic_enh               =

*        virtual_subobject      =

*        before_export          =

*        rfcdestination         =

*        suppress_lang_dialog   =

*        repairmode             = 'U'

*        upgrade_mode           =

*        run_dark               =

*        cwb_handling           = ' '

*        is_xversionable_object =

*        versno                 =

*        bypassing_buffer       =

*        find_version           =

*        find_version_date      =

*        find_version_time      =

*        log_srcsystem          =

*        logid                  =

*        after_import           =

*        i_devclass             =

*        i_trkorr               =

*        suppress_repair_popup  =

*        request_language       = SY-LANGU

*        fallback_masterlang    =

            ).

*   If the enhancement implementation does not exist, the exception CX_ENH_IO_ERROR is thrown

*   and value of lo_enh_impl remains the same as before the method is called.

   CATCH cx_enh_root INTO lx_enh_root.

 ENDTRY.

 TRY.

*  Delete the enhancement implementation if found

     IF lo_enh_impl IS BOUND.

       lo_enh_impl->if_enh_object~delete(

*      EXPORTING

*        nevertheless_delete =

*        run_dark            =

*        scwb_call           = ABAP_FALSE

         CHANGING

           devclass            = cv_package

           trkorr              = cv_change_request

              ).

     lo_enh_impl->if_enh_object~unlock( ).

     ENDIF.

*  Try to create new enhancement implementation

     cl_enh_factory=>create_enhancement(

       EXPORTING

          enhname       = iv_enh_impl_name

          enhtype       = cl_abstract_enh_tool_redef=>credefinition

          enhtooltype   = cl_enh_tool_badi_impl=>tooltype

          compositename = iv_comp_enh_impl_name

*      scwb_call     = ' '

*      scwb_no_lock  = ' '

*      dark          =

*      orig_lang     =

*      check_mode    = ' '

*      genflag       =

     IMPORTING

         enhancement   = lo_enh_impl

     CHANGING

         trkorr        = cv_change_request

         devclass      = cv_package

     ).

* Enhancement is of type BAdI, so convert

     lo_badi_impl_tool ?= lo_enh_impl.

     lo_badi_impl_tool->set_spot_name( iv_enh_spot_name ).

* Prepare data for BAdI implementation creation

     CLEAR ls_badi_impl.

     ls_badi_impl-spot_name = iv_enh_spot_name.  "Enhancement spot

     ls_badi_impl-badi_name = iv_badi_def_name.  "BAdI definition name

     ls_badi_impl-impl_name = iv_badi_impl_name. "BAdI implementation name

     ls_badi_impl-impl_class = iv_impl_class_name. "Implementation class

* Other implementation configuration are hard-coded

     ls_badi_impl-active = 'X'.

     ls_badi_impl-is_default = 'X'.

     ls_badi_impl-impl_shorttext = 'BAdI implementation generated by FE Tool'.

* Create Filters

* Attention! only process string type filter with comparaotr '=' here.

     IF ( is_simple_string_filter IS NOT INITIAL  ).

*        Filter root

       lv_natual_number = 1.

       ls_filter_id-filter_name = is_simple_string_filter-filter_name.

       ls_filter_id-id = lv_natual_number.

       ls_filter_root-root = lv_natual_number.

       APPEND ls_filter_id TO ls_filter_root-filters.

       APPEND ls_filter_root TO ls_badi_impl-filter_root.

*         Filter value

       ls_filter_value-id = lv_natual_number.

       ls_filter_value-filter_name = is_simple_string_filter-filter_name.

       ls_filter_value-filter_type = 'S'.

       ls_filter_value-compare = '='.

       ls_filter_value-filter_string_value1 = is_simple_string_filter-filter_value.

       APPEND ls_filter_value TO ls_badi_impl-filter_values.

*          Filters

       ls_filter_impl-disj_idx = lv_natual_number.

       ls_filter_impl-conj_idx = lv_natual_number.

       ls_filter_impl-filter_name = is_simple_string_filter-filter_name.

       ls_filter_impl-filter_type = 'S'.

       ls_filter_impl-compare = '='.

       ls_filter_impl-filter_string_value1 = is_simple_string_filter-filter_value.

       APPEND ls_filter_impl TO ls_badi_impl-filters.

     ENDIF.

* Add BAdI implementations

     lo_badi_impl_tool->add_implementation( im_implementation = ls_badi_impl  ).

* Save

     lo_badi_impl_tool->if_enh_object~save( ).

* Activate

     lo_badi_impl_tool->if_enh_object~activate( ).

* Generate.

     lo_badi_impl_tool->if_enh_object~generate( ).

* Unlock.

     lo_badi_impl_tool->if_enh_object~unlock( ).

   CATCH cx_enh_root INTO lx_enh_root.

     RAISE EXCEPTION TYPE /SFT/cx_badi_impl_handling

       EXPORTING

         previous = lx_enh_root.

 ENDTRY.

ENDMETHOD.


相关文章
|
1月前
|
前端开发 开发工具 Android开发
小技巧分享 - 使用 Visual Studio Code 查看和修改 ABAP 代码试读版
小技巧分享 - 使用 Visual Studio Code 查看和修改 ABAP 代码试读版
15 0
小技巧分享 - 使用 Visual Studio Code 查看和修改 ABAP 代码试读版
|
1月前
|
开发者 供应链 BI
SAP ABAP CALL SUBSCREEN 代码解析
SAP ABAP CALL SUBSCREEN 代码解析
58 0
|
1月前
|
BI
工具分享 - 将一个 ABAP Function Group 内所有 Function Module 按照代码行数从高到低排序并显示
工具分享 - 将一个 ABAP Function Group 内所有 Function Module 按照代码行数从高到低排序并显示
20 0
工具分享 - 将一个 ABAP Function Group 内所有 Function Module 按照代码行数从高到低排序并显示
|
1月前
|
存储
使用 ABAP 代码打印出 SAP CRM 系统里所有维护了 Sales Area 的 business partner id
使用 ABAP 代码打印出 SAP CRM 系统里所有维护了 Sales Area 的 business partner id
21 0
|
1月前
|
开发工具 Web App开发 IDE
如何对 SAPGUI 里的 ABAP 代码语法检查功能进行自定义增强配套代码
如何对 SAPGUI 里的 ABAP 代码语法检查功能进行自定义增强配套代码
9 2
如何对 SAPGUI 里的 ABAP 代码语法检查功能进行自定义增强配套代码
|
1月前
|
开发者 数据库
使用 SAP ABAP 代码下载一个 note 到本地 ABAP 系统
使用 SAP ABAP 代码下载一个 note 到本地 ABAP 系统
12 0
|
2月前
|
BI
工具分享 - 将一个 ABAP Function Group 内所有 Function Module 按照代码行数从高到低排序并显示试读版
工具分享 - 将一个 ABAP Function Group 内所有 Function Module 按照代码行数从高到低排序并显示试读版
16 0
|
2月前
|
存储 数据处理 开发者
ABAP 如何把 unicode 代码点转换成字符
ABAP 如何把 unicode 代码点转换成字符
21 0
|
7月前
|
存储 语音技术 UED
如何用 ABAP 代码进行文本转语音的输出工作
如何用 ABAP 代码进行文本转语音的输出工作
38 0
|
3月前
|
SQL 数据库
小技巧:如何让 ABAP OPEN SQL 代码具有自解释性(Self-Explained)
小技巧:如何让 ABAP OPEN SQL 代码具有自解释性(Self-Explained)
26 0

热门文章

最新文章