当前位置: 代码迷 >> 综合 >> 实现ALVnbsp;Gridnbsp;和A…
  详细解决方案

实现ALVnbsp;Gridnbsp;和A…

热度:37   发布时间:2024-01-18 14:27:23.0
原文地址:实现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
*&
*&---------------------------------------------------------------------*
*&copy  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  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  Custom  container  and  name  it  CC_CONT  and  OK  code  as  OK_CODE.
*Save  check  and  Activate  the  screen  painter.
*Now  normal  screen  with  number  600  is  created  which  holds  the  ALV  grid.
PBO  of  the  actual  screen  ,Here  we  can  give  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  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的树结构拖拽,可以参考上述两个程序。