SAP ALV 三种使用方式讲解

SAP ALV三种使用方式深度解析

SAP ALV的使用通常有三种方式,分别为Funtion ALV 通常是指:REUSE_ALV_GRID_DISPLAY[ _LVC];然后OO ALV则会用到object:CL_GUI_ALV_GRID;OO SALV则会用到 CL_SALV_TABLE等一系列Object。

Function ALV:Function ALV 是基于函数的(Function-based)ALV 技术,使用函数模块和功能代码块实现. Function ALV一般有grid和list两种,grid以网格显示(REUSE_ALV_GRID_DISPLAY[ _LVC]),list以表格显示(REUSE_ALV_LIST_DISPLAY),两者的工具栏有一点不同。

OO ALV:使用面向对象的方法创建的ALV,需要创建一个容器,然后将 cl_gui_alv_grid 分配给这个容器,它存在很多的事件,这些实现需要注册这些事件处理方法,但是ALV的布局参数不用依靠Object来设置,和function一样,还是依靠函数。

OO SALV:(Simple ALV Grid Control),SALV也称为New ALV. 它是面向对象创建ALV的一种方式,但不提供编辑的功能,(当你需要编辑的时候,可以通过SALV适配器调用CL_GUI_ALV_GRID修改为编辑模式),一般情况下SALV是不需要创建容器的,但是ALV的布局也是需要通过Object来控制。

SALV 提供了更多的功能和样式选项,允许开发人员通过方法调用来设置排序、筛选、分组、求和、合计等功能,同时可以改变行列样式、添加自定义按钮和菜单等。

OO SALV主要是通过一个类CL_SALV_TABLE来实现的.系统里的demo为:SALV_DEMO_*

Function ALV 示例代码:
 

REPORT ztest_function_alv.

* 数据定义和选择
DATA: it_sflight TYPE TABLE OF sflight,
      wa_sflight TYPE sflight.

SELECT * FROM sflight INTO TABLE it_sflight.

* 调用 Function ALV
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
  EXPORTING
    i_callback_program = sy-repid

     i_callback_pf_status_set = 'FRM_SET_PF_STATUS'
  TABLES
    t_outtab = it_sflight.

form frm_set_pf_status  using extab type slis_t_extab.
  set pf-status 'STANDARD_FULLSCREEN' of program 'SAPLKKBL'.
endform.

SALV 示例代码

REPORT ZSALV-01.
*以前都是通过函数“REUSE_ALV_GRID_DISPLAY”来显示列表,这种方式是面向过程的
*现在有另外一种面向对象化的方式来显示列表,函数REUSE_ALV_GRID_DISPLAY可以做到的它也能够做到。
*它主要是通过一个类CL_SALV_TABLE来实现的.
*下面让我们来实现最简单的ALV列表。
"1、取得数据
SELECT * INTO TABLE @DATA(LT_VBAK) FROM VBAK UP TO 20 ROWS.
"2、调用类CL_SALV_TABLE的静态方法Factory()创建类的实例。
DATA: S_ALV TYPE REF TO CL_SALV_TABLE."定义参考类型
TRY.
    CL_SALV_TABLE=>FACTORY( IMPORTING R_SALV_TABLE = S_ALV CHANGING T_TABLE = LT_VBAK ).
  CATCH CX_SALV_MSG.
ENDTRY.
"3、取得实例之后再调用方法Display()显示列表
S_ALV->DISPLAY( ).

OO LAV示例:

data stbl type lvc_s_stbl.
data: ref_grid type ref to cl_gui_alv_grid.
data:gt_events type slis_t_event,
     gs_events like line of gt_events.

data: l_grid_settings type lvc_s_glay.
data:  rs_selfield type slis_selfield.

data: f4_flag(1).
data: lt_sbz like table of zhr_sbz,
      ls_sbz type zhr_sbz.

class lcl_event_receiver definition.
  public section.
    methods:
      handle_f4
                    for event onf4 of cl_gui_alv_grid
        importing e_fieldname
                    es_row_no
                    er_event_data
                    et_bad_cells.
endclass.

*data gt_event_receiver type ref to lcl_event_receiver .

class lcl_event_receiver implementation.
  method  handle_f4.

