二维码

SAP实战中Submit的常见用法-调用标准程序

Twilight发表于 2015-10-05 11:49zhongguomao 最后回复于 2017-07-28 13:41 [复制链接] 8507 2

场景:系统MB52/MB51/MB5B等类似的报表,虽然数据很全面,执行效率也够快,但是经常会不满足用户需求(增添字段、添加查询条件等),很多ABAP会选择去COPY出标准程序,然后去做修改,强烈不推荐此种方式,弊端太大,容易使标准程序出现问题,且效率低(特别涉及MSEG等数据库表)。

我们可以使用SUBMIT,此语法可将获取系统标准报表数据,然后你就可以自己去加一层壳来实现自己的定制。

语法:
  1. SUBMIT {rep|(name)} [selscreen_options]
  2. [list_options]
  3. [job_options]
  4. [AND RETURN].
复制代码
selscreen_options:主要是标准程序选择界面Field,通过F1去查看具体Field name

方式一:获取ALV报表结果数据(不局限于严格意义上的ALV Grid、LIST报表也能获取到值),关键代码:
  1. SUBMIT

  2.     TRY.
  3.         cl_salv_bs_runtime_info=>get_data_ref( IMPORTING r_data = lr_alv_data ).

  4.         ASSIGN lr_alv_data->* TO <lt_alv_data>.
  5.       CATCH cx_salv_bs_sc_runtime_info.

  6.         MESSAGE 'Unable to retrieve ALV data! Please try other conditions.' TYPE 'E'.
  7.     ENDTRY.
复制代码

示例:获取MB5B执行结果,详细代码:
  1. *&---------------------------------------------------------------------*
  2. *&
  3. *& 获取MB5B数据
  4. *&---------------------------------------------------------------------*
  5. DATA:lr_alv_data TYPE REF TO data.

  6. FIELD-SYMBOLS : <lt_alv_data> TYPE ANY TABLE .
  7. FIELD-SYMBOLS : <lt_data> TYPE ANY. "LIKE LINE OF  it_tab .


  8. *&---------------------------------------------------------------------*
  9. *& "计算特殊库存E的期初期末
  10. *&---------------------------------------------------------------------*
  11.     cl_salv_bs_runtime_info=>set( EXPORTING display  = abap_false
  12.                                             metadata = abap_false
  13.                                             data     = abap_true ).
  14.     CLEAR lr_alv_data.
  15.     UNASSIGN <lt_alv_data>.

  16.     SUBMIT rm07mlbd                                         "MB5B特殊库存及搜索条件
  17.            WITH matnr IN so_matnr
  18.            WITH werks IN so_werks
  19.            WITH lgort EQ so_lgort-low "循环获取每个库存地点的期初期末
  20.            WITH sobkz EQ 'E'
  21.            WITH datum IN so_budat
  22.            "库存类型-特殊库存
  23.            WITH lgbst EQ space
  24.            WITH bwbst EQ space
  25.            WITH sbbst EQ 'X'
  26.            "设置
  27.            WITH xsum EQ space
  28.            WITH pa_sumfl EQ 'X'
  29.            WITH xchar EQ space
  30.            WITH xnomchb EQ space
  31.            WITH xnomchb EQ space
  32.            WITH nosto EQ space

  33.            WITH pa_dbstd EQ 'X'
  34.            AND RETURN.

  35.     TRY.
  36.         cl_salv_bs_runtime_info=>get_data_ref( IMPORTING r_data = lr_alv_data ).

  37.         ASSIGN lr_alv_data->* TO <lt_alv_data>.
  38.       CATCH cx_salv_bs_sc_runtime_info.

  39.         MESSAGE 'Unable to retrieve ALV data! Please try other conditions.' TYPE 'E'.
  40.     ENDTRY.

  41.     cl_salv_bs_runtime_info=>clear_all( ).

  42.     "
  43.     IF <lt_alv_data> IS ASSIGNED.
  44.       UNASSIGN <lt_data>.
  45.       LOOP AT <lt_alv_data> ASSIGNING <lt_data>."即所需要内表数据

  46.       ENDLOOP.
  47.     ENDIF.
