OO ALV是面向对象的ALV,在使用之前我们需创建一个control容器(屏幕),在通过CUSTOM_CONTAINER将其实例化为一个ALV屏幕,我们可以将ALV看作是一个对象,按钮,字段,样式,事件都是其属性,使用起来简单方便。
image.png
*&---------------------------------------------------------------------*
*& Report ZTEST_OOP_ALV
*&
*&---------------------------------------------------------------------*
*&OO ALV练习
*&
*&---------------------------------------------------------------------*
REPORT ZTEST_OOP_ALV.
INCLUDE .
TABLES:MARA, " 常规物料数据
MAKT, " 物料描述
T023T. " 物料组描述
TYPE-POOLS: VRM, SLIS.
TYPES:BEGIN OF TY_ITAB,
CKBOX TYPE C , " ALV 左侧选择框
ICON TYPE ICON-ID, " 状态
MATNR TYPE MARA-MATNR, " 物料号
MAKTX TYPE MAKT-MAKTX, " 物料描述
MTART TYPE MARA-MTART, " 物料类型
MBRSH TYPE MARA-MBRSH, " 行业领域
MATKL TYPE MARA-MATKL, " 物料组
WGBEZ TYPE T023T-WGBEZ, " 物料组描述
MEINS TYPE MARA-MEINS, " 基本计量单位
BRGEW TYPE MARA-BRGEW, " 毛重
NTGEW TYPE MARA-NTGEW, " 净重
GEWEI TYPE MARA-GEWEI, " 重量单位
ROW_COLOR(4) TYPE C, " 行颜色
CEL_COLOR TYPE SLIS_T_SPECIALCOL_ALV, " 列颜色
BNAME(10) TYPE C,
STORE TYPE CHAR10, " 存放地点,搜索帮助字段
ZHTTP TYPE STRING, " 存放URL
ZLINK TYPE INT4,
END OF TY_ITAB.
*&---物料描述(属性信息为附属表,禁止和主表jion使用)
TYPES:BEGIN OF TY_MAKT,
MATNR TYPE MAKT-MATNR, " 物料号
SPRAS TYPE MAKT-SPRAS, " 语言代码
MAKTX TYPE MAKT-MAKTX, " 物料描述
END OF TY_MAKT.
*&---物料组描述(属性信息为附属表,禁止和主表jion使用)
TYPES:BEGIN OF TY_T023T,
MATKL TYPE T023T-MATKL, " 物料组
SPRAS TYPE T023T-SPRAS, " 语言代码
WGBEZ TYPE T023T-WGBEZ, " 物料组描述
END OF TY_T023T.
*&---ALV 搜索帮助类型
TYPES:BEGIN OF TY_STORE,
STORE TYPE CHAR4,
TYPE TYPE CHAR4,
BNAME TYPE CHAR30,
END OF TY_STORE.
*----------------------------------------------------------------------*
* 全局变量定义/Global variable definition
*----------------------------------------------------------------------*
*&---全局内表定义
DATA:GT_ITAB TYPE TABLE OF TY_ITAB, " 主数据表
GT_MAKT TYPE TABLE OF TY_MAKT, " 物料描述
GT_T023T TYPE TABLE OF TY_T023T, " 物料组描述
GT_STORE TYPE TABLE OF TY_STORE. " 搜索帮助内表
*&---全局结构定义
DATA:GS_ITAB TYPE TY_ITAB, " 主数据结构
GS_MAKT TYPE TY_MAKT, " 物料描述结构
GS_STORE TYPE TY_STORE, " 搜索帮助内表
GS_T023T TYPE TY_T023T. " 物料组描述结构
*&---全局变量定义
DATA:GV_MATNR TYPE MARA-MATNR, " 物料号
GV_MAKTX TYPE MAKT-MAKTX, " 物料描述
GV_NAME1 TYPE CHAR10, " 字符串操作变量1
GV_NAME2 TYPE STRING, " 字符串操作变量2
GV_INDEX TYPE I, " 取余值
GV_TIMES TYPE I VALUE 10. " 循环次数
*&---------------------------------------------------------------------*
*& 字段串定义/Field-symbols *
*&---------------------------------------------------------------------*
FIELD-SYMBOLS: TYPE TY_ITAB.
*&---------------------------------------------------------------------*
*& ALV TYPE/ALV 类型定义
*&---------------------------------------------------------------------*
DATA: OK_CODE TYPE SY-UCOMM,
G_REPID LIKE SY-REPID,
G_GRID TYPE REF TO CL_GUI_ALV_GRID,
GS_LAYOUT TYPE LVC_S_LAYO,
CUSTOM_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER.
DATA: GT_FIELD_CAT TYPE LVC_T_FCAT,
GS_FIELD_CAT TYPE LVC_S_FCAT,
GS_VARIANT TYPE DISVARIANT,
GT_EXCLUDE TYPE UI_FUNCTIONS.
*&---选择屏幕下拉框/list box
DATA:GT_LIST TYPE VRM_VALUES,
GS_LIST LIKE LINE OF GT_LIST.
*&---ALV HTTP超链接
DATA GS_HYPE TYPE LVC_S_HYPE .
DATA GT_HYPE TYPE LVC_T_HYPE ."网址映射关系表,在具体链接到哪个网址就是根
*&---ALV 下拉列表
DATA:GT_BNAME TYPE LVC_T_DROP, " 用户下拉列表,表存储
GS_BNAME TYPE LVC_S_DROP. " 用户下拉列表,结构
*&---单元格颜色
DATA:GS_CELL TYPE LINE OF SLIS_T_SPECIALCOL_ALV.
*----------------------------------------------------------------------*
*CLASS cl_event_handler DEFINITION
*----------------------------------------------------------------------*
CLASS CL_EVENT_HANDLER DEFINITION.
PUBLIC SECTION.
"Hotspot Click.
METHODS: HANDLE_CLICK
FOR EVENT HOTSPOT_CLICK OF CL_GUI_ALV_GRID
IMPORTING E_ROW_ID E_COLUMN_ID ES_ROW_NO.
METHODS: HANDLE_ONF4
FOR EVENT ONF4 OF CL_GUI_ALV_GRID
IMPORTING E_FIELDNAME ES_ROW_NO ER_EVENT_DATA.
METHODS: HANDLE_DATA_CHANGED
FOR EVENT DATA_CHANGED OF CL_GUI_ALV_GRID
IMPORTING
ER_DATA_CHANGED
E_ONF4
E_ONF4_BEFORE
E_ONF4_AFTER
E_UCOMM.
ENDCLASS. "cl_event_handler DEFINITION
*----------------------------------------------------------------------*
* CLASS cl_event_handler IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS CL_EVENT_HANDLER IMPLEMENTATION.
"Hotspot Click.单击事件
METHOD HANDLE_CLICK.
CASE E_COLUMN_ID-FIELDNAME.
WHEN 'MATNR'.
READ TABLE GT_ITAB ASSIGNING INDEX E_ROW_ID.
IF SY-SUBRC = 0.
SET PARAMETER ID 'MAT' FIELD -MATNR.
CALL TRANSACTION 'MM03' AND SKIP FIRST SCREEN.
ENDIF.
WHEN OTHERS.
ENDCASE.
ENDMETHOD. "HANDLE_CLICK
METHOD HANDLE_ONF4."搜索帮助
PERFORM HANDLE_ONF4 USING E_FIELDNAME ES_ROW_NO ER_EVENT_DATA.
ENDMETHOD. "HANDLE_ONF4
"数据变化事件:更改物料描述
METHOD HANDLE_DATA_CHANGED.
DATA: GT_HEAD TYPE TABLE OF BAPIMATHEAD,
GS_HEAD TYPE BAPIMATHEAD,
LT_MAKT TYPE TABLE OF BAPI_MAKT,
LS_MAKT TYPE BAPI_MAKT,
GT_RET TYPE TABLE OF BAPI_MATRETURN2,
GS_RET TYPE BAPI_MATRETURN2.
DATA: L_MSG TYPE STRING.
TYPES:LTY_ALV_H TYPE STANDARD TABLE OF TY_ITAB WITH NON-UNIQUE DEFAULT KEY.
DATA: L_MAKTX TYPE MAKT-MAKTX.
FIELD-SYMBOLS: TYPE LTY_ALV_H,
LIKE LINE OF ,
LIKE LINE OF ER_DATA_CHANGED->MT_DELETED_ROWS,
LIKE LINE OF ER_DATA_CHANGED->MT_MOD_CELLS.
LOOP AT ER_DATA_CHANGED->MT_MOD_CELLS ASSIGNING WHERE FIELDNAME = 'MAKTX'.
CASE -FIELDNAME.
WHEN 'MAKTX'.
READ TABLE GT_ITAB INTO GS_ITAB INDEX -ROW_ID.
IF SY-SUBRC EQ 0.
GS_HEAD-MATERIAL = GS_ITAB-MATNR.
ENDIF.
LS_MAKT-LANGU = '1'.
LS_MAKT-MATL_DESC = -VALUE.
APPEND LS_MAKT TO LT_MAKT.
CLEAR LS_MAKT.
CALL FUNCTION 'BAPI_MATERIAL_SAVEDATA'
EXPORTING
HEADDATA = GS_HEAD
* IMPORTING
* RETURN = GS_RET
TABLES
MATERIALDESCRIPTION = LT_MAKT
RETURNMESSAGES = GT_RET.
LOOP AT GT_RET INTO GS_RET WHERE TYPE = 'S'.
ENDLOOP.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_OUTPUT'
EXPORTING
INPUT = GS_HEAD-MATERIAL
IMPORTING
OUTPUT = GS_HEAD-MATERIAL.
IF SY-SUBRC EQ 0.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'.
COMMIT WORK.
CONCATENATE '物料号' GS_HEAD-MATERIAL '的物料描述修改成功!' INTO L_MSG.
MESSAGE L_MSG TYPE 'S'.
ELSE.
CALL FUNCTION