ABAP--关于SAP Control Framework(入门GUI编程的不错的基础介绍)

本文介绍了SAP Control Framework的架构,包括客户端的Automation Controller和应用服务器端的ABAP Objects Control Framework,详细阐述了它们的功能。讨论了SAP Control Framework的事件类型,如System和Application事件,并解析了事件的交互流程。此外,还概述了基于该框架的程序设计步骤,包括定义事件处理类、实现事件处理和设置控件及事件处理过程。

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

一、SAP Control Framework的架构

SAP Control Framework的架构分为客户端和应用服务器端,其中客户端包含重要的部件:“Automation Controller”,应用服务器端包含:“ABAP Objects Control Framework”;
Automation Controller的功能
1) The automation controller is the central instance at the frontend. It administers all instances of custom controls.
2) The Automation Controller also contains a list of the events that a custom control can trigger 
.
3) All communication between the controls at the frontend and the application program at the backend runs through the Automation Controller.

 

 

ABAP Objects Control Framework的功能
1) The ABAP Objects Control Framework has a similar function at the backend to that of the Automation Controller at the frontend. All method calls from an application program to a custom control run through the Control Framework. In order to avoid each method call establishing a separate connection to the frontend, the method calls are buffered in the automation queue. The automation queue is not sent to the frontend until you reach a synchronization point.
2) Like the Automation Controller, the Control Framework has a list of control events. This list also contains the corresponding handler methods that need to be called when the event occurs 
.
3) The Control Framework also maintains a list of the control instances you have created. This list is the basis for the lifetime management of controls

二、SAP Control Framework的事件类型
System events:
该事件发生时,不会发生自动对象的数据交换,不会触发PBO和PAI事件。
在该事件的处理过程里你可以通过set_new_ok_code 函数设置新值到OK_CODE,人为的触发PAI和PBO事件。

Application events:
该事件在PAI event处理完后会自动触发(这种情况下屏幕字段已经传输到程序变量),你也可以在PAI事件当中使用CL_GUI_CFW=>DISPATCH 来人为触发Application events事件的处理。

三、SAP Control Framework事件的交互图

先由控件触发事件,“Automation Controller”就会检查是否有该事件的注册,有就会向应用服务器提交,应用服务器就将由“ABAP Objects Control Framework”来检测事件的注册,找出对应处理过程并调用处理

四、SAP Control Framework的程序设计步骤
1)定义事件处理类
CLASS lcl_event_receiver DEFINITION.
PUBLIC SECTION.
METHODS Event_Handler
   FOR EVENT
event_name OF cl_gui_picture 
   IMPORTING
event_parameter
             sender
.
ENDCLASS.
2)事件类实现
CLASS lcl_event_receiver DEFINITION.
PUBLIC SECTION.
CLASS-METHODS Event_Handler
        FOR EVENT
event_name OF cl_gui_picture
        IMPORTING event_parameter
                  sender
.
ENDCLASS.
3) 定义自定义控件容器变量
DATA container TYPE REF TO cl_gui_custom_container.
4)定义自定义变量
DATA my_control  TYPE REF TO cl_gui_picture. 

5)定义事件内表变量
DATA events TYPE cntl_simple_events.
DATA wa_events TYPE  cntl_simple_event.
6)定义事件处理类的对象
DATA event_receiver TYPE REF TO lcl_event_receiver.
6)创建容器和控件
CREATE OBJECT container
    EXPORTING container_name = 'CUSTOM'
                            lifetime       = lifetime.

CREATE OBJECT my_control
     EXPORTING parent  = container 
              lifetime = lifetime.
7)创建事件处理类的对象
CREATE OBJECT event_receiver.
8)维护事件内表并注册事件
wa_events-eventid = event_id .
wa_events-appl_event =
appl_event . “为X是表示应用类型事件,空表示系统类型事件
APPEND wa_events TO events.

CALL METHOD my_control->set_registered_events
            events = events.

9)设置事件处理过程
SET HANDLER event_receiver->Event_Handler
            FOR my_control.

五、SAP的GUI的类列表

