Funcation ALV 事件用法(编辑ALV ,直接保存修改数据到DB)

*&---------------------------------------------------------------------*
*& REPORT  Y_ALV_OO_JAMES_4
*&
*&---------------------------------------------------------------------*
*& THIS REPORT SHOW YOU HOW TO USE FUNCATION ALV AND EVENT
*&---------------------------------------------------------------------*
REPORT Y_FCUNCA_ALV_DEMON.

TABLES:YCACS_CTRTBU.
*&---------------------------------------------------------------------*
*&  DATA DEFINE
*&---------------------------------------------------------------------*
DATA:
  CTRTBU_ID TYPE CACS_CTRTBU_ID.

DATA:
  LT_CACS_CTRTBU_TEMP TYPE TABLE OF YCACS_CTRTBU1,
  LT_CACS_CTRTBU      TYPE TABLE OF YCACS_CTRTBU1,
  LS_CACS_CTRTBU      TYPE YCACS_CTRTBU1,

* ALV DEFINIE
  GT_FIELDCAT         TYPE SLIS_T_FIELDCAT_ALV,
  GS_FIELDCAT         TYPE SLIS_FIELDCAT_ALV,
  GS_LAYOUT           TYPE SLIS_LAYOUT_ALV,

* EVENT用
  GT_EVENT            TYPE SLIS_T_EVENT,
  GS_EVENT            TYPE SLIS_ALV_EVENT,

* 当用户选择复选框时,立刻出发DATA_CHANGED 事件.
  GS_GLAY             TYPE LVC_S_GLAY.
*&---------------------------------------------------------------------*
*&  PARAMETERS DEFINITION
*&---------------------------------------------------------------------*
START-OF-SELECTION.
SELECTION-SCREEN BEGIN OF BLOCK B01 WITH FRAME TITLE TEXT-B01.
PARAMETERS: P_CLIK AS CHECKBOX DEFAULT 'X'.
PARAMETERS: P_EDIT AS CHECKBOX DEFAULT 'X'.
SELECT-OPTIONS:S_COMM FOR CTRTBU_ID.
SELECTION-SCREEN END OF BLOCK B01.

*&---------------------------------------------------------------------*
*&  INITIALIZATION
*&---------------------------------------------------------------------*
INITIALIZATION.
  CLEAR:
    LT_CACS_CTRTBU_TEMP,
    LT_CACS_CTRTBU,
    LS_CACS_CTRTBU,
    GT_FIELDCAT,
    GS_LAYOUT,
    GT_EVENT,
    GS_EVENT.
*&---------------------------------------------------------------------*
*&  START-OF-SELECTION
*&---------------------------------------------------------------------*
START-OF-SELECTION.
* GET DATA
  PERFORM GET_DATA.
  PERFORM SET_ALV_FIELDCAT.
  PERFORM SET_ALV_LAYOUT.
  PERFORM SET_ALV_EVENT.
  PERFORM SET_ALV_SHOW.
* 和SE80里自己设置的 GUI_STATUS 进行关联。
  FORM ALV_STATUS_SET USING PT_EXTAB TYPE SLIS_T_EXTAB.

   CLEAR: PT_EXTAB.
*   SET PF-STATUS 'ALV_STATUS'.         " 这是我自己设置的GUI STATUS,具体方法SE80-->GUI STATUS -APPLICATION TOOLBAR
   SET PF-STATUS 'STANDARD_FULLSCREEN'. " 这是我参照SAP 系统标准的GUI STATUS 进行设置的,功能比较齐全,具体方法,复制STANDARD_FULLSCREEN名
  ENDFORM.

* USER_COMMAND 事件
  FORM ALV_USER_COMMAND
    USING P_UCOMM    LIKE SY-UCOMM
          P_SELFIELD TYPE SLIS_SELFIELD.  "  可以获取某一个单元格内的值

    CASE P_UCOMM.
      WHEN 'CLOSE'.
        LEAVE PROGRAM.
      WHEN '&DATA_SAVE'.
        MODIFY YCACS_CTRTBU FROM TABLE LT_CACS_CTRTBU.
        IF SY-SUBRC = 0.
          COMMIT WORK.
          MESSAGE 'SUCCESSS' TYPE 'S'.
        ELSE.
          MESSAGE 'FAIL' TYPE 'E'.
        ENDIF.
      WHEN OTHERS.
    ENDCASE.
  ENDFORM.

