ABAP OOALV

一、搭建基本框架-界面

创建一个REPORT程序,参照CL_GUI_ALV_GRID创建对象,参照CL_GUI_CUSTOM_CONTAINER创建对象

取数

输出:创建FIELDCAT,把学生表中的所有字段,创建FIELDCAT,实例化容器、实例化ALV、调用方法SET_TABLE_FOR_FIRST_DISPALY

SE24类:CL_GUI_ALV_GRID

REPORT Z_G_08 MESSAGE-ID ZG_01.

INCLUDE Z_G_08TOP.
INCLUDE Z_G_08F01.

START-OF-SELECTION.
PERFORM GET_DATA.

END-OF-SELECTION.
IF GT_STUDENT IS NOT INITIAL.
  PERFORM DISPLAY_DATA.
  ELSE.
    MESSAGE S001 DISPLAY LIKE 'E'.
ENDIF.

创建TOP和F01,并在F01中分别创建GET_DATA和DISPLAYDATA.

定义并创建选择界面

DATA GT_STUDENT TYPE TABLE OF ZSTUDENT_G_01.
DATA GS_STUDENT TYPE ZSTUDENT_G_01.

SELECT-OPTIONS S_ZCODE FOR GS_STUDENT-ZCODE.

 取数

FORM GET_DATA .
  SELECT *
    FROM ZTUDENT_G_01
    INTO CORRESPONDING FIELDS OF TABLE GT_STUDENT
    WHERE ZCODE IN S_ZCODE.
ENDFORM.

展示数据

FORM DISPLAY_DATA .
  PERFORM BUILD_FIELDCAT.
  PERFORM BUILD_ALV.
ENDFORM.
FORM BUILD_FIELDCAT .
  %%ADD_fieldcat:
    'ZCODE'   '学号' '10',
    'ZNAME'   '姓名' '20',
    'SEX'     '性别' '5',
    'ZSCHOOL' '学校' '10',
    'WEIGHT'  '体重' '15',
    'ZUNIT'   '单位'  '5'.
ENDFORM.

 面向对象的表单展示,参考类定义

 基于实例的一个方法,所以需要给这个类创建一个对象 

*OOALV DISPLAY
DATA GS_ALV TYPE REF TO CL_GUI_ALV_GRID.

调用方法 

取消异常注释

搜索CONSTRUCTOR,查看参数,可以看到该值为必输项

DATA GS_PARENT TYPE REF TO CL_GUI_CONTAINER.

因为GS_PARENT的类型为类,所以也需要进行实例化

FORM BUILD_ALV .
*实例化
  CREATE OBJECT GS_PARENT
  EXPORTING
    CLASSID = ''.
  CREATE OBJECT GS_ALV
  EXPORTING
    I_PARENT = GS_PARENT.
ENDFORM.

但是一般不使用CL_GUI_CONTAINER,而使用CL_GUI_CUSTOM_CONTAINER

修改GS_PARENT的参照类型 ,可以查到CL_GUI_CUSTOM_CONTAINER这个类,也有一个必输项,修改如下:

FORM BUILD_ALV .
*实例化
*GS_PARENT的实例化--实例化容器   
  CREATE OBJECT GS_PARENT
  EXPORTING
    CONTAINER_NAME = ''."界面中CUSTOMER CONTROL控件名称
  
*将ALV植入到容器中  
  CREATE OBJECT GS_ALV
  EXPORTING
    I_PARENT = GS_PARENT.
ENDFORM.

定义表单列格式

根据IT_FIELDCATLOG的类型,定义GT_FIELDCAT类型

DATA GT_FIELDCAT TYPE LVC_T_FCAT."列结构 
DATA GS_FIELDCAT TYPE LVC_S_FCAT.

双击LVC_T_FCAT查看参数,通过宏完成内表的增加

