【ALV】关于ALV

在传统的ABAP中,ALV是一个十分常见并常用的工作,用以以table(非Dialog中的table control)的形式显示展示数据。ALV也是ABAP中使用与讨论最为广泛的技术之一,无论是传统的使用FM实现ALV、使用EnjoySAP ALV Grid control还是WebDynpro中的SALV_WD_TABLE component的使用。

ALV本身带有相当多的功能或者特性。本文仅将记录使用FM实现ALV的一些常见的FM或功能,而关于EnjoySAP ALV Grid control后面还将有专门的总结(关于EnjoySAP control以及CFW),而WebDynpro版本的ALV已在WebDynpro案例集中有太多的案例相关。

(1) REUSE_ALV_FIELDCATALOG_MERGE获得显示用的fields

这里,非常重要:

1. Reuse_alv_fieldcatalog_merge的参数:

如果是SE11中定义的structure,那么,我们只需要传I_PROGRAM_NAMEI_STRUCTURE_NAME ‘STR_MARD’ 即可。

如果结构是我们自己在程序中定义的(如下例),那么,必须传入I_PROGRAM_NAMEI_INTERNAL_TABNAME以及I_INCLNAM同时,这里的I_INTERNAL_TABNAME必须是定义为occurs <n>之类的内表结构。

2. 在于ALV 显示时的field catalog

如果我们不使用上面的FM,我们也可以直接在最后alv displayFM中传入I_STRUCTURE_NAME

*&———————————————————————*

*& Report ZTEST_ALV_1 *

*& *

*&———————————————————————*

*& Test ALV *

*& *

*&———————————————————————*

REPORT ZTEST_ALV_1 .

type-pools:SLIS.

*—————————————————————-

* data

*—————————————————————-

DATA: BEGIN OF T_DATA occurs 0,

MATNR LIKE MARD-MATNR,

WERKS LIKE MARD-WERKS,

LGORT LIKE MARD-LGORT,

LVORM LIKE MARD-LVORM,

LABST LIKE MARD-LABST,

INSME LIKE MARD-INSME,

END OF T_DATA.

data: ls_alv like t_data,

lt_alv like standard table of t_data.

非常重要:这里lt_alv必须定义为 like table of 上面的t_data。可能有疑问了,上面的occur 0不就是定义了一个内表了吗,为什么这里还需要是table of t_data才是内表呢?

这是因为,occurs <n>声明的内表,如果用在定义上,它是相当于一个structure

data: ls_fieldcat type slis_fieldcat_alv,

lt_fieldcat type SLIS_T_FIELDCAT_ALV.

*—————————————————————-

* Start-of-selection

*—————————————————————-

start-of-selection.

*1. retrive data

select * from MARD into corresponding fields of table lt_alv “或者t_data

up to 20 rows.

*2. form the field category

CALL FUNCTION ‘REUSE_ALV_FIELDCATALOG_MERGE’

EXPORTING

I_PROGRAM_NAME = ‘ZTEST_ALV_1′

I_INTERNAL_TABNAME = ‘T_DATA’

* I_STRUCTURE_NAME =

* I_CLIENT_NEVER_DISPLAY = ‘X’

I_INCLNAME = ‘ZTEST_ALV_1′

* I_BYPASSING_BUFFER =

* I_BUFFER_ACTIVE =

CHANGING

CT_FIELDCAT = lt_fieldcat

EXCEPTIONS

INCONSISTENT_INTERFACE = 1

PROGRAM_ERROR = 2

OTHERS = 3

.

IF SY-SUBRC <> 0 or lt_fieldcat is initial.

write:/ ‘ALV Fieldcatalog: Failed!’.

return.

ENDIF.

*3. open the ALV

CALL FUNCTION ‘REUSE_ALV_LIST_DISPLAY’

EXPORTING

* I_INTERFACE_CHECK = ‘ ‘

* I_BYPASSING_BUFFER =

* I_BUFFER_ACTIVE = ‘ ‘

* I_CALLBACK_PROGRAM = ‘ ‘

* I_CALLBACK_PF_STATUS_SET = ‘ ‘

* I_CALLBACK_USER_COMMAND = ‘ ‘

” I_STRUCTURE_NAME = ‘TYP_DATA’

* IS_LAYOUT =

IT_FIELDCAT = lt_fieldcat

* IT_EXCLUDING =

* IT_SPECIAL_GROUPS =

* IT_SORT =

* IT_FILTER =

* IS_SEL_HIDE =

* I_DEFAULT = ‘X’

* I_SAVE = ‘ ‘

