二维码

[Tree] ALV Tree实例,对同类数据归类,并分类汇总

Twilight发表于 2014-01-20 23:17Twilight 最后回复于 2014-01-20 23:17 [复制链接] 4647 0

在sap业务系统中,大量的使用到ALV tree对象,该对象在表格基础上对同类数据进行归类,并对各分类能进行数据汇总,执行效果如下:
alv_tree.jpg
注:distance 字段在数据库值为空,所以输出为空

以航班表(spfli)为例:
1)、按国家、航线、航班分类;
2)、在右半屏幕对字段字段进行数量汇总;
3)、在右屏幕输出起飞国家、起飞城市、目的国家、目的城市、距离字段,并控制其输出长度。

处理过程:
1)、建立程序和屏幕,在屏幕上建立定制控制对象,定义好工作流;
2)、建立好PAI、PBO事件;
3)、在pai中定义建立定制控制对象,并建立alv tree对象;
4)、建立alv tree对象的标题;
5)、建立右屏幕输出字段清单、字段长度、汇总字段等内容;
6)、建立tree分类字段清单及输出先后顺序;
7)、显示alv tree对象。

注:该实例是在屏幕上建立custom control控件,实现oolav输出报表 的扩展,如阅读有困难可先参考它。

主程序:
  1. REPORT  ZDEMON_008.
  2. DATA OK_CODE TYPE SY-UCOMM. " SY-UCOMM:Function code that PAI triggered
  3. DATA IT_SPFLI TYPE TABLE OF SPFLI.

  4. *ALV字段内表、分类字段内表
  5. DATA: GB_FIELDCAT TYPE LVC_T_FCAT,
  6.       GB_SORTFIELD TYPE LVC_T_SORT.
  7. DATA:S_CONTAINER TYPE SCRFNAME VALUE 'ALVDATA',  " SCRFNAME: Name of a Screen Element  只能为该类型
  8. *      ALV_GRID TYPE REF TO CL_GUI_ALV_GRID, "参考CL_GUI_ALV_GRID类,定义对象ALV_GRID
  9.       ALV_GRID TYPE REF TO CL_GUI_ALV_TREE_SIMPLE,
  10.       LO_CUSTOM_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER.
  11. *ALV TREE对象,此处是直接从 alv_grid的定义更改


  12. SELECT *
  13.   INTO CORRESPONDING FIELDS OF TABLE IT_SPFLI
  14.   FROM SPFLI.

  15. CALL SCREEN 100.

  16. *----------------------------------------------------------------------*
  17. *  MODULE STATUS_0100 OUTPUT
  18. *----------------------------------------------------------------------*
  19. *
  20. *----------------------------------------------------------------------*
  21. MODULE STATUS_0100 OUTPUT.
  22.   SET PF-STATUS 'STATUS1'.
  23.   SET TITLEBAR 'ALV TITLEBAR'.
  24. ENDMODULE.                 " STATUS_0100  OUTPUT

  25. *----------------------------------------------------------------------*
  26. *  MODULE USER_COMMAND_0100 INPUT
  27. *----------------------------------------------------------------------*
  28. *
  29. *----------------------------------------------------------------------*
  30. MODULE USER_COMMAND_0100 INPUT.
  31.   CASE OK_CODE.
  32.     WHEN 'CANCEL'.
  33.       LEAVE PROGRAM.
  34.     WHEN 'BACK' OR 'EXIT'.
  35.       LEAVE TO SCREEN 0.
  36.   ENDCASE.
  37. ENDMODULE.                 " USER_COMMAND_0100  INPUT

  38. *----------------------------------------------------------------------*
  39. *  MODULE CLEAR_OK_CODE OUTPUT
  40. *----------------------------------------------------------------------*
  41. *
  42. *----------------------------------------------------------------------*
  43. MODULE CLEAR_OK_CODE OUTPUT.
  44.   CLEAR OK_CODE.
  45. ENDMODULE.                 " CLEAR_OK_CODE  OUTPUT

  46. *----------------------------------------------------------------------*
  47. *  MODULE DISPLAY_OOALV OUTPUT
  48. *----------------------------------------------------------------------*
  49. *
  50. *----------------------------------------------------------------------*
  51. MODULE DISPLAY_OOALV OUTPUT.
  52.   IF LO_CUSTOM_CONTAINER IS INITIAL. "如果LO_CUSTOM_CONTAINE RDialog容器对象不存在,实例化该对象
  53. *ALV表头设定
  54.     DATA LS_LIST_COMM TYPE SLIS_T_LISTHEADER.
  55.     DATA LS_ALIST_COMM TYPE SLIS_LISTHEADER.
  56.     LS_ALIST_COMM-TYP = 'H'.
  57.     LS_ALIST_COMM-INFO = 'ALV TREE演示'.
  58.     APPEND LS_ALIST_COMM TO LS_LIST_COMM.
  59. *字段清单、字段长度、汇总字段方法调用
  60.     PERFORM BLDCAT.
  61. *创建TREE分类字段清单以及先后顺序
  62.     PERFORM BLDSORTFLD.

  63.     CREATE OBJECT LO_CUSTOM_CONTAINER
  64.       EXPORTING
  65.         CONTAINER_NAME = S_CONTAINER.
  66.     CREATE OBJECT ALV_GRID "实例化alv对象
  67.            EXPORTING I_PARENT = LO_CUSTOM_CONTAINER.
  68.     CALL METHOD ALV_GRID->SET_TABLE_FOR_FIRST_DISPLAY "调用alv对象的方法显示报表
  69.          EXPORTING
  70.            IT_LIST_COMMENTARY = LS_LIST_COMM
  71.            I_STRUCTURE_NAME = 'SPFLI'
  72.          CHANGING
  73.            IT_SORT            = GB_SORTFIELD
  74.            IT_FIELDCATALOG    = GB_FIELDCAT
  75.            IT_OUTTAB = IT_SPFLI.

  76.     CALL METHOD ALV_GRID->EXPAND_TREE
  77.       EXPORTING
  78.         I_LEVEL = 1.
  79.   ENDIF.
  80. ENDMODULE.                 " DISPLAY_OOALV  OUTPUT

  81. *&---------------------------------------------------------------------*
  82. *&      Form  BLDCAT
  83. *&---------------------------------------------------------------------*
  84. *       text
  85. *----------------------------------------------------------------------*
  86. FORM BLDCAT .
  87. *将SPFLI所有结构字段到内表
  88.   CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
  89.     EXPORTING
  90.       I_STRUCTURE_NAME = 'SPFLI'
  91.     CHANGING
  92.       CT_FIELDCAT      = GB_FIELDCAT.
  93. *单条记录
  94.   DATA LS_FLDCAT TYPE LVC_S_FCAT.
  95. *记录处理
  96.   LOOP AT GB_FIELDCAT INTO LS_FLDCAT.
  97.     CASE LS_FLDCAT-FIELDNAME.
  98. *定义四段长度
  99.       WHEN 'COUNTRYER'
  100.         OR 'CITYFROM'
  101.         OR 'COUNTRYTO'
  102.         OR 'CITYTO'
  103.         OR 'DISTANCE'.
  104.         LS_FLDCAT-OUTPUTLEN = 15.
  105.       WHEN OTHERS.
  106.         LS_FLDCAT-NO_OUT = 'X'."不输出
  107.     ENDCASE.
  108. *字段汇总  如果是距离字段,定义自动汇总
  109.     IF LS_FLDCAT-FIELDNAME = 'DISTANCE'.
  110.       LS_FLDCAT-DO_SUM = 'X'.
  111.     ENDIF.

  112.     MODIFY GB_FIELDCAT FROM LS_FLDCAT.
  113.   ENDLOOP.
  114. ENDFORM.                    " BLDCAT

  115. *&---------------------------------------------------------------------*
  116. *&      Form  BLDSORTFLD
  117. *&---------------------------------------------------------------------*
  118. *       text
  119. *----------------------------------------------------------------------*
  120. FORM BLDSORTFLD .
  121.   DATA LS_SORTFLD TYPE LVC_S_SORT.

  122.   LS_SORTFLD-SPOS = 1.
  123.   LS_SORTFLD-FIELDNAME = 'COUNTRYFR'.
  124.   LS_SORTFLD-UP = 'X'.
  125.   LS_SORTFLD-SUBTOT = 'X'.
  126.   APPEND LS_SORTFLD TO GB_SORTFIELD.

  127.   LS_SORTFLD-SPOS = 2.
  128.   LS_SORTFLD-FIELDNAME = 'CARRID'.
  129.   LS_SORTFLD-UP = 'X'.
  130.   LS_SORTFLD-SUBTOT = 'X'.
  131.   APPEND LS_SORTFLD TO GB_SORTFIELD.

  132.   LS_SORTFLD-SPOS = 3.
  133.   LS_SORTFLD-FIELDNAME = 'CONNID'.
  134.   LS_SORTFLD-UP = 'X'.
  135.   LS_SORTFLD-SUBTOT = 'X'.
  136.   APPEND LS_SORTFLD TO GB_SORTFIELD.
  137. ENDFORM.                    " BLDSORTFLD
复制代码




回复

使用道具 举报

快速回帖

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

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