最近收到了一个需求,大致的要求是在标准报表ME55的ALV短文本列双击后跳转到MD04的详情。刚开始没有找到增强点想用间接的办法实现,在ME55上增加一列,展示想看到的内容,最后由于需要展示的内容太多,该方案被舍弃。
经过几天的断点追踪,找到了实现这个需求的切入点。在 ME55 报表中双击物料可以跳转到 MM03 查看采购信息,而输入 /h 并回车可以进入断点模式。通过断点一步一步地跟踪,我们发现了一个非常关键的方法,即 cl_gui_cfw=>dispatch。这个方法用于处理 SAP GUI 事务中的事件,它是一个全局共享的对象,通过调用此方法,可以将事件派发给合适的处理程序进行处理。
具体来说,当用户在SAP GUI事务中进行操作(比如点击按钮、输入数据等),事件会被发送到SAP GUI前端控制器。然后,前端控制器通过调用cl_gui_cfw=>dispatch
方法将事件传递给后端的事件处理程序。事件处理程序可以是标准SAP程序,也可以是自定义的ABAP对象,它们负责根据事件类型进行相应的处理,例如显示弹出窗口、执行逻辑处理等。
总之,cl_gui_cfw=>dispatch
方法是SAP GUI事务处理中不可或缺的一部分,它帮助实现了前端和后端之间的事件通信,使得用户在SAP GUI中进行操作时,能够得到正确的响应和处理。
继续跟进,会发现一个熟悉的方法handle_double_click
,用来处理双击事件
里面会有一个user_command
,用来具体处理事件,依次进入perform里面,查看对应的form
下图就是最关键的地方,me->my_environment
,里面有众多的消费者,通过dispatch分发
上图中的第8行,就是自定义的功能池。需要在包含文件LMEREPI05
中隐式增强下,插入代码
CREATE OBJECT lo_env TYPE lcl_env_TXZ01.
INSERT lo_env INTO TABLE me->my_environment.
继续进入到lo_env->execute
方法中,可以看到lcl_env_matnr
实现类,这里就是最终实现跳转到MM03的逻辑。我们可以此模仿matnr 的双击跳转逻辑。包含文件LMEREPI31
创建隐式增强,插入跳转到MD04的逻辑。
ENHANCEMENT 2 ZMME001. "active version
*---------------------------------------------------------------------*
* CLASS lcl_env_matnr IMPLEMENTATION
*---------------------------------------------------------------------*
CLASS lcl_env_txz01 IMPLEMENTATION.
METHOD lif_environment~execute.
DATA: l_werks TYPE ekpo-werks.
FIELD-SYMBOLS: <ematn> TYPE ekpo-matnr,
<werks> TYPE ekpo-werks.
re_success = cl_mmpur_constants=>no.
CHECK im_fieldname EQ 'TXZ01'.
ASSIGN COMPONENT 'MATNR' OF STRUCTURE im_line TO <ematn>.
valid_line <ematn>.
ASSIGN COMPONENT 'WERKS' OF STRUCTURE im_line TO <werks>.
IF sy-subrc IS INITIAL.
l_werks = <werks>.
ENDIF.
re_success = cl_mmpur_constants=>yes.
SET PARAMETER ID 'MAT' FIELD <ematn>.
SET PARAMETER ID 'WRK' FIELD l_werks.
CALL TRANSACTION 'MD04' AND SKIP FIRST SCREEN.
ENDMETHOD. "lif_environment~execute
ENDCLASS. "lcl_env_matnr IMPLEMENTATION
ENDENHANCEMENT.
最后,在包含文件LMEREPD31
进行类定义,到此就实现了ME55双击短文本跳转到MD04的需求了。
CLASS lcl_env_TXZ01 DEFINITION.
PUBLIC SECTION.
INTERFACES lif_environment.
ENDCLASS. "lcl_env_TXZ01 DEFINITION