* ALV_DATA_CHANGED 事件
  FORM ALV_DATA_CHANGED USING PCL_DATA TYPE REF TO CL_ALV_CHANGED_DATA_PROTOCOL.
    DATA:
      L_NAME(100),
      LS_CELLS TYPE LVC_S_MODI.

    FIELD-SYMBOLS <FS_VALUE>.

    LOOP AT PCL_DATA->MT_MOD_CELLS INTO LS_CELLS.


      CLEAR:LS_CACS_CTRTBU.
      READ TABLE LT_CACS_CTRTBU INTO LS_CACS_CTRTBU INDEX LS_CELLS-ROW_ID.

        CONCATENATE 'LT_CACS_CTRTBU-'LS_CELLS-FIELDNAME INTO L_NAME.
        ASSIGN (L_NAME) TO <FS_VALUE>.
        <FS_VALUE> = LS_CELLS-VALUE.

       MODIFY LT_CACS_CTRTBU INDEX LS_CELLS-ROW_ID FROM LS_CACS_CTRTBU.

    ENDLOOP.

  ENDFORM.
*&---------------------------------------------------------------------*
*&      FORM  SET_ALV_FIELDCAT
*&---------------------------------------------------------------------*
*       THIS PERFORM IS FOR GET ALL FIELDCAT REFERENCE CACS_CTRTBU
*----------------------------------------------------------------------*
*  -->  CACS_CTRTBU         REFERENCE
*  <--  GT_FIELDCAT
*----------------------------------------------------------------------*
FORM SET_ALV_FIELDCAT .
  CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
    EXPORTING
      I_PROGRAM_NAME               = 'Y_FCUNCA_ALV_DEMON'
*     I_INTERNAL_TABNAME           =
      I_STRUCTURE_NAME             = 'CACS_CTRTBU'
*     I_CLIENT_NEVER_DISPLAY       = 'X'
*     I_INCLNAME                   =
*     I_BYPASSING_BUFFER           =
*     I_BUFFER_ACTIVE              =
    CHANGING
      CT_FIELDCAT                  = GT_FIELDCAT
    EXCEPTIONS
      INCONSISTENT_INTERFACE       = 1
      PROGRAM_ERROR                = 2
      OTHERS                       = 3
              .
  IF SY-SUBRC <> 0.
* IMPLEMENT SUITABLE ERROR HANDLING HERE
  ENDIF.

* ALV 显示的时候增加出2列CHECK BOX   DELETE和ADD 列
  GS_FIELDCAT-FIELDNAME      = 'DELETE_LINE'."FIELDNAME
  GS_FIELDCAT-TABNAME        = 'YCACS_CTRTBU'."TABNAME
  GS_FIELDCAT-CHECKBOX       = 'X'.
*  GS_FIELDCAT-COLTEXT   = 'DELETE LINE'##NO_TEXT .
  GS_FIELDCAT-SELTEXT_L      = 'DELETE_LINE'.
  GS_FIELDCAT-SELTEXT_M      = 'DELETE_LINE'.
  GS_FIELDCAT-SELTEXT_S      = 'DELETE_LINE'.

  INSERT GS_FIELDCAT INTO TABLE GT_FIELDCAT.

  CLEAR GS_FIELDCAT.
  GS_FIELDCAT-FIELDNAME      = 'NEW_LINE'."FIELDNAME
  GS_FIELDCAT-TABNAME        = 'YCACS_CTRTBU'."TABNAME
  GS_FIELDCAT-CHECKBOX       = 'X'.
  GS_FIELDCAT-SELTEXT_L      = 'NEW_LINE'.
  GS_FIELDCAT-SELTEXT_M      = 'NEW_LINE'.
  GS_FIELDCAT-SELTEXT_S      = 'NEW_LINE'.

  INSERT GS_FIELDCAT INTO TABLE GT_FIELDCAT.
ENDFORM.
*&---------------------------------------------------------------------*
*&      FORM  SET_ALV_LAYOUT
*&---------------------------------------------------------------------*
*       EDIT THE LAYOUT
*----------------------------------------------------------------------*
*  -->  P1        TEXT
*  <--  GS_LAYOUT        LAYOUT
*----------------------------------------------------------------------*
FORM SET_ALV_LAYOUT .
* SET LAYOUT
  GS_LAYOUT-ZEBRA             = ABAP_TRUE.
  GS_LAYOUT-COLWIDTH_OPTIMIZE = ABAP_TRUE.

