ABAP动态编程-动态调用子例程&方法及动态SQL

43 篇文章 7 订阅

目录

前言

一、动态调用

1.1 FORM子例程的动态调用

1.2 ABAP方法动态调用

二、动态SQL

2.1 动态OPEN SQL语句

2.2 使用ADBC类执行SQL

 总结


前言

        本文主要讲述ABAP语言中FORM子例程,方法的动态调用,以及SQL的动态使用(动态OPEN SQL 和 ADBC调用)


一、动态调用

1.1 FORM子例程的动态调用

        代码示例:

DATA:lv_formname TYPE string,
     lv_program  TYPE program. 
PERFORM (lv_formname) IN PROGRAM (lv_program) IF FOUND.

        PS: ABAP子例程的动态调用不仅可以调用当前主程序及子程序中的FORM,也可以动态指定程序调用,生成的动态子例程就用该方式调用。注意form名称及程序名必须大写。

1.2 ABAP方法动态调用

        代码示例:

DATA: lo_object    TYPE REF TO object,
      lv_class     TYPE seoclsname,
      lv_method    TYPE string,
      lt_parameter TYPE abap_parmbind_tab,
      ls_parameter TYPE abap_parmbind,
      lt_exception TYPE abap_excpbind_tab,
      ls_exception TYPE abap_excpbind.

lv_class = 'CL_DEMO_TEXT'.
lv_method = 'DISPLAY_STRING'.

lt_parameter = VALUE #( ( name = 'TEXT_STRING' kind = 'E' value = REF #( `CL_DEMO_TEXT=>DISPLAY_STRING` ) ) ).
lt_exception = VALUE #( ( name = 'OTHERS' value = 9  ) ).

TRY.
    CALL METHOD (lv_class)=>(lv_method) PARAMETER-TABLE lt_parameter EXCEPTION-TABLE lt_exception.
  CATCH cx_root. 
ENDTRY.

        展示效果:

        PS:示例为静态方法的调用,实例方法需要动态创建对象后调用,使用方式同理,另外function动态调用时参数(参数字段KIND: E,I,C,R 分别对应EXPORTING, IMPORTING, CHANGING, RECEIVING)的处理与方法一致,不再说明。注意类名和方法名需要大写。

二、动态SQL

2.1 动态OPEN SQL语句

        代码示例:

DATA: lt_data TYPE TABLE OF t001.

DATA: lv_from  TYPE string,
      lv_field TYPE string,
      lv_where TYPE string.

lv_from   = 'T001'.
lv_field  = 'BUKRS BUTXT'.
lv_where  = `BUKRS = '0001'`.


SELECT (lv_field)
  INTO CORRESPONDING FIELDS OF TABLE lt_data
  FROM (lv_from)
  WHERE (lv_where).

         效果:

        PS: 使用时注意捕捉异常

2.2 使用ADBC类执行SQL

        代码示例:

DATA: lr_result TYPE REF TO data.
DATA: lo_structdescr TYPE REF TO cl_abap_datadescr.

TRY.
    " 需要执行的SQL语句字符串
    DATA(lv_statement) = `SELECT * FROM T001 WHERE BUKRS = '0001'`.
    DATA(lo_db_connection) = cl_sql_connection=>get_connection( cl_sadl_dbcon=>get_default_dbcon( ) ).
    DATA(lo_result) = lo_db_connection->create_statement( )->execute_query( statement = lv_statement ).
    DATA(lt_md_data) = lo_result->get_metadata( ).
    DATA(lr_metadata) = lo_result->get_struct_ref( md_tab = lt_md_data
                                                      p_strict = abap_false ).

    lo_structdescr ?= cl_abap_typedescr=>describe_by_data_ref( lr_metadata ).
    DATA(lo_tabletype)     = cl_abap_tabledescr=>create( p_line_type  = lo_structdescr
                                                  p_table_kind = cl_abap_tabledescr=>tablekind_std ).

    CREATE DATA lr_result TYPE HANDLE lo_tabletype.

*     finally save the result_set in the handled tabletype
    lo_result->set_param_table( itab_ref = lr_result ) .

    lo_result->next_package( ).

    lo_db_connection->close( ).

  CATCH cx_sql_exception.

ENDTRY.

         效果:

         PS: 这里的SQL语句为底层数据库SQL,而不是OPEN SQL.


 总结

        1. 动态使用中括号标识符的使用很重要,括号表示使用的为括号中变量对用的值,而不是括号中的值。

        2. 动态调用时的动态部分注意要大写

        3. 动态调用有可能会产生dump,一定要注意异常的捕捉

关联文章:

ABAP动态编程-动态数据对象_xiefireworks的博客-CSDN博客

ABAP动态编程-动态调用子例程&方法及动态SQL_xiefireworks的博客-CSDN博客

ABAP动态编程-动态生成子例程和本地类-GENERATE SUBROUTINE POOL_xiefireworks的博客-CSDN博客

ABAP动态编程-动态生成报表、屏幕_xiefireworks的博客-CSDN博客

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值