CLASS NAME Super CLASS NAME DESCRIPTIO
CL_GUI_OBJECT   Proxy Class for a GUI Object
CL_FORMPAINTER_BASEWINDOW CL_GUI_OBJECT SAP Form Painter Window Base Class
CL_FORMPAINTER_BITMAPWINDOW CL_FORMPAINTER_BASEWINDOW SAP Form Painter Bitmap Window Class
CL_FORMPAINTER_TEXTWINDOW CL_FORMPAINTER_BASEWINDOW SAP Form Painter Text Window Class
CL_GUI_CONTROL CL_GUI_OBJECT Proxy Class for Control in GUI
CL_DSVAS_GUI_BUSIGRAPH CL_GUI_CONTROL DSVAS: Proxy for Business Graphic
CL_GFW_GP_PRES_CHART CL_GUI_CONTROL GFW: Product-specific section of CL_GUI_GP_PRES (Chart)
CL_GFW_GP_PRES_PIG CL_GUI_CONTROL GFW: product specific section for web view
CL_GFW_GP_PRES_SAP CL_GUI_CONTROL GFW: product-specific section of CL_GUI_GP_PRES (SAP BUSG)
CL_GUI_ALV_GRID_BASE CL_GUI_CONTROL Basis Class for ALV Grid
CL_CALENDAR_CONTROL_SCHEDULE CL_GUI_ALV_GRID_BASE Calendar View (Day, Week, Month)
CL_GUI_ALV_GRID CL_GUI_ALV_GRID_BASE ALV List Viewer
CL_ALV_DD_LISTBOX CL_GUI_ALV_GRID D&D List Box
CL_BUKF_CAT_GRID CL_GUI_ALV_GRID Key Figures - Grid of categories
CL_BUKF_DSRC_GRID CL_GUI_ALV_GRID Key Figures - Grid for Data sources
CL_BUKF_FILTER_GRID CL_GUI_ALV_GRID Key Figures - Filter for Key Figure
<think>好的,我现在要解决用户在SAP Table Control中获取用户点击的列的问题。首先,我需要回忆一下SAP ABAP中Table Control的基本结构和工作原理。Table Control是用于在屏幕上显示和编辑表格数据的一种控件,用户可以通过它进行交互操作,比如点击某一列。用户的问题是如何捕获点击的具体列信息。 根据引用[1],Table Control的结构需要与程序中的声明一致,控件类型为TABLEVIEW USING SCREEN。这可能涉及到屏幕的PBO(Process Before Output)和PAI(Process After Input)事件的处理。在PAI事件中,通常需要处理用户的输入,比如点击事件。 接下来,引用[2]提到OK_CODE在Control Framework中的作用,它是用户交互和后台逻辑之间的桥梁。当用户执行操作时,比如点击,系统会将相应的功能码赋值给OK_CODE,程序通过检查OK_CODE的值来执行对应的逻辑。因此,可能需要通过OK_CODE来触发获取点击列的操作。 然后,考虑如何具体识别用户点击的列。Table Control中的每个字段可能有自己的名称,当用户点击某个字段时,系统可能会记录当前的列位置。可能需要使用系统变量如SY-COLNO或者动态获取当前光标的位置。此外,Table Control的属性中是否有关于当前选中列的信息,比如CURRENT_LINE和CURRENT_COLUMN,这些可能需要设置或读取。 引用[5]提到的CL_GUI_CFW=>FLUSH方法用于刷新GUI控件,确保客户端和服务器端的数据同步。这可能涉及到在处理用户点击后,及时刷新界面以反映状态变化。 综合以上信息,处理步骤可能包括: 1. 在屏幕的PAI事件中,检查OK_CODE的值,判断是否有点击事件发生。 2. 使用系统字段或Table Control的属性(如tc1-current_col)获取当前点击的列索引。 3. 根据列索引,映射到具体的字段名称,比如通过动态获取字段名称或预先定义的列顺序。 4. 处理获取到的列信息,执行相应的业务逻辑。 此外,需要注意在屏幕流逻辑中正确处理Table Control的循环和字段传输,确保数据正确传递。可能还需要在PBO中初始化Table Control的结构,以及在PAI中处理用户输入的数据。 最后,编写示例代码时,要确保语法正确,正确使用内表和工作区,并处理屏幕元素与程序变量之间的绑定。同时,可能需要使用CL_GUI_CFW=>FLUSH来确保界面更新。</think>在SAP ABAP中,获取Table Control用户点击的列需要通过屏幕字段与事件处理结合实现。以下是具体实现方法及示例: ### 实现步骤 1. **定义Table Control属性** 在屏幕绘制器中为Table Control设置`LOOP`逻辑,并在属性中启用列位置跟踪: ```abap PROCESS BEFORE OUTPUT. LOOP AT it_data INTO wa_data WITH CONTROL tc1. ENDLOOP. PROCESS AFTER INPUT. LOOP AT it_data. ENDLOOP. ``` 2. **捕获点击事件** 通过`GET CURSOR`命令获取点击位置: ```abap MODULE user_command_0100 INPUT. CASE sy-ucomm. WHEN 'CLICK_COL'. GET CURSOR FIELD lv_field_name VALUE lv_value LINE lv_line OFFSET lv_offset. tc1-current_col = sy-colno. "记录当前列号[^1] ENDCASE. ENDMODULE. ``` 3. **列号映射字段名称** 使用动态技术将列索引转为字段名称: ```abap DATA: lv_colname TYPE char30. lv_colname = tc1-cols[ tc1-current_col ]-screen-name+4(10). "去除前缀 ``` ### 完整示例 ```abap DATA: tc1 TYPE TABLEVIEW USING SCREEN 0100, "声明表控件[^1] it_data TYPE TABLE OF mara, wa_data TYPE mara. MODULE status_0100 OUTPUT. "初始化表控件 tc1-lines = lines( it_data ). ENDMODULE. MODULE user_command_0100 INPUT. CASE sy-ucomm. WHEN 'CLICK_COL'. DATA: lv_col TYPE i, lv_fname TYPE fieldname. "获取当前列号 GET CURSOR FIELD lv_fname LINE lv_line OFFSET lv_offset. lv_col = tc1-current_col. "根据列号获取字段名 ASSIGN tc1-cols[ lv_col ]-screen-name TO FIELD-SYMBOL(<fs_col>). IF sy-subrc = 0. SHIFT <fs_col> BY 4 PLACES. "去除'TAB_'前缀 MESSAGE |点击列:{ <fs_col> }| TYPE 'I'. ENDIF. "强制刷新界面[^5] cl_gui_cfw=>flush( ). ENDCASE. ENDMODULE. ``` ### 关键点说明 1. **字段命名规则** Table Control屏幕字段需遵循`TAB_XXXX`格式命名(如`TAB_MATNR`),便于通过偏移量截取真实字段名[^1] 2. **列位置同步** 必须使用`tc1-current_col`与`sy-colno`结合,确保在多页显示时仍能准确定位[^2] 3. **事件处理优化** 建议在`POH`(Process On Help)和`POV`(Process On Value)事件中同步处理列点击逻辑[^4]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值