前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OOALV学习

OOALV学习

作者头像
秋白
发布2021-11-09 17:41:28
7080
发布2021-11-09 17:41:28
举报
文章被收录于专栏:java小白java小白

概述

  1. ALV实现相关变量定义
  2. 创建界面,并创建Customer Control容器
  3. 实例化Container,关联Customer Control容器
  4. 将ALV植入Container中
  5. ALV格式化(Layout及Fieldcat赋值等)
  6. 创建本地类的声明及实现(EVENT HANDLER)
  7. 注册相关事件
  8. 执行ALV显示

report程序大致结构

程序目录

在这里插入图片描述
在这里插入图片描述

屏幕结构

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
MODULE INIT_ALV OUTPUT.
  IF GS_ALV IS INITIAL.
    PERFORM CREATE_ALV. "实例化容器和ALV植入容器中
    PERFORM BUILD_FIELDCAT. "定义展示字段
    PERFORM BUILD_LAYOUT. "定义布局
    PERFORM BUILD_EXCLUDE. "定义隐藏按钮
    PERFORM SET_HANDLER. "注册事件
    PERFORM BUILD_ALV. "展示ALV
  ELSE.
    PERFORM REFESH_ALV. "刷新ALV
  ENDIF.
ENDMODULE.

主要操作

创建屏幕

  • 创建屏幕
在这里插入图片描述
在这里插入图片描述

-界面中增加Customer Control控件,定义名称为:OOALVSCREEN

在这里插入图片描述
在这里插入图片描述

定义变量

代码语言:javascript
复制
DATA:GS_ALV         TYPE REF TO CL_GUI_ALV_GRID, "ALV类
     GS_PARENT       TYPE REF TO CL_GUI_CUSTOM_CONTAINER, "容器类
     GT_FIELDCAT    TYPE LVC_T_FCAT, "列格式内表
     GS_FIELDCAT    TYPE LVC_S_FCAT, "列格式-结构
     GS_LAYOUT      TYPE LVC_S_LAYO."输出格式

实例化容器和将ALV植入到容器中

代码语言:javascript
复制
*实例化--实例化容器
  CREATE OBJECT GS_PARENT
    EXPORTING
      CONTAINER_NAME = 'OOALVSCREEN'.

*将ALV植入到容器中
  CREATE OBJECT GS_ALV
    EXPORTING
      I_PARENT = GS_PARENT.

设置fieldcat

创建子例程

代码语言:javascript
复制
FORM ADD_FIELDCAT_ALV USING P_FIELDNAME
                            P_SELTEXT
                            P_COL
                            P_LEN.
  CLEAR GS_FIELDCAT.
  GS_FIELDCAT-FIELDNAME = P_FIELDNAME."字段名
  GS_FIELDCAT-SCRTEXT_M = P_SELTEXT."描述
  GS_FIELDCAT-COL_POS = P_COL."输出列
  GS_FIELDCAT-OUTPUTLEN = P_LEN."输出长度
  APPEND  GS_FIELDCAT TO GT_FIELDCAT.
ENDFORM.

赋值

代码语言:javascript
复制
  CLEAR GT_FIELDCAT[].
  PERFORM ADD_FIELDCAT_ALV USING: 'VBELN' '销售凭证' '1' '10' ,
                                  'LCBH' '流程编号' '1' '10'
                                    .

设置Layout

代码语言:javascript
复制
  GS_LAYOUT-ZEBRA = 'X'.
  GS_LAYOUT-CWIDTH_OPT = 'X'.
  GS_LAYOUT-BOX_FNAME = 'BOX'.

调用方法执行ALV

代码语言:javascript
复制
  CALL METHOD GS_ALV->SET_TABLE_FOR_FIRST_DISPLAY
    EXPORTING
      IS_LAYOUT                     = GS_LAYOUT "布局
    CHANGING
      IT_OUTTAB                     = GTY_ZOA01T_0001 "内表数据
      IT_FIELDCATALOG               = GT_FIELDCAT "字段列数据
    EXCEPTIONS
      INVALID_PARAMETER_COMBINATION = 1
      PROGRAM_ERROR                 = 2
      TOO_MANY_LINES                = 3
      OTHERS                        = 4.

