ABAP SUBMIT 调用程序DEMO

文章描述了一个使用ABAP编程语言从MB5B类型表中检索ALV数据的过程,涉及参数传递和错误处理。开发者通过`SUBMIT`命令执行RM07MLBD并处理返回的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

调用MB5B
TYPES: BEGIN OF gw_mb5b,
         matnr         LIKE mbew-matnr,
         maktx         LIKE makt-maktx,
         bwkey         LIKE mbew-bwkey,
         werks         LIKE mseg-werks,
         charg         LIKE mseg-charg,
         sobkz         LIKE mslb-sobkz,
         name1         LIKE t001w-name1,
         start_date    LIKE sy-datlo,
         end_date      LIKE sy-datlo,
         anfmenge(09)  TYPE p DECIMALS 3,
         meins         LIKE mara-meins,
         soll(09)      TYPE p DECIMALS 3,
         haben(09)     TYPE p DECIMALS 3,
         endmenge(09)  TYPE p DECIMALS 3,
         anfwert(09)   TYPE p DECIMALS 2,
         waers         LIKE t001-waers,
         sollwert(09)  TYPE p DECIMALS 2,
         habenwert(09) TYPE p DECIMALS 2,
         endwert(09)   TYPE p DECIMALS 2,
         color         TYPE slis_t_specialcol_alv,
       END OF gw_mb5b.

DATA: gt_mb5b TYPE STANDARD TABLE OF gw_mb5b,
      gs_mb5b TYPE gw_mb5b.

FORM frm_get_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 .

  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
  WITH matnr IN gt_matnr_rang
  WITH datum IN s_budat
  WITH werks EQ '1040'
  WITH xchar EQ 'X'
  WITH lgbst EQ 'X'
  WITH bwbst EQ ''
  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 '无法检索ALV数据!请尝试其他条件。' 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>."即所需要内表数据
      MOVE-CORRESPONDING <lt_data> TO gs_mb5b.
      APPEND gs_mb5b TO gt_mb5b.
      CLEAR gs_mb5b.
      CLEAR <lt_data>.
    ENDLOOP.
  ENDIF.

ENDFORM.

<think>嗯,用户问的是在ABAP中,点击执行按钮会触发START-OF-SELECTION事件,那么是否可以在程序里模拟触发这个执行按钮的动作。首先,我需要回忆一下ABAP的事件处理机制。 我记得在ABAP中,START-OF-SELECTION是当用户执行程序时自动触发的,比如点击执行按钮或者通过事务码直接运行。这个事件通常用于主程序逻辑的执行。用户的问题是想知道是否能在程序内部手动触发这个事件,而是等待用户操作。 首先,我需要确认ABAP的事件模型。ABAP的事件是由系统自动触发的,比如INITIALIZATION、AT SELECTION-SCREEN、START-OF-SELECTION等。这些事件是预定义的,开发能直接通过代码触发这些事件。也就是说,能像调用程序那样直接调用START-OF-SELECTION。 但是,用户可能想在某些情况下自动执行原本需要用户点击执行按钮才能触发的逻辑。这时候,可以考虑将主逻辑封装到一个子程序或者方法中,然后在需要的地方调用它。比如,在START-OF-SELECTION事件中调用这个子程序,同时在其他事件或条件中也可以手动调用,比如在屏幕的某个按钮事件或者在INITIALIZATION阶段自动触发。 另外,如果用户希望在程序启动时自动执行而需要用户交互,可以考虑在程序属性中设置“状态”为“可执行程序”,并在逻辑数据库或直接代码中处理。或者在选择屏幕事件中设置默认值并自动提交,但这可能涉及到屏幕流程的自动跳转,需要注意系统限制和用户交互的合理性。 还需要注意,直接模拟用户操作如点击按钮可能在ABAP可行,因为系统事件是由运行时环境控制的,开发能随意触发这些事件。因此,正确的做法是重构代码,将核心逻辑提取出来,通过子程序或方法调用来复用,而是试图触发系统事件。 总结一下,用户的需求是自动触发执行按钮对应的逻辑,而ABAP能直接触发START-OF-SELECTION事件,但可以通过代码结构调整来实现类似效果。需要建议用户将主逻辑移到可调用的模块中,并在适当的地方调用它,而是依赖事件触发。</think>在ABAP中,直接通过程序代码模拟用户点击执行按钮触发`START-OF-SELECTION`事件是可行的。这是由ABAP运行时架构决定的,但可以通过以下方式实现类似效果: ### 核心机制说明 1. **系统控制事件** `START-OF-SELECTION`是由ABAP运行时环境自动触发的系统事件,开发者无法通过代码直接触发此类预定义事件。 2. **执行按钮的本质** 点击执行按钮会触发以下流程: - 系统隐式调用`SUBMIT`语句 - ABAP运行时初始化程序上下文 - 自动触发`START-OF-SELECTION`事件 ### 实现自动执行的替代方案 #### 方案1:主动调用主逻辑 ```abap FORM main_logic. " 将原本在START-OF-SELECTION中的逻辑移到这里 WRITE '自动执行的主逻辑'. ENDFORM. START-OF-SELECTION. PERFORM main_logic. " 正常执行入口 " 在其他需要触发的地方(如初始化时) INITIALIZATION. PERFORM main_logic. " 自动触发 ``` #### 方案2:使用SUBMIT调用自身 ```abap " 在需要触发的地方提交程序自身 CALL FUNCTION 'ABAP4_CALL_TRANSACTION' EXPORTING tcode = sy-tcode skip_screen = 'X'. " 跳过选择屏幕 ``` #### 方案3:强制提交(需结合选择屏幕) ```abap AT SELECTION-SCREEN OUTPUT. " 自动提交(慎用!可能造成死循环) LEAVE TO LIST-PROCESSING. ``` ### 注意事项 1. **架构设计建议** 推荐将核心业务逻辑封装到独立模块: ```abap CLASS lcl_main IMPLEMENTATION. METHOD run. " 主业务逻辑 ENDMETHOD. ENDCLASS. START-OF-SELECTION. NEW lcl_main( )->run( ). ``` 2. **自动执行的限制** - 需要处理选择屏幕参数的默认值 - 避免在需要用户交互的场景中使用自动触发 - 注意事务码调用权限控制 ### 典型应用场景示例 ```abap " 后台作业自动执行示例 SCHEDULE JOB demo_job USING 'ZDEMO_PROGRAM' ON EVENT OF 'ZDEMO_EVENT' START IMMEDIATELY. ``` 总结:虽然无法直接触发`START-OF-SELECTION`事件,但通过合理的架构设计和ABAP提供的提交机制,可以实现程序逻辑的自动触发执行。建议优先采用面向对象的模块化设计来提升代码的可控性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值