二维码

[fmalv] alv list 实现alv多表头或自定义表头(一)

Twilight发表于 2014-08-13 19:19Twilight 最后回复于 2014-08-13 19:19 [复制链接] 6525 0

ALV具有强大的数据显示功能,不过其表头形式较为单一,难以适合于一些要求较复杂的报表需求,本例将介绍如何实现ALV表头的自定义格式。

ALV表头的修改首先需要定义表头所需要的具体字段数,然后修改各字段属性,包括名称,横竖线的绘制等。需要注意的是,实现该功能要求ALV必须设置为LIST显示模式,且所生成的报表不适用于排序或Layout的修改;为了使ALV表格与自定义表头对齐,一般建议在设置Fieldcat时指定各字段宽度。

本节主要介绍在一些特别需求中自定义ALV表头的方法,对一些商务应用中的正式报表建议还是采用ScriptForm或SmartForm方式。

程序中所需使用函数及ABAP Report处理事件如下:

REUSE_ALV_LIST_DISPLAY:显示List格式ALV,该例需要设置其IT_EVENTS属性;

REUSE_ALV_EVENTS_GET:获取ALV执行事件,在表头中增加指定行数数据需要调用其"TOP_OF_PAGE"事件。

  1. TYPE-POOLS: SLIS.
  2. TABLES: SPFLI.
  3. DATA: FIELDCAT TYPE SLIS_T_FIELDCAT_ALV WITH HEADER LINE,
  4.     LAYOUT    TYPE SLIS_LAYOUT_ALV,
  5.     W_REPID  LIKE SY-REPID,
  6.     L_EVENTS TYPE SLIS_T_EVENT,                 "定义ALV事件类型
  7.     EVENTCAT TYPE SLIS_T_EVENT WITH HEADER LINE.    "定义事件数据保存内表

  8. DATA: LS_SPFLI TYPE SPFLI.                          "定义查询数据相关内表
  9. DATA: LSPFLI LIKE STANDARD TABLE OF LS_SPFLI WITH HEADER LINE.

  10. START-OF-SELECTION.
  11.   PERFORM EVENTTAB_BUILD CHANGING L_EVENTS.
  12.   PERFORM GETDATA.
  13.   PERFORM CATALOG.
  14.   PERFORM ALVSHOW.

  15. *---------------------------------------------------------------------*
  16. *       FORM GetData From DataBase
  17. *---------------------------------------------------------------------*
  18. FORM GETDATA.                                   "抓取十条数据作为参考例子
  19.   SELECT * FROM SPFLI UP TO 10 ROWS
  20.   INTO CORRESPONDING FIELDS OF TABLE LSPFLI.
  21. ENDFORM.

  22. *&---------------------------------------------------------------------*
  23. *&      Form  CATALOG
  24. *&---------------------------------------------------------------------*
  25. FORM CATALOG.
  26.   W_REPID = SY-REPID.
  27.   CLEAR FIELDCAT.

  28. *  通过宏来设置ALV Fieldcat属性,包括字段名、长度、对齐方式等
  29. DEFINE FIELDCATSET.
  30. FIELDCAT-REF_TABNAME = 'LSPFLI'.
  31. FIELDCAT-FIELDNAME = &1.
  32. FIELDCAT-SELTEXT_L = &1.
  33. FIELDCAT-COL_POS = &2.
  34. FIELDCAT-JUST = 'C'.
  35. FIELDCAT-OUTPUTLEN = &3.
  36. APPEND FIELDCAT.
  37.   END-OF-DEFINITION.
  38. * 调用宏设置Fieldcat
  39.   CLEAR SY-TABIX.
  40.   FIELDCATSET 'CARRID' SY-TABIX 6.
  41.   FIELDCATSET 'COUNTRYFR' SY-TABIX 9.
  42.   FIELDCATSET 'CITYFROM' SY-TABIX 8.
  43.   FIELDCATSET 'COUNTRYTO' SY-TABIX 10.
  44.   FIELDCATSET 'AIRPFROM' SY-TABIX 8.
  45.   FIELDCATSET 'AIRPTO' SY-TABIX 7.
  46.   FIELDCATSET 'DEPTIME' SY-TABIX 10.
  47.   FIELDCATSET 'DISTANCE' SY-TABIX 10.
  48.   FIELDCATSET 'DISTID' SY-TABIX 6.
  49.   FIELDCATSET 'FLTYPE' SY-TABIX 6.
  50.   FIELDCATSET 'PERIOD' SY-TABIX 6.
  51. ENDFORM.

  52. *&---------------------------------------------------------------------*
  53. *&      Form  ALVSHOW
  54. *&---------------------------------------------------------------------*
  55. FORM ALVSHOW.
  56.   LAYOUT-ZEBRA = 'X' .                          "加上间隔条纹美化ALV显示

  57.   CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
  58.     EXPORTING
  59.          I_CALLBACK_PROGRAM = W_REPID
  60.          IS_LAYOUT          = LAYOUT
  61.          IT_FIELDCAT        = FIELDCAT[]
  62.          IT_EVENTS          = EVENTCAT[]    "加入处理事件
  63.     TABLES
  64.          T_OUTTAB           = LSPFLI
  65.     EXCEPTIONS
  66.          PROGRAM_ERROR  = 1
  67.          OTHERS             = 2.
  68.   IF SY-SUBRC <> 0.
  69. MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
  70.          WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  71.   ENDIF.
  72. ENDFORM.

  73. *&--------------------------------------------------------------------------------*
  74. *&      Form  EVENTTAB_BUILD      获取ALV执行事件
  75. *&--------------------------------------------------------------------------------*
  76. FORM EVENTTAB_BUILD CHANGING P_EVENTS TYPE SLIS_T_EVENT.
  77.   DATA L_EVENT TYPE LINE OF  SLIS_T_EVENT.
  78.   CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
  79.     EXPORTING
  80.          I_LIST_TYPE     = 0
  81.     IMPORTING
  82.          ET_EVENTS       = P_EVENTS
  83.     EXCEPTIONS
  84.          LIST_TYPE_WRONG = 1
  85.          OTHERS          = 2.

  86. * 定义页面首行输出事件
  87.   READ TABLE P_EVENTS INTO L_EVENT WITH KEY NAME = 'TOP_OF_PAGE'.
  88.   EVENTCAT-NAME  = L_EVENT-NAME.
  89.   EVENTCAT-FORM = 'F_TOP_OF_PAGE'.
  90.   APPEND EVENTCAT.

  91. * 定义List输出后事件
  92.   READ TABLE P_EVENTS INTO L_EVENT WITH KEY NAME = 'END_OF_LIST'.
  93.   EVENTCAT-NAME  = L_EVENT-NAME.
  94.   EVENTCAT-FORM = 'F_END_OF_PAGE'.
  95.   APPEND EVENTCAT.
  96. ENDFORM.                    " EVENTTAB_BUILD

  97. *&--------------------------------------------------------------------*
  98. *&      Form  F_TOP_OF_PAGE   绘制ALV表头
  99. *&--------------------------------------------------------------------*
  100. FORM F_TOP_OF_PAGE.
  101.   DATA: L_LINE(398) TYPE C.

  102.   WRITE: / SY-ULINE.
  103.   WRITE SY-VLINE TO L_LINE+0.
  104.   WRITE 'Flight Information Report' TO L_LINE+33 .
  105.   WRITE SY-VLINE  TO L_LINE+97.
  106.   WRITE: / L_LINE.
  107.   WRITE: / SY-ULINE+7.

  108.   CLEAR L_LINE.
  109.   WRITE SY-VLINE TO L_LINE+0.
  110.   WRITE SY-VLINE TO L_LINE+7.
  111.   WRITE 'Country Information'  TO L_LINE+12.
  112.   WRITE SY-VLINE TO L_LINE+37.
  113.   WRITE 'Flight detail'  TO L_LINE+50.
  114.   WRITE SY-VLINE TO L_LINE+97.
  115.   WRITE: / L_LINE.
  116. ENDFORM.                    "F_TOP_OF_PAGE

  117. *&--------------------------------------------------------------------*
  118. *&      Form  F_TOP_OF_PAGE  在ALV表最后加入描述
  119. *&--------------------------------------------------------------------*
  120. FORM F_END_OF_PAGE.
  121. DATA: L_LINE(398) TYPE C.
  122. * 重新绘制表头自定义表格和ALV List衔接部分
  123.   WRITE: / SY-ULINE.
  124.   WRITE SY-VLINE TO L_LINE+0.
  125.   WRITE 'Flight Information Report' TO L_LINE+33 .
  126.   WRITE SY-VLINE  TO L_LINE+97.
  127.   WRITE: / L_LINE.
  128.   WRITE: / SY-ULINE+7.

  129.   WRITE SY-VLINE TO L_LINE+0.
  130.   WRITE 'Total QTY:10' TO L_LINE+40.
  131.   WRITE SY-VLINE TO  L_LINE+97.
  132.   WRITE L_LINE.
  133.   WRITE : / SY-ULINE.
  134. ENDFORM.                    "F_END_OF_PAGE
复制代码


执行效果:
alv list 实现alv多表头.png
回复

使用道具 举报

快速回帖

本版积分规则
您需要登录后才可以回帖 登录 | 注册有礼

快速回复 返回顶部 返回列表