1、ABAP-ALV报表开发 ALV相关概念 ALV是系统的一种网格的显示方式,这种方式带有汇总\排序\筛选等功能,ALV格式的数据是以单元格为单位显示,不象一般的写屏方式拷出来或是 导出成文件不同列的内容粘在一块,这种方式便于数据导出来放在电子表格里进行加工。 ALV即能显示简单表单(SIMPLE LIST)又能显示有序表单(SEQUENTIAL LIST): ALV实现方式: ALV 可以通过两种方式实现:Two Approaches Conventional (Using SAP Standard Function Modules). Object Oriented (Usi
2、ng SAP Standard Classes and Methods). 以下我们要讲的为Function Modules方式。 ALV实现流程: 第一步:定义将要用到的表,即TALBES定义部分,然后定义TYPE-POOLS: SLIS. 第二步:定义数据类型或者内表的实体对象. 第三步:定义一些需要用到的变量. 第四步:定义自己的选择屏幕. 第五步:start-of-selection部分. 1)用一个子函数完成对ALV表单标题区域的赋值(i_list_comments). 2)用一个子函数完成自己所需要数据的抓取. 3)用一个子函数完成要显示列表的列名行(第一行)的
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,
4、 "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-TXZ
5、01, 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
6、 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 *第三步: *-----------------------------------------
7、 * COUNTER DEF *----------------------------------------------------------------------* DATA: W_BUKRS TYPE T001-BUKRS, "用于公司代码的检索 W_LIFNR TYPE LFA1-LIFNR, "用于购买者代码的检索 W_DATUM TYPE EKKO-AEDAT, W_DATE(10) TYPE C. *---
8、 * FOR ALV DEF *----------------------------------------------------------------------* DATA: ST_LAYO TYPE SLIS_LAYOUT_ALV, "ALV LAYOUT STR TD_EVENT TYPE SLIS_T_EVENT, "ALV EVENT T
9、AB 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_FIELDC
10、AT 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 = '
11、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_EVENT
12、S_GET取得多个事件(包括操作页眉页脚的事件). *3)SLIS_T_LISTHEADER操作页眉页脚的内表. *4)SLIS_T_FIELDCAT_ALV操作ALV报表列的内表. *5)SLIS_T_SORTINFO_ALV对显示数据排序的内表。 *第四步: *----------------------------------------------------------------------* * PARAMTER DEF(SELECT-OPTION etc.) *----------------------------------------------
13、 *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 *------------------------------------
14、 * 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.
15、 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_BU
16、KRS. 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.
17、 "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.
18、 " 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 "Purchas
19、e 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 INNE
20、R 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_D
21、ATA "取全部的事件,并且更改处理页眉页脚的事件的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-MS
22、GID 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
23、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.
24、 " 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
25、 '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' E
26、XPORTING 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.
27、 " 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)
28、 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_COMMENTAR
29、Y = 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
30、 = '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'. "是否可编辑 AP
31、PEND 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_FI
32、ELDCAT. 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
33、 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_FIE
34、LDCAT-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_FIELDCA
35、T-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-SE
36、LTEXT_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
37、 = 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_
38、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 I
39、T_FIELDCAT = TD_FIELDCAT IT_SORT = TD_SORT I_DEFAULT = 'X' I_SAVE = 'A' IT_EVENTS = TD_EVENT TABLES T_OUTTAB = TD_PUR
40、ORDER "操作的内表 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.
41、 " 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.






