您的位置:首页 > 其它

实现ALV Grid 和A…

2014-06-17 14:53 218 查看
原文地址:Grid 和ALV Tree的拖拽功能">实现ALV Grid 和ALV Tree的拖拽功能作者:sap侠之大者使用class CL_GUI_ALV_TREE
和CL_GUI_ALV_GRID的ON_DRAG、ON_DROP 事件来实现相应的拖拽功能。
ALV Grid的示例程序如下,此程序可以通过拖拽来改变ALV控件数据行的顺序:
1、创建一个600屏幕,只需一个屏幕元素OK_CODE即可
2、创建一个gui status,命名为STATUS,增加对退出按钮的相应
*&---------------------------------------------------------------------*

*& Report YZ_TEST32

*&

*&---------------------------------------------------------------------*

*© from SAPTechnical.com

*&ALV report with drag and drop functionality on its rows

*&---------------------------------------------------------------------*

REPORT YZ_TEST32.

*Structure declaration for T016T

TYPES : BEGIN OF TY_T016T,

BRSCH TYPE BRSCH,

BRTXT TYPE TEXT1_016T,

SPRAS TYPE SPRAS,

END OF TY_T016T.

*Work area and internal table for T016T

DATA : IT_T016T TYPE STANDARD TABLE OF TY_T016T,

WA_T016T TYPE TY_T016T.

DATA OK_CODE LIKE SY-UCOMM.

*class declaration

CLASS LCL_OBJDRAGDROPAPP DEFINITION DEFERRED.

*data declarations for alv

DATA: C_DRAGDROPAPP TYPE REF TO LCL_OBJDRAGDROPAPP,

C_DOCKINGCONT TYPE REF TO CL_GUI_DOCKING_CONTAINER,

C_ALV TYPE REF TO CL_GUI_ALV_GRID,

* reference variable to CL_DRAGDROP:

C_DRAGDROPALV TYPE REF TO CL_DRAGDROP,

IT_LAYOUT TYPE LVC_S_LAYO,

IT_FCAT TYPE LVC_T_FCAT. "Field catalogue

*declarations for handle event

DATA: EFFECT TYPE I,

HANDLE_ALV TYPE I.

*initialization event

INITIALIZATION.

*start of selection event

START-OF-SELECTION.

*select data

PERFORM FETCH_DATA.

*ALV output

PERFORM ALV_OUTPUT.

* Class definitions and method implementation for drag and drop

CLASS LCL_DRAGDROP DEFINITION.

PUBLIC SECTION.

DATA: WA TYPE TY_T016T,

INDEX TYPE I. "Index of Line to be moved

ENDCLASS. "LCL_DRAGDROP DEFINITION

*Application class definition

CLASS LCL_OBJDRAGDROPAPP DEFINITION.

PUBLIC SECTION.

METHODS:

*Handling Event Drag

HANDLE_ALV_DRAG

FOR EVENT ONDRAG

OF CL_GUI_ALV_GRID

IMPORTING E_ROW E_COLUMN E_DRAGDROPOBJ,

*Handling event DROP

HANDLE_ALV_DROP

FOR EVENT ONDROP

OF CL_GUI_ALV_GRID

IMPORTING E_ROW E_COLUMN E_DRAGDROPOBJ.

ENDCLASS. "LCL_objdragdropapp DEFINITION

*Application class implementation

CLASS LCL_OBJDRAGDROPAPP IMPLEMENTATION.

* OnDrag event is used to 'fetch' information from the drag source.

METHOD HANDLE_ALV_DRAG.

DATA: DATAOBJ TYPE REF TO LCL_DRAGDROP,

LINE TYPE TY_T016T.

* Read dragged row

READ TABLE IT_T016T INDEX E_ROW-INDEX INTO LINE.

* create and fill dataobject for events ONDROP

CREATE OBJECT DATAOBJ.

* Remembering row index to move a line

MOVE E_ROW-INDEX TO DATAOBJ->INDEX.

* store the dragged line.

READ TABLE IT_T016T INTO DATAOBJ->WA INDEX E_ROW-INDEX.

* Assigning data object to the refering event parameter

E_DRAGDROPOBJ->OBJECT = DATAOBJ.

ENDMETHOD. "HANDLE_ALV_DRAG

