用 ALV 輸出的基本流程:
PERFORM get_data.
PERFORM event_build.
PERFORM layout_build.
PERFORM fields.
PERFORM output_alv.
1. 定義 ALV 用到的變量.
TYPE-POOLS: slis. "package
DATA: i_alv_fieldcat TYPE slis_t_fieldcat_alv.
DATA: i_alv_field TYPE slis_fieldcat_alv.
DATA: i_layout TYPE slis_layout_alv.
DATA: w_repid LIKE sy-repid.
DATA: i_events TYPE slis_t_event,
i_event_exit TYPE slis_t_event_exit,
i_list_comments TYPE slis_t_listheader, "用來(lái)填充表單標(biāo)題區(qū)域
i_excluding TYPE slis_t_extab.
DATA: w_variant LIKE disvariant,
w_variant_save(1) TYPE c,
w_events LIKE LINE OF i_events,
w_list_comments LIKE LINE OF i_list_comments,
i_sort TYPE STANDARD TABLE OF slis_sortinfo_alv,
w_sort LIKE LINE OF i_sort.
2. 定義INITIALIZATION部分
CLEAR: w_variant.
w_repid = sy-repid.
w_variant-report = w_repid.
w_variant-username = sy-uname.
w_variant_save = 'A'. "All types
3. 對(duì)標(biāo)題區(qū)和頁(yè)尾區(qū)賦值
FORM event_build .
CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
"獲得事件名稱及 form 的內(nèi)表, 后面去填補(bǔ)
form"
EXPORTING
i_list_type = 0
IMPORTING
et_events = i_events.
READ TABLE i_events WITH KEY name = slis_ev_top_of_page INTO w_events.
IF sy-subrc = 0.
MOVE 'ALV_TOP_OF_PAGE' TO w_events-form. "將標(biāo)題區(qū)數(shù)據(jù)賦值給 W_EVENTS
MODIFY i_events FROM w_events INDEX sy-tabix.
ENDIF.
READ TABLE i_events WITH KEY name = slis_ev_end_of_list INTO w_events.
IF sy-subrc = 0.
MOVE 'ALV_END_OF_LIST' TO w_events-form. "將頁(yè)尾數(shù)據(jù)賦值給 W_EVENTS
MODIFY i_events FROM w_events INDEX sy-tabix.
ENDIF.
READ TABLE i_events WITH KEY name = slis_ev_end_of_page INTO w_events.
IF sy-subrc = 0.
MOVE 'ALV_END_OF_PAGE' TO w_events-form. "將頁(yè)腳區(qū)數(shù)據(jù)賦值給 W_EVENTS.
MODIFY i_events FROM w_events INDEX sy-tabix.
ENDIF.
ENDFORM.
定義上面用到的子函數(shù)
FORM alv_top_of_page.
DATA: p_werks(40).
CLEAR: i_list_comments[].
w_list_comments-typ = 'H'. "H=Header, S=Selection, A=Action
w_list_comments-key = ''.
w_list_comments-info = 'USI 同一 PO 分批收料報(bào)表'.
APPEND w_list_comments TO i_list_comments.
* w_list_comments-typ = 'S'. "H = Header, S = Selection, A = Action
* w_list_comments-key = ''.
* CONCATENATE '廠別' '1000' INTO p_werks.
* w_list_comments-info = p_werks.
* APPEND w_list_comments TO i_list_comments.
* * w_list_comments-typ = 'S'. "H = Header, S = Selection, A = Action
* w_list_comments-key = ''.
* CONCATENATE '廠別' '2000' INTO p_werks.
* w_list_comments-info = p_werks.
* APPEND w_list_comments TO i_list_comments.
CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
EXPORTING
i_logo = 'ENJOYSAP_LOGO'
it_list_commentary = i_list_comments.
ENDFORM. "alv_top_of_page
*&---------------------------------------------------------------------*
*& Form alv_end_of_list
*&---------------------------------------------------------------------*
FORM alv_end_of_list.
clear: i_list_comments[].
w_list_comments-typ = 'H'. "H=Header, S=Selection, A=Action
w_list_comments-key = ''.
w_list_comments-info = '頁(yè)腳顯示'.
APPEND w_list_comments to i_list_comments.
call FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
EXPORTING
it_list_commentary = i_list_comments
i_logo = 'ENJOYSAP_LOGO'
i_end_of_list_grid = 'X'.
ENDFORM. "alv_end_of_list
*&---------------------------------------------------------------------*
*& Form alv_end_of_page
*&---------------------------------------------------------------------*
FORM alv_end_of_page.
* CLEAR: i_list_comments[].
* w_list_comments-typ = 'A'. "H=Header, S=Selection, A=Action
* w_list_comments-key = ''.
* w_list_comments-info = 'END OF PAGE'.
* APPEND w_list_comments TO i_list_comments.
* * CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
* EXPORTING
* it_list_commentary = i_list_comments
* i_logo = 'ENJOYSAP_LOGO'
* i_end_of_list_grid = 'X'.
ENDFORM. "alv_end_of_page
4. Layout設(shè)置
FORM layout_build .
w_repid = sy-repid. "當(dāng)前程式
i_layout-zebra = 'X'. "斑馬條紋間隔
i_layout-colwidth_optimize = 'X'. "優(yōu)化列寬
* i_layout-no_vline = 'X'. "用來(lái)設(shè)置是否有列間隔線
i_layout-detail_initial_lines = 'X'.
i_layout-detail_titlebar = '詳細(xì)內(nèi)容'. "設(shè)置彈出窗口的標(biāo)題欄
i_layout-detail_popup = 'X'. "是否彈出詳細(xì)信息窗口
i_layout-f2code = '&ETA'. "設(shè)置觸發(fā)彈出詳細(xì)窗口的功能碼,這里是雙擊
* i_layout-info_fieldname = 'COLOR' ."設(shè)置顏色屬性,設(shè)置ALV輸出報(bào)表每一行的顏色,
"其參數(shù)為輸出內(nèi)表的欄位名稱,要注意的是,使用
"該屬性需要同時(shí)在內(nèi)表中定義一個(gè)與該參數(shù)所定義
"字段相同的欄位,然后往該欄位位填值. "
先介紹ALV里色碼.就是顏色編碼,4位CHAR型.
Cxyz---
Color X:1-7
Y:1/0: 強(qiáng)化 開(kāi)/關(guān)
Z:1/0: 相反 開(kāi)/關(guān)
其中C是固定的第一位,第二位代表是顏色編碼(1到7),第三位是加強(qiáng)的設(shè)置,第四位是相反,個(gè)人理解,在強(qiáng)化關(guān)閉的情況下,相反的作用是背景和字體的變化.
顏色編碼:
x 顏色
主要使用在
1 Gray-blue headers
2 Light gray List bodies
3 yellow totals
4 Blue-green Key columns
5 green Positive threshold value
6 red Negative threshold value
7 orange Control levels
ENDFORM. " LAYOUT_BUILD
5. Fieldcat設(shè)置
pos = pos + 1.
PERFORM set_fieldcat USING pos 'EXCESS' 'Excess' 'C500'.
FORM set_fieldcat USING p_pos p_field_name p_field_text p_color.
w_fieldcat-col_pos = p_pos.
w_fieldcat-fieldname = p_field_name.
w_fieldcat-seltext_m = p_field_text.
w_fieldcat-emphasize = p_color. "設(shè)置列的顏色,注意:行的顏色會(huì)覆蓋列的顏色
w_fieldcat-do_sum = 'X'.
"對(duì)列求和
w_fieldcat-just = 'R'.
"對(duì)齊試(R, L, C)
w_fieldcat-lzero = 'X'.
"前導(dǎo)0的形式顯示
*
w_fieldcat-no_sign = 'X'. "將定義欄位的符號(hào)設(shè)置為不顯示
*
w_fieldcat-hotspot = 'X'. "設(shè)置欄位是否有熱點(diǎn)
APPEND w_fieldcat TO i_fieldcat.
ENDFORM. " SET_FIELDCAT
6. 輸出
REUSE_ALV_GRID_DISPLAY
REUSE_ALV_LIST_DISPLAY
FORM output_alv .
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = w_repid
i_save = 'A'
i_default = 'X'
is_layout = i_layout
it_fieldcat = i_alv_fieldcat
it_events = i_events
it_sort
= i_sort[]
i_callback_html_top_of_page = 'DGL_HTML_TOP_OF_PAGE'
"覆蓋 i_events中定義的.
TABLES
t_outtab = it_output[]
EXCEPTIONS
program_error = 1
OTHERS = 2.
ENDFORM.
7. 顏色的顯示
ALV中每行顏色顯示都是通過(guò)LAYOUT控制的,
要實(shí)現(xiàn)每行顏色的控制
step
1.
在輸出內(nèi)表中新增一個(gè)字段, 用于保存顏色的屬性.
step 2.
給內(nèi)表的顏色字段賦值.
step 3.
在LAYOUT中指定內(nèi)表中定義的顏色字段名稱.
i_layout-info_fieldname = 'COLOR' ."設(shè)置顏色屬性,設(shè)置ALV輸出報(bào)表每一行的顏色,
8.
ALV輸出值的排序及匯總
該屬性設(shè)置在IT_SORT接口之中.
IT_SORT 的屬性有如下:
SPOS: 排序順序,多個(gè)字段排序時(shí)使用.
FIELDNAME: 排序字段名稱.
UP/DOWN: 升序/降序排序.
GROUP: 控制中斷.
SUBTOT: 對(duì)指定字段小計(jì)輸出. 要實(shí)現(xiàn)小計(jì), 首先要保證ALV輸出內(nèi)表的合并功能,
FIELDCAT 的DO_SUM字段
設(shè)置為'X'.
FORM set_sort .
w_sort-fieldname = 'MATKL'.
w_sort-up = 'X'.
w_sort-group = '*'.
w_sort-subtot = 'X'.
APPEND w_sort TO i_sort.
ENDFORM.
這樣相同的那列就會(huì)合并,如果要避免合并,請(qǐng)?jiān)?span style="color: rgb(57, 57, 57); font-family: 宋體; line-height: normal; background-color: rgb(250, 247, 239);">布局中設(shè)置"no_merging"為"X"
.
9. ALV 標(biāo)題中的表頭
表頭信息可以通過(guò)ALV的接口"I_CALLBACK_HTML_TOP_OF_PAGE"實(shí)現(xiàn).
其實(shí)表頭完全是個(gè)HTML文件,所以可參考HTML語(yǔ)法.
FORM dgl_html_top_of_page USING r_ddoc TYPE REF TO cl_dd_document.
DATA: text TYPE sdydo_text_element.
CALL METHOD r_ddoc->initialize_document. "定義表頭文本
DEFINE write_inf.
call method r_ddoc->new_line. "換行
call method r_ddoc->add_icon "輸出圖標(biāo)
exporting
sap_icon = &1.
call method r_ddoc->add_text "輸出文本
exporting
text = &2.
END-OF-DEFINITION.
CALL METHOD r_ddoc->add_text
EXPORTING
text = 'Justin Test'
sap_emphasis = 'STRONG'.
write_inf 'ICON_GREEN_LIGHT' ': 商品庫(kù)存'.
write_inf 'ICON_RED_LIGHT' ': 商品無(wú)可用庫(kù)存'.
ENDFORM.
data: m_buff TYPE string.
data: m_p TYPE i.
m_buff = '<html>'.
CALL METHOD cl_dd->html_insert
EXPORTING
contents = m_buff
CHANGING
position = m_p.
m_buff = '<center><H2>配件報(bào)廢品種匯總表</H2></Center>'.
CALL METHOD CL_DD->HTML_INSERT
EXPORTING
CONTENTS = m_buff
CHANGING
POSITION = m_p.
CONCATENATE '報(bào)表日期:' S_DATE-LOW ' TO ' S_DATE-HIGH '<BR>' into m_buff.
CALL METHOD CL_DD->HTML_INSERT
EXPORTING
CONTENTS = m_buff
CHANGING
POSITION = m_p.
m_buff = '</html>'.
CALL METHOD cl_dd->html_insert
EXPORTING
contents = m_buff
CHANGING
position = m_p.
|