1功能说明
需要开发一个报表,分为上下两个部分,下边需要再分割为左右两个部分,点击上边部分的行,下边两个报表信息发生变化。
效果如下:
2代码实现
1、数据查询
分别查询MARA、MARC、MAKT三张表,存放在三个内表中,分别放在1、2、3界面,并调用9000屏幕
9000屏幕中逻辑流
2、创建容器
FRM_CREATE_CONTAINER_9000
创建容器对象方法:
3、分割容器
将创建的容器分割为两行一列
获得拆分后的上半部分(第一行,第一列),并设置宽度
获得拆分后的下半部分(第二行,第一列),将其再次拆分为一行两列,即左右两个部分
同样获取拆分后的左半部分(第一行第一列),设置宽度,同理设置右半部分
创建ALV对象
其他逻辑与创建普通OOALV一致,在最终显示时,分别调用三个ALV对象的SET_TABLE_FOR_FIRST_DISPLAY方法即可。
4、双击事件
点击一行时,查询这行物料对应的MARC和MAKT表中的数据,并展示在2、3区域内
5、方法说明
在实现容器时,常用两种实现方式,一种是在屏幕中画区域,一种是只创建屏幕。
① 需要画区域时,定义容器为:
创建对象方法:
② 不需要画区域时,定义容器为:
创建容器对象方法:
当分割屏幕是,把容器对象作为参数传入
此处传入的容器参数PARENT参照CL_GUI_CONTAINER类,所以传入的容器对象可以是G_CONTAINER_9000,也可以是G_CONTAINER_9001,因为CL_GUI_CUSTOM_CONTAINER和CL_GUI_DOCKING_CONTAINER都是继承了CL_GUI_CONTAINER类。
个人倾向于不画区域的方法,最终展示的效果也会比较美观,文档源代码展示的是不画区域的做法
3源代码
"-----------------------------------------@斌将军--------------------------------------------
*&---------------------------------------------------------------------*
REPORT ZTEST001.
*----------------------------------------------------------------------*
* 数据库表声明/Database table declaration
*----------------------------------------------------------------------*
TABLES:MARA.
*--------------------------------------------------------------------*
*内表定义
*--------------------------------------------------------------------*
TYPES: BEGIN OF TY_ALV,
MATNR TYPE MARA-MATNR, "物料号
MTART TYPE MARA-MTART, "物料类型
MATKL TYPE MARA-MATKL, "物料组
MEINS TYPE MARA-MEINS, "基本计量单位
ZCHECK TYPE C,
ICON TYPE CHAR4,
MSG TYPE CHAR50,
END OF TY_ALV.
TYPES:BEGIN OF TY_MARC,
MATNR TYPE MARC-MATNR, "物料号
WERKS TYPE MARC-WERKS, "工厂
BWTTY TYPE MARC-BWTTY, "评估类别
ZCHECK TYPE C,
END OF TY_MARC.
TYPES:BEGIN OF TY_MAKT,
MATNR TYPE MAKT-MATNR, "物料号
SPRAS TYPE MAKT-SPRAS, "语言代码
MAKTX TYPE MAKT-MAKTX, "物料描述
ZCHECK TYPE C,
END OF TY_MAKT.
*----------------------------------------------------------------------*
* 全局变量定义/Global variable definition
*----------------------------------------------------------------------*
DATA:GT_ALV1 TYPE STANDARD TABLE OF TY_ALV,
GS_ALV1 TYPE TY_ALV,
GT_MAKT TYPE STANDARD TABLE OF TY_MAKT,
GS_MAKT TYPE TY_MAKT,
GT_MARC TYPE STANDARD TABLE OF TY_MARC,
GS_MARC TYPE TY_MARC,
LT_ALV2 TYPE STANDARD TABLE OF TY_MARC,
LS_ALV2 TYPE TY_MARC,
LT_ALV3 TYPE STANDARD TABLE OF TY_MAKT,
LS_ALV3 TYPE TY_MAKT.
"创建ALV屏幕
DATA: G_GRID_T TYPE REF TO CL_GUI_ALV_GRID, "顶部
G_GRID_L TYPE REF TO CL_GUI_ALV_GRID, "底部——左部
G_GRID_R TYPE REF TO CL_GUI_ALV_GRID, "底部——右部
G_CONTAINER_9000 TYPE REF TO CL_GUI_DOCKING_CONTAINER, "ALV容器 不用画屏幕容器 cl_gui_custom_container, "ALV container容器 需要画屏幕容器
G_SPLITTER TYPE REF TO CL_GUI_SPLITTER_CONTAINER,
G_SPLITTER1 TYPE REF TO CL_GUI_SPLITTER_CONTAINER,
G_CONTAINER_T TYPE REF TO CL_GUI_CONTAINER, "顶部
G_CONTAINER_B TYPE REF TO CL_GUI_CONTAINER, "底部
G_CONTAINER_L TYPE REF TO CL_GUI_CONTAINER, "底部——左部
G_CONTAINER_R TYPE REF TO CL_GUI_CONTAINER, "底部——右部
GT_EXCLUDE_9000 TYPE UI_FUNCTIONS, " 用于去掉不要的菜单栏
GT_FIELDCAT_T TYPE LVC_T_FCAT, "顶部字段
GT_FIELDCAT_L TYPE LVC_T_FCAT, "底部——左部字段
GT_FIELDCAT_R TYPE LVC_T_FCAT, "底部——右部字段
GS_LAYOUT_L TYPE LVC_S_LAYO, "底部——左部布局
GS_LAYOUT_R TYPE LVC_S_LAYO, "底部——右部布局
GS_VARIANT_T TYPE DISVARIANT,
GS_VARIANT_L TYPE DISVARIANT,
GS_VARIANT_R TYPE DISVARIANT,
GT_SORT TYPE LVC_T_SORT, "用于排序
GS_SORT TYPE LVC_S_SORT, "用于排序
GT_FILT TYPE LVC_T_FILT.
DATA:GV_9000 TYPE SCRFNAME VALUE 'Z9000', "GV_TABLE 是屏幕中定义的控件
R_UCOMM LIKE SY-UCOMM,
OK_CODE TYPE SY-UCOMM,
SAVE_CODE TYPE SY-UCOMM.
*&---------------------------------------------------------------------*
*& 字段串定义/Field-symbols *
*&---------------------------------------------------------------------*
FIELD-SYMBOLS:<FS_ALV1> TYPE TY_ALV.
*--------------------------------------------------------------------*
*ALV参数声明
*--------------------------------------------------------------------*
DATA: GT_FIELDCAT TYPE LVC_T_FCAT, "字段目录内表
GS_FIELDCAT TYPE LVC_S_FCAT, "字段目录工作区
GS_LAYOUT TYPE LVC_S_LAYO. "用于定义ALV表单的相关格式、属性
*--------------------------------------------------------------------*
*定义选择屏幕参数
*--------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK BLK0 WITH FRAME.
SELECT-OPTIONS: S_MATNR FOR MARA-MATNR. "物料
SELECT-OPTIONS: S_ERSDA FOR MARA-ERSDA DEFAULT '20190801' TO '20190831'. "创建日期
SELECTION-SCREEN END OF BLOCK BLK0.
*&---------------------------------------------------------------------*
*& INITIALIZATION/选择屏幕前初始化 *
*&---------------------------------------------------------------------*
INITIALIZATION.
CLASS ALV_EVENT_9000 DEFINITION DEFERRED."
CLASS ALV_EVENT_9000 DEFINITION.
PUBLIC SECTION.
METHODS HANDLE_DOUBLE_CLICK FOR EVENT DOUBLE_CLICK OF CL_GUI_ALV_GRID"双击事件
IMPORTING E_ROW E_COLUMN ES_ROW_NO.
METHODS HANDLE_USER_COMMAND FOR EVENT USER_COMMAND OF CL_GUI_ALV_GRID"用户按钮事件
IMPORTING E_UCOMM.
METHODS HANDLE_TOOLBAR FOR EVENT TOOLBAR OF CL_GUI_ALV_GRID"工具条事件
IMPORTING E_OBJECT E_INTERACTIVE.
ENDCLASS. "alv_event_9000 DEFINITION
*----------------------------------------------------------------------*
* CLASS BELOW_ALV_EVENT IMPLEMENTATION 定义的事件类对应的事件响应模块
*----------------------------------------------------------------------*
CLASS ALV_EVENT_9000 IMPLEMENTATION.
METHOD HANDLE_DOUBLE_CLICK . "双击事件
PERFORM FRM_DOUBLE_CLICK USING E_ROW E_COLUMN ES_ROW_NO.
ENDMETHOD. "HANDLE_USER_COMMAND
METHOD HANDLE_USER_COMMAND. "用户按钮事件
PERFORM FRM_HANDLE_USER_COMMAND9000 USING E_UCOMM.
ENDMETHOD. "handle_hotspot_click
METHOD HANDLE_TOOLBAR. "工具条事件
PERFORM FRM_HANDLE_TOOLBAR9000 USING E_OBJECT E_INTERACTIVE."设置工具条图标
ENDMETHOD. "HANDLE_DOUBLE_CLICK
ENDCLASS. "alv_event_9000 IMPLEMENTATION
AT SELECTION-SCREEN.
*&---------------------------------------------------------------------*
*& Start-of-selection/开始选择屏幕 *
*&---------------------------------------------------------------------*
START-OF-SELECTION.
"获取数据
PERFORM FRM_GET_DATA.
*&---------------------------------------------------------------------*
*& Form FRM_LAYOUT
*&---------------------------------------------------------------------*
FORM FRM_LAYOUT.
CLEAR:GS_LAYOUT,GS_LAYOUT_L,GS_LAYOUT_R.
GS_LAYOUT-GRID_TITLE = '第1个界面'. "标题
GS_LAYOUT-CWIDTH_OPT = 'A'. "优化列宽
GS_LAYOUT-ZEBRA = 'X'. "斑马线
GS_LAYOUT-SEL_MODE = 'A'. "设置行模式"
GS_LAYOUT-BOX_FNAME = 'ZCHECK'."选择行控制
GS_LAYOUT_L = GS_LAYOUT_R = GS_LAYOUT.
GS_LAYOUT_L-GRID_TITLE = '第2个界面'. "标题
GS_LAYOUT_R-GRID_TITLE = '第3个界面'. "标题
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_GET_DATA3
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FRM_GET_DATA.
SELECT
MATNR"物料号
MTART"物料类型
MATKL"物料组
MEINS"基本计量单位
FROM MARA
INTO TABLE GT_ALV1
WHERE MATNR IN S_MATNR
AND ERSDA IN S_ERSDA.
IF GT_ALV1 IS NOT INITIAL.
SELECT
MATNR"物料号
WERKS"工厂
BWTTY"评估类别
FROM MARC
INTO TABLE GT_MARC
FOR ALL ENTRIES IN GT_ALV1
WHERE MATNR = GT_ALV1-MATNR.
SELECT
MATNR"物料号
SPRAS"语言代码
MAKTX"物料描述
FROM MAKT
INTO TABLE GT_MAKT
FOR ALL ENTRIES IN GT_ALV1
WHERE MATNR = GT_ALV1-MATNR.
ENDIF.
IF GT_ALV1 IS INITIAL.
MESSAGE '系统中无相关数据' TYPE 'S' DISPLAY LIKE 'E'.
STOP.
ELSE.
CALL SCREEN 9000.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_FIELDCAT3
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FRM_FIELDCAT4.
*&---alv 表头宏
DEFINE INIT_FIELDCAT.
CLEAR gs_fieldcat.
gs_fieldcat-fieldname = &1. " 字段技术名称
gs_fieldcat-coltext = &2. " 显示名称
gs_fieldcat-ref_table = &3. " 参照表,标准功能实现例如搜索帮助
gs_fieldcat-ref_field = &4. " 参照表字段,标准功能实现例如搜索帮助
gs_fieldcat-no_init_ch = &5.
gs_fieldcat-EDIT = &6. " 是否可以编辑
gs_fieldcat-KEY = &7. "
gs_fieldcat-HOTSPOT = &8. "
gs_fieldcat-outputlen = &9. "
APPEND gs_fieldcat TO gt_fieldcat.
END-OF-DEFINITION.
REFRESH:GT_FIELDCAT.
INIT_FIELDCAT 'MATNR' '物料号' '' '' '' '' '' '' '' .
INIT_FIELDCAT 'MTART' '物料类型' '' '' '' '' '' '' '' .
INIT_FIELDCAT 'MATKL' '物料组' '' '' '' '' '' '' '' .
INIT_FIELDCAT 'MEINS' '基本计量单位' '' '' '' '' '' '' '' .
GT_FIELDCAT_T = GT_FIELDCAT.
REFRESH:GT_FIELDCAT.
INIT_FIELDCAT 'MATNR' '物料号' '' '' '' '' '' '' '' .
INIT_FIELDCAT 'WERKS' '工厂' '' '' '' '' '' '' '' .
INIT_FIELDCAT 'BWTTY' '评估类别' '' '' '' '' '' '' '' .
GT_FIELDCAT_L = GT_FIELDCAT.
REFRESH:GT_FIELDCAT.
INIT_FIELDCAT 'MATNR' '物料号' '' '' '' '' '' '' '' .
INIT_FIELDCAT 'SPRAS' '语言代码' '' '' '' '' '' '' '' .
INIT_FIELDCAT 'MAKTX' '物料描述' '' '' '' '' '' '' '' .
GT_FIELDCAT_R = GT_FIELDCAT.
ENDFORM.
FORM FRM_ENTER_DATA.
MESSAGE '调用方法成功' TYPE 'S'.
ENDFORM.
MODULE STATUS_9000 OUTPUT.
SET PF-STATUS 'STANDARD'.
ENDMODULE.
MODULE DISPLAY_ALV_9000 OUTPUT.
IF G_CONTAINER_9000 IS NOT BOUND.
PERFORM FRM_CREATE_CONTAINER_9000.
* PERFORM FRM_ALV_SORT_9000.
PERFORM FRM_FIELDCAT4.
PERFORM FRM_LAYOUT.
PERFORM FRM_ALV_BTN_EXCLUDE_9000.
PERFORM FRM_ALV_EVENT_9000.
PERFORM FRM_ALV_DISPLAY_9000.
ELSE.
PERFORM FRM_REFRESH_ALV_9000 USING G_GRID_T.
PERFORM FRM_REFRESH_ALV_9000 USING G_GRID_L.
PERFORM FRM_REFRESH_ALV_9000 USING G_GRID_R.
ENDIF.
ENDMODULE.
MODULE USER_COMMAND_9000 INPUT.
DATA: LT_ROW TYPE LVC_T_ROW,
LT_ROID TYPE LVC_T_ROID,
LS_ROW TYPE LVC_S_ROW.
SAVE_CODE = OK_CODE.
CLEAR OK_CODE.
CASE SAVE_CODE.
WHEN '&BACK'."设置功能键返回按钮单击事件
LEAVE TO SCREEN 0.
WHEN '&EXIT'.
LEAVE PROGRAM.
ENDCASE.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Form FRM_CREATE_CONTAINER_9000
*& 创建容器
*&---------------------------------------------------------------------*
FORM FRM_CREATE_CONTAINER_9000.
* 创建 容器
CREATE OBJECT G_CONTAINER_9000
EXPORTING
REPID = SY-REPID
DYNNR = '9000'
* side = cl_gui_docking_container=>dock_at_right ”ALV贴屏幕右边,从屏幕右边开始算宽度
SIDE = CL_GUI_DOCKING_CONTAINER=>DOCK_AT_TOP "ALV贴屏幕左边,从左边算屏幕宽度,
EXTENSION = 1000 "屏幕宽度
* ratio = 95 "屏幕比例 小于5大于95会报cntl_error异常
STYLE = CL_GUI_CONTROL=>WS_CHILD "可选参数,设置ALV是否可用手动拖动大小
EXCEPTIONS
CNTL_ERROR = 1
CNTL_SYSTEM_ERROR = 2
CREATE_ERROR = 3
LIFETIME_ERROR = 4
LIFETIME_DYNPRO_DYNPRO_LINK = 5
OTHERS = 6.
IF SY-SUBRC <> 0.
MESSAGE S001(00) WITH '屏幕初始化失败'.
LEAVE LIST-PROCESSING.
ENDIF.
"拆分成2行1列部分
CREATE OBJECT G_SPLITTER
EXPORTING
PARENT = G_CONTAINER_9000
ROWS = 2
COLUMNS = 1.
"一行一列
CALL METHOD G_SPLITTER->GET_CONTAINER
EXPORTING
ROW = 1
COLUMN = 1
RECEIVING
CONTAINER = G_CONTAINER_T.
CALL METHOD G_SPLITTER->SET_COLUMN_WIDTH
EXPORTING
ID = 1
WIDTH = 100.
"二行一列*
CALL METHOD G_SPLITTER->GET_CONTAINER
EXPORTING
ROW = 2
COLUMN = 1
RECEIVING
CONTAINER = G_CONTAINER_B.
"拆分成一行二列部分*
CREATE OBJECT G_SPLITTER1
EXPORTING
PARENT = G_CONTAINER_B
ROWS = 1
COLUMNS = 2.
"一行一列*
CALL METHOD G_SPLITTER1->GET_CONTAINER
EXPORTING
ROW = 1
COLUMN = 1
RECEIVING
CONTAINER = G_CONTAINER_L.
CALL METHOD G_SPLITTER1->SET_COLUMN_WIDTH
EXPORTING
ID = 2
WIDTH = 50.
"*一行二列*
CALL METHOD G_SPLITTER1->GET_CONTAINER
EXPORTING
ROW = 1
COLUMN = 2
RECEIVING
CONTAINER = G_CONTAINER_R.
CALL METHOD G_SPLITTER1->SET_COLUMN_WIDTH
EXPORTING
ID = 3
WIDTH = 50.
CREATE OBJECT G_GRID_T"上半部分
EXPORTING
I_PARENT = G_CONTAINER_T.
CREATE OBJECT G_GRID_L"左半部分
EXPORTING
I_PARENT = G_CONTAINER_L.
CREATE OBJECT G_GRID_R"右半部分
EXPORTING
I_PARENT = G_CONTAINER_R.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_ALV_BTN_EXCLUDE_9000
*& 排除不用的按钮
*&---------------------------------------------------------------------*
FORM FRM_ALV_BTN_EXCLUDE_9000.
DATA: LS_EXCLUDE TYPE UI_FUNC.
REFRESH GT_EXCLUDE_9000.
CLEAR LS_EXCLUDE.
LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_DETAIL.
APPEND LS_EXCLUDE TO GT_EXCLUDE_9000.
CLEAR LS_EXCLUDE.
LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_COPY.
APPEND LS_EXCLUDE TO GT_EXCLUDE_9000.
CLEAR LS_EXCLUDE.
LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_CUT.
APPEND LS_EXCLUDE TO GT_EXCLUDE_9000.
CLEAR LS_EXCLUDE.
LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_PASTE.
APPEND LS_EXCLUDE TO GT_EXCLUDE_9000.
CLEAR LS_EXCLUDE.
LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_INSERT_ROW.
APPEND LS_EXCLUDE TO GT_EXCLUDE_9000.
CLEAR LS_EXCLUDE.
LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_DELETE_ROW.
APPEND LS_EXCLUDE TO GT_EXCLUDE_9000.
CLEAR LS_EXCLUDE.
LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_UNDO.
APPEND LS_EXCLUDE TO GT_EXCLUDE_9000.
CLEAR LS_EXCLUDE.
LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_CHECK.
APPEND LS_EXCLUDE TO GT_EXCLUDE_9000.
CLEAR LS_EXCLUDE.
LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_APPEND_ROW.
APPEND LS_EXCLUDE TO GT_EXCLUDE_9000.
CLEAR LS_EXCLUDE.
LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_COPY_ROW.
APPEND LS_EXCLUDE TO GT_EXCLUDE_9000.
CLEAR LS_EXCLUDE.
LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_PASTE_NEW_ROW.
APPEND LS_EXCLUDE TO GT_EXCLUDE_9000.
CLEAR LS_EXCLUDE.
LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_REFRESH.
APPEND LS_EXCLUDE TO GT_EXCLUDE_9000.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_ALV_EVENT_9000
*&---------------------------------------------------------------------*
FORM FRM_ALV_EVENT_9000.
DATA: LR_EVENT_HANDLER TYPE REF TO ALV_EVENT_9000.
* CALL METHOD G_GRID_T->register_edit_event "注册回车事件
* EXPORTING
* i_event_id = cl_gui_alv_grid=>mc_evt_enter.
*
* CALL METHOD g_grid_9000->register_edit_event "注册失去鼠标事件
* EXPORTING
* i_event_id = cl_gui_alv_grid=>mc_evt_modified.
IF LR_EVENT_HANDLER IS INITIAL.
CREATE OBJECT LR_EVENT_HANDLER.
ENDIF.
* SET HANDLER LR_EVENT_HANDLER->HANDLE_DATA_CHANGED FOR G_GRID_9000. "数据改动事件
SET HANDLER LR_EVENT_HANDLER->HANDLE_DOUBLE_CLICK FOR G_GRID_T.
* SET HANDLER LR_EVENT_HANDLER->HANDLE_ON_F4 FOR G_GRID_9000.
* SET HANDLER LR_EVENT_HANDLER->HANDLE_HOTSPOT_CLICK FOR G_GRID_9000 .
SET HANDLER LR_EVENT_HANDLER->HANDLE_TOOLBAR FOR G_GRID_T. "工具栏事件
SET HANDLER LR_EVENT_HANDLER->HANDLE_USER_COMMAND FOR G_GRID_T. "用户命令事件
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_ALV_DISPLAY_9000
*&---------------------------------------------------------------------*
FORM FRM_ALV_DISPLAY_9000.
CALL METHOD G_GRID_T->SET_TABLE_FOR_FIRST_DISPLAY
EXPORTING
* I_CONSISTENCY_CHECK = 'X'
IS_VARIANT = GS_VARIANT_T
IT_TOOLBAR_EXCLUDING = GT_EXCLUDE_9000
I_SAVE = 'A'
I_DEFAULT = 'X' "允许定义默认布局
IS_LAYOUT = GS_LAYOUT
CHANGING
IT_OUTTAB = GT_ALV1
IT_FIELDCATALOG = GT_FIELDCAT_T
EXCEPTIONS
INVALID_PARAMETER_COMBINATION = 1
PROGRAM_ERROR = 2
TOO_MANY_LINES = 3
OTHERS = 4.
IF SY-SUBRC <> 0.
ENDIF.
CALL METHOD G_GRID_L->SET_TABLE_FOR_FIRST_DISPLAY
EXPORTING
* I_CONSISTENCY_CHECK = 'X'
IS_VARIANT = GS_VARIANT_L
IT_TOOLBAR_EXCLUDING = GT_EXCLUDE_9000
I_SAVE = 'A'
I_DEFAULT = 'X' "允许定义默认布局
IS_LAYOUT = GS_LAYOUT_L
* IS_PRINT = GS_PRINT_H
CHANGING
IT_OUTTAB = LT_ALV2
IT_FIELDCATALOG = GT_FIELDCAT_L
EXCEPTIONS
INVALID_PARAMETER_COMBINATION = 1
PROGRAM_ERROR = 2
TOO_MANY_LINES = 3
OTHERS = 4.
IF SY-SUBRC <> 0.
ENDIF.
CALL METHOD G_GRID_R->SET_TABLE_FOR_FIRST_DISPLAY
EXPORTING
* I_CONSISTENCY_CHECK = 'X'
IS_VARIANT = GS_VARIANT_R
IT_TOOLBAR_EXCLUDING = GT_EXCLUDE_9000
I_SAVE = 'A'
I_DEFAULT = 'X' "允许定义默认布局
IS_LAYOUT = GS_LAYOUT_R
* IS_PRINT = GS_PRINT_H
CHANGING
IT_OUTTAB = LT_ALV3
IT_FIELDCATALOG = GT_FIELDCAT_R
EXCEPTIONS
INVALID_PARAMETER_COMBINATION = 1
PROGRAM_ERROR = 2
TOO_MANY_LINES = 3
OTHERS = 4.
IF SY-SUBRC <> 0.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DOUBLE_CLICK
*&---------------------------------------------------------------------*
FORM FRM_DOUBLE_CLICK USING P_E_ROW_ID TYPE LVC_S_ROW
P_E_COLUMN_ID TYPE LVC_S_COL
P_ES_ROW_NO TYPE LVC_S_ROID.
READ TABLE GT_ALV1 INTO GS_ALV1 INDEX P_ES_ROW_NO-ROW_ID."得到点击的行
IF SY-SUBRC EQ 0.
REFRESH:LT_ALV2,LT_ALV3.
LOOP AT GT_MARC INTO GS_MARC WHERE MATNR = GS_ALV1-MATNR.
CLEAR:LS_ALV2.
MOVE-CORRESPONDING GS_MARC TO LS_ALV2.
APPEND LS_ALV2 TO LT_ALV2.
CLEAR:GS_MARC.
ENDLOOP.
LOOP AT GT_MAKT INTO GS_MAKT WHERE MATNR = GS_ALV1-MATNR.
CLEAR:LS_ALV3.
MOVE-CORRESPONDING GS_MAKT TO LS_ALV3.
APPEND LS_ALV3 TO LT_ALV3.
CLEAR:GS_MAKT.
ENDLOOP.
PERFORM FRM_REFRESH_ALV_9000 USING G_GRID_T.
PERFORM FRM_REFRESH_ALV_9000 USING G_GRID_L.
PERFORM FRM_REFRESH_ALV_9000 USING G_GRID_R.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_HANDLE_USER_COMMAND
*&---------------------------------------------------------------------*
FORM FRM_HANDLE_USER_COMMAND9000 USING PV_UCOMM.
CALL METHOD G_GRID_T->GET_SELECTED_ROWS
IMPORTING
ET_INDEX_ROWS = LT_ROW
ET_ROW_NO = LT_ROID.
FIELD-SYMBOLS:<FS_ZCHECK>.
* 因为OOALV中侧边栏选择框不起作用,但是需要使用,就将选中的行的侧边栏的值修改一下
LOOP AT GT_ALV1 ASSIGNING <FS_ALV1>.
<FS_ALV1>-ZCHECK = ''.
ENDLOOP.
IF LT_ROW IS NOT INITIAL.
LOOP AT LT_ROW INTO LS_ROW.
LOOP AT GT_ALV1 ASSIGNING <FS_ALV1>.
IF SY-TABIX = LS_ROW-INDEX.
<FS_ALV1>-ZCHECK = 'X'.
ENDIF.
ENDLOOP.
CLEAR:LS_ROW.
ENDLOOP.
ELSE.
MESSAGE '请选择数据' TYPE 'S' DISPLAY LIKE 'E'.
RETURN.
ENDIF.
CASE PV_UCOMM.
WHEN '&ENTER'."审批通过
PERFORM FRM_ENTER_DATA.
WHEN OTHERS.
ENDCASE.
PERFORM FRM_REFRESH_ALV_9000 USING G_GRID_T.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_HANDLE_TOOLBAR
*&---------------------------------------------------------------------*
FORM FRM_HANDLE_TOOLBAR9000 USING P_OBJECT P_INTERACTIVE.
PERFORM FRM_HANDLE_TOOLBAR_PRO USING P_OBJECT '&ENTER' '@0V@' '确认'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_HANDLE_TOOLBAR_PRO
*&---------------------------------------------------------------------*
FORM FRM_HANDLE_TOOLBAR_PRO USING P_OBJECT TYPE REF TO CL_ALV_EVENT_TOOLBAR_SET
P_FUNCTION TYPE STB_BUTTON-FUNCTION
P_ICON TYPE STB_BUTTON-ICON
P_TEXT TYPE STB_BUTTON-TEXT.
DATA: LS_TOOLBAR TYPE STB_BUTTON,
LV_QUICKINFO TYPE STB_BUTTON-QUICKINFO.
CLEAR LS_TOOLBAR.
MOVE 3 TO LS_TOOLBAR-BUTN_TYPE. " 分隔符
APPEND LS_TOOLBAR TO P_OBJECT->MT_TOOLBAR.
CLEAR LS_TOOLBAR.
MOVE 0 TO LS_TOOLBAR-BUTN_TYPE. " 按钮(正常)
MOVE P_FUNCTION TO LS_TOOLBAR-FUNCTION. "功能码
MOVE P_ICON TO LS_TOOLBAR-ICON. "图标
MOVE P_TEXT TO LS_TOOLBAR-TEXT. "显示文本
LV_QUICKINFO = P_TEXT.
MOVE LV_QUICKINFO TO LS_TOOLBAR-QUICKINFO.
APPEND LS_TOOLBAR TO P_OBJECT->MT_TOOLBAR.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_REFRESH_ALV_9000
*&---------------------------------------------------------------------*
FORM FRM_REFRESH_ALV_9000 USING PV_GRID TYPE REF TO CL_GUI_ALV_GRID.
DATA: LT_CELLTAB TYPE LVC_T_STYL,
LS_CELLTAB TYPE LVC_S_STYL,
LS_STABLE TYPE LVC_S_STBL.
LS_STABLE-ROW = 'X'. "固定行
LS_STABLE-COL = 'X'. "固定列
CHECK PV_GRID IS NOT INITIAL.
CALL METHOD PV_GRID->REFRESH_TABLE_DISPLAY
EXPORTING
IS_STABLE = LS_STABLE
* I_SOFT_REFRESH = 'X'
EXCEPTIONS
FINISHED = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
CALL METHOD CL_GUI_CFW=>FLUSH.
ENDFORM.
"-----------------------------------------@斌将军--------------------------------------------