*Event handler for event 'OnDrop'. This event is used

*to use your dragged information in combination with your drop source.

METHOD HANDLE_ALV_DROP.

DATA: DATAOBJ TYPE REF TO LCL_DRAGDROP,

DROP_INDEX TYPE I,

STABLE TYPE LVC_S_STBL.

* Refresh Alv Grid Control without scrolling

STABLE-ROW = 'X'.

STABLE-COL = 'X'.

* Catch-Statement to ensure the drag&drop-Operation is aborted properly.

CATCH SYSTEM-EXCEPTIONS MOVE_CAST_ERROR = 1.

DATAOBJ ?= E_DRAGDROPOBJ->OBJECT.

DELETE IT_T016T INDEX DATAOBJ->INDEX.

INSERT DATAOBJ->WA INTO IT_T016T INDEX E_ROW-INDEX.

*Refreshing the ALV

CALL METHOD C_ALV->REFRESH_TABLE_DISPLAY

EXPORTING

I_SOFT_REFRESH = 'X'

IS_STABLE = STABLE.

ENDCATCH.

IF SY-SUBRC <> 0.

* If anything went wrong aborting the drag and drop operation:

CALL METHOD E_DRAGDROPOBJ->ABORT.

ENDIF.

ENDMETHOD. "HANDLE_ALV_DROP

ENDCLASS. "LCL_objdragdropapp IMPLEMENTATION

*&---------------------------------------------------------------------*

*& Form alv_output

*&---------------------------------------------------------------------*

* text

*----------------------------------------------------------------------*

* --> p1 text

* <-- p2 text

*----------------------------------------------------------------------*

FORM ALV_OUTPUT .

CALL SCREEN 600.

ENDFORM. " alv_output

** Calling the ALV screen with custom container

*On this statement double click it takes you to the screen painter SE51.

*Enter the attributes

*Create a Custom container and name it CC_CONT and OK code as OK_CODE.

*Save check and Activate the screen painter.

*Now a normal screen with number 600 is created which holds the ALV grid.

* PBO of the actual screen ,Here we can give a title and customized menus

*&---------------------------------------------------------------------*

*& Module STATUS_0600 OUTPUT

*&---------------------------------------------------------------------*

* text

*----------------------------------------------------------------------*

MODULE STATUS_0600 OUTPUT.

SET PF-STATUS 'STATUS'.

* SET TITLEBAR 'xxx'.

IF C_ALV IS INITIAL.

PERFORM ALV_CONTROLS.

ENDIF.

ENDMODULE. " STATUS_0600 OUTPUT

*&---------------------------------------------------------------------*

*& Form alv_CONTROLS

*&---------------------------------------------------------------------*

* text

*----------------------------------------------------------------------*

* --> p1 text

* <-- p2 text

*----------------------------------------------------------------------*

FORM ALV_CONTROLS.

* create docking container for alv control

CREATE OBJECT C_DOCKINGCONT

EXPORTING

DYNNR = '600'

EXTENSION = 300

SIDE = CL_GUI_DOCKING_CONTAINER=>DOCK_AT_TOP.

* create alv control

CREATE OBJECT C_ALV

EXPORTING I_PARENT = C_DOCKINGCONT.

* create the application object to handle the ABAP Objects Events

CREATE OBJECT C_DRAGDROPAPP.

* Events alv control

*For Dragging

SET HANDLER C_DRAGDROPAPP->HANDLE_ALV_DRAG FOR C_ALV.

*For Dropping

SET HANDLER C_DRAGDROPAPP->HANDLE_ALV_DROP FOR C_ALV.

* build tree nodes for drag&drop

PERFORM BUILD_HANDLE.

* Fieldcatalogue for ALV

PERFORM ALV_BUILD_FIELDCAT.

* ALV attributes FOR LAYOUT

PERFORM ALV_REPORT_LAYOUT.

* Call ALV GRID

CALL METHOD C_ALV->SET_TABLE_FOR_FIRST_DISPLAY

EXPORTING

IS_LAYOUT = IT_LAYOUT

CHANGING

IT_OUTTAB = IT_T016T

IT_FIELDCATALOG = IT_FCAT

EXCEPTIONS

INVALID_PARAMETER_COMBINATION = 1

PROGRAM_ERROR = 2

TOO_MANY_LINES = 3