复制代码

方式二:将执行结果放入MEMORY(此法用于结果不是很明确的ALV结构),关键代码:
  1. EXPORT export_list TO MEMORY ID 'MB51_EXPORT_LIST'.

  2. SUBMIT...

  3. IMPORT export_list FROM MEMORY ID 'MB51_EXPORT_LIST'.
复制代码
示例:获取MB51执行结果数据,详细代码:
  1. *&---------------------------------------------------------------------*
  2. *& Report  ZTEST_CALL_MB51
  3. *&
  4. *&---------------------------------------------------------------------*
  5. *&
  6. *& 获取MB51数据
  7. *&---------------------------------------------------------------------*

  8. REPORT  ztest_call_mb51.

  9. TYPE-POOLS:abap.
  10. TABLES:mseg,mara,mard.

  11. DATA:
  12.       flag(01)    TYPE  c VALUE 'X', "Name for compatibility with MB03 "MAA EhP4
  13.       no_list(01) TYPE  c VALUE 'X'. "Do not show the list             "MAA EhP4

  14. DATA: BEGIN OF export_list OCCURS 0,
  15.         matnr TYPE mseg-matnr,
  16.         maktx TYPE makt-maktx,
  17.         werks TYPE mseg-werks,
  18.         name1 TYPE t001w-name1,
  19.         lgort TYPE mseg-lgort,
  20.         charg TYPE mseg-charg,                              "351455
  21.         bwtar TYPE mseg-bwtar,                              "351455
  22.         bwart TYPE mseg-bwart,
  23.         sobkz TYPE mseg-sobkz,
  24.         btext TYPE t156t-btext,
  25.         mblnr TYPE mseg-mblnr,
  26.         mjahr TYPE mseg-mjahr,
  27.         zeile TYPE mseg-zeile,
  28.         budat TYPE mkpf-budat,
  29.         erfmg TYPE mseg-erfmg,
  30.         erfme TYPE mseg-erfme,
  31.         lifnr TYPE mseg-lifnr,
  32.         vgart TYPE mkpf-vgart,
  33.       END OF export_list.

  34. SELECTION-SCREEN: BEGIN OF BLOCK blk1 WITH FRAME TITLE text-t01.
  35. SELECT-OPTIONS:so_werks FOR mseg-werks OBLIGATORY,
  36.                           so_matnr FOR mseg-matnr,
  37.                           so_mtart FOR mara-mtart,
  38.                           so_matkl FOR mara-matkl,
  39.                           so_lgort FOR mard-lgort.
  40. SELECT-OPTIONS so_mtr_i FOR mseg-matnr NO-DISPLAY .
  41. SELECTION-SCREEN: END OF BLOCK blk1.

  42. START-OF-SELECTION.

  43.   EXPORT flag TO MEMORY ID 'MB51_FLAG'.
  44.   EXPORT no_list TO MEMORY ID 'MB51_NOLIST' .
  45.   EXPORT export_list TO MEMORY ID 'MB51_EXPORT_LIST'.

  46.   SUBMIT rm07docs
  47.     WITH matnr IN so_matnr
  48.     WITH werks IN so_werks
  49.     WITH lgort IN so_lgort
  50.     WITH database EQ abap_true
  51.     WITH pa_dbstd EQ abap_true
  52.     WITH mb51_flag EQ flag
  53.     WITH mb51_nolist EQ no_list
  54.   EXPORTING LIST TO MEMORY AND RETURN.

  55.   IMPORT export_list FROM MEMORY ID 'MB51_EXPORT_LIST'.
  56.   FREE MEMORY ID 'MB51_EXPORT_LIST'.

  57.   LOOP AT export_list."export_list 为需要的内表数据

  58.   ENDLOOP.
复制代码
回复

使用道具 举报

zll
各位在使用第一种方法中有没有出现BUG ,有时候第一次执行会获取不到数据 ,多次执行才可以获取到标准系统表的数据
回复 支持 反对

使用道具 举报

zhongguomao
经常用。也是直接copy的,根本不知道其中的奥秘。
回复 支持 反对

使用道具 举报

快速回帖

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

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