*定义宏
DATA GV_POS TYPE I.
DEFINE %%ADD_FIELDCAT.
  CLEAR GS_FIELDCAT.
  GV_POS = GV_POS + 1.
  GS_FIELDCAT-COL_POS = GV_POS.
  GS_FIELDCAT-FIELDNAME = &1.
  GS_FIELDCAT-SCRTEXT_M = &2.
  GS_FIELDCAT-OUTPUTLEN = &3.

  CASE &2.
  	WHEN 'WEIGH'.
      GS_FIELDCAT-QFIELDNAME = 'ZUNIT'.
  ENDCASE.
  APPEND GS_FIELDCAT TO GT_FIELDCAT.
END-OF-DEFINITION.

创建SCREEN,在布局中画一个定制控制,命名为GC_CON,决定了ALV输出的时候的位置

将定义的名字放在此处,同时调用屏幕

 调用屏幕后不执行PERFORM,因此调用ALV要放在PBO中,将原先的PERFORM DISPLAY_DATA注释,并将其中的两个子程序放在PBO中

输出效果:

二、布局与按钮

1、单元格颜色设置

前提需要定义变量名

2、定义布局

DATA GS_LAYOUT TYPE LVC_S_LAYO.
TYPES:BEGIN OF GTY_STUDENT,
        BOX         TYPE C LENGTH 1.
        INCLUDE STRUCTURE ZSTUDENT_G_01.
TYPES:  FIELD_COLOR TYPE LVC_T_SCOL,
        FIELD_MODIFY TYPE LVC_T_STYL,
      END OF GTY_STUDENT.

DATA GT_STUDENT TYPE TABLE OF GTY_STUDENT.
DATA GS_STUDENT TYPE GTY_STUDENT.

FORM build_layout .
  gs_layout-CWIDTH_opt = 'X'."优化列宽
  gs_layout-zebra = 'X'. "斑马纹
  gs_layout-keyhot = 'X'. "关键字的热点
*  gs_layout-window_titlebar = '窗体抬头(layout)'.
  gs_layout-box_fname = 'BOX'."内表中字段名称 - 定义为当前行的选择按钮,选择时自动选x
*  gs_layout-info_fieldname = 'LINE_COLOR'. "行颜色
  gs_layout-CTAB_fname = 'FIELD_COLOR'. "单元格颜色
*  GS_LAYOUT-EDIT = 'X'."以表单为单位可修改
  "以列为单位可修改在FIELDCAT处添加
  gs_layout-stylefname = 'FIELD_MODIFY'."以单元格为单位可修改
ENDFORM.

 如果修改列

以单元格进行设置

在内表中增加一个字段,类型为LVC_T_STYL,例如CELLSTL

然后进行赋值

进入BUILD_LAYOUT进行属性定义

 gs_layout-stylefname = 'FIELD_MODIFY'."以单元格为单位可修改

 因为优先级的问题可能不会执行成功,在FIELDCAT中增加,即可成功

2、增加按钮

定义一个0100的按钮组,并设置基本的按钮

创建一个抬头,双击填写抬头名

定义按钮功能,在EXIT中执行LEAVE PROGRAM

PROCESS BEFORE OUTPUT.
MODULE INIT_ALV.
 MODULE STATUS_0100.
*
PROCESS AFTER INPUT.
MODULE EXIT AT EXIT-COMMAND.
MODULE USER_COMMAND_0100.
MODULE EXIT INPUT.
LEAVE PROGRAM.
ENDMODULE.

MODULE USER_COMMAND_0100 INPUT.
CASE OK_CODE.
	WHEN 'BACK'.
    LEAVE TO SCREEN 0.
	WHEN 'EXIT'OR 'CANCEL'.
    LEAVE PROGRAM.
ENDCASE.
ENDMODULE.

声明OK_CODE,并在TOP创建一个变量进行传值

DATA OK_CODE TYPE SY-UCOMM.

三、表单的重新刷新

使用REFRESH_ALV

MODULE INIT_ALV OUTPUT.
  IF GS_ALV IS INITIAL.
    PERFORM CREATE_ALV.
    PERFORM BUILD_FIELDCAT.
    PERFORM BULID_LAYOUT.
    PERFORM BUILD_ALV.
  ELSE.
    PERFORM REFRESH_ALV.
  ENDIF.
ENDMODULE.

调用方法

在TOP中定义一下参数

DATA GS_STABLE TYPE LVC_S_STBL."固定

分别对STABLE中的参数定义,查看LVC_S_STBL的类型来定义参数

  GS_STABLE-ROW = 'X'.
  GS_STABLE-COL = 'X'.

四、按钮隐藏

OOALV与FUNCTION ALV的按钮位置不一样,是两种按钮,与STATUS无关

思路:使用方法将按钮隐藏

FORM BUILD_exculde .
  CLEAR gt_exclude[].
*找到方法中对应的属性
*  gs_exclude = CL_GUI_ALV_GRID=>MC_FC_LOC_INSERT_ROW."插入
*  APPEND GS_EXCLUDE TO GT_EXCLUDE.
*
*  gs_exclude = CL_GUI_ALV_GRID=>MC_FC_LOC_DELETE_ROW."删除
*  APPEND GS_EXCLUDE TO GT_EXCLUDE.
*
*  gs_exclude = CL_GUI_ALV_GRID=>MC_FC_LOC_APPEND_ROW.
*  APPEND GS_EXCLUDE TO GT_EXCLUDE.
*
*  gs_exclude = CL_GUI_ALV_GRID=>MC_FC_LOC_COPY_ROW.
*  APPEND GS_EXCLUDE TO GT_EXCLUDE.

*调用子程序
PERFORM append_alv_exclude_functions TABLES gt_exclude    "隐藏按钮
    USING :
          cl_gui_alv_grid=>mc_fc_loc_insert_row,
          cl_gui_alv_grid=>MC_FC_LOC_delete_ROW,
          cl_gui_alv_grid=>MC_FC_LOC_append_ROW,
          cl_gui_alv_grid=>MC_FC_LOC_copy_ROW,
          cl_gui_alv_grid=>MC_FC_LOC_cut.
ENDFORM.
FORM append_alv_exclude_functions TABLES pt_exclude TYPE ui_functions
  USING p_exclude TYPE ui_func.
  APPEND p_exclude TO pt_exclude.
ENDFORM .

五、用户交互事件

1、CLASS类实现按钮的添加

 先声明一个本地类

INCLUDE Z_G_08_CLS.

 定义类,进行方法的声明

CLASS lcl_app_compt DEFINITION.
  PUBLIC SECTION.
*按钮方法
    METHODS handle_toolbar FOR EVENT toolbar
      OF cl_gui_alv_grid
      IMPORTING e_object.

    METHODS handle_user_command FOR EVENT user_command
      OF cl_gui_alv_grid
      IMPORTING e_ucomm.

    METHODS handle_hotspot_click FOR EVENT hotspot_click
      OF cl_gui_alv_grid
      IMPORTING e_row_id
                e_column_id
                es_row_no.

    METHODS handle_double_click FOR EVENT double_click
      OF cl_gui_alv_grid
      IMPORTING e_row
                e_column.

    METHODS HANDLE_DATA_CHANGED FOR EVENT DATA_CHANGED
      OF cl_gui_alv_grid
      IMPORTING ER_DATA_CHANGED.

ENDCLASS.
CLASS lcl_app_compt IMPLEMENTATION.
*  HANDLE TOOLBAR
  METHOD handle_toolbar.
    PERFORM fm_handle_toolbar USING e_object.

  ENDMETHOD.

*  HANDLE user_command
  METHOD handle_user_command.
    PERFORM fm_user_command USING e_ucomm.

  ENDMETHOD.

*  HANDLE hotspot_click
  METHOD handle_hotspot_click.
    PERFORM fm_hotspot_click USING e_row_id e_column_id.
  ENDMETHOD.

*  HANDLE double_click
  METHOD handle_double_click.
    PERFORM fm_double_click USING e_row e_column.
  ENDMETHOD.

