SAP-ABAP开发-完整OOALV示例(详细步骤代码)

本文目录

一、主要使用的类和方法
        1、主要使用的类
        2、主要使用的方法

二、执行步骤
        1、基本表单流程
        2、ALV类的创建
        3、设置fieldcat
        4、可修改属性设置
                ①报表的可修改
                ②容器按钮隐藏
        5、用户交互事件
                *声明
                *事件的实现
                *注册和调用


         OO ALV,即采用面向对象(Object-Oriented)编程方式实现的ALV输出,其基本使用原理是通过界面调用,在界面的Customer Control控件中进行ALV的输出展示。CLASS ALV的优势在于它使用了面向对象的编程方式,这不仅提高了代码的灵活性和可维护性,而且通过使用容器技术,允许在一个界面的指定位置进行ALV的输出,从而优化了用户界面的布局和交互体验。

一、主要使用的类和方法

1、主要使用的类

类的声明
Data for ALV
DATA: gs_alv         TYPE REF TO cl_gui_alv_grid,    “用于表单输出
      gs_con         TYPE REF TO cl_gui_custom_container,  “用于定义容器
      gs_dyndoc_id   TYPE REF TO cl_dd_document,   “用于表头书写
      gs_splitter    TYPE REF TO cl_gui_splitter_container.  “用于分割容器

2、主要使用的方法

如何在类中找到我们需要的方法以及里面的需要用到的参数等,步骤如下:
事务码:se24  打开后输入用到的类名,点击查看

点击查询按钮,找到需要用到的方法,选中哪一行点击参数,进入后可以找到需要的参数名称或者必输的参数等















二、执行步骤

创建一个report程序,定义输出的内表和选择界面,创建界面0100,调用界面
参照CL_GUI_ALV_GUID ,创建对象
参照容器CL_GUI_CUSTOM_CONTAINER,创建对象

取数 select

输出:1、创建fieldcat,把学生表中的所有字段,创建fieldcat
           2、实例化容器
           3、实例化AVL
           4、调用方法set_table_for_first_display

调用界面,并在逻辑流里面的PBO部分进行对输出的定义,设置fieldcat及layout等属性,通过调用方法执行ALV的初次输出或刷新。

1、基本表单流程

在END-OF-SELECTION中执行输出,创建界面0100,调用界面

在TOP INCLUDE中增加基本定义

在界面中增加customer control控件,例名称为GS_CON

在界面的PBO部分增加module,用于ALV输出

2、ALV类的创建

        接上面初始report创建,现实例化容器对象,给CONSTRUCTOR构造方法传值 CONTAINER_NAME,界面中用户定义容器名称 实例化ALV对象,给CONSTRUCTOR构造方法传I_PARENT值实例化的容器对象。

FORM create_alv .
*实例化 CREATE OBJECT ...
  CREATE OBJECT gs_parent "GS_PARENT实例化
    EXPORTING
      container_name = 'GC_CON'. "界面中的CUSTOMER CONTROL 控件名称
  CREATE OBJECT gs_alv
    EXPORTING
      i_parent = gs_parent. "必输参数

ENDFORM.

3、设置fieldcat

定义内表:LVC_T_FCAT 结构:LVC_S_FCAT并对fieldcat表单进行赋值和设计等

DATA gt_fieldcat TYPE lvc_t_fcat . "列结构
DATA gs_fieldcat TYPE lvc_s_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  &1.
    WHEN 'ZSCHOOL'.
      GS_FIELDCAT-HOTSPOT ='X'.
    WHEN 'WEIGH'.
      gs_fieldcat-qfieldname = 'ZUNIT'."内表中表明当前数值的单位的字段,不同单位数量合计
      gs_fieldcat-edit = 'X'."以列为单位修改
      gs_fieldcat-decimals = 2."给输出添加小数点,不然修改数字时,小数点会自己左移。
*      gs_fieldcat-emphasize = 'C600'."颜色设置 第一位标明数字,第二位标明是否加重,第三位标明文字或底纹
*      WHEN 'ZUNIT'.
*      gs_fieldcat-emphasize = 'C601'."颜色设置1是文字0是底纹
      WHEN 'SEX'.
        gs_fieldcat-edit = 'X'.
  ENDCASE.

  APPEND gs_fieldcat TO gt_fieldcat.

END-OF-DEFINITION.

4、可修改属性设置