* IS_VARIANT =

* IT_EVENTS =

* IT_EVENT_EXIT =

* IS_PRINT =

* IS_REPREP_ID =

* I_SCREEN_START_COLUMN = 0

* I_SCREEN_START_LINE = 0

* I_SCREEN_END_COLUMN = 0

* I_SCREEN_END_LINE = 0

* IMPORTING

* E_EXIT_CAUSED_BY_CALLER =

* ES_EXIT_CAUSED_BY_USER =

TABLES

T_OUTTAB = lt_alv

* EXCEPTIONS

* PROGRAM_ERROR = 1

* OTHERS = 2

.

IF SY-SUBRC <> 0.

write:/ ‘ALV Display: Failed!’.

return.

ENDIF.

(2) REUSE_ALV_COMMENTARY_WRITE显示header部分

这里,非常重要:

1. 如果是使用reuse_alv_grid_display

那么如下面所示对于grid它有一个参数i_callback_top_of_page,可以将实现top-of-pageform名传入。

*——————————————–

form frm_alv_header .

data:

* top-of-page: header

lth_commentary type typ_th_commentary , “slis_listheader

ltd_commentary type typ_td_commentary .

*define: top-of-page’s commentary

*——header: title

lth_commentary-typ = ‘H’.

lth_commentary-key = ”.

lth_commentary-info = ‘The Material str.loc info List’.

append lth_commentary to ltd_commentary.

*——header: the item

lth_commentary-typ = ‘S’.

lth_commentary-key = ‘Plant’.

lth_commentary-info = p_plant.

append lth_commentary to ltd_commentary.

“the item 2

lth_commentary-typ = ‘S’.

lth_commentary-key = ‘Programe’.

lth_commentary-info = sy-repid.

append lth_commentary to ltd_commentary.

*——header: the infomation

lth_commentary-typ = ‘A’.

lth_commentary-key = ”.

lth_commentary-info = ‘Enterprise SAP 3.71′.

append lth_commentary to ltd_commentary.

CALL FUNCTION ‘REUSE_ALV_COMMENTARY_WRITE’

EXPORTING

it_list_commentary = ltd_commentary

* I_END_OF_LIST_GRID =

.

endform.

而在后面display添加一个I_CALLBACK_TOP_OF_PAGE

* alv-grid: list the data

CALL FUNCTION ‘REUSE_ALV_GRID_DISPLAY’

EXPORTING

I_CALLBACK_PROGRAM = W_REPID

IT_FIELDCAT = ltd_fieldcat

I_CALLBACK_TOP_OF_PAGE = ‘FRM_ALV_HEADER’

TABLES

t_outtab = ltd_alv

EXCEPTIONS

PROGRAM_ERROR = 1

OTHERS = 2

.

IF sy-subrc <> 0.

write: ‘REUSE_ALV_GRID_DISPLAY–>failed’.

stop.

ENDIF.

2. 如果是使用reuse_alv_list_display

那么它不同于grid有一个参数i_callback_top_of_page;所以,必须要自己将event设置好,作为一个参数传入list_dispaly如下所示:

*&———————————————————————*

*& Report ZTEST_ALV_2 *

*& *

*&———————————————————————*

*& *

*& *

*&———————————————————————*

REPORT ZTEST_ALV_2 .

type-pools:SLIS.

*—————————————————————-

* data

*—————————————————————-

DATA: BEGIN OF T_DATA occurs 0,

MATNR LIKE MARD-MATNR,

WERKS LIKE MARD-WERKS,

LGORT LIKE MARD-LGORT,

LVORM LIKE MARD-LVORM,

LABST LIKE MARD-LABST,

INSME LIKE MARD-INSME,

END OF T_DATA.

data: ls_alv like t_data,

lt_alv like standard table of t_data.

data: ls_fieldcat type slis_fieldcat_alv,

lt_fieldcat type SLIS_T_FIELDCAT_ALV.

*for ALV Commentary heading

data: ls_header type slis_listheader,

lt_header type SLIS_T_LISTHEADER.

*for ALV event

data: ls_event type slis_alv_event,

lt_event type SLIS_T_EVENT.

*—————————————————————-

* Start-of-selection

*—————————————————————-

start-of-selection.

*1. retrive data

select * from MARD into corresponding fields of table lt_alv

up to 20 rows.

*2. form the field category

CALL FUNCTION ‘REUSE_ALV_FIELDCATALOG_MERGE’

EXPORTING

I_PROGRAM_NAME = sy-repid

I_INTERNAL_TABNAME = ‘T_DATA’

* I_STRUCTURE_NAME =