OTHERS = 4.

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. "ALV_CONTROLS

*&---------------------------------------------------------------------*

*& Form build_handle

*&---------------------------------------------------------------------*

* text

*----------------------------------------------------------------------*

* --> p1 text

* <-- p2 text

*----------------------------------------------------------------------*

FORM BUILD_HANDLE.

* define a drag & Drop behaviour for the whole grid

CREATE OBJECT C_DRAGDROPALV.

EFFECT = CL_DRAGDROP=>MOVE + CL_DRAGDROP=>COPY.

CALL METHOD C_DRAGDROPALV->ADD

EXPORTING

FLAVOR = 'Line'

DRAGSRC = 'X'

DROPTARGET = 'X'

EFFECT = EFFECT.

*getting the handle for drag and drop

CALL METHOD C_DRAGDROPALV->GET_HANDLE

IMPORTING

HANDLE = HANDLE_ALV.

ENDFORM. " build_handle

*&---------------------------------------------------------------------*

*& Form fetch_data

*&---------------------------------------------------------------------*

* text

*----------------------------------------------------------------------*

* --> p1 text

* <-- p2 text

*----------------------------------------------------------------------*

FORM FETCH_DATA .

* select and display data from t016

SELECT BRTXT BRSCH SPRAS FROM T016T INTO CORRESPONDING FIELDS OF TABLE IT_T016T

WHERE SPRAS = 'EN'.

ENDFORM. " fetch_data

*&---------------------------------------------------------------------*

*& Form alv_report_layout

*&---------------------------------------------------------------------*

* text

*----------------------------------------------------------------------*

* --> p1 text

* <-- p2 text

*----------------------------------------------------------------------*

FORM ALV_REPORT_LAYOUT .

IT_LAYOUT-GRID_TITLE = 'ALV Drag Drop'.

* provide handle to alv control to all rows for same drag & drop behaviour

IT_LAYOUT-S_DRAGDROP-ROW_DDID = HANDLE_ALV.

ENDFORM. " alv_report_layout

*&---------------------------------------------------------------------*

*& Form alv_build_fieldcat

*&---------------------------------------------------------------------*

* text

*----------------------------------------------------------------------*

* --> p1 text

* <-- p2 text

*----------------------------------------------------------------------*

FORM ALV_BUILD_FIELDCAT .

DATA LV_FLDCAT TYPE LVC_S_FCAT.

CLEAR LV_FLDCAT.

LV_FLDCAT-ROW_POS = '1'.

LV_FLDCAT-COL_POS = '1'.

LV_FLDCAT-FIELDNAME = 'BRSCH'.

LV_FLDCAT-TABNAME = 'IT_T016T'.

LV_FLDCAT-OUTPUTLEN = 8.

LV_FLDCAT-SCRTEXT_M = 'Industry'.

APPEND LV_FLDCAT TO IT_FCAT.

CLEAR LV_FLDCAT.

LV_FLDCAT-ROW_POS = '1'.

LV_FLDCAT-COL_POS = '2'.

LV_FLDCAT-FIELDNAME = 'BRTXT'.

LV_FLDCAT-TABNAME = 'IT_T016T'.

LV_FLDCAT-OUTPUTLEN = 15.

LV_FLDCAT-SCRTEXT_M = 'Description'.

APPEND LV_FLDCAT TO IT_FCAT.

CLEAR LV_FLDCAT.

ENDFORM. " alv_build_fieldcat

* PAI module of the screen created. In case we use an interactive ALV or

*for additional functionalities we can create OK codes

*and based on the user command we can do the coding.

*&---------------------------------------------------------------------*

*& Module USER_COMMAND_0600 INPUT

*&---------------------------------------------------------------------*

* text

*----------------------------------------------------------------------*

MODULE USER_COMMAND_0600 INPUT.

OK_CODE = SY-UCOMM.

CASE OK_CODE.

WHEN 'EXIT'.

LEAVE PROGRAM.

WHEN OTHERS.

ENDCASE.

ENDMODULE. " USER_COMMAND_0600 INPUT

ALV
Tree的示例程序:BCALV_GRID_DND_TREE,
可以将左侧ALV TREE的节点拖拽到右侧的ALV上。
实现ALV TREE的树结构拖拽,可以参考上述两个程序。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: