SAP ABAP SUBMIT调用标准程序

文章介绍了在ABAP开发中,如何使用SUBMIT命令来调用标准程序并获取其数据,以此避免直接复制修改标准程序带来的问题。通过示例展示了如何获取MB5B和MB51报表的数据,并提供了两种方法:一种是直接获取ALV报表结果数据,另一种是将结果存储到内存中。这种方法可以更灵活地满足用户对报表的定制需求,同时保持标准程序的完整性。

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

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

语法:
 

SUBMIT {rep|(name)} [selscreen_options]
[list_options]
[job_options]
[AND RETURN].

selscreen_options:主要是标准程序选择界面Field,通过F1去查看具体Field name

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

SUBMIT

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

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

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

示例:获取MB5B执行结果,详细代码:

*&---------------------------------------------------------------------*
*&
*& 获取MB5B数据 
*&---------------------------------------------------------------------*
DATA:lr_alv_data TYPE REF TO data. 

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


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

    SUBMIT rm07mlbd                                         "MB5B特殊库存及搜索条件
           WITH matnr IN so_matnr
           WITH werks IN so_werks
           WITH lgort EQ so_lgort-low "循环获取每个库存地点的期初期末
           WITH sobkz EQ 'E'
           WITH datum IN so_budat
           "库存类型-特殊库存
           WITH lgbst EQ space
           WITH bwbst EQ space
           WITH sbbst EQ 'X'
           "设置
           WITH xsum EQ space
           WITH pa_sumfl EQ 'X'
           WITH xchar EQ space
           WITH xnomchb EQ space
           WITH xnomchb EQ space
           WITH nosto EQ space

           WITH pa_dbstd EQ 'X'
           AND RETURN.

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

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

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

    cl_salv_bs_runtime_info=>clear_all( ).

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

      ENDLOOP.
    ENDIF.

方式二:将执行结果放入MEMORY(此法用于结果不是很明确的ALV结构),关键代码:

EXPORT export_list TO MEMORY ID 'MB51_EXPORT_LIST'.

SUBMIT...

IMPORT export_list FROM MEMORY ID 'MB51_EXPORT_LIST'.

示例:获取MB51执行结果数据,详细代码:

*&---------------------------------------------------------------------*
*& Report  ZTEST_CALL_MB51
*&
*&---------------------------------------------------------------------*
*&
*& 获取MB51数据
*&---------------------------------------------------------------------*

REPORT  ztest_call_mb51.

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

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

DATA: BEGIN OF export_list OCCURS 0,
        matnr TYPE mseg-matnr,
        maktx TYPE makt-maktx,
        werks TYPE mseg-werks,
        name1 TYPE t001w-name1,
        lgort TYPE mseg-lgort,
        charg TYPE mseg-charg,                              "351455
        bwtar TYPE mseg-bwtar,                              "351455
        bwart TYPE mseg-bwart,
        sobkz TYPE mseg-sobkz,
        btext TYPE t156t-btext,
        mblnr TYPE mseg-mblnr,
        mjahr TYPE mseg-mjahr,
        zeile TYPE mseg-zeile,
        budat TYPE mkpf-budat,
        erfmg TYPE mseg-erfmg,
        erfme TYPE mseg-erfme,
        lifnr TYPE mseg-lifnr,
        vgart TYPE mkpf-vgart,
      END OF export_list.

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

START-OF-SELECTION.

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

  SUBMIT rm07docs
    WITH matnr IN so_matnr
    WITH werks IN so_werks
    WITH lgort IN so_lgort
    WITH database EQ abap_true
    WITH pa_dbstd EQ abap_true
    WITH mb51_flag EQ flag
    WITH mb51_nolist EQ no_list
  EXPORTING LIST TO MEMORY AND RETURN.

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

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

  ENDLOOP.

