看了很多人開發alv報表都寫一大堆複雜的東西。其實可以將這些複雜內容寫在一個包裏,程序調用只需要很簡單的代碼結構即可。
report 調用如下:
REPORT ysdr0004.
INCLUDE y_alv_func.-----"包含文件
perform get_data.-------"取數據
perform show_alv.------"顯示alv
form get_data.
.....
endform.
form show_alv.
DATA title TYPE string.
title = LINES( it_show1 ).
CONCATENATE '記錄共計:' title '條.' INTO title.
alv_set_title title.
* alv_set_status.
SORT it_show1 BY prctr region .
alv_clear_data.
alv_add_data 'IT_SHOW1' '' '' 'CHAR' '' '' 'PRCTR' '利潤中心'.
alv_add_data 'IT_SHOW1' '' '' 'CHAR' '' '' 'REGION' '區域'.
* alv_add_data 'IT_SHOW1' '' '' 'NUMC' '' '' 'PERIO' '期間/年度'.
alv_add_data 'IT_SHOW1' 'X' '' 'CURR' '' '' 'ABSMG' '銷售數量'.
alv_add_data 'IT_SHOW1' 'X' '' 'CURR' '' '' 'ERLOS' '銷售收入'.
alv_add_data 'IT_SHOW1' 'X' '' 'CURR' '' '' 'CM' '標準人工費用'.
alv_add_data 'IT_SHOW1' 'X' '' 'CURR' '' '' 'RM' '標準材料成本'.
alv_add_data 'IT_SHOW1' 'X' '' 'CURR' '' '' 'ZCOGS' '最終銷售成本'.
alv_add_data 'IT_SHOW1' '' '' 'CURR' '' '' 'BL' '收入/成本'.
alv_show_data it_show1.
endform.
*&---------------------------------------------------------------------*
*& Form user_command
*&---------------------------------------------------------------------*
* text 處理雙擊事件
*----------------------------------------------------------------------*
* -->R_UCOMM text
* -->RS_SELFIELD text
*----------------------------------------------------------------------*
FORM user_command USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.
CASE r_ucomm.
WHEN '&IC1'.
ENDCASE.
WHEN OTHERS.
ENDCASE.
ENDFORM. "user_command
*&---------------------------------------------------------------------*
*& Form set_pf_status
*&---------------------------------------------------------------------*
* text 當顯示ALV前調用了alv_set_status.這段就必須加
* 此函數,且去se80中複製一個ZSTANDARD
*----------------------------------------------------------------------*
* -->RT_EXTAB text
*----------------------------------------------------------------------*
FORM set_pf_status USING rt_extab TYPE slis_t_extab.
SET PF-STATUS 'ZSTANDARD' .
ENDFORM. "set_pf_status
開發包代碼:
TYPE-POOLS: slis.
DATA: i_fieldcat TYPE slis_t_fieldcat_alv ,
fieldcat_ln LIKE LINE OF i_fieldcat.
DATA: i_events TYPE slis_t_event.
DATA: i_layout TYPE slis_layout_alv.
DATA: g_variant LIKE disvariant.
DATA: l_title TYPE lvc_title,
l_window_titlebar LIKE sy-title,
l_ls_event TYPE slis_alv_event.
DATA: p_hotspot.
DATA: col_pos LIKE sy-cucol .
DATA: g_user_command TYPE slis_formname VALUE 'USER_COMMAND'.
"處理雙擊事件
DATA:status TYPE c."是否使用自定一狀態欄。
*DATA:i_grid_title TYPE lvc_title.
*******建造數據*********************************
DEFINE alv_add_data.
fieldcat_ln-tabname = &1."待顯示的內表名
fieldcat_ln-do_sum = &2."是否按該列求和
fieldcat_ln-edit = &3. "使其呈可輸入狀態
fieldcat_ln-datatype = &4. "凍結列
* i_fieldcat-tech = &5. "是否爲技術字段
fieldcat_ln-emphasize = &5.
fieldcat_ln-input = &6. "
* fieldcat_ln-inttype = &6."類型
fieldcat_ln-fieldname = &7."字段名
fieldcat_ln-seltext_l = &8.
col_pos = col_pos + 1.
fieldcat_ln-col_pos = col_pos .
fieldcat_ln-ddictxt = 'L'.
fieldcat_ln-outputlen = '40'.
* fieldcat_ln-key = &9."固定列不移動
append fieldcat_ln to i_fieldcat.
* p_col_pos = p_col_pos + 1.
clear: fieldcat_ln.
END-OF-DEFINITION.
DEFINE alv_clear_data.
clear : g_variant,i_events,i_layout,i_fieldcat[].
END-OF-DEFINITION.
DEFINE alv_set_status.
status = 'X'.
END-OF-DEFINITION.
DEFINE alv_set_title.
l_title = &1.
END-OF-DEFINITION.
*DEFINE alv_set_title.
* i_grid_title = &1.
*END-OF-DEFINITION.
DEFINE alv_show_data.
******啓動命令功能********************************
refresh i_events.
call function 'REUSE_ALV_EVENTS_GET'
exporting
i_list_type = 0
importing
et_events = i_events.
read table i_events with key name = slis_ev_user_command
into l_ls_event.
* BREAK-POINT.
if sy-subrc = 0.
move slis_ev_user_command to l_ls_event-form.
append l_ls_event to i_events.
endif.
******** Control data ************************************
* i_layout-colwidth_optimize = 'X'.
i_layout-zebra = 'X'.
i_layout-get_selinfos = 'X'.
i_layout-colwidth_optimize = 'X'.
i_layout-detail_popup = 'X'.
i_layout-no_keyfix = ''.
i_layout-colwidth_optimize = 'X'.
i_layout-get_selinfos = 'X'.
if l_title is not initial.
i_layout-window_titlebar = l_window_titlebar. "擡頭顯示
endif.
******** Display data ************************************
if status is initial.
call function 'REUSE_ALV_GRID_DISPLAY'
exporting
* i_grid_title = i_grid_title
i_callback_program = sy-repid
* i_callback_pf_status_set = 'SET_PF_STATUS'
* i_bypassing_buffer = 'x'
* i_buffer_active = 'x'
i_default = 'X'
i_save = 'A'
i_grid_title = l_title "擡頭
is_variant = g_variant
it_events = i_events
it_fieldcat = i_fieldcat
is_layout = i_layout
tables
t_outtab = &1
exceptions
program_error = 1
others = 2.
else.
call function 'REUSE_ALV_GRID_DISPLAY'
exporting
* i_grid_title = i_grid_title
* i_bypassing_buffer = 'x'
* i_buffer_active = 'x'
i_callback_program = sy-repid
i_callback_pf_status_set = 'SET_PF_STATUS'
i_default = 'X'
i_save = 'A'
i_grid_title = l_title "擡頭
is_variant = g_variant
it_events = i_events
it_fieldcat = i_fieldcat
is_layout = i_layout
tables
t_outtab = &1
exceptions
program_error = 1
others = 2.
endif.
END-OF-DEFINITION.