*     窗口时间参数的自定义f4检索帮助
    case e_fieldname.
      when 'SCHKZ'.   "内表字段名称
        perform f4_help_schkz using e_fieldname
                                    es_row_no.

      when 'MASSG'.   "内表字段名称
        perform f4_help_massg using e_fieldname
                                    es_row_no.

    endcase.

    er_event_data->m_event_handled = 'X'.


    call function 'GET_GLOBALS_FROM_SLVC_FULLSCR'
      importing
        e_grid = ref_grid.

**     设置后,alv稳定刷新
    stbl-row = 'X'." 基于行的稳定刷新
    stbl-col = 'X'." 基于列稳定刷新
    call method ref_grid->refresh_table_display
      exporting
        is_stable = stbl.

  endmethod.                    "HANDLE_F4
endclass.   


form frm_disp_data  tables   p_im_data structure wa_data.

  perform get_fieldcat.
  perform get_layout.

  data:msg type lvc_title.
  data:row type i .
  describe table p_im_data lines row.
  move row to msg.condense msg.
  concatenate '记录数:' msg into msg .

  gs_events-name = 'CALLER_EXIT'.
  gs_events-form = 'FM_BUTTON'.
  append gs_events to gt_events.
*  l_grid_settings-edt_cll_cb = 'X'  .

  call function 'REUSE_ALV_GRID_DISPLAY_LVC'
    exporting
      i_callback_program       = sy-repid
      i_callback_pf_status_set = 'FRM_SET_PF_STATUS'
      i_callback_user_command  = 'FRM_USER_COMMAND'
*     i_grid_settings          = l_grid_settings
      i_grid_title             = msg
      is_layout_lvc            = gs_layout
      it_fieldcat_lvc          = gt_fieldcat
      i_default                = 'X'
      i_save                   = 'A'
      it_events                = gt_events
    tables
      t_outtab                 = p_im_data
    exceptions
      program_error            = 1
      others                   = 2.

endform. 

form get_fieldcat .
  define addcol.
    CLEAR wa_fieldcat.
    wa_fieldcat-fieldname = &1.
    wa_fieldcat-scrtext_s = &2.
    wa_fieldcat-scrtext_m = &2.
    wa_fieldcat-scrtext_l = &2.
    wa_fieldcat-edit = &3.
    wa_fieldcat-checkbox = &4.
    wa_fieldcat-key = &5.
    wa_fieldcat-rollname = &6.
*    wa_fieldcat-NO_ZERO = 'X'.

  if wa_fieldcat-fieldname = 'PERNR'.
     wa_fieldcat-NO_ZERO = 'X'.
    ENDIF.

   if wa_fieldcat-fieldname = 'ZSBZ'.
     wa_fieldcat-DD_OUTLEN = '20'.
    ENDIF.

    if wa_fieldcat-fieldname = 'MASSN'.
      wa_fieldcat-F4AVAILABL = 'X'.
      wa_fieldcat-REF_TABLE = 'PA0000'.
      wa_fieldcat-REF_field = 'MASSN'.
    ENDIF.

    if wa_fieldcat-fieldname = 'WERKS'.
      wa_fieldcat-F4AVAILABL = 'X'.
      wa_fieldcat-REF_TABLE = 'PA0001'.
      wa_fieldcat-REF_field = 'WERKS'.
      wa_fieldcat-seltext = '成本公司'.
    ENDIF.

    append wa_fieldcat to gt_fieldcat.
  end-of-definition.

  addcol 'SEL' '选择' 'X' 'X' 'X' ''.
  addcol 'PERNR' '' '' '' '' 'PERNR_D'.
  addcol 'NACHN' '姓名' '' '' '' ''.
  addcol 'ICNUM' '身份证号码' '' '' '' ''.  
  addcol 'WERKS' '成本公司' 'X' '' '' ''.
  addcol 'BEGDA' '入职日期' '' '' '' ''.
endform.  

form get_layout .
  gs_layout-cwidth_opt = 'X'.  "清单格式优化模式:自动
  gs_layout-zebra =  'X'.
  gs_layout-stylefname = 'FIELD_STYLE'.  "可编辑控制
  gs_layout-no_rowmark = 'X'.  "无缺省列表选择按钮
  gs_layout-ctab_fname = 'CELLCOLORS'.
endform.   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Murphy2023

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值