使用ABAP代码动态创建一个新的BAdI Enhancement Implementation
代码 一个 ABAP 动态创建 implementation 使用
2023-09-14 09:02:46 时间
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.
相关文章
- 详解ThinkPHP登录功能实例代码
- 【工具类】如何通过代码安装一个apk文件
- Javassist动态构造一个Class类代码示例
- 使用 ABAP 代码解析一个 class 的所有方法
- SAP ABAP里unicode转中文的一个解决方案的完整代码
- 一个Java实现的把指定字符串生成二维码并保存成图片的代码
- 推荐一个用于程序员写代码时播放背景音乐的网站:听雨网
- Atitit 代码的导航 1.1.代码的层次导航 语句 函数方法 类 包 1.2.4.4. 代码可视化 流程图 一个方法内,多个代码行的关系图 语句to方法2 1.3.4.5. 类图 类结构
- 一个小技巧,快速找出一段ABAP代码里访问到的所有透明表
- 从编译后的代码,分析 Angular @Injectable 的工作原理
- 一个让开发人员仅通过声明式代码的方式实现智能数据结构的Java框架
- 从零开始学习Java神经网络、自然语言处理和语音识别,附详解和简易版GPT,语音识别完整代码示例解析
- 基于多目标粒子群优化算法的计及光伏波动性的主动配电网有功无功协调优化(Matlab代码实现)
- 基于SUSAN算法的边缘检测方法研究(Matlab代码实现)
- ffplay源码分析:代码框架
- 低代码实现传统装饰企业的管理跃迁
- (1/8)[代码整洁之道]你真的会用枚举吗?非也!
- 前后端代码分离开发(Vue)
- 【iOS开展-50】使用它来创建一个新的类的实现代码包,因此,不自觉地练习简单MVC实验,附带动画
- gvim写html代码时如何快速地跳转到一个标签的结束位置: 终极插件: matchit.vim
- 114:vue+openlayers 实现视图联动功能(代码示例 )
- leaflet使用Polygon画嵌套多边形,一个数组多条数据(示例代码016)
- PDFium-PDF开源之旅(1)-初探代码下载编译
- 大势所趋——区块链(Python代码实现)
- gitlab提交代码失败,提示这是一个受保护的分支