资源描述
ABAP-ALV报表开发
ALV相关概念
ALV是系统的一种网格的显示方式,这种方式带有汇总\排序\筛选等功能,ALV格式的数据是以单元格为单位显示,不象一般的写屏方式拷出来或是
导出成文件不同列的内容粘在一块,这种方式便于数据导出来放在电子表格里进行加工。
ALV即能显示简单表单(SIMPLE LIST)又能显示有序表单(SEQUENTIAL LIST):
ALV实现方式:
ALV 可以通过两种方式实现:Two Approaches
Conventional (Using SAP Standard Function Modules).
Object Oriented (Using SAP Standard Classes and Methods).
以下我们要讲的为Function Modules方式。
ALV实现流程:
第一步:定义将要用到的表,即TALBES定义部分,然后定义TYPE-POOLS: SLIS.
第二步:定义数据类型或者内表的实体对象.
第三步:定义一些需要用到的变量.
第四步:定义自己的选择屏幕.
第五步:start-of-selection部分.
1)用一个子函数完成对ALV表单标题区域的赋值(i_list_comments).
2)用一个子函数完成自己所需要数据的抓取.
3)用一个子函数完成要显示列表的列名行(第一行)的相关赋值(i_fieldcat_alv)以及设置.
4)用一个子函数完成输出格式的设置(i_layout),比如双击一条记录是否弹出对话框啊?是用哪个功能键触发等等.
5)用一个子函数FORM DISPLAY_DATA来显示上面我们已经分别封装好的数据,需要调用两个常用的FUNCTION MODULE.
下面根据一个普通的例子(purchase order)来具体解释各步骤:
*第一步:
TABLES:EKKO,EKPO,T001,LFA1.
TYPE-POOLS SLIS."有时可以还要包含
*第二步:
TYPES : BEGIN OF TYP_PURORDER, "TYPE OF Purchase Order Information
AEDAT TYPE EKKO-AEDAT, "Date on Which Record Was Created
EBELN TYPE EKKO-EBELN, "Purchasing Document Number
MATNR TYPE EKPO-MATNR, "Material Number
TXZ01 TYPE EKPO-TXZ01,
MENGE TYPE EKPO-MENGE, "Purchase Order Quantity
MEINS TYPE EKPO-MEINS, "Purchase Order Unit of Measure
NETPR TYPE EKPO-NETPR, "Net Price in Purchasing Document
WAERS TYPE EKKO-WAERS, "Currency Key
NETWR TYPE EKPO-NETWR, "Net Order Value in PO Currency
END OF TYP_PURORDER.
DATA: ST_PURORDER TYPE TYP_PURORDER, "MAIN STRUCTER
TD_PURORDER TYPE STANDARD TABLE OF TYP_PURORDER. "MAIN TABLE
*第三步:
*----------------------------------------------------------------------*
* COUNTER DEF
*----------------------------------------------------------------------*
DATA: W_BUKRS TYPE T001-BUKRS, "用于公司代码的检索
W_LIFNR TYPE LFA1-LIFNR, "用于购买者代码的检索
W_DATUM TYPE EKKO-AEDAT,
W_DATE(10) TYPE C.
*----------------------------------------------------------------------*
* FOR ALV DEF
*----------------------------------------------------------------------*
DATA: ST_LAYO TYPE SLIS_LAYOUT_ALV, "ALV LAYOUT STR
TD_EVENT TYPE SLIS_T_EVENT, "ALV EVENT TAB
ST_EVENT TYPE SLIS_ALV_EVENT, "ALV EVENT STR
TD_COMMENT TYPE SLIS_T_LISTHEADER, "SET HEADER TAB
ST_COMMENT LIKE LINE OF TD_COMMENT, "SET HEADER STR
ST_FIELDCAT TYPE SLIS_FIELDCAT_ALV, "ALV FIELDCAT STR
TD_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV, "ALV FIELDCAT TAB
ST_SORT TYPE SLIS_SORTINFO_ALV, "ALV SORT STR
TD_SORT TYPE SLIS_T_SORTINFO_ALV. "ALV SORT TAB
*1)SLIS_LAYOUT_ALV是一个类型,它用来定义ALV报表的整体属性例如:
*ST_LAYO-ZEBRA = 'X'.“显示成斑马纹样式
*ST_LAYO-DETAIL_POPUP = 'X'.“是否弹出详细信息窗口
*ST_LAYO-F2CODE = '&ETA'. “设置触发弹出详细信息窗口的功能码,这里是双击
*ST_LAYO-COLWIDTH_OPTIMIZE = 'X'. “优化列宽选项是否设置
*ST_LAYO-DETAIL_INITIAL_LINES = 'X'.
*ST_LAYO -no_vline = 'X'.“这个用来设置列间隔线
*ST_LAYO -detail_titlebar = '详细内容'. “设置弹出窗口的标题栏
*2)SLIS_T_EVENT是一个取得事件的内表,通过函数REUSE_ALV_EVENTS_GET取得多个事件(包括操作页眉页脚的事件).
*3)SLIS_T_LISTHEADER操作页眉页脚的内表.
*4)SLIS_T_FIELDCAT_ALV操作ALV报表列的内表.
*5)SLIS_T_SORTINFO_ALV对显示数据排序的内表。
*第四步:
*----------------------------------------------------------------------*
* PARAMTER DEF(SELECT-OPTION etc.)
*----------------------------------------------------------------------*
*view or posting selection screen
PARAMETERS: P_BUKRS TYPE T001-BUKRS DEFAULT TEXT-001 OBLIGATORY. "Company Code
PARAMETERS: P_LIFNR TYPE LFA1-LIFNR OBLIGATORY. "Vendor Code
SELECT-OPTIONS: S_DAT FOR W_DATUM. "PO Date
*----------------------------------------------------------------------*
* AT SELECTION-SCREEN
*----------------------------------------------------------------------*
AT SELECTION-SCREEN.
*Check Airline Carrier ID
PERFORM PRM_CHECK_SCDATA.
*第五步:
START-OF-SELECTION.
PERFORM PRM_GET_DATA.
PERFORM FRM_SET_LAYOUT.
PERFORM FRM_SET_EVENT. "Set ALV EVENT
PERFORM FRM_SET_FIELDCAT."Set ALV FIELDCAT 用来定义表单中的各个列的相关信息,比如列名等
PERFORM FRM_SORT_TAB.
PERFORM FRM_DISPLAY_ALV. "OUT DATA FROM ALV
"判断录入参数的合法性
FORM PRM_CHECK_SCDATA.
SELECT SINGLE BUKRS
FROM T001
INTO W_BUKRS
WHERE BUKRS = P_BUKRS.
IF SY-SUBRC <> 0.
MESSAGE E003 WITH P_BUKRS.
LEAVE TO LIST-PROCESSING.
ENDIF.
SELECT SINGLE LIFNR
FROM LFA1
INTO W_LIFNR
WHERE LIFNR = P_LIFNR.
IF SY-SUBRC <> 0.
MESSAGE E003 WITH P_LIFNR.
LEAVE TO LIST-PROCESSING.
ENDIF.
ENDFORM.
"Set ALV LAYOUT 用于定义ALV表单的相关格式、属性
FORM FRM_SET_LAYOUT .
CLEAR ST_LAYO.
ST_LAYO-ZEBRA = 'X'.
ST_LAYO-DETAIL_POPUP = 'X'.
ST_LAYO-F2CODE = '&ETA'.
ST_LAYO-COLWIDTH_OPTIMIZE = 'X'.
ST_LAYO-DETAIL_INITIAL_LINES = 'X'.
ENDFORM. " FRM_SET_LAYOUT
"取数据到内表中
FORM PRM_GET_DATA.
SELECT
EKKO~AEDAT "Date on Which Record Was Created
EKKO~EBELN "Purchasing Document Number
EKPO~MATNR "Material Number
EKPO~TXZ01
EKPO~MENGE "Purchase Order Quantity
EKPO~MEINS "Purchase Order Unit of Measure
EKPO~NETPR "Net Price in Purchasing Document
EKKO~WAERS "Currency Key
EKPO~NETWR "Net Order Value in PO Currency
INTO TABLE TD_PURORDER
FROM EKKO INNER JOIN EKPO
ON ( EKKO~EBELN = EKPO~EBELN )
WHERE EKKO~BUKRS = P_BUKRS
AND EKKO~LIFNR = P_LIFNR
AND EKKO~AEDAT IN S_DAT.
IF SY-SUBRC <> 0.
MESSAGE E002 .
LEAVE LIST-PROCESSING.
ENDIF.
* SORT TD_PURORDER BY AEDAT EBELN MATNR.
ENDFORM. "GET_DATA
"取全部的事件,并且更改处理页眉页脚的事件的FORM的值
FORM FRM_SET_EVENT .
CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
EXPORTING
I_LIST_TYPE = 0
IMPORTING
ET_EVENTS = TD_EVENT
EXCEPTIONS
LIST_TYPE_WRONG = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
LEAVE TO LIST-PROCESSING.
ENDIF.
READ TABLE TD_EVENT
WITH KEY NAME = SLIS_EV_END_OF_LIST
INTO ST_EVENT.
IF SY-SUBRC = 0.
ST_EVENT-FORM = 'ALV_END_OF_LIST'."将页尾子程名称赋值给 ST_EVENT-FORM
MODIFY TD_EVENT FROM ST_EVENT INDEX SY-TABIX.
ENDIF.
READ TABLE TD_EVENT
WITH KEY NAME = SLIS_EV_TOP_OF_PAGE
INTO ST_EVENT.
IF SY-SUBRC = 0.
ST_EVENT-FORM = 'ALV_TOP_OF_PAGE'."将页眉子程名称赋值给 ST_EVENT-FORM
MODIFY TD_EVENT FROM ST_EVENT INDEX SY-TABIX.
ENDIF.
ENDFORM. " FRM_SET_EVENT
"页眉处理子程
FORM ALV_TOP_OF_PAGE .
REFRESH TD_COMMENT.
CLEAR ST_COMMENT.
ST_COMMENT-TYP = 'H'."H=Header, S=Selection, A=Action供选择
ST_COMMENT-KEY = SPACE.
ST_COMMENT-INFO = TEXT-024.
APPEND ST_COMMENT TO TD_COMMENT.
CLEAR ST_COMMENT.
ST_COMMENT-TYP = 'A'.
ST_COMMENT-KEY = TEXT-020.
ST_COMMENT-INFO = P_BUKRS.
APPEND ST_COMMENT TO TD_COMMENT.
CLEAR ST_COMMENT.
ST_COMMENT-TYP = 'S'.
ST_COMMENT-KEY = TEXT-023.
ST_COMMENT-INFO = P_LIFNR.
APPEND ST_COMMENT TO TD_COMMENT.
CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
EXPORTING
IT_LIST_COMMENTARY = TD_COMMENT
I_LOGO = 'ENJOYSAP_LOGO'." 输出图标
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
LEAVE TO LIST-PROCESSING.
ENDIF.
ENDFORM. " ALV_TOP_OF_PAGE
"页脚处理子程
FORM ALV_END_OF_LIST .
REFRESH TD_COMMENT.
CLEAR ST_COMMENT.
ST_COMMENT-TYP = 'S'.
ST_COMMENT-KEY = TEXT-022.
ST_COMMENT-INFO = SY-UNAME.
APPEND ST_COMMENT TO TD_COMMENT.
CONCATENATE SY-DATUM+0(4)
SY-DATUM+4(2)
SY-DATUM+6(2)
INTO W_DATE
SEPARATED BY '/'."时间字符串的连接
CLEAR ST_COMMENT.
ST_COMMENT-TYP = 'S'.
ST_COMMENT-KEY = TEXT-021.
ST_COMMENT-INFO = W_DATE.
APPEND ST_COMMENT TO TD_COMMENT.
CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
EXPORTING
IT_LIST_COMMENTARY = TD_COMMENT
I_END_OF_LIST_GRID = 'X'.
ENDFORM.
"指定ALV报表列属性
FORM FRM_SET_FIELDCAT .
REFRESH TD_FIELDCAT.
CLEAR ST_FIELDCAT.
ST_FIELDCAT-COL_POS = 0. "第一列
ST_FIELDCAT-FIELDNAME = TEXT-002. "绑定的内表列名称
* ST_FIELDCAT-ref_tabname = 'EKKO'. "录入时,帮助制作时指定表名称
ST_FIELDCAT-REF_FIELDNAME = TEXT-002. "录入时,帮助制作时指定表中参考列名称
ST_FIELDCAT-SELTEXT_M = TEXT-003.
* ST_FIELDCAT-SELTEXT_L = 'zzz'. "M,L,S这三个给一个就行
* ST_FIELDCAT-SELTEXT_S = 'AAA'. "如果都给,它只用L中的值
ST_FIELDCAT-EDIT = 'X'. "是否可编辑
APPEND ST_FIELDCAT TO TD_FIELDCAT.
CLEAR ST_FIELDCAT.
ST_FIELDCAT-COL_POS = 1.
ST_FIELDCAT-FIELDNAME = TEXT-004.
ST_FIELDCAT-REF_FIELDNAME = TEXT-004.
ST_FIELDCAT-SELTEXT_M = TEXT-005.
ST_FIELDCAT-EDIT = 'X'.
APPEND ST_FIELDCAT TO TD_FIELDCAT.
CLEAR ST_FIELDCAT.
ST_FIELDCAT-COL_POS = 2.
ST_FIELDCAT-FIELDNAME = TEXT-006.
ST_FIELDCAT-ref_tabname = 'EKPO'.
ST_FIELDCAT-REF_FIELDNAME = TEXT-006.
ST_FIELDCAT-SELTEXT_M = TEXT-007.
ST_FIELDCAT-EDIT = SPACE.
APPEND ST_FIELDCAT TO TD_FIELDCAT.
CLEAR ST_FIELDCAT.
ST_FIELDCAT-COL_POS = 3.
ST_FIELDCAT-FIELDNAME = TEXT-008.
ST_FIELDCAT-REF_FIELDNAME = TEXT-008.
ST_FIELDCAT-SELTEXT_M = TEXT-009.
ST_FIELDCAT-EDIT = SPACE.
APPEND ST_FIELDCAT TO TD_FIELDCAT.
CLEAR ST_FIELDCAT.
ST_FIELDCAT-COL_POS = 4.
ST_FIELDCAT-FIELDNAME = TEXT-010.
ST_FIELDCAT-REF_FIELDNAME = TEXT-010.
ST_FIELDCAT-SELTEXT_M = TEXT-011.
ST_FIELDCAT-EDIT = SPACE.
APPEND ST_FIELDCAT TO TD_FIELDCAT.
CLEAR ST_FIELDCAT.
ST_FIELDCAT-COL_POS = 5.
ST_FIELDCAT-FIELDNAME = TEXT-012.
ST_FIELDCAT-REF_FIELDNAME = TEXT-013.
ST_FIELDCAT-SELTEXT_M = TEXT-013.
ST_FIELDCAT-EDIT = SPACE.
APPEND ST_FIELDCAT TO TD_FIELDCAT.
CLEAR ST_FIELDCAT.
ST_FIELDCAT-COL_POS = 6.
ST_FIELDCAT-FIELDNAME = TEXT-014.
ST_FIELDCAT-REF_FIELDNAME = TEXT-014.
ST_FIELDCAT-SELTEXT_M = TEXT-015.
ST_FIELDCAT-EDIT = SPACE.
APPEND ST_FIELDCAT TO TD_FIELDCAT.
CLEAR ST_FIELDCAT.
ST_FIELDCAT-COL_POS = 7.
ST_FIELDCAT-FIELDNAME = TEXT-016.
ST_FIELDCAT-REF_FIELDNAME = TEXT-016.
ST_FIELDCAT-SELTEXT_M = TEXT-017.
ST_FIELDCAT-EDIT = SPACE.
APPEND ST_FIELDCAT TO TD_FIELDCAT.
CLEAR ST_FIELDCAT.
ST_FIELDCAT-COL_POS = 8.
ST_FIELDCAT-FIELDNAME = TEXT-018.
ST_FIELDCAT-REF_FIELDNAME = TEXT-018.
ST_FIELDCAT-SELTEXT_M = TEXT-019.
ST_FIELDCAT-EDIT = SPACE.
APPEND ST_FIELDCAT TO TD_FIELDCAT.
ENDFORM.
"ALV报表的显示
FORM FRM_DISPLAY_ALV .
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
I_INTERFACE_CHECK = SPACE
I_CALLBACK_PROGRAM = SY-REPID "表示当前程序调用
IS_LAYOUT = ST_LAYO
IT_FIELDCAT = TD_FIELDCAT
IT_SORT = TD_SORT
I_DEFAULT = 'X'
I_SAVE = 'A'
IT_EVENTS = TD_EVENT
TABLES
T_OUTTAB = TD_PURORDER "操作的内表
EXCEPTIONS
PROGRAM_ERROR = 1
OTHERS = 2
.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ENDFORM. " FRM_DISPLAY_ALV
"显示前页表数据的排序
FORM FRM_SORT_TAB .
CLEAR ST_SORT.
REFRESH TD_SORT.
ST_SORT-SPOS = 3. "排序的次序
ST_SORT-FIELDNAME = 'AEDAT'. "绑定的内表字段名称
ST_SORT-UP = 'X'. "是否为升序
APPEND ST_SORT TO TD_SORT.
CLEAR ST_SORT.
ST_SORT-SPOS = 2.
ST_SORT-FIELDNAME = 'EBELN'.
ST_SORT-UP = 'X'.
* ST_SORT-DOWN = 'X'.
APPEND ST_SORT TO TD_SORT.
CLEAR ST_SORT.
ST_SORT-SPOS = 1.
ST_SORT-FIELDNAME = 'MATNR'.
ST_SORT-UP = 'X'.
APPEND ST_SORT TO TD_SORT.
CLEAR ST_SORT.
展开阅读全文