在传统的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_NAME和I_STRUCTURE_NAME= ‘STR_MARD’ 即可。
如果结构是我们自己在程序中定义的(如下例),那么,必须传入I_PROGRAM_NAME和I_INTERNAL_TABNAME以及I_INCLNAM。同时,这里的I_INTERNAL_TABNAME必须是定义为occurs <n>之类的内表结构。
2. 在于ALV 显示时的field catalog
如果我们不使用上面的FM,我们也可以直接在最后alv display的FM中传入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-page的form名传入。
*——————————————– 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. |
执行效果:
(3) 使用layout: 如隔行不同颜色,单元格长度最优,window的title
*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 status和User 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. 同时,不需要第三步
|