二维码

[ooalv] ABAP程序中直接调用ALV报表结果数据

Twilight发表于 2016-09-29 12:04Twilight 最后回复于 2016-09-29 12:04 [复制链接] 891 0

如果我们想直接使用ALV报表数据,而不去重写逻辑,这能否做到呢?

虽然SAP ALV诞生很早了,在此之前好没用Separation of Concerns (SoC) and Model-View-Controller (MVC) 概念,不能直接使用数据,但是我们可以直接使用ABAP内存即可实现这样的效果。

例如:程序中直接获取T-code:IA09报表数据
  1. * Execute transaction IA09 to get all Functional Location Tasklists
  2. SUBMIT riplko10
  3.   WITH SELECTION-TABLE lt_selscreen
  4.   WITH pn_iflo  = abap_true  "Select Func Loc Tasklists
  5.   WITH dy_tcode = 'IA09'
  6.   WITH dy_selm  = 'D'        "Dark mode
  7.   AND RETURN.
  8. EXPORT sel_tab FROM MEMORY ID 'RIPLKO10'.
复制代码
但是这样有个弊病,那就是你必须增强原先程序riplko10,将结果数据IMPORT到ABAP内存中。

其实SAP已经提供一个标准的Class CL_SALV_BS_RUNTIME_INFO用来处理这样的问题了,这样我们就不需要增强原程序,直接获取数据,是不是很方便。
  1. FIELD-SYMBOLS <lt_pay_data>   TYPE ANY TABLE.
  2. DATA lr_pay_data              TYPE REF TO data.
  3. cl_salv_bs_runtime_info=>set(
  4.   EXPORTING display  = abap_false
  5.             metadata = abap_false
  6.             data     = abap_true ).
  7. * Submit Wage Type Reporter
  8. SUBMIT h99cwtr0
  9.   WITH SELECTION-TABLE lt_selscreen
  10.   AND RETURN.
  11. TRY.
  12.     cl_salv_bs_runtime_info=>get_data_ref(
  13.       IMPORTING r_data = lr_pay_data ).
  14.     ASSIGN lr_pay_data->* TO <lt_pay_data>.
  15.   CATCH cx_salv_bs_sc_runtime_info.
  16.     MESSAGE 'Unable to retrieve ALV data' TYPE 'E'.
  17. ENDTRY.
  18. cl_salv_bs_runtime_info=>clear_all( ).
复制代码
注:断点<lt_pay_data>,可以获取内表结构

CL_SALV_BS_RUNTIME_INFO->SET( )方法,用来设置开启、关闭alv的那些功能:
  • DISPLAY:是否输出ALV界面
  • METADATA:是否输出ALV的metadata (layout, field catalog, etc)数据到ABAP内存中
  • DATA:是否导出ALV结果数据到ABAP内存中

获取ALV结果数据的方法:
  • GET_DATA_REF( ):不需要知道ALV数据内表的结构
  • GET_DATA( ):必须指定ALV数据内表的结构

清空数据,这步很重要
  • CLEAR_ALL( ):清空所有内存数据,清空SET( ) 方法设置的标示。

注意:
  • 该方法适合所有alv类型的报表,包括alv树形报表
  • 如果你想获取高性能的解决方案,该方法可能并不能满足
回复

使用道具 举报

快速回帖

本版积分规则
您需要登录后才可以回帖 登录 | 注册有礼

快速回复 返回顶部 返回列表