* I_CLIENT_NEVER_DISPLAY = ‘X’

I_INCLNAME = sy-repid

* I_BYPASSING_BUFFER =

* I_BUFFER_ACTIVE =

CHANGING

CT_FIELDCAT = lt_fieldcat

EXCEPTIONS

INCONSISTENT_INTERFACE = 1

PROGRAM_ERROR = 2

OTHERS = 3

.

IF SY-SUBRC <> 0 or lt_fieldcat is initial.

write:/ ‘ALV Fieldcatalog: Failed!’.

return.

ENDIF.

*3. form events

CALL FUNCTION ‘REUSE_ALV_EVENTS_GET’

EXPORTING

I_LIST_TYPE = 0

IMPORTING

ET_EVENTS = lt_event

EXCEPTIONS

LIST_TYPE_WRONG = 1

OTHERS = 2

.

if sy-subrc = 0.

loop at lt_event into ls_event.

if ls_event-name = ‘TOP_OF_PAGE’.”实现top-of-page

ls_event-form = ‘FRM_TOP_PAGE’.

MODIFY lt_event from ls_event index sy-tabix.

endif.

endloop.

endif.

*4. open the ALV

CALL FUNCTION ‘REUSE_ALV_LIST_DISPLAY’

EXPORTING

* I_INTERFACE_CHECK = ‘ ‘

* I_BYPASSING_BUFFER =

* I_BUFFER_ACTIVE = ‘ ‘

I_CALLBACK_PROGRAM = sy-repid

* I_CALLBACK_PF_STATUS_SET = ‘ ‘

* I_CALLBACK_USER_COMMAND = ‘ ‘

* I_STRUCTURE_NAME = ‘TYP_DATA’

* IS_LAYOUT =

IT_FIELDCAT = lt_fieldcat

* IT_EXCLUDING =

* IT_SPECIAL_GROUPS =

* IT_SORT =

* IT_FILTER =

* IS_SEL_HIDE =

* I_DEFAULT = ‘X’

* I_SAVE = ‘ ‘

* IS_VARIANT =

IT_EVENTS = lt_event

* IT_EVENT_EXIT =

* IS_PRINT =

* IS_REPREP_ID =

* I_SCREEN_START_COLUMN = 0

* I_SCREEN_START_LINE = 0

* I_SCREEN_END_COLUMN = 0

* I_SCREEN_END_LINE = 0

* IMPORTING

* E_EXIT_CAUSED_BY_CALLER =

* ES_EXIT_CAUSED_BY_USER =

TABLES

T_OUTTAB = lt_alv

* EXCEPTIONS

* PROGRAM_ERROR = 1

* OTHERS = 2

.

IF SY-SUBRC <> 0.

write:/ ‘ALV Display: Failed!’.

return.

ENDIF.

*—————————————————————-

* Form: Top-of-page

*—————————————————————-

form frm_top_page.

* set the top-of-page

ls_header-typ = ‘H’.

ls_header-key = ”.

ls_header-info = ‘The Header of ALV’.

append ls_header to lt_header.

ls_header-typ = ‘S’.

ls_header-key = ‘Key 1:’.

ls_header-info = ‘Material Number’.

append ls_header to lt_header.

ls_header-typ = ‘S’.

ls_header-key = ‘Key 2:’.

ls_header-info = ‘Plant Number’.

append ls_header to lt_header.

ls_header-typ = ‘A’.

ls_header-key = ‘ ‘.

ls_header-info = ‘Action’.

append ls_header to lt_header.

CALL FUNCTION ‘REUSE_ALV_COMMENTARY_WRITE’

EXPORTING

IT_LIST_COMMENTARY = lt_header

* I_LOGO =

* I_END_OF_LIST_GRID =

.

endform.

执行效果:

222

(3) 使用layout 如隔行不同颜色,单元格长度最优,windowtitle

*for layout

data: lth_layout type SLIS_LAYOUT_ALV.

* define the layout

lth_layout-zebra = ‘X’.

lth_layout-COLWIDTH_OPTIMIZE = ‘X’.

lth_layout-WINDOW_TITLEBAR = ‘ALV TEST- Edison’.

而在后面display添加一个IS_Layout:

* alv-grid: list the data

CALL FUNCTION ‘REUSE_ALV_GRID_DISPLAY’

EXPORTING

I_CALLBACK_PROGRAM = W_REPID

IT_FIELDCAT = ltd_fieldcat

I_CALLBACK_TOP_OF_PAGE = ‘FRM_ALV_HEADER’

IS_LAYOUT = lth_layout

