SAP学习日志--ALV的创建

ALV grid control 是当前比较流行的交互式报表 interactive report. 其中包含了很多功能,比如说:排序, 算总值, 格式定义 等等. 而且ALV的报表开发相对简单,而且美观程度也相对于传统报表 traditional report 有了很大的提高.

在ALV的设计中要包含以下几点.
1.从数据库取数据 Get data
2.对ALV的报表布局进行设计  Build ALV layout
3.对ALV的列属性进行设计    Create Fieldcat
4.将ALV报表显示出来        Display ALV

全局类型(Type pool)  slis
在程序的最开始,需要引用Type pool slis.里面存放了很多关于ALV的类型.以下是几个常用的类型.

1.slis_layout_alv        结构体类型,主要存放ALV布局信息
2.slis_t_fieldcat_alv    内表类型,主要存放标题列信息
3.slis_fieldcat_alv      结构体类型,与slis_t_fieldcat_alv行结构类型相同
4.slis_t_event           内表类型,存放ALV中触发的事件
5.slis_t_listheader      内表类型,存放ALV表头相关信息

数据库取数
通常情况下,我们所需要的数据都存放在不同的数据库表中,所以首先要建立一个存放数据的内表,然后将所需数据从不同的数据库表中添加到该内表.

对ALV的布局设计
要对slis_layout_alv的字段进行填充,来实现布局的功能,以下是常用的字段以及功能
1.i_layout-zebra = 'X'  行与行之间变换颜色
2.i_layout-no_vline = ' '. 显示垂直分割线
3.i_layout-colwidth_optimize = 'X'. 系统自动调整列的宽度
4.i_layout-no_colhead = ' '.    显示列标题

对ALV的列属性进行设计
对slis_fieldcat_alv的字段进行填充,并添加到内表slis_t_fieldcat_alv中,以下是常用字段及功能
i_fieldcat-outputlen ='14'.                        指定列长为14
i_fieldcat-fieldname = 'INFNR'.                    指定列存放的字段
i_fieldcat-seltext_s = 'prn'.                      列标题短文本
i_fieldcat-seltext_m = ' pur rec num '.            列标题中文本
i_fieldcat-seltext_l = ' purchase record number '. 列标题长文本
i_fieldcat-lzero = 'X'.                            显示数据的前导零
i_fieldcat-key = 'X'.                              指定是否为主要字段
i_fieldcat-hotspot = 'X'.                          是否设置小手快捷单击
i_fieldcat-tech = 'X'.                             隐藏该列

显示ALV报表
需要调用 Function module “ REUSE_ALV_GRID_DISPLAY ”,以下是重要的几个参数
Exporting 参数
i_callback_program = w_repid(当前程序)         指定当前程序
is_layout          = i_layout                 ALV布局
it_fieldcat        = i_fieldcat_alv[]         ALV列属性
it_events          = i_events[]               ALV事件
i_grid_title       = 'ALV'                    报表标题
i_callback_user_command = 'USER_COMMAND'      用户事件
i_callback_pf_status_set = 'WHOLE_TOOLBAR'    工具条设置

Tables 参数
t_outtab           = hd_itab.                   显示数据所存放的内表

ALV报表头设置
要使用到slis_t_listheader类型,   包含三部分:
1.         typ(类型): H(header) S(selection) A(action)
2.         key(标题)
3.         info(标题的内容)

需要调用function
CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
       EXPORTING
            it_list_commentary = i_list_comments
            i_logo             = 'ENJOYSAP_LOGO'  " Title logo
            i_end_of_list_grid = 'X'.

ALV事件设置
事件要使用到类型slis_t_event,包含两个字段,  name,form
需要调用function
CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
       EXPORTING
            i_list_type = 0
       IMPORTING
            et_events   = i_events.
  READ TABLE i_events WITH KEY name = 'TOP_OF_PAGE'
                      INTO w_events.
  IF sy-subrc = 0.
    MOVE 'ALV_TOP_OF_PAGE' TO w_events-form.
    MODIFY i_events FROM w_events INDEX sy-tabix.
  ENDIF.

通过调用function传出一个内表的值, 内表中的name字段包含了,ALV中可能触发到的事件,
根据需要, 将要触发的事件子程序 修改到相应的form字段中.

以下是在建立ALV报表需要注意的一些事项.

要在取数完之后 就对alv的事件进行处理, 因为事件内表要在作为参数传递到REUSE_ALV_GRID_DISPLAY中去.
在布局ALV时,有一个f2CODE参数不要去改.

*  i_layout-f2code = '&ETA'.

*  i_layout-f2code = '&IC1'.

一旦改了, user_command事件就不触发了, 具体原因还不是很清楚

在user_command的子程序中,要传入两个值 sy-ucmm功能值,下一个因该是被点击字段的属性结构体(我也不是很清楚).  当sy-ucomm为'&IC1' 就表示点击了当前字段

FORM user_command USING
i_ucomm LIKE sy-ucomm
is_selfield TYPE slis_selfield.                       
  CASE i_ucomm.
    WHEN '&IC1'. " Pick
      READ TABLE hd_itab INDEX is_selfield-tabindex.
      IF sy-subrc EQ 0.
        ......
      ENDIF.
  ENDCASE.
ENDFORM. " USER_COMMAND

在对列标题进行设计的时候,每一个列标题属性都要设置,所以代码重复量很大. 可以定义宏来减少代码量
DEFINE hout.
    i_fieldcat-fieldname     = &1.
    i_fieldcat-seltext_l     = &2.
    i_fieldcat-key           = &3.
    append i_fieldcat to i_fieldcat_alv.
    clear i_fieldcat.
  END-OF-DEFINITION.
  hout 'CARRID'       'Airline carrier ID'        'X'.
  hout 'CONNID'       'Flight connection code'    'X'.
  hout 'FLDATE'       'Flight date'               'X'.
  hout 'PRICE'        'Airfare'                   ' '.
  hout 'CURRENCY'     'Local currency of airline' ' '.
  hout 'PLANETYPE'    'Plane type'                ' '.
  hout 'SEATSMAX'     'Maximum capacity'          ' '.
  hout 'SEATSOCC'     'Occupied seats'            ' '.
  hout 'PAYMENTSUM'   'Total of current bookings' ' '.

重点注意:在调用function的时候, 一定要注意参数所引用的类型,以及单引号中内容的大写.这点很重要. 程序中很多错误都是因为这个引起的
后面我会发一个ALV的demo 希望能够帮助大家更进一步了解ALV

你可能感兴趣的:(数据结构)