收藏 分销(赏)

转载:ABAP-ALV报表开发实例.docx

上传人:仙人****88 文档编号:11258355 上传时间:2025-07-11 格式:DOCX 页数:9 大小:23.77KB 下载积分:10 金币
下载 相关 举报
转载:ABAP-ALV报表开发实例.docx_第1页
第1页 / 共9页
转载:ABAP-ALV报表开发实例.docx_第2页
第2页 / 共9页


点击查看更多>>
资源描述
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.
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服