TABLES

t_outtab = ltd_alv

EXCEPTIONS

PROGRAM_ERROR = 1

OTHERS = 2

.

IF sy-subrc <> 0.

write: ‘REUSE_ALV_GRID_DISPLAY–>failed’.

stop.

ENDIF.

(4) 修改category,设定KEY 值或进行合计

* modify the fieldcategory

LOOP AT ltd_fieldcat ASSIGNING <lfs_fieldcat>.

case <lfs_fieldcat>-fieldname.

WHEN ‘MATNR’ or

‘WERKS’ or

‘LGORT’ .

<lfs_fieldcat>-key = ‘X’. “设定为key

WHEN ‘LABST’ or

‘INSME’.

<lfs_fieldcat>-do_sum = ‘X’. “对该字段进行合计

endcase.

ENDLOOP.

(5)使用pf statusUser command

*——————————————–

* form frm_alv_pfstatus

*——————————————–

form frm_alv_pfstatus

USING I_EXTAB type slis_t_extab.

set pf-status ‘MALV’ excluding i_extab.

endform.

*——————————————–

* form frm_alv_usercommd

*——————————————–

form frm_alv_usercommd

using r_comm like sy-ucomm

rs_selfield type slis_selfield.

case r_comm.

when ‘ADDON’.

LEAVE TO LIST-PROCESSING.

set pf-status ‘MALV3′.

WINDOW STARTING AT 10 12

ENDING AT 77 12.

LOOP AT td_alv into T_DATA.

write: / T_DATA-MATNR.

endloop.

when ‘BACK’.

leave TO list-PROCESSING AND RETURN TO SCREEN 0.

 LEAVE PROGRAM.

endcase.

endform.

而在后面display添加一个I_CALLBACK_PF_STATUS_SET

I_CALLBACK_USER_COMMAND:

* alv-grid: list the data

CALL FUNCTION ‘REUSE_ALV_GRID_DISPLAY’

EXPORTING

I_CALLBACK_PROGRAM = W_REPID

IT_FIELDCAT = ltd_fieldcat

I_CALLBACK_TOP_OF_PAGE = ‘FRM_ALV_HEADER’

IS_LAYOUT = lth_layout

I_CALLBACK_PF_STATUS_SET = ‘FRM_ALV_PFSTATUS’

I_CALLBACK_USER_COMMAND = ‘FRM_ALV_USERCOMMD’

TABLES

t_outtab = td_alv

EXCEPTIONS

PROGRAM_ERROR = 1

OTHERS = 2

.

IF sy-subrc <> 0.

write: ‘REUSE_ALV_GRID_DISPLAY–>failed’.

stop.

ENDIF.

(6) ALV前面一列设置为 选择框或checkbox

有时候我们需要将ALV表现成SAP标准那样:头一column是一个类似于checkbox的选择按纽。

选择框:

首先要在内表定义出一个 checkbox

*—————————————————————-

* data

*—————————————————————-

DATA: BEGIN OF T_DATA ,

 CHECKBOX TYPE c,  “checkbox

 MATNR LIKE MARD-MATNR,

WERKS LIKE MARD-WERKS,

LGORT LIKE MARD-LGORT,

LVORM LIKE MARD-LVORM,

LABST LIKE MARD-LABST,

INSME LIKE MARD-INSME,

MEINS LIKE MARA-MEINS,

END OF T_DATA.

第二步:修改fieldcategory

* modify the fieldcategory

LOOP AT ltd_fieldcat ASSIGNING <lfs_fieldcat>.

case <lfs_fieldcat>-fieldname.

<lfs_fieldcat>-NO_OUT = ‘X’. 将其列为 不输出

“<lfs_fieldcat>-checkbox = ‘X’. “checkbox

endcase.

ENDLOOP.

第三步:修改layout

* define the layout

lth_layout-zebra = ‘X’.

lth_layout-COLWIDTH_OPTIMIZE = ‘X’.

lth_layout-WINDOW_TITLEBAR = ‘ALV TEST- Edison’.

lth_layout-box_fieldname = ‘CHECKBOX’. 这里定义列为选择框

 

 

如果是 checkbox,那么在这第二步时

* modify the fieldcategory

LOOP AT ltd_fieldcat ASSIGNING <lfs_fieldcat>.

case <lfs_fieldcat>-fieldname.

<lfs_fieldcat>-checkbox = ‘X’. “checkbox

endcase.

ENDLOOP.

同时,不需要第三步

 

转载于:https://www.cnblogs.com/andyfurong/archive/2010/12/07/1898644.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值