*  HANDLE_DATA_CHANGED
  METHOD HANDLE_DATA_CHANGED .
    PERFORM fm_DATA_CHANGED USING ER_DATA_CHANGED->mt_mod_cells.
  ENDMETHOD.
ENDCLASS.
FORM fm_handle_toolbar  USING  p_object TYPE REF TO cl_alv_event_toolbar_set.
  "向mt_toolbar内表中增加行,增加按钮
  DATA ls_button TYPE stb_button.

  CLEAR: ls_button.
  ls_button-butn_type = '3'."插入分割线
  APPEND ls_button TO p_object->mt_toolbar."传入参数E_OBJECT

  CLEAR: ls_button.
  ls_button-function = 'CALLSF'.
  ls_button-text = '调用sf'.
  ls_button-icon = icon_failure.
  APPEND ls_button TO p_object->mt_toolbar.

  CLEAR: ls_button.
  ls_button-function = 'EDIT'.
  ls_button-text = '修改选中行'.
  ls_button-icon = icon_toggle_display_change.
  APPEND ls_button TO p_object->mt_toolbar.

  CLEAR: ls_button.
  ls_button-function = 'DOWNLOAD'.
  ls_button-text = '下载表单'.
  ls_button-icon = icon_layout_control.
  APPEND ls_button TO p_object->mt_toolbar.

ENDFORM.

2、单击与双击

先设置热点

HOTSPOT_CLICK

    PERFORM set_handle."事件注册
  SET HANDLER event_handle->handle_HOTSPOT_CLICK FOR gs_alv.

FORM fm_hotspot_click USING p_row_id TYPE lvc_s_row
                          p_column_id TYPE lvc_s_col.

  IF p_column_id-fieldname = 'ZSCHOOL'.
    READ TABLE gt_student INTO gs_student INDEX p_row_id-index.
    MESSAGE s003 WITH '单击了第 ' p_row_id-index '行,学校字段的值为' gs_student-zschool.
  ENDIF.
ENDFORM.
FORM fm_double_click  USING    p_row TYPE lvc_s_row
                               p_column TYPE lvc_s_col.

  DATA lv_value TYPE c LENGTH 20.
  DATA ls_col TYPE lvc_s_col.
  CALL METHOD gs_alv->get_current_cell
    IMPORTING
*     e_row     =
      e_value   = lv_value
*     e_col     =
*     es_row_id =
      es_col_id = ls_col
*     es_row_no =
    .

*  双击了xxx字段,值为xxx
  MESSAGE s000 WITH '双击了' ls_col-fieldname '字段,值为' lv_value.
ENDFORM.

3、数据修改

事件注册

  SET HANDLER event_handle->handle_DATA_CHANGED FOR gs_alv.
*  HANDLE_DATA_CHANGED
  METHOD HANDLE_DATA_CHANGED .
    PERFORM fm_DATA_CHANGED USING ER_DATA_CHANGED->mt_mod_cells.
  ENDMETHOD.
FORM fm_DATA_CHANGED USING  pt_cell TYPE lvc_t_modi .
  DATA ls_cell TYPE lvc_s_modi.

  LOOP AT pt_cell INTO ls_cell.
*1.读到修改的行
    READ TABLE gt_student INTO gs_student INDEX ls_cell-row_id.
    IF sy-subrc = 0.
*2.根据字段改对应的值
      CASE ls_cell-fieldname.
        WHEN 'SEX'.
          gs_student-sex = ls_cell-value.
        WHEN 'WEIGHT'.
          gs_student-weight = ls_cell-value.
      ENDCASE .
      MODIFY gt_student FROM gs_student INDEX ls_cell-row_id.
    ENDIF.
  ENDLOOP.
ENDFORM.

 修改数据后,点击保存,强制修改

    WHEN 'SAVE'.
      CALL METHOD gs_alv->check_changed_data
*        IMPORTING
*          e_valid   =
*        CHANGING
*          c_refresh = 'X'
          .

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值