二维码

[ooalv] 在ooalv中,自定义alv控件的工具条按钮,显示选中行明细

Twilight发表于 2014-01-19 13:57Twilight 最后回复于 2014-01-19 13:57 [复制链接] 6598 0

ALV的工具条上增加一个自定义的按钮,单击它弹出窗口提示选择行数据内容,执行效果如下。
自定义alv控件的工具条按钮.jpg

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

程序处理流程说明:
定义alv控件相关事件、接口和实现方法等,主要定义以下事件。
(1)、alv控件的工具条处理事件,定义了新按钮的功能码;
(2)、alv控件的功能码处理事件,定义用户单击按钮产生的功能码事件

主程序:

  1. REPORT  ZDEMON_004.
  2. INCLUDE <ICON>."引用系统的图标 按钮
  3. CLASS LCL_EVENT_RECEIVER DEFINITION DEFERRED."DEFERRED大概就是 “预定义”类,先告诉你会有这么一个类,可被别的地方用,之后它还是要定义的
  4. DATA EVENT_RECEIVER TYPE REF TO  LCL_EVENT_RECEIVER. "定义事件

  5. DATA OK_CODE TYPE SY-UCOMM. " SY-UCOMM:Function code that PAI triggered
  6. DATA:IT_SPFLI TYPE TABLE OF SPFLI,
  7.      A_SPFLI TYPE SPFLI.
  8. DATA:S_CONTAINER TYPE SCRFNAME VALUE 'ALVDATA',  " SCRFNAME: Name of a Screen Element  只能为该类型
  9.       ALV_GRID TYPE REF TO CL_GUI_ALV_GRID, "参考CL_GUI_ALV_GRID类,定义对象ALV_GRID
  10.       LO_CUSTOM_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER.

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

  14. CALL SCREEN 100.
  15. *定义事件的属性和方法
  16. CLASS LCL_EVENT_RECEIVER DEFINITION.
  17.   PUBLIC SECTION.
  18.     METHODS:
  19. *按钮处理方法
  20.     HANDLE_TOOLBAR
  21.       FOR EVENT TOOLBAR OF CL_GUI_ALV_GRID
  22.         IMPORTING E_OBJECT E_INTERACTIVE,
  23. *用户交互事件处理
  24.     HANDLE_USER_COMMAND
  25.       FOR EVENT USER_COMMAND OF CL_GUI_ALV_GRID
  26.         IMPORTING E_UCOMM .
  27. ENDCLASS.
  28. *实现方法
  29. CLASS LCL_EVENT_RECEIVER IMPLEMENTATION.
  30. *处理按钮事件
  31.   METHOD HANDLE_TOOLBAR.
  32.     DATA:LS_TOOLBAR TYPE STB_BUTTON.
  33.     CLEAR LS_TOOLBAR.
  34.     MOVE 3 TO LS_TOOLBAR-BUTN_TYPE.
  35. *取工具条接口
  36.     APPEND LS_TOOLBAR TO E_OBJECT->MT_TOOLBAR.
  37. *append an icon to show booking table
  38.     CLEAR LS_TOOLBAR.
  39. *加入功能码
  40.     MOVE 'SHOW_DETA' TO LS_TOOLBAR-FUNCTION.
  41. *图标 可以使用showicon系统程序查阅使用的图标
  42.     MOVE ICON_PPE_VNODE TO LS_TOOLBAR-ICON.
  43. *按钮文本和提示
  44.     MOVE '航班明细显示' TO LS_TOOLBAR-QUICKINFO.
  45.     MOVE '航班明细显示'(112) TO LS_TOOLBAR-TEXT.
  46.     MOVE '' TO LS_TOOLBAR-DISABLED.
  47. *添加到工具条
  48.     APPEND LS_TOOLBAR TO E_OBJECT->MT_TOOLBAR.
  49.    ENDMETHOD.
  50. *处理功能码事件
  51.    METHOD HANDLE_USER_COMMAND.
  52.      DATA:LT_ROWS TYPE LVC_T_ROW.
  53.      CASE E_UCOMM.
  54. *定义的按钮事件
  55.              WHEN 'SHOW_DETA'.
  56. *取得所以选择行
  57.         CALL METHOD ALV_GRID->GET_SELECTED_ROWS
  58.               IMPORTING ET_INDEX_ROWS = LT_ROWS.
  59.         CALL METHOD CL_GUI_CFW=>FLUSH.
  60.         IF SY-SUBRC EQ 0.
  61.            MESSAGE S001(ZDEMON) WITH '已选择行!'.
  62. *调用子程序显示选择行内容
  63.            PERFORM MESSDETA TABLES LT_ROWS.
  64.         ENDIF.
  65.      ENDCASE.
  66.     ENDMETHOD.
  67. ENDCLASS.

  68. MODULE STATUS_0100 OUTPUT.
  69.   SET PF-STATUS 'STATUS1'.
  70.   SET TITLEBAR 'ALV TITLEBAR'.
  71. ENDMODULE.                 " STATUS_0100  OUTPUT

  72. MODULE USER_COMMAND_0100 INPUT.
  73. CASE OK_CODE.
  74.   WHEN 'CANCEL'.
  75.     LEAVE PROGRAM.
  76.   WHEN 'BACK' OR 'EXIT'.
  77.     LEAVE TO SCREEN 0.
  78. ENDCASE.
  79. ENDMODULE.                 " USER_COMMAND_0100  INPUT

  80. MODULE CLEAR_OK_CODE OUTPUT.
  81.   CLEAR OK_CODE.
  82. ENDMODULE.                 " CLEAR_OK_CODE  OUTPUT

  83. MODULE DISPLAY_OOALV OUTPUT.
  84.   IF LO_CUSTOM_CONTAINER IS INITIAL. "如果LO_CUSTOM_CONTAINE RDialog容器对象不存在,实例化该对象
  85.     CREATE OBJECT LO_CUSTOM_CONTAINER
  86.            EXPORTING CONTAINER_NAME = S_CONTAINER.
  87.     CREATE OBJECT ALV_GRID "实例化alv对象
  88.            EXPORTING I_PARENT = LO_CUSTOM_CONTAINER.
  89.     CALL METHOD ALV_GRID->SET_TABLE_FOR_FIRST_DISPLAY "调用alv对象的方法显示报表
  90.          EXPORTING I_STRUCTURE_NAME = 'SPFLI'
  91.            CHANGING IT_OUTTAB = IT_SPFLI.
  92. *创建事件
  93.     CREATE OBJECT EVENT_RECEIVER.
  94. *将用户互交事件分配alv
  95.     SET HANDLER EVENT_RECEIVER->HANDLE_USER_COMMAND FOR ALV_GRID.
  96. *将按钮相关事件分配alv
  97.     SET HANDLER EVENT_RECEIVER->HANDLE_TOOLBAR FOR ALV_GRID.
  98. *调用处理工具条处理方法,使自定义工具条生效
  99.     CALL METHOD ALV_GRID->SET_TOOLBAR_INTERACTIVE.
  100.   ENDIF.
  101. ENDMODULE.                 " DISPLAY_OOALV  OUTPUT
  102. *显示选择行内容模块
  103. FORM MESSDETA TABLES P_ET_INDEX_ROWS STRUCTURE LVC_S_ROW.
  104. *定义选择行
  105.   DATA:LS_SELECTED_LINE LIKE LVC_S_ROW,
  106.        LF_ROW_INDEX TYPE LVC_INDEX.
  107. *定义合并字段及分配字段
  108.   DATA:S1(200) TYPE C,
  109.        S2(3) TYPE C.
  110.   S2 = '-'.
  111. *读取所有选择行
  112.   LOOP AT P_ET_INDEX_ROWS INTO LS_SELECTED_LINE.
  113.       LF_ROW_INDEX = LS_SELECTED_LINE-INDEX.
  114.       READ TABLE IT_SPFLI INDEX LF_ROW_INDEX INTO A_SPFLI.
  115.       S1 = '选择行内容'.
  116.       CONCATENATE S1 A_SPFLI-CONNID A_SPFLI-CARRID A_SPFLI-CITYFROM INTO S1 SEPARATED BY S2.
  117.       MESSAGE I002(ZDEMON) WITH S1.
  118.   ENDLOOP.
  119. ENDFORM.
复制代码



回复

使用道具 举报

快速回帖

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

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