REFRESH_TABLE_DISPLAY作用

使用此方法可以刷新输出ALV的数据,不必浪费性能再次创建ALV的一些操作。

代码语言:javascript
复制
  GS_STABLE      TYPE LVC_S_STBL. "ALV 控制:刷新稳定性
  GS_STABLE-ROW = 'X'.
  GS_STABLE-COL = 'X'.
  CALL METHOD GS_ALV->REFRESH_TABLE_DISPLAY
    EXPORTING
      IS_STABLE = GS_STABLE
    EXCEPTIONS
      FINISHED  = 1
      OTHERS    = 2.

其他功能

设置颜色

  • 颜色值的设置:C+X(颜色:1~7)X(是否加重:1/0)X(是否反色1/0)
  • 列为单位 在FIELDCAT中给EMPHASIZE字段赋值
代码语言:javascript
复制
 GS_FIELDCAT-EMPHASIZE = 'C100'."设置列颜色
  • 以行为单位 在内表中增加一个字段,类型为CHAR,至少长度为4,例COLOR 给向输出内表获取数据时,给COLOR字段赋值 设置LAYOUT,给INFO_FNAME字段赋值颜色字段名称,例COLOR
代码语言:javascript
复制
TYPES:BEGIN OF TY_ZOA01T_0001  ,
        BOX      TYPE C LENGTH 1,
        COLOR    TYPE C LENGTH 4.
    INCLUDE STRUCTURE  GS_ZOA01T_0001.
TYPES   END OF TY_ZOA01T_0001.
代码语言:javascript
复制
LOOP AT GTY_ZOA01T_0001 INTO GSY_ZOA01T_0001.
        GSY_ZOA01T_0001-COLOR = 'C101'.
        MODIFY GTY_ZOA01T_0001 FROM  GSY_ZOA01T_0001.
ENDLOOP.
代码语言:javascript
复制
  GS_LAYOUT-ZEBRA = 'X'.
  GS_LAYOUT-CWIDTH_OPT = 'X'.
  GS_LAYOUT-BOX_FNAME = 'BOX'.
  GS_LAYOUT-INFO_fNAME = 'color'."行颜色
  • 以单元格为单位 在内表中增加一个字段,类型为LVC_T_SCOL ,例DY_COLOR 在向输出内表取数据时,通过结构给DY_COLOR字段内表赋值 设置LAYOUT,给CTAB_FNAME字段赋值颜色字段名称,例DY_COLOR
代码语言:javascript
复制
TYPES:BEGIN OF TY_ZOA01T_0001  ,
        BOX      TYPE C LENGTH 1,
        COLOR    TYPE C LENGTH 4,
        DY_COLOR TYPE LVC_T_SCOL , "
        INCLUDE STRUCTURE  GS_ZOA01T_0001.
TYPES   END OF TY_ZOA01T_0001.
代码语言:javascript
复制
    "设置单元格颜色
*    LS_CELLCOLOR-FNAME = 'LCBH'.
*    LS_CELLCOLOR-COLOR-COL = '6'.
*    LS_CELLCOLOR-COLOR-INT = '0'.
*    LS_CELLCOLOR-COLOR-INV = '0'.
*    APPEND LS_CELLCOLOR TO GSY_ZOA01T_0001-DY_COLOR.
代码语言:javascript
复制
  GS_LAYOUT-CTAB_FNAME = 'DY_COLOR'.

可修改属性设置

  • 以表单为单位 设置LAYOUT-EDIT,为X,可修改
  • 以列为单位 设置FIELDCAT-EDIT,为X,列可修改
  • 以单元格为单位 在内表中增加一个字段,类型为LVC_T_STYL ,例CELLSTL
