介绍
今天给大家介绍一个alv的模板,可以满足日常中常用的需求,比如:自定义按钮,下载文件,上载文件,gui状态,使用alv模板可以大大提高开发报表的效率.
1.主程序
message-id 这个需要去打 se91 中去创建维护
该报表分为三个include文件和三个子程序
top:一般存放全局变量和选择屏幕(也可以include中)
f01:子程序
s01:用来处理alv的先关逻辑,包含字段处理;layout处理,数据显示等
REPORT zfir046 MESSAGE-ID zfir046.
INCLUDE zfir046_top.
INCLUDE zfir046_f01.
INCLUDE zfir046_s01.
START-OF-SELECTION.
PERFORM frm_get_data.
PERFORM frm_process_data.
PERFORM frm_show_alv TABLES gt_output.
2.ZFIR046_TOP
*&---------------------------------------------------------------------*
*& 包含 ZFIR046_TOP
*&---------------------------------------------------------------------*
TABLES:sscrfields, regup,reguh .
TYPE-POOLS : slis .
DATA: gr_alv TYPE REF TO cl_salv_table,
gr_functions TYPE REF TO cl_salv_functions_list.
DATA: lr_layout TYPE REF TO cl_salv_layout,
ls_key TYPE salv_s_layout_key.
DATA: gs_dyntxt TYPE smp_dyntxt.
FIELD-SYMBOLS: <fs_output> TYPE zst_zfir046.
DATA: gt_fieldcat TYPE lvc_t_fcat,
gs_fieldcat LIKE LINE OF gt_fieldcat,
is_layout TYPE lvc_s_layo,
is_variant TYPE disvariant.
FIELD-SYMBOLS: <fs_fieldcat> TYPE lvc_s_fcat.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS:s_belnr FOR regup-belnr. "多值
PARAMETERS:p_zbukr TYPE reguh-zbukr OBLIGATORY. " 单值
*SELECTION-SCREEN SKIP. 空一行
*PARAMETERS p_xvorl AS CHECKBOX . "复选框
SELECTION-SCREEN END OF BLOCK b1.
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE TEXT-002.
PARAMETERS p_priv TYPE c RADIOBUTTON GROUP rad DEFAULT 'X'. "单选框
PARAMETERS p_pubi TYPE c RADIOBUTTON GROUP rad .
SELECTION-SCREEN END OF BLOCK b2.
3.ZFIR046_F01
FORM frm_get_data .
*在这里插入SQL取数逻辑
ENDFORM.
FORM frm_process_data .
*在这里插入数据处理逻辑
ENDFORM.
4.ZFIR046_S01
复制标准gui状态参考博客: SAP abap ALV 自定义按钮功能
想添加Excel下载功能,参考博客:abap GUI_DOWNLOAD 可下载Excel TXT的文档
*&---------------------------------------------------------------------*
*& 包含 ZFIR046_S01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form FRM_SHOW_ALV
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> GT_OUTPUT
*&---------------------------------------------------------------------*
FORM frm_show_alv TABLES pt_outtab .
DATA: ls_layout TYPE lvc_s_layo,
lt_fieldcat TYPE lvc_t_fcat,
ls_fieldcat TYPE lvc_s_fcat.
DATA : lt_sort TYPE slis_t_sortinfo_alv,
ls_sort LIKE lvc_s_sort.
**--ALV显示样式
PERFORM pf_alv_list_layout USING ls_layout .
**--ALV报表的字段设置
PERFORM pf_alv_list_fcat TABLES lt_fieldcat .
**--定义排序字段
" PERFORM pf_alv_sub_sort TABLES lt_sort .
**----ALV报表显示
PERFORM pf_alv_list_disply TABLES pt_outtab lt_fieldcat lt_sort USING ls_layout .
ENDFORM.
*&---------------------------------------------------------------------*
*& Form PF_ALV_LIST_LAYOUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_LS_LAYOUT text
*----------------------------------------------------------------------*
FORM pf_alv_list_layout USING ps_layout TYPE lvc_s_layo.
CLEAR:ps_layout.
ps_layout-cwidth_opt = 'X'.
ps_layout-col_opt = 'X'.
ps_layout-zebra = 'X'.
ps_layout-sel_mode = 'A'.
ps_layout-box_fname = 'SEL'.
ENDFORM. " PF_ALV_LIST_LAYOUT
*&---------------------------------------------------------------------*
*& Form PF_ALV_SUB_SORT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_LT_SORT text
* -->P_TYPE text
* -->P_SLIS_T_SORTINFO_ALV text
*----------------------------------------------------------------------*
FORM pf_alv_sub_sort TABLES pt_sort TYPE slis_t_sortinfo_alv .
DATA : ls_sort LIKE lvc_s_sort.
ENDFORM. " PF_ALV_SUB_SORT
*&---------------------------------------------------------------------*
*& Form PF_ALV_LIST_FCAT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->PT_FIELDCAT text
*----------------------------------------------------------------------*
FORM pf_alv_list_fcat TABLES pt_fieldcat TYPE lvc_t_fcat .
DATA : ls_fieldcat TYPE lvc_s_fcat .
DATA : l_structure_name TYPE tabname .
DATA : lt_dd03t TYPE STANDARD TABLE OF dd03t,
ls_dd03t LIKE LINE OF lt_dd03t.
IF p_priv IS NOT INITIAL.
l_structure_name = 'ZST_ZFIR046_PRIV'.
ELSEIF p_pubi IS NOT INITIAL .
l_structure_name = 'ZST_ZFIR046'.
ENDIF.
"这个函数用来获取结构中字段和描述
CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
EXPORTING
i_structure_name = l_structure_name " 结构名
i_bypassing_buffer = 'X'
CHANGING
ct_fieldcat = pt_fieldcat[] "获取到的字段和描述
EXCEPTIONS
inconsistent_interface = 1
program_error = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
"删除不需要显示在alv上的的字段
DELETE pt_fieldcat WHERE fieldname = 'SEL'.
*如果说你需要修改描述的话可以 修改这个个内表 pt_fieldcat[] 来更改描述
loop at pt_fieldcat[] into ls_fieldcat.
case ls_fieldcat-fieldname.
WHEN 'SEL'.
PERFORM set_fieldcat_name USING ls_fieldcat '选择' .
when 'mesg' .
PERFORM set_fieldcat_name USING ls_fieldcat '消息' .
ls_fieldcat-colddictxt = 'L'.
MODIFY pt_fieldcat[] FROM ls_fieldcat .
endloop.
*如果需要新增一个字段到alv上展示
PERFORM set_fieldcat_name USING ls_fieldcat 'STA' '状态' .
APPEND ls_fieldcat TO pt_fieldcat[].
CLEAR ls_fieldcat .
PERFORM set_fieldcat_name USING ls_fieldcat 'MSG' '消息' .
APPEND ls_fieldcat TO pt_fieldcat[].
CLEAR ls_fieldcat .
ENDFORM . "pf_alv_list_fcat
*&---------------------------------------------------------------------*
*& Form PF_ALV_LIST_DISPLY
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->PT_OUTTAB text
* -->LT_FIELDCAT text
* -->LS_LAYOUT text
*----------------------------------------------------------------------*
FORM pf_alv_list_disply TABLES pt_outtab pt_fieldcat TYPE lvc_t_fcat
pt_sort TYPE slis_t_sortinfo_alv
USING ps_layout TYPE lvc_s_layo .
DATA : l_pf_status_name TYPE slis_formname VALUE 'ALV_SET_PF_STATUS',
l_pf_comand_name TYPE slis_formname VALUE 'ALV_USER_COMMAND',
l_repid LIKE sy-repid VALUE sy-repid.
DATA : is_variant LIKE disvariant .
is_variant-report = l_repid .
is_variant-handle = '0001' .
*ALV数据显示函数
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = l_repid
i_callback_pf_status_set = l_pf_status_name "定义gui状态
i_callback_user_command = l_pf_comand_name " 定义按钮
it_fieldcat_lvc = pt_fieldcat[] "字段
is_layout_lvc = ps_layout
is_variant = is_variant
i_save = 'A' "保存变式
TABLES
t_outtab = pt_outtab[]. "输出数据表
ENDFORM. " PF_ALV_LIST_DISPLY
*&---------------------------------------------------------------------*
*& Form sub_set_pf_status
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->RT_EXTAB text
*----------------------------------------------------------------------*
FORM alv_set_pf_status USING rt_extab TYPE slis_t_extab.
DATA fcode TYPE TABLE OF sy-ucomm.
*创建贵状态的时候建议直接复制标准的
SET PF-STATUS 'GUI01' EXCLUDING fcode.
SET TITLEBAR 'CAP' WITH '&' .
ENDFORM. "sub_set_pf_status
*&---------------------------------------------------------------------*
*& Form ALV_USER_COMMAND
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->R_UCOMM text
* -->RS_SELFIELD text
*----------------------------------------------------------------------*
FORM alv_user_command USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield. "响应ALV点击自定义按钮之后的事件
DATA: lr_grid TYPE REF TO cl_gui_alv_grid,
lc_i TYPE i,
lv_subrc TYPE sy-subrc.
DATA: p_gv_answer(1).
DATA: l_answer TYPE string.
DATA: l_tcode TYPE char20 .
DATA: is_stable TYPE lvc_s_stbl.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR' "刷新alv
IMPORTING
e_grid = lr_grid.
is_stable-row = 'X'.
is_stable-col = 'X'.
CASE r_ucomm. "按钮功能写在这里
WHEN '&IC1'.
WHEN '&F03' OR '&F15'.
LEAVE PROGRAM .
WHEN '&F12'.
LEAVE PROGRAM.
WHEN '&SAVE'.
ENDCASE.
CALL METHOD lr_grid->refresh_table_display "刷新alv
EXPORTING
is_stable = is_stable.
ENDFORM. "ALV_USER_COMMAND
*&---------------------------------------------------------------------*
*& Form SET_FIELDCAT_NAME
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_TEXT text
*----------------------------------------------------------------------*
FORM set_fieldcat_name USING ps_fieldcat TYPE lvc_s_fcat p_text.
*FORM set_fieldcat_name USING ps_fieldcat TYPE lvc_s_fcat p_fcatname p_text.
"如果说你结构中没有某个字段,然后添加这个参数,自定义某个字段在alv上展示
* ps_fieldcat-fieldname = p_factname .
ps_fieldcat-scrtext_l = p_text.
ps_fieldcat-scrtext_m = p_text.
ps_fieldcat-scrtext_s = p_text.
ps_fieldcat-reptext = p_text.
ENDFORM. " SET_FIELDCAT_NAME