ABAP DEMO篇25 调用标准程序取ALV数据

示例1:

调用J3RFLVMOBVEDH ,取物料的期初/ 期末庫存数、金额

  DATA: LO_DATA TYPE REF TO DATA.
  FIELD-SYMBOLS:
          <FS_T_DATA> TYPE ANY TABLE.


  CL_SALV_BS_RUNTIME_INFO=>SET(
   EXPORTING
     DISPLAY        = ABAP_FALSE
     METADATA       = ABAP_FALSE
     DATA           = ABAP_TRUE
 ).
  SUBMIT J_3RMOBVEDH
     WITH SO_BUKRS IN LR_BUKRS
     WITH SO_WERKS IN S_WERKS
     WITH SO_LGORT IN S_LGORT
     WITH SO_MATNR IN S_MATNR
     WITH SO_BUDAT IN LR_DATUM
     WITH P_XNEGP = 'X'
     AND RETURN.
  TRY.
      CL_SALV_BS_RUNTIME_INFO=>GET_DATA_REF(
        IMPORTING
            R_DATA = LO_DATA
      ).
      ASSIGN LO_DATA->* TO <FS_T_DATA>.
    CATCH CX_SALV_BS_SC_RUNTIME_INFO.
*      MESSAGE '无法获取ALV数据' TYPE 'E'.
      MESSAGE S004 DISPLAY LIKE 'E'.
      LEAVE LIST-PROCESSING.
  ENDTRY.
  CL_SALV_BS_RUNTIME_INFO=>CLEAR_ALL( ).

示例2:
调用 MB51 ,1 取物料查询期间的物料移动数据,2取各个进耗存类别数量、金额

FORM frm_material_list .

  DATA: lv_va TYPE slis_vari.

  DATA: lr_mjahr TYPE RANGE OF mjahr,

        ls_mjahr LIKE LINE OF lr_mjahr,

        lr_datum TYPE RANGE OF datum,

        ls_datum LIKE LINE OF lr_datum.

  DATA: lo_data TYPE REF TO data.

  FIELD-SYMBOLS:

    <fs_t_data> TYPE ANY TABLE,

    <ls_data>   TYPE any.

  ls_datum-sign = 'I'.

  ls_datum-option = 'BT'.

  ls_datum-low = gv_start_date.

  ls_datum-high = gv_end_date.

  APPEND ls_datum TO lr_datum.

**通过查询条件形成range

  ls_mjahr(3) = 'IEQ'.

  ls_mjahr-low = p_buper+0(4).

  APPEND ls_mjahr TO lr_mjahr.

***为后续获取ALV数据做设置

  cl_salv_bs_runtime_info=>set(

     EXPORTING

       display  = abap_false

       metadata = abap_false

       data     = abap_true ).

  SUBMIT rm07docs           " Tcode MB51

    WITH matnr IN s_matnr   "物料

    WITH werks IN s_werks   "工厂

    WITH lgort IN s_lgort   "库位

    WITH budat IN lr_datum  "过账日期

    WITH rhier_l = ''

    WITH rflat_l = abap_true"扁平结构

    WITH database = abap_true "读取数据库

    WITH alv_def = lv_va"变式

      AND RETURN.

**    WITH charg IN s_charg   "批次

*    WITH lifnr IN s_lifnr   "供应商

*    WITH kunnr IN s_kunnr   "客户

*    WITH bwart IN s_bwart   "移动类型

*    WITH sobkz IN s_sobkz   "特殊库存

*    WITH aufnr IN s_aufnr   "生产订单

*    WITH kostl IN s_kostl   "成本中心

*    WITH mat_kdau IN s_kdau "销售订单

*    WITH mat_kdpo IN s_kdpo "销售订单行项目

*    WITH rsnum IN s_rsnum   "预留

*    WITH rspos IN s_rspos   "预留行

*    WITH usnam IN s_usnam   "用户

*    WITH vgart IN s_vgart

*    WITH mblnr IN s_mblnr

*    WITH mjahr IN lr_mjahr

*    WITH budat IN lr_datum

*    WITH xblnr IN s_xblnr

  

  TRY.

      cl_salv_bs_runtime_info=>get_data_ref(

      IMPORTING

        r_data  = lo_data ).

      ASSIGN lo_data->* TO <fs_t_data>.

    CATCH cx_salv_bs_sc_runtime_info.

      MESSAGE '无法获取ALV数据' TYPE 'E'.

  ENDTRY.

  cl_salv_bs_runtime_info=>clear_all( ).

  IF <fs_t_data> IS ASSIGNED.

    LOOP AT <fs_t_data> ASSIGNING <ls_data>.

      MOVE-CORRESPONDING <ls_data> TO gt_itab.

      APPEND gt_itab.

    ENDLOOP.

  ENDIF.

  SORT gt_itab.

  DELETE ADJACENT DUPLICATES FROM gt_itab COMPARING ALL FIELDS.

