ABAP Docking Control Container开发实例

本文介绍如何在ABAP中使用DockingControl创建可拖拽的容器界面,包括实例化容器、ALV网格和树控件的过程。通过设置不同位置参数实现灵活布局。

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

ABAP Docking Control Container开发实例

使用时需引用cl_gui_docking_container事物

DATAsplitter                       TYPE REF TO cl_dynpro_splitter,
           go_dbz                      TYPE REF TO cl_gui_alv_grid,
           go_ybz                      TYPE REF TO cl_gui_alv_grid,
           go_cache                  TYPE REF TO cl_gui_alv_grid,
           gc_custom_container       TYPE REF TO cl_gui_custom_container,
           g_container_object           TYPE REF TO cl_gui_docking_container,
           go_tree                    TYPE REF TO cl_gui_simple_tree,
           ok_code                   TYPE sy-ucomm,
           ok_save                   TYPE sy-ucomm,
           g_tree_container_name(30TYPE c VALUE'C1'.

创建100屏幕,画好container(这里的container与生成docking无关

在PBO中实例化docking control

MODULE status_0100 OUTPUT.
  SET PF-STATUS 'PF_0100'.
  SET TITLEBAR  'TITLE_0100'.
*为避免每一次有PAI时都会触发PBO重新实例化对象,要在这里加一个标记
  CHECK flag IS INITIAL.
*   alv_grid
  PERFORM form_create_object.
*   docking control
  PERFORM createdockingcontrol.
*   tree control
  PERFORM createtreecontrol.
  flag 'X'.
ENDMODULE.

 

FORM createdockingcontrol .
* create container for alv-tree
  CREATE OBJECT g_container_object
      
EXPORTING side cl_gui_docking_container=>dock_at_left 

可以选择拼接的位置(DOCK_AT_LEFTDOCK_AT_TOPDOCK_AT_BOTTOMDOCK_AT_RIGHT
                extension 260        “初始宽度
                repid     sy-repid  “程序名
                dynnr     '0100'.   
ENDFORM.

实例化屏幕控件时,将Docking对象写入parent参数即可

*建立树对象
  CREATE OBJECT go_tree
    
EXPORTING
      parent   g_container_object
      node_selection_mode 
cl_gui_simple_tree=>node_sel_mode_single.

效果展示:

个人感觉这种生成拖拽屏幕的方式比起splitter要友好许多

<think>我们正在分析一段ABAP代码,该代码涉及使用ALV网格显示数据。重点在于以下几个方面: 1. DATA声明:用于存储ALV控件、容器、字段目录等的变量。 2. 对象创建:创建容器和ALV网格对象。 3. 字段目录构建:定义ALV网格中每一列的属性。 4. 调用SET_TABLE_FOR_FIRST_DISPLAY方法:将数据与ALV网格绑定并显示。 根据提供的代码片段,我们逐步分析: ### 1. DATA声明 在代码的顶部,我们看到了以下与ALV相关的数据声明: ```abap "ALV Parameter DATA:GT_FIELDCAT TYPE LVC_T_FCAT, " 字段目录内表 GS_FIELDCAT TYPE LVC_S_FCAT, " 字段目录工作区 GS_LAYOUT TYPE LVC_S_LAYO, " ALV布局结构 GV_REPID TYPE SY-REPID, " 当前程序名 GS_STBL TYPE LVC_S_STBL, " 稳定性控制(用于刷新) GR_GRID TYPE REF TO CL_GUI_ALV_GRID. " ALV网格对象引用 ``` 此外,还有用于存储数据的内部表: ```abap DATA: GT_RESB TYPE STANDARD TABLE OF TYP_RESB. ``` ### 2. 对象创建 在类`LCL_REPORT`的方法`FRM_GENERATE_OUTPUT`中,我们看到了对象的创建: ```abap METHOD FRM_GENERATE_OUTPUT. ... CHECK LO_DOCK IS INITIAL. CREATE OBJECT LO_DOCK EXPORTING REPID = SY-CPROG DYNNR = SY-DYNNR RATIO = 80 SIDE = CL_GUI_DOCKING_CONTAINER=>DOCK_AT_BOTTOM. ... LO_CONT ?= LO_DOCK. CREATE OBJECT GR_GRID_D1001 EXPORTING I_PARENT = LO_CONT. ... ENDMETHOD. ``` 这里创建了一个停靠容器(`CL_GUI_DOCKING_CONTAINER`)作为ALV网格的父容器,然后创建了ALV网格对象(`CL_GUI_ALV_GRID`),并指定其父容器为这个停靠容器。 ### 3. 字段目录构建 字段目录的构建在子程序`FRM_BUILD_FIELDCAT`中完成: ```abap FORM FRM_BUILD_FIELDCAT. REFRESH GT_FIELDCAT. GS_FIELDCAT-FIELDNAME = 'AUFNR'. GS_FIELDCAT-REPTEXT = '生产订单' . ... " 设置其他属性 APPEND GS_FIELDCAT TO GT_FIELDCAT. CLEAR GS_FIELDCAT. ... " 其他字段的定义 ENDFORM. ``` 在这个子程序中,为每个要显示的字段定义属性(如字段名、列标题等),并添加到字段目录内表`GT_FIELDCAT`中。 ### 4. 调用SET_TABLE_FOR_FIRST_DISPLAY方法 在方法`FRM_GENERATE_OUTPUT`中,创建ALV网格对象后,调用了`SET_TABLE_FOR_FIRST_DISPLAY`方法: ```abap CALL METHOD GR_GRID_D1001->SET_TABLE_FOR_FIRST_DISPLAY EXPORTING I_BUFFER_ACTIVE = SPACE I_BYPASSING_BUFFER = SPACE CHANGING IT_OUTTAB = ME->GT_DATA IT_FIELDCATALOG = GT_FIELDCAT. ``` 这里将数据内表`ME->GT_DATA`和字段目录`GT_FIELDCAT`传递给ALV网格,以进行首次显示。 ### 整体逻辑 1. 程序初始化时,创建`LCL_REPORT`类的实例。 2. 在`INITIALIZATION`事件中,调用`LO_REPORT->FRM_GENERATE_OUTPUT`方法,但此时可能没有数据,因此ALV显示为空。 3. 在`AT SELECTION-SCREEN OUTPUT`事件中,如果二维码输入不为空,则解析二维码,并获取预留/相关需求数据。 4. 在`START-OF-SELECTION`事件中,再次解析二维码(确保),然后获取数据(`PERFORM FRM_GET_RESB`),再调用`LO_REPORT->FRM_GET_DATA`将数据存储到类的内部表中。 5. 然后,在`LO_REPORT->FRM_GENERATE_OUTPUT`方法中,会再次被调用(在`START-OF-SELECTION`之后,但实际在初始化时已经调用过一次,所以需要检查容器是否已经创建,避免重复创建)。 注意:在`FRM_GENERATE_OUTPUT`方法中,首先检查容器是否已经创建(`CHECK LO_DOCK IS INITIAL.`),如果没有则创建容器和ALV网格,然后设置字段目录并显示数据。但这里有一个潜在问题:在程序初始化时(`INITIALIZATION`)调用`FRM_GENERATE_OUTPUT`时,数据可能尚未准备好,因此第一次调用时ALV可能显示为空。在`START-OF-SELECTION`之后,数据已经准备好,但`FRM_GENERATE_OUTPUT`方法并没有再次被调用的机制(除了在`AT SELECTION-SCREEN OUTPUT`事件中,但该事件在屏幕输出时触发,而`START-OF-SELECTION`之后不会自动触发屏幕输出)。因此,可能需要其他机制来刷新ALV显示。 ### 刷新ALV 在代码中,我们没有看到显式的刷新操作。通常,在数据变化后,需要调用ALV网格的`REFRESH_TABLE_DISPLAY`方法来刷新显示。但在这个程序中,由于在`START-OF-SELECTION`之后没有重新调用显示方法,所以新数据可能不会自动显示。因此,可能需要调整程序逻辑,确保在数据加载后刷新ALV显示。 ### 总结 这段代码展示了使用OO ALV(CL_GUI_ALV_GRID)来显示数据的基本步骤: 1. 声明必要的变量(字段目录、布局、容器、网格引用等)。 2. 创建容器和ALV网格对象。 3. 构建字段目录。 4. 调用SET_TABLE_FOR_FIRST_DISPLAY方法初始化显示。 但是,程序在数据加载和显示的时序上可能存在缺陷:初始化时显示空数据,而获取数据后没有刷新ALV显示。通常,我们会在获取数据后调用ALV网格的刷新方法,或者将ALV的创建和显示放在数据加载之后(例如在START-OF-SELECTION事件中或之后)。 §§相关问题§§ 1. 在ABAP OO ALV中,如何实现数据的动态刷新? 2. 如何调整ALV网格的列宽和布局? 3. 在ALV网格中如何实现用户交互(如双击事件)? 4. 如何为ALV网格添加自定义工具栏按钮?</think>以下是对ABAP代码中ALV网格显示实现逻辑的分析,重点关注DATA声明、对象创建、字段目录构建和SET_TABLE_FOR_FIRST_DISPLAY方法调用: ### 1. DATA声明分析 代码中声明了以下关键数据结构: ```abap " ALV核心控制对象 DATA: GT_FIELDCAT TYPE LVC_T_FCAT, " 字段目录内表 GS_FIELDCAT TYPE LVC_S_FCAT, " 字段目录工作区 GS_LAYOUT TYPE LVC_S_LAYO, " 布局参数 GR_GRID TYPE REF TO CL_GUI_ALV_GRID " ALV网格对象引用 " 数据容器 DATA: LO_DOCK TYPE REF TO CL_GUI_DOCKING_CONTAINER " 停靠容器 " 业务数据结构 TYPES: BEGIN OF TYP_RESB, " 自定义数据结构 MATNR TYPE RESB-MATNR, " 物料号 MAKTX TYPE MAKT-MAKTX, " 物料描述 NUMB TYPE RESB-ENMNG, " 数量 ... END OF TYP_RESB. DATA: GT_RESB TYPE STANDARD TABLE OF TYP_RESB " 显示数据表 ``` 这些声明构成了ALV显示的基础框架,其中: - `LVC_T_FCAT`和`LVC_S_FCAT`管理字段属性 - `CL_GUI_DOCKING_CONTAINER`提供容器功能 - `CL_GUI_ALV_GRID`实现网格显示[^1][^2] ### 2. 对象创建与初始化 在类方法`FRM_GENERATE_OUTPUT`中实现: ```abap CREATE OBJECT LO_DOCK " 创建停靠容器 EXPORTING REPID = SY-CPROG " 当前程序ID DYNNR = SY-DYNNR " 当前屏幕号 RATIO = 80 " 占据屏幕80%高度 SIDE = CL_GUI_DOCKING_CONTAINER=>DOCK_AT_BOTTOM " 底部停靠 CREATE OBJECT GR_GRID " 创建ALV网格对象 EXPORTING I_PARENT = LO_DOCK " 设置父容器 ``` 关键点: 1. 容器使用底部停靠方式,高度占比80% 2. ALV网格绑定到停靠容器作为子对象 3. 通过`I_PARENT`参数建立父子关系[^2] ### 3. 字段目录构建 在`FRM_BUILD_FIELDCAT`子程序中实现: ```abap " 生产订单字段 GS_FIELDCAT-FIELDNAME = 'AUFNR' GS_FIELDCAT-REPTEXT = '生产订单' GS_FIELDCAT-TABNAME = 'RESB' APPEND GS_FIELDCAT TO GT_FIELDCAT. " 物料描述字段 GS_FIELDCAT-FIELDNAME = 'MAKTX' GS_FIELDCAT-REPTEXT = '物料描述' GS_FIELDCAT-OUTPUTLEN = 40 " 列宽40字符 APPEND GS_FIELDCAT TO GT_FIELDCAT. " 数量字段 GS_FIELDCAT-FIELDNAME = 'NUMB' GS_FIELDCAT-REPTEXT = '数量' GS_FIELDCAT-OUTPUTLEN = 10 APPEND GS_FIELDCAT TO GT_FIELDCAT. ``` 字段目录特点: - 通过`REPTEXT`定义列标题 - 使用`OUTPUTLEN`控制列宽 - `TABNAME`指定关联表字段[^1] - 隐藏技术字段(如`SPLKZ`设置`NO_OUT = 'X'`) ### 4. SET_TABLE_FOR_FIRST_DISPLAY调用 在`FRM_GENERATE_OUTPUT`方法中: ```abap CALL METHOD GR_GRID->SET_TABLE_FOR_FIRST_DISPLAY EXPORTING I_BUFFER_ACTIVE = SPACE " 禁用缓冲 I_BYPASSING_BUFFER = SPACE " 不使用缓冲 CHANGING IT_OUTTAB = ME->GT_DATA " 显示数据 IT_FIELDCATALOG = GT_FIELDCAT " 字段目录 ``` 关键参数: - `IT_OUTTAB`:绑定业务数据表`GT_DATA` - `IT_FIELDCATALOG`:应用自定义字段目录 - `I_BUFFER_ACTIVE`:禁用缓冲确保实时数据显示[^3] ### 5. 显示逻辑时序 1. **初始化**:`INITIALIZATION`事件设置选择屏幕只读 2. **数据准备**:`START-OF-SELECTION`填充`GT_RESB` 3. **对象创建**:在`FRM_GENERATE_OUTPUT`中创建容器和网格 4. **字段配置**:调用`FRM_BUILD_FIELDCAT`构建目录 5. **数据显示**:通过`SET_TABLE_FOR_FIRST_DISPLAY`渲染 ### 6. 布局配置 在`FRM_SET_LAYOUT`中设置: ```abap GS_LAYOUT-ZEBRA = 'X' " 启用斑马纹 GS_LAYOUT-SEL_MODE = 'X' " 启用行选择 ``` 这实现了更友好的用户界面[^3][^4] ### 总结 该实现展示了典型的OO ALV开发模式: 1. 通过`CL_GUI_DOCKING_CONTAINER`创建容器 2. 使用`CL_GUI_ALV_GRID`实例化网格对象 3. 手动构建字段目录控制列属性 4. 调用`SET_TABLE_FOR_FIRST_DISPLAY`完成数据绑定 5. 布局参数优化视觉呈现[^1][^3]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值