ALV 功能总结
一
.
关于
FUNCTION'REUSE_ALV_GRID_DISPLAY'
常用参数说明及用法
REPORT
Z_ALV_TEST01
NO
STANDARD
PAGE
HEADING
MESSAGE
-ID
ZX.
***GlobalDatadeclear
INCLUDE
Z_ALV_TEST01TOP.
INCLUDE
Z_ALV_TEST01F01.
***initialdata
INITIALIZATION
.
***preparereportdata
START-OF
-SELECTION.
perform
get_data.
perform
alv_show.
***outputreport
END
-OF
-SELECTION.
*&---------------------------------------------------------------------*
*&IncludeZ_ALV_TEST01TOP
*&---------------------------------------------------------------------*
TABLES
:MARA,MBEW,EKPO,MAKT.
SELECT
-OPTIONS:S_MATNRFOR
MARA-MATNR.
DATA
:BEGIN
OF
IT_MATNROCCURS
0
,
BOX TYPE C,"
用来控制输出画面左测的可选择该行,如果选中某行,则该栏位值为‘
X
’
MATKLLIKE
MARA-MATKL,
MATNRLIKE
MARA-MATNR,
MTARTLIKE
MARA-MTART,
MAKTXLIKE
MAKT-MAKTX,
MEINSLIKE
MARA-MEINS,
MBRSHLIKE
MARA-MBRSH,
MENGELIKE
EKPO-MENGE,
END
OF
IT_MATNR.
TYPES
:BEGIN
OF
WA_MATNR,
MATKLLIKE
MARA-MATKL,
MATNRLIKE
MARA-MATNR,
MTARTLIKE
MARA-MTART,
MAKTXLIKE
MAKT-MAKTX,
MEINSLIKE
MARA-MEINS,
MBRSHLIKE
MARA-MBRSH,
MENGELIKE
EKPO-MENGE,
END
OF
WA_MATNR.
DATA
:IT_MATNR_OLDLIKE
IT_MATNROCCURS
0
WITH
HEADER
LINE
.
FIELD
-SYMBOLS<MATNR>TYPE
WA_MATNR.
TYPE
-POOLS:slis.
DATA
:it_fieldcatTYPE
slis_t_fieldcat_alvWITH
HEADER
LINE
,
lt_sortTYPE
slis_t_sortinfo_alvWITH
HEADER
LINE
,
it_eventsTYPE
slis_t_event,
lt_event_exitTYPE
slis_t_event_exit,
ls_event_exitTYPE
slis_event_exit,
pt_top_of_pageTYPE
slis_t_listheader,
gs_printTYPE
slis_print_alv,
gs_layoutTYPE
slis_layout_alv.
*&-------------------------------------------------------------------
*&IncludeZ_ALV_TEST01F01
*&-------------------------------------------------------------------
*&Formget_data
*&-------------------------------------------------------------------
FORM
get_data.
SELECT
*
INTO
CORRESPONDINGFIELDS
OF
TABLE
IT_MATNR
FROM
MARA
WHERE
MATNRIN
S_MATNR.
LOOP
AT
IT_MATNR.
SELECT
SINGLE
MENGE
INTO
IT_MATNR-MENGE
FROM
EKPO
WHERE
MATNR=IT_MATNR-MATNR.
SELECT
SINGLE
MAKTX
INTO
IT_MATNR-MAKTX
FROM
MAKT
WHERE
MATNR=IT_MATNR-MATNR
AND
SPRAS='M'
.
MODIFY
IT_MATNR.
ENDLOOP
.
IT_MATNR_OLD[]=IT_MATNR[].
ENDFORM
."get_data
*&-------------------------------------------------------------------
*&Formset_pf_status
*&-------------------------------------------------------------------
FORM
set_pf_statusUSING
rt_extabTYPE
slis_t_extab.
SET
PF-STATUS'ALV_PF_STATUS'
.
ENDFORM
."Set_pf_status
此 FORM 的作用是在标准的 ALV 工具栏上添加自定义的按钮
该名称
必须和
FUNCTION
参数
I_CALLBACK_PF_STATUS_SET='SET_PF_STATUS'
对应起来
,
即
FORM
的名称和变量名称要一样
.
GUI STATUS '
ALV_PF_STATUS
'
是自己定义的
,
因为自定义后会把标准的
ALV
工具栏覆盖
,
所以还要把标准工具栏复制过来
.
方法如下 :
T-CODE :SE90 Program Library-- GUI Status
program name:SAPLKKBLGUI Status:STANDARD_FULLSCREEN 标准的 ALV 工具栏名称 , F8 运行 , 选择菜单栏 GUI Status---COPY, 最后输入你的程序名以及你自定义的 GUI Status 名 , 此例即为 ALV_PF_STATUS , 再添加按钮 .
*&-------------------------------------------------------------------
*&FormALV_USER_COMMAND
*&-------------------------------------------------------------------
*-->R_UCOMMtext
*-->RS_SELFIELDtext
*----------------------------------------------------------------------*
form
ALV_USER_COMMANDusing
r_ucommlike
sy-ucomm
rs_selfieldtype
slis_selfield."
响应
ALV
点击自定义按钮之后的事件
case
r_ucomm.
when
'EXIT2'
."
在
setpf-status'9100'.
的屏幕状态里面
自定义的按钮名称
LEAVE
TO
SCREEN
0
.
WHEN
'&DATA_SAVE'
.
"
修改屏幕字段物料描述
MAKTX,
此时的
&DATA_SAVE
是标准
GUI
的参数
,
I_CALLBACK_PF_STATUS_SET
不要进行设置
LOOP
AT
IT_MATNR.
READ
TABLE
IT_MATNR_OLDASSIGNING
<MATNR>
WITH
KEY
MATNR=IT_MATNR-MATNR.
CHECK
IT_MATNR-MAKTX<><matnr>-MAKTX.
UPDATE
MAKTSET
MAKTX=IT_MATNR-MAKTXWHERE
MATNR=IT_MATNR-MATNR
AND
SPRAS='M'
.
ENDLOOP
.
WHEN
'&IC1'
.
"
表示双击
CHECK
rs_selfield-tabindex>0
.
READ
TABLE
IT_MATNRINDEX
rs_selfield-tabindex.
SET
PARAMETER
ID
:'MAT'
FIELD
IT_MATNR-MATNR.
CALL
TRANSACTION
'MM03'
AND
SKIP
FIRST
SCREEN
.
endcase
.
rs_selfield-fieldname
表示双击的字段名
,
有时候有用
.
endform
."ALV_USER_COMMAND
*&---------------------------------------------------------------------*
*&Formalv_show
*&---------------------------------------------------------------------*
FORM
alv_show.
PERFORM
prepare_alv_field.
"
设置屏幕输出拦位的描述和格式
PERFORM
eventtab_buildUSING
it_events[].
"
触发
ALV
事件
,
比如
TOP_OF_PAGE,
ALV_END_OF_LIST
,
ALV_END_OF_PAGE
PERFORM
build_sortcat.
"
设置排序和
分类汇总
PERFORM
build_layout.
"
设置输出格式
PERFORM
build_eventexit.
"
设置
ALV
按钮增强功能
CALL
FUNCTION
'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program=sy-cprog
/SY-REPID "
程式名称
i_background_id='ALV_BACKGROUND'
I_CALLBACK_PF_STATUS_SET='SET_PF_STATUS'
"
如果
ALV
使用自定义的工具栏
,
如果使用系统工具栏则忽略该行
I_CALLBACK_USER_COMMAND='ALV_USER_COMMAND'
"
自定义工具栏的事件
*I_CALLBACK_TOP_OF_PAGE=GT_LIST_TOP_OF_PAGE[]
I_CALLBACK_HTML_TOP_OF_PAGE='ALV_TOP_OF_PAGE' " 自定义 ALV 表头
使用 HTML 语言对表头的输出格式进行控制 , 包括输出文字的大小 , 字体及颜色等 , 总之在 HTML 语言中能实现的在这里都能实现 . 具体实现见 FORMALV_TOP_OF_PAGE
当
I_CALLBACK_TOP_OF_PAGE
和
I_CALLBACK_HTML_TOP_OF_PAGE
同时设置时
,
只有
I_CALLBACK_HTML_TOP_OF_PAGE
起作用
.
it_fieldcat=it_fieldcat[]
"
必须要设置的参数
,
设定输出目录
it_events=it_events[]
"
如果有事件触发
*i_structure_name='it_matnr'
i_save='A'
"
保存样式
is_layout=gs_layout
"
对输出样式的设定
is_print=gs_print
it_sort=lt_sort[]
"
如果有排序和分类汇总,需要该行
TABLES
t_outtab=it_matnr
"ALV
输出的内表
EXCEPTIONS
program_error=1
OTHERS
=2
.
ENDFORM
."alv_show
*&---------------------------------------------------------------------*
*&Formprepare_alv_field
*&---------------------------------------------------------------------*
FORM
prepare_alv_field.
DEFINE
m_fieldcat.
it_fieldcat-fieldname=&1
.
"
输出字段名
,
注意一定要是大写
it_fieldcat-reptext_ddic=&2
.
"
输出显示的文字说明
*it_fieldcat-col_pos=&3.
"
输出的位置
,
即第几列
*it_fieldcat-outputlen=&4.
"
该显示文字所占的字长
it_fieldcat-emphasize=&3
.
"
设置输出的颜色
it_fieldcat-edit
=&4
.
"
设置为可编辑字段
,
可进行修改
append
it_fieldcat.
END
-OF
-DEFINITION
.
m_fieldcat'MATKL'
'
物料群組
'
'C110'
''
.
m_fieldcat'MATNR'
'
物料
'
'C210'
''
.
m_fieldcat'MTART'
'
物料类型
'
'C310'
''
.
m_fieldcat'MBRSH'
'
行业领域
'
'C410'
''
.
m_fieldcat'MEINS'
'
基本计量单位
'
'C510'
''
.
m_fieldcat'MENGE'
'
数量
'
'C610'
''
.
m_fieldcat'MAKTX'
'
物料描述
'
''
'X'
.
ENDFORM
."prepare_alv_field
*&---------------------------------------------------------------------*
*&FormALV_TOP_OF_PAGE
*&---------------------------------------------------------------------*
FORM
alv_top_of_pageUSING
cl_ddTYPE
REF
TO
cl_dd_document.
DATA
:m_pTYPE
i
.
DATA
:m_buffTYPE
string.
*
表头其实完全可以是一个
html
文件,自己使用
html
语言进行格式控制
m_buff='<html>'
.
CALL
METHOD
cl_dd->html_insert
EXPORTING
contents=m_buff
CHANGING
position
=m_p.
*m_buff='<left><H2>
配件报废品种汇总表
</H2></left>'.
m_buff='<H4>
配件报废品种汇总
</H4>'
.
CALL
METHOD
CL_DD->HTML_INSERT
EXPORTING
CONTENTS=m_buff
CHANGING
POSITION
=m_p.
m_buff=sy-datum.
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.
ENDFORM
.
*&---------------------------------------------------------------------*
*&Formbuild_sortcat
*&---------------------------------------------------------------------*
FORM
build_sortcat.
CLEAR
lt_sort.
"
此部分用于排序和
分类汇总
MOVE
1
TO
lt_sort-spos.
lt_sort-fieldname='MATKL'
.
"
表示按照该栏位名来汇总
lt_sort-up
='X'
.
"
表示按照上面栏位升序排列
lt_sort-subtot='X'
.
APPEND
lt_sort.
CLEAR
lt_sort.
lt_sort-spos=1
.
lt_sort-fieldname='MATNR'
.
lt_sort-down='X'
.
lt_sort-subtot='X'
.
APPEND
lt_sort.
ENDFORM
."build_sortcat
*&---------------------------------------------------------------------*
*&Formbuild_layout
*&---------------------------------------------------------------------*
FORM
build_layout.
gs_layout-totals_text='totals'
.
gs_layout-zebra='X'
.
gs_layout-no_vline='X'
.
gs_layout-colwidth_optimize='X'
.
"
自动设置宽度
gs_layout-detail_popup='X'
.
gs_layout-detail_initial_lines='X'
.
gs_layout-detail_titlebar='DetailTitleBar'
.
gs_layout-box_fieldname='BOX' . " 用来控制输出画面左测的可选择该行,如果选中某行,
则该栏位值为‘
X
’
ENDFORM
.
"build_layout
*&---------------------------------------------------------------------*
*&FormTOP_OF_PAGE
*&---------------------------------------------------------------------*
FORM
TOP_OF_PAGE.
DATA
:ls_lineTYPE
slis_listheader.
CLEAR
pt_top_of_page[].
CLEAR
ls_line.
ls_line-typ='H'
.
SELECT
SINGLE
butxtINTO
ls_line-info
FROM
t001
WHERE
bukrs='3000'
.
APPEND
ls_lineTO
pt_top_of_page.
CLEAR
ls_line.
ls_line-typ='S'
.
ls_line-key
='TITLE'
.
ls_line-info=sy-title
.
APPEND
ls_lineTO
pt_top_of_page.
CALL
FUNCTION
'REUSE_ALV_COMMENTARY_WRITE'
EXPORTING
it_list_commentary=pt_top_of_page.
ENDFORM
.
*---------------------------------------------------------------------*
*FORMalv_end_of_list*
*---------------------------------------------------------------------*
form
alv_end_of_list.
data
:i_list_commentsTYPE
slis_t_listheader.
data
:w_list_commentsTYPE
slis_listheader.
clear
:i_list_comments.
w_list_comments-typ='H'
."H=Header,S=Selection,A=Action
w_list_comments-key
='TITLE'
.
w_list_comments-info='Endoflist'
.
append
w_list_commentsto
i_list_comments.
call
function
'REUSE_ALV_COMMENTARY_WRITE'
exporting
it_list_commentary=i_list_comments.
endform
.
*---------------------------------------------------------------------*
*FORMALV_END_OF_PAGE*
*---------------------------------------------------------------------*
FORM
ALV_END_OF_PAGE.
ENDFORM
.
*&---------------------------------------------------------------------*
*&Formbuild_eventexit
*&---------------------------------------------------------------------*
FORM
build_eventexit.
DATA
c_refreshTYPE
syucommVALUE
'&REFRESH'
.
CLEAR
ls_event_exit.
ls_event_exit-ucomm=c_refresh."Refresh
ls_event_exit-after='X'
.
APPEND
ls_event_exitTO
lt_event_exit.
ENDFORM
."build_eventexit
二
.
关于
FUNCTION'
REUSE_ALV_HIERSEQ_LIST_DISPLAY
'
分层显示
常用参数说明及用法
REPORT
Z_DAVID_ALVTEST.
TABLES
:ekko,
ekpo.
SELECT
-OPTIONS:s_ebelnFOR
ekko-ebeln.
TYPE
-POOLS:slis.
DATA
:BEGIN
OF
headertabOCCURS
0
,
ebelnLIKE
ekko-ebeln,
bstypLIKE
ekko-bstyp,
bsartLIKE
ekko-bsart,
statuLIKE
ekko-statu,
expandTYPE
xfeld,
"
用于设置是否可扩展
,
在这里必须要定义此字段
END
OF
headertab.
DATA
:BEGIN
OF
itemtabOCCURS
0
,
ebelnLIKE
ekpo-ebeln,
ebelpLIKE
ekpo-ebelp,
matnrLIKE
ekpo-matnr,
werksLIKE
ekpo-werks,
mengeLIKE
ekpo-menge,
netprLIKE
ekpo-netpr,
peinhLIKE
ekpo-peinh,
netwrLIKE
ekpo-netwr,
END
OF
itemtab.
DATA
:ls_fieldcatTYPE
slis_t_fieldcat_alvWITH
HEADER
LINE
,
ls_sortTYPE
slis_t_sortinfo_alvWITH
HEADER
LINE
,
ls_keyinfoTYPE
slis_keyinfo_alv,
ls_layoutTYPE
slis_layout_alv.
START-OF
-SELECTION.
PERFORM
readdata.
PERFORM
build_fieldcat.
PERFORM
build_sortcat.
PERFORM
build_layout.
PERFORM
build_keyinfo.
PERFORM
display_alv.
*&---------------------------------------------------------------------*
*&Formreaddata
*&---------------------------------------------------------------------*
FORM
readdata.
SELECT
ebelnbstypbsartstatu
INTO
TABLE
headertab
FROM
ekko
WHERE
ebelnIN
s_ebeln.
IF
NOT
headertab[]IS
INITIAL
.
SELECT
ebelnebelpmatnrwerksmengenetprpeinhnetwr
INTO
TABLE
itemtab
FROM
ekpo
FOR
ALL
ENTRIESIN
headertab
WHERE
ebeln=headertab-ebeln.
ENDIF
.
ENDFORM
."readdata
*&---------------------------------------------------------------------*
*&Formbuild_fieldcat
*&---------------------------------------------------------------------*
FORM
build_fieldcat.
DEFINE
alv_fieldcat.
ls_fieldcat-tabname=&1
.
ls_fieldcat-fieldname=&2
.
ls_fieldcat-ref_tabname=&3
.
append
ls_fieldcat.
END
-OF
-DEFINITION
.
alv_fieldcat'headertab'
'EBELN'
'EKKO'
.
alv_fieldcat'headertab'
'BSTYP'
'EKKO'
.
alv_fieldcat'headertab'
'BSART'
'EKKO'
.
alv_fieldcat'headertab'
'STATU'
'EKKO'
.
alv_fieldcat'itemtab'
'EBELN'
'EKPO'
.
alv_fieldcat'itemtab'
'EBELP'
'EKPO'
.
alv_fieldcat'itemtab'
'MATNR'
'EKPO'
.
alv_fieldcat'itemtab'
'WERKS'
'EKPO'
.
alv_fieldcat'itemtab'
'MENGE'
'EKPO'
.
alv_fieldcat'itemtab'
'NETPR'
'EKPO'
.
alv_fieldcat'itemtab'
'PEINH'
'EKPO'
.
alv_fieldcat'itemtab'
'NETWR'
'EKPO'
.
ENDFORM
."build_fieldcat
*&---------------------------------------------------------------------*
*&Formbuild_sortcat
*&---------------------------------------------------------------------*
FORM
build_sortcat.
DEFINE
m_sort.
ls_sort-tabname=&1
.
ls_sort-fieldname=&2
.
ls_sort-up
=&3
.
append
ls_sort.
END
-OF
-DEFINITION
.
m_sort'headertab'
'EBELN'
'X'
.
m_sort'itemtab'
'EBELP'
'X'
.
ENDFORM
."build_sortcat
*&---------------------------------------------------------------------*
*&Formbuild_keyinfo
*&---------------------------------------------------------------------*
FORM
build_keyinfo.
ls_keyinfo-header01='EBELN'
.
ls_keyinfo-item01='EBELN'
.
ls_keyinfo-item02='EBELP'
.
ENDFORM
."build_keyinfo
*&---------------------------------------------------------------------*
*&Formbuild_layout
*&---------------------------------------------------------------------*
FORM
build_layout.
ls_layout-group_change_edit='X'
.
ls_layout-colwidth_optimize='X'
.
ls_layout-zebra='X'
.
ls_layout-detail_popup='X'
.
ls_layout-get_selinfos='X'
.
ls_layout-expand_fieldname='EXPAND'
.
ENDFORM
."build_layout
*&---------------------------------------------------------------------*
*&Formdisplay_alv
*&---------------------------------------------------------------------*
FORM
display_alv.
CALL
FUNCTION
'REUSE_ALV_HIERSEQ_LIST_DISPLAY'
EXPORTING
i_callback_program=sy-cprog
*i_callback_user_command='USER_COMMAND'
is_layout=ls_layout
it_fieldcat=ls_fieldcat[]
it_sort=ls_sort[]
i_tabname_header='headertab'
i_tabname_item='itemtab'
is_keyinfo=ls_keyinfo
i_save='A'
TABLES
t_outtab_header=headertab
t_outtab_item=itemtab
EXCEPTIONS
program_error=1
OTHERS
=2
.
IF
sy-subrc<>0
.
MESSAGE
ID
sy-msgidTYPE
sy-msgtyNUMBER
sy-msgno
WITH
sy-msgv1sy-msgv2sy-msgv3sy-msgv4.
ENDIF
.
ENDFORM
."display_alv