<think> 首先,用户的问题是关于在ABAP中使用SUBMIT调用其他程序时跳过选择屏幕的方法。用户提到了引用[1]和引用[2],但它们似乎不是直接相关的。引用[1]是关于CALL TRANSACTION的,引用[2]是关于SUBMIT的用法,但用户明确说这些引用仅供参考,不是真正的需求。用户的上一个问题可能与此无关,所以我需要基于当前问题回答。 用户的问题是:“我想查找在ABAP中使用SUBMIT调用其他程序跳过选择屏幕的方法 请问ABAPSUBMIT调用其他程序跳过选择屏幕的方法” 关键点:使用SUBMIT调用程序时跳过选择屏幕。 在ABAP中,SUBMIT 是用来调用其他ABAP报表程序的语句。选择屏幕(Selection Screen)是报表程序的一部分,用户可以在其中输入参数。 要跳过选择屏幕,直接进入程序的执行部分,有几种方法: 1. **使用SUBMIT WITH ... 参数传递**:在SUBMIT语句中,使用WITH子句直接传递选择屏幕的参数,这样程序就不会显示选择屏幕。 2. **使用VIA SELECTION-SCREEN**:在SUBMIT语句中添加VIA SELECTION-SCREEN子句来控制选择屏幕的行为。 3. **设置系统字段**:通过设置系统字段如SY-BATCH来指示批处理模式,从而跳过选择屏幕。 4. **使用LEAVE TO TRANSACTION**:但用户指定了SUBMIT,所以应该专注于SUBMIT。 从ABAP知识: - 当使用SUBMIT时,如果提供了所有必要的选择屏幕参数,程序可能不会显示选择屏幕。 - 具体地,使用SUBMIT ... WITH ... TO SAP-SPOOL 或其他选项可以控制。 标准方法是使用SUBMIT语句的WITH子句来传递值给选择屏幕字段。 例如: SUBMIT program_name WITH p_field = value ... AND RETURN. 如果所有参数都提供了,选择屏幕就被跳过。 用户问的是“跳过选择屏幕的方法”,所以我需要给出明确的代码示例。 现在,系统级指令: - 所有行内数学表达式使用$...$,但这不是数学主题,所以可能不需要。 - 独立公式使用$$...$$,但同样,这不是数学主题。 - LaTeX语法正确:可能不需要LaTeX,因为是编程问题。 - 使用中文回答。 - 生成相关问题:在回答末尾生成相关问题。 - 引用标识:如果在回答中引用了部分,添加引用标识如[^1]。但用户提供的引用可能不相干,我应该基于通用知识。 用户说:“上述引用仅供参考,并不是用户真正的需求”,所以我会忽略那些引用,除非必要。 回答结构清晰:逐步解决问题。 所以,结构: 1. 解释方法:在ABAP中,使用SUBMIT调用程序时跳过选择屏幕的主要方法是通过在SUBMIT语句中提供选择屏幕参数的值。 2. 给出代码示例。 3. 讨论可能的注意事项。 代码示例: 例如,假设有一个报表程序ZMY_REPORT,它有一个参数P_DATE。 要跳过选择屏幕: SUBMIT ZMY_REPORT WITH P_DATE = sy-datum AND RETURN. 如果所有必要参数都提供了,选择屏幕将不会显示。 另一个方法是使用VIA SELECTION-SCREEN子句。但在ABAP中,VIA SELECTION-SCREEN通常用于指定选择屏幕的版本,不是直接跳过。 更可靠的方法是确保参数完整。 在批处理模式(SY-BATCH = 'X')时,选择屏幕通常被跳过。 但对于交互式使用,提供参数是关键。 用户提到“跳过选择屏幕”,所以焦点是SUBMIT。 从引用[2]中:“SUBMIT ZSD429 WITH SKDGRP = ‘’ ... AND RETURN”,这表明使用WITH子句传递参数。 所以,在回答中,我可以引用这个思路。 现在,生成相关问题: 在末尾添加相关问题。 相关问题应该相关于ABAP SUBMIT的使用。 例如: 1. 如何传递动态参数给SUBMIT? 2. 如何处理SUBMIT调用后的返回值? 3. SUBMIT和CALL TRANSACTION的区别? 确保回答用中文。 大纲回答: - 介绍:要在ABAP中使用SUBMIT调用程序时跳过选择屏幕,可以通过在SUBMIT语句中提供选择屏幕参数的值来实现。 - 方法:使用WITH子句传递参数值。如果所有强制参数都指定了值,选择屏幕将被跳过。 - 示例代码:给出一个简单的ABAP代码片段。 - 注意事项:如果参数不完整,选择屏幕可能还会显示;在批处理模式中自动跳过。 - 相关问题:生成几个相关问题。 </think> ### ABAP中使用SUBMIT调用程序跳过选择屏幕的方法 在ABAP中,当使用`SUBMIT`语句调用其他报表程序时,跳过选择屏幕(Selection Screen)的方法是**通过在`SUBMIT`语句中提供选择屏幕参数的所有必要值**。选择屏幕是ABAP报表程序的一部分,用于用户输入参数。如果在调用时直接指定了这些参数的值,系统将跳过选择屏幕的显示,直接执行程序的主逻辑。以下是详细的步骤和解释: #### 步骤1: 理解核心方法 - **使用`WITH`子句传递参数**:在`SUBMIT`语句中,通过`WITH`子句为选择屏幕的参数赋值。如果所有强制参数(即定义了`OBLIGATORY`的参数)都被提供了值,系统将自动跳过选择屏幕。 - **添加`AND RETURN`选项**:推荐使用`AND RETURN`子句,确保调用程序后控制权返回源程序,便于后续处理(如内存数据导入)。如果省略,程序可能停留在被调用程序界面。 - **注意事项**: - 如果参数值不完整(例如,遗漏了某些强制参数),选择屏幕仍会显示。 - 在批处理模式(如后台作业,设置`SY-BATCH = 'X'`)中,选择屏幕默认跳过,无需额外处理。 - 使用`FREE MEMORY`释放内存ID,避免冲突(如果被调用程序使用了内存传输)[^2]。 #### 步骤2: 代码示例 假设您要调用一个名为`ZSD429`的报表程序,它有几个选择屏幕参数,例如`SKDGRP`(客户组)、`SBZIRK`(销售地区)和`SWADAT`(过账日期)。以下ABAP代码展示了如何跳过选择屏幕: ```abap " 定义选择屏幕参数范围(可选,用于动态值) DATA: lt_datum TYPE RANGE OF datum, ls_datum LIKE LINE OF lt_datum. " 设置参数值(例如,使用系统日期) ls_datum-sign = 'I'. ls_datum-option = 'EQ'. ls_datum-low = sy-datum. " 当前日期 APPEND ls_datum TO lt_datum. " 使用SUBMIT调用程序并跳过选择屏幕 SUBMIT ZSD429 WITH SKDGRP = '' " 客户组,空值示例 WITH SBZIRK = 'BZIRK' " 销售地区,固定值 WITH SWADAT IN lt_datum " 过账日期,使用范围表 AND RETURN. " 返回控制权 " 可选:导入内存数据(如果被调用程序设置了内存) DATA lv_yue TYPE i. IMPORT ARTOTAL = lv_yue FROM MEMORY ID 'ARTOTAL'. FREE MEMORY ID 'ARTOTAL'. " 释放内存,避免残留 ``` - **解释**: - `WITH SKDGRP = ''`:传递空值给`SKDGRP`参数(如果程序允许空值)。 - `WITH SBZIRK = 'BZIRK'`:传递固定值给`SBZIRK`参数。 - `WITH SWADAT IN lt_datum`:使用范围表传递日期参数,支持复杂条件。 - `AND RETURN`:确保调用后返回源程序。 - 所有参数都指定后,选择屏幕将被跳过,程序直接执行。 #### 步骤3: 常见问题和注意事项 - **参数完整性**:确保覆盖所有强制参数。如果参数缺失,选择屏幕会显示。您可以使用`SELECT-OPTIONS`或`PARAMETERS`在调用程序中动态构建值。 - **错误处理**:添加异常处理以捕获错误: ```abap SUBMIT ZSD434 WITH ... AND RETURN EXCEPTIONS PROGRAM_NOT_FOUND = 1 OTHERS = 2. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. ``` - **性能与安全**: - 在后台作业中使用时,设置`SY-BATCH = 'X'`可强制跳过选择屏幕。 - 避免硬编码值:使用变量或数据库读取使代码更灵活。 - 引用[^2]提到内存管理(`IMPORT`和`FREE MEMORY`),这在参数传递后导入结果时很有用。 通过上述方法,您可以高效地在ABAP中跳过选择屏幕,适用于批量处理或自动化任务。如果参数值动态变化,请结合ABAP的`ASSIGN`或`LOOP`结构生成值[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值