目录
前言
本文为ABAP编程中动态生成子例程/本地类的简单示例,依托语句GENERATE SUBROUTINE POOL实现。
1. 动态生成子例程并调用
代码示例:
DATA: lt_source TYPE TABLE OF string WITH EMPTY KEY,
lv_source TYPE string,
lv_program TYPE sy-repid,
lv_message TYPE text240,
lv_lines TYPE i,
lv_word TYPE char72,
lv_sid TYPE string.
lt_source = VALUE #( ( `PROGRAM.` )
( `FORM DYN_FORM.` )
( ` DATA LS_T001 TYPE T001.` )
( ` SELECT SINGLE * FROM T001 INTO LS_T001 WHERE bukrs = '0001'.` )
( `WRITE: LS_T001-BUTXT.` )
( `ENDFORM.` )
).
TRY .
GENERATE SUBROUTINE POOL lt_source NAME lv_program
MESSAGE lv_message
LINE lv_lines WORD lv_word
SHORTDUMP-ID lv_sid.
CATCH cx_sy_generate_subpool_full .
sy-subrc = 2.
CATCH cx_sy_gen_source_too_wide .
sy-subrc = 3.
ENDTRY.
IF sy-subrc = 0.
PERFORM ('DYN_FORM') IN PROGRAM (lv_program) IF FOUND.
ELSEIF sy-subrc = 4.
MESSAGE lv_message TYPE 'I'.
ELSEIF sy-subrc = 8.
MESSAGE lv_sid TYPE 'I'.
ELSE.
MESSAGE 'GENERATE SUBROUTINE POOL EXCEPTION' TYPE 'I'.
ENDIF.
PS:根据代码字符串生成对应的子例程,适用于根据配置表或其它条件动态生成对应逻辑的处理, 或者处理一些其它动态调用无法灵活实现的场景,和主程序的数据交互也较为方便。
2. 动态生成本地类并调用
代码示例:
DATA: lt_source TYPE TABLE OF string WITH EMPTY KEY,
lv_source TYPE string,
lv_program TYPE sy-repid,
lv_message TYPE text240,
lv_lines TYPE i,
lv_word TYPE char72,
lv_sid TYPE string.
DATA: lv_classname TYPE string,
lo_object TYPE REF TO object.
lt_source = VALUE #(
( `PROGRAM.` )
( `CLASS main DEFINITION.` )
( ` PUBLIC SECTION.` )
( ` CLASS-METHODS meth_static.` )
( ` METHODS meth_instance.` )
( `ENDCLASS.` )
( `CLASS main IMPLEMENTATION.` )
( ` METHOD meth_static.` )
( ` WRITE: 'Static Method'.` )
( ` ENDMETHOD.` )
( ` METHOD meth_instance.` )
( ` WRITE: 'Instance Method'.` )
( ` ENDMETHOD.` )
( `ENDCLASS.` ) ).
TRY .
GENERATE SUBROUTINE POOL lt_source NAME lv_program
MESSAGE lv_message
LINE lv_lines WORD lv_word
SHORTDUMP-ID lv_sid.
CATCH cx_sy_generate_subpool_full .
sy-subrc = 2.
CATCH cx_sy_gen_source_too_wide .
sy-subrc = 3.
ENDTRY.
IF sy-subrc = 0.
TRY.
" 动态调用 静态方法
lv_classname = `\PROGRAM=` && lv_program && `\CLASS=MAIN`.
CALL METHOD (lv_classname)=>meth_static.
" 动态调用 实例方法
CREATE OBJECT lo_object TYPE (lv_classname).
CALL METHOD lo_object->('METH_INSTANCE').
CATCH cx_sy_dyn_call_error.
MESSAGE 'Dynamic call error' TYPE 'I'.
ENDTRY.
ELSEIF sy-subrc = 4.
MESSAGE lv_message TYPE 'I'.
ELSEIF sy-subrc = 8.
MESSAGE lv_sid TYPE 'I'.
ELSE.
MESSAGE 'GENERATE SUBROUTINE POOL EXCEPTION' TYPE 'I'.
ENDIF.
结果展示:
PS: 和生成子例程使用同样的语法,具体使用看个人喜好。
关联文章:
ABAP动态编程-动态数据对象_xiefireworks的博客-CSDN博客
ABAP动态编程-动态调用子例程&方法及动态SQL_xiefireworks的博客-CSDN博客
ABAP动态编程-动态生成子例程和本地类-GENERATE SUBROUTINE POOL_xiefireworks的博客-CSDN博客