ENDFORM.

图片

这个内表可以直接使用,也可以把他赋值到自定义的全局内表,供后续取数


补充说明:

遇到某些需求,顾问要的就是某张标准程序的 某些栏位,逻辑很难理清楚,特别是取期初,期末库存, 或者是某个特定日期的库存,
所以就要调用标准程序取数

以下参考博文:https://www.cnblogs.com/dy-debug/p/5791534.html

程序间获取ALV数据的两种方法:

方法1:通过修改SUBMIT的目标程序,把内表EXPORT到内存,SUBMIT后IMPORT ,该方法需要修改目标程序,可以任意设置目标程序的中断点;

示例:

* Execute transaction IA09 to get all Functional Location Tasklists
  SUBMIT riplko10
    WITH SELECTION-TABLE lt_selscreen
    WITH pn_iflo  = abap_true  "Select Func Loc Tasklists
    WITH dy_tcode = 'IA09'
    WITH dy_selm  = 'D'        "Dark mode
    AND RETURN
  IMPORT sel_tab FROM MEMORY ID 'RIPLKO10'.

这种方法性能比较高但是依赖源程序,需要事先将需要的数据EXPORT到内存,如果是标准程序就需要做增强。

方法2:SUBMIT前屏蔽ALV GRID的显示,使用SUBMIT,然后调用

CL_SALV_BS_RUNTIME_INFO=>GET_DATA_REF 

方法获取数据,(包括显示数据,布局数据,字段数据,过滤器等),这个是SAP提供的API所以我们不关心如何存储,所以该方法不需要修改目标程序就可以直接得到ALV显示的结果,

但不能设置目标程序的中断点,需显示ALV的函数执行完毕方可获取到数据。

FIELD-SYMBOLS <lt_pay_data>   TYPE ANY TABLE.
  DATA lr_pay_data              TYPE REF TO data.
  DATA lt_selscreen             TYPE TABLE OF rsparams.

  "初始设置
  CALL METHOD cl_salv_bs_runtime_info=>set
    EXPORTING
      display  = abap_false
      metadata = abap_false
      data     = abap_true.

* 调用目标程序
  SUBMIT h99cwtr0
    WITH SELECTION-TABLE lt_selscreen
     AND RETURN.

  TRY.

      "获取ALV显示数据
      CALL METHOD cl_salv_bs_runtime_info=>get_data_ref
        IMPORTING
          r_data = lr_pay_data.

      ASSIGN lr_pay_data->* TO <lt_pay_data>.
    CATCH cx_salv_bs_sc_runtime_info.

      MESSAGE `无法取得ALV术` TYPE 'E'.
  ENDTRY.

  "结束
  cl_salv_bs_runtime_info=>clear_all( ).

图片

CL_SALV_BS_RUNTIME_INFO 与读取 ALV相关的方法:

SET()  - 此方法初始化类(清除内存区域),然后允许标志的设置让任何后续ALV对象如何工作。它应该在装程序调用ALV报告程序之前被调用。

参数:

    • DISPLAY - 将它设为abap_false强制所有后续ALV报告在“黑暗模式”下运行,也就是说,ALV不会被输出到GUI。

    • METADATA - 将它设为abap_false防止基本信息(布局,字段目录等)被取到内存中......一般我们不需要。

    • DATA - 将它设为abap_true迫使数据表导出到内存而不是显示报表。

GET_DATA_REF() - 非常灵活的GET_DATA*方法,这种方法可以用来访问该数据表变量的引用(动态而且易用),所以即使不知道ALV数据表的结构也没关系。

参数:

  • R_DATA - 输出ALV数据表。

  • R_DATA_LINE - 如果执行的ALV有HEADER的(可选)。

GET_DATA() - 如果知道需要调用的ALV数据表的结构,可以使用这个方法。
参数:

  • T_DATA - 输出参数数据表。

  • T_DATA_LINE - 如果执行的ALV有HEADER(可选)。

CLEAR_ALL() - 此方法清除在 SET()  方法设置的标志。如果之后本程序还需要显示 其他ALV ,

那么这个方法尤为重要,如果不清楚设置,你的ALV 就不会被显示出来。

我自己就入了这个坑,因为少了这句,所以把表不输出。

此博客是朋友翔子原创。

原创 翔子的新骆驼 翔子的开发日记 2019-11-29  原文链接

ABAP DEMO篇25 调用标准程序取ALV数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值