从现有报表取数

有些情况我们需要取一些标准报表的数据,如果自己重写比较复杂,用SUBMIT … AND RETURN可以调用标准报表并获取获取返回值。

参考:ZEROTEST69

语法:SUBMIT [程序名] WITH [调用程序屏幕的参数名]IN/=  值 AND RETURN

加上 EXPORTING LIST TO MEMORY 将程序返回的alv输出到MEMORY可以用函数取出

网上也有很多类似的例子,这里自己以MB5B测试了一个例子

列子一:

*&---------------------------------------------------------------------**& Report  ZEROTEST69*& 测试直接取MB5B 历史库存的数据*&---------------------------------------------------------------------**&*&*&---------------------------------------------------------------------*REPORT  zerotest69.TABLES: t001w,mard,mkpf.DATA:ls_data TYPE REF TO data.FIELD-SYMBOLS: <lt_data> TYPE table,
  <l_data>  TYPE data.DATA  BEGIN OF itab_list OCCURS 0.
  INCLUDE STRUCTURE abaplist.DATA  END OF itab_list.DATA:BEGIN OF t_str OCCURS 0,
  str(20) TYPE c,END OF t_str.DATA: BEGIN OF vlist OCCURS 0, "这个调用程序ALV输出的长度要根据实际长度来确认
  filler1(100)   TYPE c,
  field1(50)    TYPE c,
  filler(50)    TYPE c,
  field2(50)    TYPE c,
  filler3(50)   TYPE c,
  END OF vlist.DATA: str1(100) TYPE c,
  str2(100) TYPE c.SELECTION-SCREEN BEGIN OF BLOCK bl1 WITH FRAME TITLE text-bl1.SELECT-OPTIONS:
  s_werks FOR t001w-werks,
  s_matnr FOR mard-matnr,
  s_budat FOR mkpf-budat.SELECTION-SCREEN END OF BLOCK bl1.START-OF-SELECTION.
  PERFORM get_mb5b_data.*&---------------------------------------------------------------------**&      Form  get_mb5b_data*&---------------------------------------------------------------------**       text*----------------------------------------------------------------------*FORM get_mb5b_data.

  cl_salv_bs_runtime_info=>set(
    display  = abap_false
    metadata = abap_false
    data     = abap_true  ).

  SUBMIT rm07mlbd WITH werks IN s_werks WITH matnr IN s_matnr WITH datum IN s_budat WITH lgbst = 'X' AND RETURN EXPORTING LIST TO MEMORY."TCODE:MB5B


  CALL FUNCTION 'LIST_FROM_MEMORY'
    TABLES
      listobject = itab_list
    EXCEPTIONS
      not_found  = 4
      OTHERS     = 8.

  CALL FUNCTION 'LIST_TO_ASCI'
    EXPORTING
      list_index         = -1
    TABLES
      listasci           = vlist
      listobject         = itab_list
    EXCEPTIONS
      empty_list         = 1
      list_index_invalid = 2
      OTHERS             = 3.
  IF sy-subrc = 0.
    READ TABLE vlist INDEX 5.
    IF sy-subrc = 0 .
      SPLIT vlist-filler1  AT '' INTO TABLE t_str . "根据空格拆分
    ENDIF.
  ENDIF.
  DELETE t_str WHERE str = ''. "删除空行
  READ TABLE t_str INDEX 3.
  IF sy-subrc = 0.
    WRITE: t_str-str.
  ENDIF.*  TRY.*      cl_salv_bs_runtime_info=>get_data_ref(*       IMPORTING r_data = ls_data ).**      ASSIGN ls_data->* TO <lt_data>.**    CATCH cx_salv_bs_sc_runtime_info.*      MESSAGE '无法读取ALV数据' TYPE 'E'.*  ENDTRY.**  cl_salv_bs_runtime_info=>clear_all( ).**  IF <lt_data> IS ASSIGNED.*    LOOP AT <lt_data> ASSIGNING <l_data>.**    MOVE-CORRESPONDING <l_data> TO gt_tab.**    APPEND gt_tab.*    ENDLOOP.*  ENDIF.ENDFORM.                    "

例子二:

  FIELD-SYMBOLS <FT_ZSDR011> TYPE ANY TABLE.

  CL_SALV_BS_RUNTIME_INFO=>SET( EXPORTING DISPLAY = ABAP_FALSE
        METADATA = ABAP_FALSE
      DATA = ABAP_TRUE ).

  SUBMIT ZSDR001
        WITH S_MVLEN = I_VBELN
        AND RETURN.
  TRY.
      CL_SALV_BS_RUNTIME_INFO=>GET_DATA_REF( IMPORTING R_DATA = DATA(LT_ZSDR011) ).
      ASSIGN LT_ZSDR011->* TO <FT_ZSDR011>.
    CATCH CX_SALV_BS_SC_RUNTIME_INFO.
  ENDTRY.

  CL_SALV_BS_RUNTIME_INFO=>CLEAR_ALL( ).

  IF <FT_ZSDR011> IS NOT INITIAL.
    LOOP AT <FT_ZSDR011> ASSIGNING FIELD-SYMBOL(<FS_ZSDR011>).
*      应收余额
      ASSIGN COMPONENT 'DMBTR_YSKYE' OF STRUCTURE <FS_ZSDR011> TO FIELD-SYMBOL(<F_DMBTR_YSKYE>).
      ES_DATA-ZZVBLEN_SYED = ES_DATA-ZZVBLEN_SYED + <F_DMBTR_YSKYE>.
    ENDLOOP.
  ENDIF.


关键词: ABAP

网友评论

发表评论