* Set edit mode
  IF P_EDIT = ABAP_TRUE.
    GS_LAYOUT-EDIT = ABAP_TRUE.

    GS_GLAY-EDT_CLL_CB = ABAP_TRUE.     " 选中复选款,立刻触发data changed 事件
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*&      FORM  SET_ALV_GUI_STATUS
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
*  -->  P1        TEXT
*  <--  P2        TEXT
*----------------------------------------------------------------------*
FORM SET_ALV_EVENT.
* SET GUI STATUS EVENT
  MOVE 'PF_STATUS_SET'  TO GS_EVENT-NAME.   " ALV的事件名
  MOVE 'ALV_STATUS_SET' TO GS_EVENT-FORM.   " ALV 程序内设置GUI STATUS的语句
  APPEND GS_EVENT TO GT_EVENT.

* SET ALV DATA_CHANGED EVENT
  MOVE 'DATA_CHANGED'     TO GS_EVENT-NAME.
  MOVE 'ALV_DATA_CHANGED' TO GS_EVENT-FORM.
  APPEND GS_EVENT TO GT_EVENT.

ENDFORM.
*&---------------------------------------------------------------------*
*&      FORM  SET_ALV_SHOW
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
*  -->  P1        TEXT
*  <--  P2        TEXT
*----------------------------------------------------------------------*
FORM SET_ALV_SHOW .
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
*     I_INTERFACE_CHECK                 = ' '
*     I_BYPASSING_BUFFER                = ' '
*     I_BUFFER_ACTIVE                   = ' '
      I_CALLBACK_PROGRAM                = 'Y_FCUNCA_ALV_DEMON'
*     I_CALLBACK_PF_STATUS_SET          = ' '
      I_CALLBACK_USER_COMMAND           = 'ALV_USER_COMMAND'
*     I_CALLBACK_TOP_OF_PAGE            = ' '
*     I_CALLBACK_HTML_TOP_OF_PAGE       = ' '
*     I_CALLBACK_HTML_END_OF_LIST       = ' '
      I_STRUCTURE_NAME                  = 'CACS_CTRTBU'
*     I_BACKGROUND_ID                   = ' '
*     I_GRID_TITLE                      =
*     I_GRID_SETTINGS                   = GS_GLAY   " 复选框触发data changed 事件
      IS_LAYOUT                         = GS_LAYOUT
      IT_FIELDCAT                       = GT_FIELDCAT
*     IS_SEL_HIDE                       =
*     I_DEFAULT                         = 'X'
*     I_SAVE                            = ' '
*     IS_VARIANT                        =
     IT_EVENTS                         = GT_EVENT
*     IT_EVENT_EXIT                     =
*     IS_PRINT                          =
*     IS_REPREP_ID                      =
    TABLES
      T_OUTTAB                          = LT_CACS_CTRTBU
   EXCEPTIONS
     PROGRAM_ERROR                     = 1
     OTHERS                            = 2
            .
  IF SY-SUBRC <> 0.
* IMPLEMENT SUITABLE ERROR HANDLING HERE
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&      FORM  GET_DATA
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
*  -->  P1        TEXT
*  <--  P2        TEXT
*----------------------------------------------------------------------*
FORM GET_DATA .
  IF P_CLIK = ABAP_TRUE.

    SELECT * INTO CORRESPONDING FIELDS OF TABLE LT_CACS_CTRTBU_TEMP
      FROM CACS_CTRTBU.

    IF LT_CACS_CTRTBU_TEMP IS NOT INITIAL.
      LT_CACS_CTRTBU = LT_CACS_CTRTBU_TEMP.
    ENDIF.
  ELSE.
    SELECT * INTO CORRESPONDING FIELDS OF TABLE LT_CACS_CTRTBU
      FROM CACS_CTRTBU
      WHERE CTRTBU_ID IN S_COMM.
  ENDIF.

  IF LT_CACS_CTRTBU IS INITIAL.
    MESSAGE 'SORRY, NOT ABLE TO FIND THE DATA' TYPE 'E'.
  ENDIF.

ENDFORM.

 

转载于:https://www.cnblogs.com/HARU/p/9359772.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值