①报表的可修改
  • 以表单为单位 设置LAYOUT-EDIT,为X,可修改整个表单即所有的单元格都是可修改状态;
  • 以列为单位 设置FIELDCAT-EDIT,为X,列可修改,即该列所有单元格都是可修改状态;
  • 以单元格为单位 在内表中增加一个字段,类型为LVC_T_STYL ,例CELLSTL 在需要设置修改属性的位置,通过结构给CELLSTL字段内表赋值 FIELDNAME,需要设置属性的字段名 STYLE,可修改属性;
  • 若要设置不可修改:CL_GUI_ALV_GRID=>MC_STYLE_DISABLED
                  可修改:CL_GUI_ALV_GRID=>MC_STYLE_ENALBED 

        特别的,如果将某一列中部分字段设置为可修改状态,一般通过以下方式完成:FIELDCAT中,设置该列属性为可修改;在表单赋值时,将不应为可修改状态的字段,设置为不可修改 (不是将需要修改的单元格设置为可修改,防止可修改属性设置与静态属性设置冲突)

②容器按钮隐藏

在OO ALV输出过程中,默认输出按钮栏,包含标准按钮如果布局中的按钮太多,需要隐藏,则使用下面的方法:

FORM build_exclude .
  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 .

5、用户交互事件

        ALV类中,提供定义好的事件,创建本地类(event handler),对事件创建方法执行相关处理。例:在执行ALV事件的“TOOLBAR”操作时,主要的工作是针对E_OBJECT对象进行操作,通过构建相应的结构体,我们将所需的值赋给MT_TOOLBAR,以此来定制按钮功能等。一些参数的详解:

并可以在TOOLBAR事件中增加的按钮进行功能处理等设置,定义ALV事件USER_COMMAND等,或者定义其他ALV事件等,具体代码如下:

*声明
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. "向MT_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.

FORM fm_user_command  USING p_ucomm TYPE sy-ucomm.
  CASE p_ucomm.
    WHEN 'CALLSF'.
      MESSAGE s000 WITH '点击调用了SF的按钮'.
    WHEN 'EDIT'.
      PERFORM change_edit_mode.
    WHEN 'DOWNLOAD'.
      PERFORM download_file.
  ENDCASE.
ENDFORM.

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 s000 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.

FORM change_edit_mode .
  DATA lv_lines TYPE i.
  DATA  ls_modify TYPE lvc_s_styl.
*   1.获取选中的行 - 一行
  CALL METHOD gs_alv->get_selected_rows
    IMPORTING
      et_index_rows = gt_rows
*     et_row_no     =
    .
  DESCRIBE TABLE gt_rows LINES lv_lines."行数
  IF lv_lines <> 1.
    MESSAGE s000 WITH '只可以选择单行进行可编辑操作' DISPLAY LIKE 'E'.
    EXIT.
  ENDIF.

*   2.修改当前行的可修改状态
  READ TABLE gt_rows INTO gs_rows INDEX 1."读取选中的行的序号
  CHECK sy-subrc = 0.
  READ TABLE gt_student INTO gs_student INDEX gs_rows-index.
  IF sy-subrc = 0.
*GS_STUDENT-FIELD MODIFY
*查看表中是否已经存在针WEIGH字段的可编辑状态
    READ TABLE gs_student-field_modify INTO ls_modify WITH KEY fieldname = 'WEIGH'.
    IF sy-subrc = 0."当前已经存在设定的状杰-当前是不可修改的状态
      DELETE gs_student-field_modify INDEX sy-tabix ."把不可修改的状态去趋
    ELSE ."当前是可修改的状态
      "不用做操作
    ENDIF.
    MODIFY gt_student FROM gs_student INDEX gs_rows-index.
  ENDIF.

*   3.刷新界面
  PERFORM refresh_alv.
ENDFORM.
*注册和调用
FORM set_handler .
  CREATE OBJECT event_handle.

  SET HANDLER event_handle->handle_toolbar FOR gs_alv.
  SET HANDLER event_handle->handle_user_command FOR gs_alv.
  SET HANDLER event_handle->handle_HOTSPOT_CLICK FOR gs_alv.
  SET HANDLER event_handle->handle_DOUBLE_CLICK FOR gs_alv.
  SET HANDLER event_handle->handle_DATA_CHANGED FOR gs_alv.

*  DATA CHANGED 事件触发时点
  CALL METHOD gs_alv->register_edit_event
    EXPORTING
      i_event_id = cl_gui_alv_grid=>mc_evt_enter "回车触发
    EXCEPTIONS
      error      = 1
      OTHERS     = 2.
  IF sy-subrc <> 0.
*   Implement suitable error handling here
  ENDIF.
ENDFORM.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值