代码语言:javascript
复制
TYPES:BEGIN OF TY_ZOA01T_0001  ,
        BOX      TYPE C LENGTH 1,
        COLOR    TYPE C LENGTH 4,
        CELLSTL  TYPE LVC_T_STYL. "设置是否可编辑
    INCLUDE STRUCTURE  GS_ZOA01T_0001.
TYPES   END OF TY_ZOA01T_0001.
代码语言:javascript
复制
DATA:LS_CELLSTL TYPE LVC_S_STYL.
LS_CELLSTL-FIELDNAME = 'LCBH'.
LS_CELLSTL-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
APPEND LS_CELLSTL TO GSY_ZOA01T_0001-CELLSTL.
MODIFY GTY_ZOA01T_0001 FROM GSY_ZOA01T_0001.
代码语言:javascript
复制
GS_LAYOUT-STYLEFNAME = 'CELLSTL'.

1、在需要设置修改属性的位置,通过结构给CELLSTL字段内表赋值 FIELDNAME,需要设置属性的字段名STYLE 可修改属性 不可修改:CL_GUI_ALV_GRID=>MC_STYLE_DISABLED 可修改:CL_GUI_ALV_GRID=>MC_STYLE_ENALBED 设置LAYOUT,给STYLEFNAME字段赋值修改属性的字段名,例CELLSTL 2、如果将某一列中部分字段设置为可修改状态,一般通过以下方式完成 在FIELDCAT中,设置该列属性为可修改 在表单赋值时,将不应为可修改状态的字段,设置为不可修改 不是将需要修改的单元格设置为可修改,防止可修改属性设置与静态属性设置冲突

隐藏按钮

子例程

代码语言:javascript
复制
FORM APPEND_ALV_EXCLUDE_FUNCTIONS TABLES PT_EXCLUDE TYPE UI_FUNCTIONS
                                   USING P_VALUE TYPE UI_FUNC.
  APPEND P_VALUE TO PT_EXCLUDE.
ENDFORM.
代码语言:javascript
复制
  REFRESH G_TOLLBAR.
  PERFORM APPEND_ALV_EXCLUDE_FUNCTIONS TABLES G_TOLLBAR
    USING:CL_GUI_ALV_GRID=>MC_FC_DETAIL .
代码语言:javascript
复制
  CALL METHOD GS_ALV->SET_TABLE_FOR_FIRST_DISPLAY
    EXPORTING
      IS_LAYOUT                                    = GS_LAYOUT
      IT_TOOLBAR_EXCLUDING          = G_TOLLBAR
    CHANGING
      IT_OUTTAB                     		 = GTY_ZOA01T_0001
      IT_FIELDCATALOG               = GT_FIELDCAT
    EXCEPTIONS
      INVALID_PARAMETER_COMBINATION = 1
      PROGRAM_ERROR                 = 2
      TOO_MANY_LINES                = 3
      OTHERS                        = 4.

增加按钮

创建本地类

代码语言:javascript
复制
CLASS LCL_APP_COMPT DEFINITION.
  PUBLIC SECTION.
    METHODS:HANDLE_TOOLBAR FOR EVENT TOOLBAR
                  OF CL_GUI_ALV_GRID
      IMPORTING E_OBJECT
                  E_INTERACTIVE.
ENDCLASS.

CLASS LCL_APP_COMPT IMPLEMENTATION.
  METHOD:HANDLE_TOOLBAR.
    PERFORM MODIFY_TOOLBAR USING E_OBJECT '' .
  ENDMETHOD.
ENDCLASS.
代码语言:javascript
复制
FORM MODIFY_TOOLBAR USING P_OBJECT TYPE REF TO CL_ALV_EVENT_TOOLBAR_SET
                    P_INTERACTIVE.
  DATA:LS_TOOLBAR TYPE STB_BUTTON.
  CLEAR LS_TOOLBAR.
  LS_TOOLBAR-BUTN_TYPE = 3.
  APPEND   LS_TOOLBAR TO P_OBJECT->MT_TOOLBAR.
  CLEAR LS_TOOLBAR.
  LS_TOOLBAR-FUNCTION = 'download'.
  LS_TOOLBAR-ICON = 'ICON_WORKLOAD'.
  LS_TOOLBAR-TEXT = 'download'.
  APPEND   LS_TOOLBAR TO P_OBJECT->MT_TOOLBAR.
ENDFORM.

声明变量

代码语言:javascript
复制
CLASS LCL_APP_COMPT DEFINITION DEFERRED."用DEFINITION DEFERRED是让程序提前知道类lcl_event,避免编译错误
DATA:EVENT_RECEIVER  TYPE REF TO LCL_APP_COMPT.

实例化和注册事件

代码语言:javascript
复制
CREATE OBJECT EVENT_RECEIVER.
SET HANDLER EVENT_RECEIVER->HANDLE_TOOLBAR FOR GS_ALV.

按钮功能

代码语言:javascript
复制
METHODS:HANDLE_USER_COMMAND FOR EVENT USER_COMMAND OF CL_GUI_ALV_GRID
      IMPORTING E_UCOMM.

METHOD:HANDLE_USER_COMMAND.
    PERFORM FM_USER_COMMANS USING E_UCOMM.
ENDMETHOD.      

FORM FM_USER_COMMANS  USING    P_UCOMM.
  CASE P_UCOMM.
    WHEN 'download'.
      MESSAGE '点击download' TYPE 'S'.
  ENDCASE.
ENDFORM.
"注册事件
SET HANDLER EVENT_RECEIVER->HANDLE_USER_COMMAND FOR GS_ALV.

单击

代码语言:javascript
复制
METHODS:HANDLE_HOTSPOT_CLICK FOR EVENT HOTSPOT_CLICK OF CL_GUI_ALV_GRID
      IMPORTING E_ROW_ID E_COLUMN_ID.

 METHOD:HANDLE_HOTSPOT_CLICK .
    PERFORM HOTSPOT_CLICK USING E_ROW_ID E_COLUMN_ID.
  ENDMETHOD.    
  
FORM HOTSPOT_CLICK  USING    P_E_ROW_ID
                             P_E_COLUMN_ID.
  DATA:LV_VALUE(50).
  CALL METHOD GS_ALV->GET_CURRENT_CELL
    IMPORTING
      E_VALUE = LV_VALUE.
  MESSAGE LV_VALUE TYPE 'S'.
ENDFORM.  

SET HANDLER EVENT_RECEIVER->HANDLE_HOTSPOT_CLICK FOR GS_ALV.

数据修改

  • 操作ALV事件:DATA_CHANGED
  • 基本原理: 当数据修改时,可以触发这个事件,可以进行数据检查或修改等功能
  • 触发方式
代码语言:javascript
复制
CALL METHOD GS_ALV->REGISTER_EDIT_EVENT
	EXPORTING
		I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_MODIFIED."单元格更改触发
  • 注册事件
代码语言:javascript
复制
SET HANDLER EVENT_RECEIVER->HANDLER_DATA_CHANGER FOR GS_ALV.
  • 注意 如果界面中有保存按钮等功能,注需要在功能语句中增加调用DATA_CHANGED的语句 CALL METHOD gs_alv->check_changed_data. 效果:这样在点击保存按钮的时候,可以触发data changed事件
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-04-26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • report程序大致结构
  • 主要操作
    • 创建屏幕
      • 定义变量
        • 实例化容器和将ALV植入到容器中
          • 设置fieldcat
          • 设置Layout
          • 调用方法执行ALV
            • REFRESH_TABLE_DISPLAY作用
            • 其他功能
              • 设置颜色
                • 可修改属性设置
                  • 隐藏按钮
                    • 增加按钮
                      • 按钮功能
                        • 单击
                          • 数据修改
                          相关产品与服务
                          容器服务
                          腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                          领券
                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档