• SUBMIT标准程序取ALV数据


    示例1:

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

    FORM frm_call_j3rflvmobvedh.
      DATA: lr_bukrs TYPE RANGE OF bukrs,
            ls_bukrs LIKE LINE OF lr_bukrs,
            lr_datum TYPE RANGE OF datum,
            ls_datum LIKE LINE OF lr_datum.
    
      DATA: lo_data TYPE REF TO data.
      DATA: lv_buper TYPE buper.
      FIELD-SYMBOLS:
            <fs_t_data> TYPE ANY TABLE.
    
      ls_bukrs-sign = 'I'.
      ls_bukrs-option = 'EQ'.
      ls_bukrs-low = p_bukrs.
      APPEND ls_bukrs TO lr_bukrs.
    
    * Caculate the first & last day of the Month
      lv_buper = |{ gv_gjahr }{ gv_monat }|.
    
      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.
    
      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.
      IF <fs_t_data> IS ASSIGNED.
        gt_3rmobvedh_total = <fs_t_data>.
      ENDIF.
      cl_salv_bs_runtime_info=>clear_all( ).
    ENDFORM.
    View Code

    示例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.
    
      PERFORM frm_get_variant CHANGING lv_va."获取程序变式
    
    ***为后续获取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.
    View Code

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

    以下参考博文: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 就不会被显示出来。
  • 相关阅读:
    oracle 索引失效的原因
    输入英文查找出十个出现频率最高的单词
    记录最近在使用sprintf构造字符串时遇到的一个问题
    ADO.NET对象模型
    MySQL5.0中文手册(13.1. 数据定义声明)
    2005年中国软件产业最大规模前100家企业名单
    妹妹生了个女儿,纪念一下
    数组定义的疑问
    短期目标
    做项目的一点收获之二
  • 原文地址:https://www.cnblogs.com/rainysblog/p/11688559.html
Copyright © 2020-2023  润新知