zoukankan      html  css  js  c++  java
  • 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.
  • 相关阅读:
    python 命令行传参
    chardet模块下载&安装
    【解决方案】编码问题:UnicodeDecodeError: 'XXX' codec can't decode byte 0xad in position...的错误
    [解决方案]Python脚本运行出现语法错误:IndentationError: unindent does not match any outer indentation level
    perl笔记
    字符串操作
    c++错误及解决方案随记
    本地Java程序访问HTTPs遇到的问题
    学习笔记 : 异常处理
    学习笔记 : python 文件操作
  • 原文地址:https://www.cnblogs.com/HARU/p/9359772.html
Copyright © 2011-2022 走看看