ABAP--如何使选择屏幕的初始化事件再次触发

本文介绍了解决ABAP程序中用户需求的一种方法:即如何在选择屏幕中自动填充参数,避免用户手动输入。提供了两种实现方案,一种是在ATSELECTION-SCREEN中直接赋值,另一种是在Initialization事件中赋值并结合使用SYSTEM-CALL INITIALIZATION语句。

最近一个同事有一个比较变态的用户需求,他希望每次回到选择屏幕时,选择参数是有程序控制输入的,用户客户端的输入清除。对此需求有两种处理方法:
一、在AT SELECTION-SCREEN中写赋值语句,这种方法你可能需要中间变量缓存选择条件用于查询,代码样例:
REPORT demo_write_statement.
tables vbak.
DATA:  NAME(20) VALUE 'SOURCE',
      SOURCE(10) VALUE 'abcd',
      TARGET(10).


select-options k_kunnr for vbak-kunnr.


data: is_parent  type i value 0.

INITIALIZATION.
×  refresh k_kunnr.
AT SELECTION-SCREEN.
  refresh k_kunnr.
  MOVE: 'I'      TO k_kunnr-SIGN,
        'EQ'     TO k_kunnr-OPTION,
        '9999'   TO k_kunnr-LOW.
  APPEND k_kunnr.
*SYSTEM-CALL INITIALIZATION.

二、在Initialization事件中写赋值代码
 在Initialization事件中写赋值代码,默认情况只有第一次会影响输入屏幕,以后将失去作用。为了使该代码起作用你必须在选择屏幕的其他事件中执行SYSTEM-CALL INITIALIZATION.这个语句。代码样例:
REPORT demo_write_statement.
tables: spfli.
DATA: tab_spfli   TYPE TABLE OF spfli,
      tab_sflight TYPE SORTED TABLE OF sflight
                       WITH UNIQUE KEY table_line,
      wa LIKE LINE OF tab_sflight.
select-options s_CARRID for spfli-CARRID.

INITIALIZATION.
  refresh s_CARRID.
  MOVE: 'I'      TO s_CARRID-SIGN,
        'EQ'     TO s_CARRID-OPTION,
        'AZ'   TO s_CARRID-LOW.
  APPEND k_kunnr.


AT SELECTION-SCREEN.
start-of-SELECTION.
  SELECT carrid connid
  INTO   CORRESPONDING FIELDS OF TABLE tab_spfli
  FROM   spfli
  WHERE  CARRID in s_CARRID .

  SYSTEM-CALL INITIALIZATION.
  SELECT  carrid connid fldate
    INTO  CORRESPONDING FIELDS OF TABLE tab_sflight
    FROM  sflight
    FOR ALL ENTRIES IN tab_spfli
    WHERE carrid = tab_spfli-carrid AND
          connid = tab_spfli-connid.


  LOOP AT tab_sflight INTO wa.

    AT NEW connid.
      WRITE: / wa-carrid, wa-connid.
    ENDAT.

    WRITE: / wa-fldate.

  ENDLOOP.



相关连接:http://blog.youkuaiyun.com/CompassButton/archive/2006/08/18/1091626.aspx

<think>嗯,用户问的是在ABAP中如何触发START-OF-SELECTION事件。我记得ABAP事件块是基于传统报表程序的,比如像执行程序时会自动触发事件。首先,START-OF-SELECTION是一个关键事件,通常用于处理主程序逻辑。 用户可能刚接触ABAP,不太清楚事件驱动的执行流程。需要先解释事件的基本概念,然后说明触发条件。可能用户之前写过程序,但没看到显式调用事件的地方,所以想知道如何主动触发。 首先,我应该说明在ABAP中,当可执行程序(类型1)被运行时,系统会自动触发INITIALIZATION、AT SELECTION-SCREEN等事件,之后是START-OF-SELECTION。如果用户没有使用选择屏幕,直接执行就会触发这个事件。 然后,用户可能需要了解如何显式触发,但根据我的知识,START-OF-SELECTION是自动触发的,不需要手动调用。可能用户有特殊需求,比如在子例程中触发,这时候可能需要用SUBMIT语句调用另一个程序,从而触发目标程序的事件。 另外,需要区分可执行程序和其他程序类型,比如模块池程序,这些可能不会自动触发START-OF-SELECTION。所以可能需要提醒用户只有在可执行程序中,这个事件才会自动执行。 可能用户遇到的场景是,他们在一个模块池或函数组中,想触发这个事件,但发现没有效果。这时候需要解释程序类型的不同,以及如何正确使用事件。 总结回答步骤应该是:1. 说明自动触发的情况;2. 提到显式触发的方法如SUBMIT;3. 注意事项,比如程序类型和事件块的位置。同时给出示例代码,帮助用户理解。</think>在 ABAP 中,`START-OF-SELECTION` 是传统报表程序(可执行程序,类型为 `1`)的主事件块,**由 ABAP 运行时环境自动触发**。以下是触发条件和实现方式: --- ### 1️⃣ **自动触发场景** 当满足以下条件时,系统会自动触发 `START-OF-SELECTION`: - **程序类型**:必须是可执行程序(`Executable Program`,类型 `1`) - **执行方式**:通过事务码直接运行程序(如 `SE38` 执行) - **执行流程**: ```abap 程序加载 → INITIALIZATION → AT SELECTION-SCREEN → START-OF-SELECTION ``` (如果程序没有选择屏幕,则跳过 `AT SELECTION-SCREEN`) --- ### 2️⃣ **显式触发方法** 若需要在其他程序类型(如模块池程序)中触发类似逻辑,可使用以下方法: ```abap " 通过 SUBMIT 调用另一个可执行程序 SUBMIT zyour_program_name WITH p_param = 'value' " 传递参数(可选) AND RETURN. ``` 此时被调用的程序 `zyour_program_name` 的 `START-OF-SELECTION` 事件会被触发--- ### 3️⃣ **注意事项** - ❗ **事件块位置**:`START-OF-SELECTION` 必须写在程序全局声明之后,其他事件块之前: ```abap REPORT zexample. DATA: gv_data TYPE string. START-OF-SELECTION. WRITE: '主逻辑开始'. PERFORM main_processing. ``` - ⚠️ **程序类型限制**:模块池程序(类型 `M`)、函数组等不会自动触发事件--- ### 📝 **示例代码** ```abap REPORT z_demo_start_of_selection. INITIALIZATION. WRITE: / '初始化完成'. START-OF-SELECTION. WRITE: / '主逻辑开始'. PERFORM calculate_data. FORM calculate_data. " 业务逻辑处理... ENDFORM. ``` 当直接执行此程序时,输出顺序为: ``` 初始化完成 主逻辑开始 ``` --- 如果需要更灵活的事件控制,建议使用面向对象方法(如类方法)替代传统事件块。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值