oo_alv的event

*&---------------------------------------------------------------------*
*&  包括              ZLP032_ALV_CLASS_EVENT                           *
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&  包括              Z_SCREEN_ALV_CLASS_EVENT                         *
*&---------------------------------------------------------------------*
CLASS lcl_alv_application DEFINITION.  "定义事件
  PUBLIC SECTION.
    METHODS:
    handle_double                             "执行双击事件
        FOR EVENT double_click OF cl_gui_alv_grid
        IMPORTING e_row e_column es_row_no,
    handle_toolbar
        FOR EVENT toolbar OF cl_gui_alv_grid  "TOOLBAR
            IMPORTING e_object e_interactive,
    handle_user_command      "执行toolbar的UCOMM
    FOR EVENT user_command OF cl_gui_alv_grid
            IMPORTING e_ucomm,
    handle_menu_button
        FOR EVENT menu_button OF cl_gui_alv_grid
            IMPORTING e_object e_ucomm,
    handle_data_changed
       FOR EVENT data_changed OF cl_gui_alv_grid
           IMPORTING er_data_changed,
       handle_hotspot_click
        FOR EVENT hotspot_click OF cl_gui_alv_grid
        IMPORTING e_row_id e_column_id es_row_no.
ENDCLASS.                    "lcl_event_receiver DEFINITION


*&---------------------------------------------------------------------*
*&       Class (Implementation)  lcl_event_receiver
*&---------------------------------------------------------------------*
*        Text
*----------------------------------------------------------------------*


CLASS lcl_alv_application IMPLEMENTATION.   "事件的实现
*-----------------------------------------------------------------
  METHOD handle_double .
*    READ TABLE it_ztcat  INDEX e_row-index.
*    if sy-subrc = 0.
*    message 'shuangji' type 'E'.
*    endif.
*  if sy-dynnr = '0100'.
*    READ TABLE it_MAIN INTO it_MAIN INDEX e_row-index.
*    IF sy-subrc = 0.
*      PERFORM DETAIL_DATA.
*      PERFORM DISPLAY_DETAIL_ALV.
*    ENDIF.
*  elseif sy-dynnr = '0200'.
*    read table it_double_click into it_double_click INDEX e_row-index.
*      if sy-subrc = 0.
*        CLEAR: F_PERID ,F_KNORD.
*        f_perid = p_perid.
*        f_knord = it_double_click-knord.
*        set parameter id 'ZPERID' FIELD F_PERID.
*        SET PARAMETER ID 'ZORDER' FIELD F_KNORD.
*        CALL TRANSACTION 'ZBD002_03' AND SKIP FIRST SCREEN.
*      endif.
*  endif.
  ENDMETHOD.                   "HANDLE_double
*-----------------------TOOLBAR------------------------------------*
  METHOD handle_toolbar.
* ?2.In event handler method for event TOOLBAR: Append own functions
*   by using event parameter E_OBJECT.
    DATA: ls_toolbar  TYPE stb_button.
*....................................................................
* E_OBJECT of event TOOLBAR is of type REF TO CL_ALV_EVENT_TOOLBAR_SET.
* This class has got one attribute, namly MT_TOOLBAR, which
* is a table of type TTB_BUTTON. One line of this table is
* defined by the Structure STB_BUTTON (see data deklaration above).
*

* A remark to the flag E_INTERACTIVE:
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*         'e_interactive' is set, if this event is raised due to
*         the call of 'set_toolbar_interactive' by the user.
*         You can distinguish this way if the event was raised
*         by yourself or by ALV
*         (e.g. in method 'refresh_table_display').
*         An application of this feature is still unknown... :-)
*判断节点是否是根节点
*删除需要的ALV按钮
*把需要的引掉
*    DELETE e_object->mt_toolbar WHERE FUNCTION = '&MB_SUM'.
*    DELETE e_object->mt_toolbar WHERE FUNCTION = '&MB_SUBTOT'.
    DELETE e_object->mt_toolbar WHERE function = '&&SEP05'.
    DELETE e_object->mt_toolbar WHERE function = '&PRINT_BACK'.
    DELETE e_object->mt_toolbar WHERE FUNCTION = '&MB_VIEW'.
    DELETE e_object->mt_toolbar WHERE FUNCTION = '&COL0'.
    DELETE e_object->mt_toolbar WHERE function = '&&SEP06'.
    DELETE e_object->mt_toolbar WHERE function = '&GRAPH'.
    DELETE e_object->mt_toolbar WHERE function = '&&SEP07'.
    DELETE e_object->mt_toolbar WHERE function = '&INFO'.
    DELETE e_object->mt_toolbar WHERE function = ''.
    DELETE e_object->mt_toolbar WHERE function = '&&SEP00'.
    DELETE e_object->mt_toolbar WHERE function = '&CHECK'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&CUT'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&COPY'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&PASTE'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&APPEND'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&INSERT_ROW'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&DELETE_ROW'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&UNDO'.
*    DELETE e_object->mt_toolbar WHERE FUNCTION = '&MB_SUM'.
*    DELETE e_object->mt_toolbar WHERE FUNCTION = '&MB_SUBTOT'.
    DELETE e_object->mt_toolbar WHERE function = '&MB_VIEW'.
    DELETE e_object->mt_toolbar WHERE function = '&GRAPH'.
    DELETE e_object->mt_toolbar WHERE function = '&INFO'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&COPY_ROW'. 
    DELETE e_object->mt_toolbar WHERE function = '&REFRESH'.


    "×××××××××××××××××加按钮 姚伟
*    IF SY-TCODE <> 'ZBD002_22' AND SY-TCODE <> 'ZBD002_23'.
**分配方式
*      CLEAR ls_toolbar.
*      MOVE 3 TO ls_toolbar-butn_type.
*      APPEND ls_toolbar TO e_object->mt_toolbar.
*      CLEAR ls_toolbar.
*      MOVE 'A_AVERAGE' TO ls_toolbar-function.
*      MOVE icon_used_relation TO ls_toolbar-icon.
*      MOVE '每征订代码按总数加权平均扣减'(114) TO ls_toolbar-quickinfo.
*      MOVE 1 TO ls_toolbar-butn_type.
*      MOVE ' ' TO ls_toolbar-disabled.
*      APPEND ls_toolbar TO e_object->mt_toolbar.
*    ENDIF.
*定义 创建alv按钮的宏
    DEFINE set_toolbar.
      clear ls_toolbar.
      move &1 to ls_toolbar-function.
      move &2 to ls_toolbar-icon.
      move &3 to ls_toolbar-butn_type. "按钮类型(父菜单)  ' '不为父菜单
      move &4 to ls_toolbar-quickinfo.
      MOVE &5 TO  ls_toolbar-text.
      move ' ' to ls_toolbar-disabled.
      append ls_toolbar to e_object->mt_toolbar.
    END-OF-DEFINITION.

    CLEAR ls_toolbar.  "分割线
    MOVE '&&SEP07' TO ls_toolbar-function.
    MOVE 3 TO ls_toolbar-butn_type.
    APPEND ls_toolbar TO e_object->mt_toolbar.
*****自己加的按钮1
*ICON_CHANGE后面的不能为空,否则无法实现子菜单。
    set_toolbar 'DO_EXPORT' ICON_EXPORT '' '导出模板' '导出模板'.
    set_toolbar 'DO_IMPORT' ICON_IMPORT '' '导入数据' '导入数据'.
    set_toolbar 'DO_SAVE' icon_system_save '' '保存' '保存'.
*    set_toolbar 'DO_LOG' ICON_PROTOCOL '' '错误日志' .
    set_toolbar '&&SEP08' '' 3 '' ''.    "分隔符
    set_toolbar 'DO_DELETE' ICON_DELETE '' '删除' '删除'.
    set_toolbar 'DO_ADD' ICON_INSERT_FAVORITES '' '添加' '添加'.
    set_toolbar '&&SEP08' '' 3 '' ''.    "分隔符
    set_toolbar 'DO_DBTAB' ICON_EFFECTIVITY_PERIOD '' '察看/修改已维护数据' '察看/修改已维护数据'.


  ENDMETHOD.                    "handle_toolbar
*---------------user_command-----------------------------------*
*****对按钮的监听 姚伟
  METHOD handle_user_command.

    CASE e_ucomm.
*导出数据模板
      WHEN: 'DO_EXPORT'.
        PERFORM DO_EXPORT.
*导入数据
      WHEN: 'DO_IMPORT'.
        PERFORM DO_IMPORT.
*保存
      WHEN: 'DO_SAVE'.
        PERFORM DO_SAVE.
*查看错误日志
*      WHEN: 'DO_LOG'.
*        PERFORM DO_LOG.
*删除
      WHEN: 'DO_DELETE'.
        PERFORM DO_DELETE.
*添加
      WHEN: 'DO_ADD'.
        PERFORM DO_ADD.
*察看修改已维护数据
      WHEN: 'DO_DBTAB'.
        PERFORM DO_DBTAB.
    ENDCASE.

  ENDMETHOD.                           "lcl_event_receiver
*-------------------------------------------------------------------
  METHOD handle_menu_button.
    "××××××××××××××××加子菜单 姚伟
  ENDMETHOD.                    "handle_menu_button
*-------------------------------------------------------------------
  METHOD handle_data_changed.   "用于双击和回车
    "×××××××××××××××数据改变时触发

  ENDMETHOD.                    "handle_menu_button

  METHOD handle_hotspot_click.
  ENDMETHOD.                   "handle_HOTSPOT_CLICK


ENDCLASS.               "lcl_ALV_event_receiver
*&---------------------------------------------------------------------*
*&      Form  DO_EXPORT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM DO_EXPORT .
*倒出模板
  TYPES:BEGIN OF IT_MY_HEAD,
       F_WERKS(4),
       F_MATKL(9),
       F_PZSX(13),
       F_PZXX(13),
       F_CSSX(13),
       F_CSXX(13),
       F_MYSX(13),
       F_MYXX(13),
       F_YFS(13),
       F_NAME(12),
       F_FBUDA(8),
       F_NAME1(12),
       F_FKDAT(8),
       F_ERROR(30),
       F_LINES(9),
       END OF IT_MY_HEAD.
  DATA:IT_HEAD TYPE TABLE OF IT_MY_HEAD WITH HEADER LINE.


  IT_HEAD-F_WERKS = '门店'.
  IT_HEAD-F_MATKL = '商品类目'.
  IT_HEAD-F_PZSX = '品种数上限'.
  IT_HEAD-F_PZXX = '品种数下限'.
  IT_HEAD-F_CSSX = '册数上限'.
  IT_HEAD-F_CSXX = '册数下限'.
  IT_HEAD-F_MYSX = '码洋上限'.
  IT_HEAD-F_MYXX = '码洋下限'.
  IT_HEAD-F_YFS = '新品预分数'.
  IT_HEAD-F_NAME = '创建人'.
  IT_HEAD-F_FBUDA = '创建日期'.
  IT_HEAD-F_NAME1 = '修改人'.
  IT_HEAD-F_FKDAT = '最后修改日期'.
  IT_HEAD-F_ERROR = '错误信息'.
  IT_HEAD-F_LINES = '序号'.
  APPEND IT_HEAD.

 

  CALL FUNCTION 'WS_DOWNLOAD'
     EXPORTING
*        CODEPAGE                = '8400'
         FILENAME                = 'C://商品主配分析表模板.XLS'
         FILETYPE                = 'DAT'
         MODE                    = ''
         TABLES
         DATA_TAB                = IT_HEAD.   "可以不止一行

  IF SY-SUBRC = 0.
    MESSAGE '导出模板成功(C://商品主配分析表模板.XLS)!' TYPE 'I'.
  ELSE.
    MESSAGE '导出模板失败!' TYPE 'I'.
  ENDIF.

ENDFORM.                    " DO_EXPORT
*&---------------------------------------------------------------------*
*&      Form  DO_IMPORT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM DO_IMPORT .
  REFRESH IT_IMPORT.
  CLEAR IT_IMPORT.
*导入数据
  CALL FUNCTION 'UPLOAD'
   EXPORTING
*   CODEPAGE                      = ' '
   FILENAME                      = 'C://商品主配分析表模板.XLS'
     filetype                      = 'DAT'
*   ITEM                          = ' '
*   FILEMASK_MASK                 = ' '
*   FILEMASK_TEXT                 = ' '
*   FILETYPE_NO_CHANGE            = ' '
*   FILEMASK_ALL                  = ' '
*   FILETYPE_NO_SHOW              = ' '
*   LINE_EXIT                     = ' '
*   USER_FORM                     = ' '
*   USER_PROG                     = ' '
*   SILENT                        = 'S'
* IMPORTING
*   FILESIZE                      =
*   CANCEL                        =
*   ACT_FILENAME                  =
*   ACT_FILETYPE                  =
      TABLES
        data_tab                      = IT_IMPORT
   EXCEPTIONS
     conversion_error              = 1
     invalid_table_width           = 2
     invalid_type                  = 3
     no_batch                      = 4
     unknown_error                 = 5
     gui_refuse_filetransfer       = 6
     OTHERS                        = 7
              .

  IF sy-subrc <> 0.
    MESSAGE '文件导入错误!' TYPE 'W'.
  ENDIF.

*ZCPDWB中的地点
  REFRESH IT_WERKS.
  CLEAR IT_WERKS.
  SELECT
  SINGLE
  WERKS
  WERK_NAME AS NAME1
  INTO CORRESPONDING FIELDS OF IT_WERKS
  FROM ZCPDWB.
  SORT IT_WERKS BY WERKS.


*排序
  SORT IT_T023T BY MATKL.
  SORT IT_T001W BY WERKS.

*把第一行的文字描述去掉
  READ TABLE IT_IMPORT INDEX 1.
  IF IT_IMPORT-F_WERKS = '门店'.
    DELETE IT_IMPORT INDEX 1.
  ENDIF.

***检查导入的数据是否有误
  DATA:F_STRING TYPE STRING.
  DATA:WA_ALV_100 LIKE IT_ALV_100.
  DATA:F_ERROR(1).
  CLEAR F_ERROR.

  SORT IT_IMPORT BY F_WERKS F_MATKL.
  REFRESH IT_ALV_100.
  CLEAR IT_ALV_100.


  LOOP AT IT_IMPORT.

    IF IT_IMPORT-F_WERKS = '' AND IT_IMPORT-F_MATKL = ''.
    CONTINUE.
    ENDIF.

    CLEAR WA_ALV_100.
    CLEAR F_STRING.

*判断地点是否存在
    WA_ALV_100-WERKS = IT_IMPORT-F_WERKS.
    READ TABLE IT_T001W WITH KEY WERKS = WA_ALV_100-WERKS BINARY SEARCH.
    IF SY-SUBRC = 0.
      WA_ALV_100-WERK_NAME = IT_T001W-NAME1.
    ELSE.
      CLEAR F_STRING.
      F_ERROR = 'X'.              "有错误的行
      CONCATENATE  WA_ALV_100-WERKS '门店不存在' INTO F_STRING.
      WA_ALV_100-F_ERROR = F_STRING.
    ENDIF.

*判断类目是否存在
    WA_ALV_100-MATKL = IT_IMPORT-F_MATKL.
    READ TABLE IT_T023T WITH KEY MATKL = WA_ALV_100-MATKL BINARY SEARCH.
    IF SY-SUBRC = 0.
      WA_ALV_100-WGBEZ60 = IT_T023T-WGBEZ.   "商品类目描述
    ELSE.
      CLEAR F_STRING.
      F_ERROR = 'X'.              "有错误的行
      CONCATENATE   '商品类目' WA_ALV_100-MATKL '不存在' INTO F_STRING.
      WA_ALV_100-F_ERROR = F_STRING.
    ENDIF.

*判断商品类目是否有重复的
    READ TABLE IT_ALV_100 WITH KEY MATKL = WA_ALV_100-MATKL BINARY SEARCH.
    IF SY-SUBRC = 0.
      CLEAR F_STRING.
      F_ERROR = 'X'.              "有错误的行
      CONCATENATE   '商品类目' WA_ALV_100-MATKL '存在重复' INTO F_STRING.
      WA_ALV_100-F_ERROR = F_STRING.
    ENDIF.

    WA_ALV_100-PZSX = IT_IMPORT-F_PZSX.
    WA_ALV_100-PZXX = IT_IMPORT-F_PZXX.
    IF WA_ALV_100-PZXX > WA_ALV_100-PZSX.
      F_ERROR = 'X'.              "有错误的行
      WA_ALV_100-F_ERROR = '品种下限大于上限'.
    ENDIF.
    WA_ALV_100-CSSX = IT_IMPORT-F_CSSX.
    WA_ALV_100-CSXX = IT_IMPORT-F_CSXX.
    IF WA_ALV_100-CSXX > WA_ALV_100-CSSX.
      F_ERROR = 'X'.              "有错误的行
      WA_ALV_100-F_ERROR = '册数下限大于上限'.
    ENDIF.
    WA_ALV_100-MYSX = IT_IMPORT-F_MYSX.
    WA_ALV_100-MYXX = IT_IMPORT-F_MYXX.
    IF WA_ALV_100-MYXX > WA_ALV_100-MYSX.
      F_ERROR = 'X'.              "有错误的行
      WA_ALV_100-F_ERROR = '码洋下限大于上限'.
    ENDIF.
    WA_ALV_100-YFS = IT_IMPORT-F_YFS.
    WA_ALV_100-NAME = IT_IMPORT-F_NAME.
    WA_ALV_100-NAME1 = IT_IMPORT-F_NAME1.
    READ TABLE IT_WERKS WITH KEY WERKS = WA_ALV_100-WERKS.
    IF SY-SUBRC = 0.    "若地点存在说明是修改的时间
      WA_ALV_100-FKDAT = SY-DATUM.
    ELSE.               "若地点不存在说明是创建时间
      WA_ALV_100-FBUDA = SY-DATUM.
    ENDIF.
    APPEND WA_ALV_100 TO IT_ALV_100.
    CLEAR WA_ALV_100.
  ENDLOOP.
*更新屏幕ALV
  SORT IT_ALV_100 BY F_ERROR DESCENDING.   "让错误的放在前面
  DATA:F_LINES TYPE I.          "序号
  F_LINES = 0.
  LOOP AT IT_ALV_100 ASSIGNING <WA>.
    F_LINES = F_LINES + 1.
    <WA>-F_LINES = F_LINES.
  ENDLOOP.
  CALL METHOD G_ALV_grid->refresh_table_display.

  IF F_ERROR = 'X'.
*存在错误的行
    MESSAGE '存在错误的行信息!' TYPE 'I'.
  ENDIF.

ENDFORM.                    " DO_IMPORT
*&---------------------------------------------------------------------*
*&      Form  DO_SAVE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM DO_SAVE .
*屏幕上的更新到内表
  DATA: g_ALV_grid_2 TYPE REF TO cl_gui_alv_grid.
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
     IMPORTING
*     ET_EXCLUDING          =
*     E_FLG_NO_HTML         =
*     E_REPID               =
       e_grid                = g_ALV_grid_2
*     ES_LAYOUT_KKBLO       =
             .
*  CALL METHOD g_ALV_grid->check_changed_data."用来触发DATACHANGE方法的


***判断是否还有错误  若有则不更新数据库表,报错要求修改

*删除错误信息
  DATA:F_STRING TYPE STRING.
  DATA:F_ERROR(1).                      "是否还有错
  DATA:IT_ALV_100_2 LIKE TABLE OF IT_MY_ALV_100 WITH HEADER LINE.
  DATA:WA_ALV_2 LIKE IT_MY_ALV_100.
  WA_ALV_2-F_ERROR = ''.
  MODIFY IT_ALV_100 FROM WA_ALV_2  TRANSPORTING F_ERROR WHERE F_ERROR <> ''.

*判断是否还有错误
  CLEAR:F_ERROR,F_STRING.
  SORT IT_ALV_100 BY WERKS MATKL.
  IT_ALV_100_2[] = IT_ALV_100[].
  LOOP AT IT_ALV_100 ASSIGNING <WA>.

*判断地点是否存在
    READ TABLE IT_T001W WITH KEY WERKS = <WA>-WERKS BINARY SEARCH.
    IF SY-SUBRC = 0.
      IT_ALV_100-WERK_NAME = IT_T001W-NAME1.
    ELSE.
      CLEAR F_STRING.
      F_ERROR = 'X'.              "还有错误的行
      CONCATENATE  <WA>-WERKS '门店不存在' INTO F_STRING.
      <WA>-F_ERROR = F_STRING.
    ENDIF.

*判断类目是否存在
    READ TABLE IT_T023T WITH KEY MATKL = <WA>-MATKL BINARY SEARCH.
    IF SY-SUBRC = 0.
      <WA>-WGBEZ60 = IT_T023T-WGBEZ.   "商品类目描述
    ELSE.
      CLEAR F_STRING.
      F_ERROR = 'X'.              "还有错误的行
      CONCATENATE   '商品类目' <WA>-MATKL '不存在' INTO F_STRING.
      <WA>-F_ERROR = F_STRING.
    ENDIF.

*判断商品类目是否有重复的
    DELETE IT_ALV_100_2 INDEX 1.  "这个有用把当前行和剩下的比较
    READ TABLE IT_ALV_100_2  WITH KEY MATKL = <WA>-MATKL.
    IF SY-SUBRC = 0.
      CLEAR F_STRING.
      F_ERROR = 'X'.              "还有错误的行
      CONCATENATE   '商品类目' <WA>-MATKL '存在重复' INTO F_STRING.
      <WA>-F_ERROR = F_STRING.
    ENDIF.

    IF <WA>-PZXX > <WA>-PZSX.
      F_ERROR = 'X'.              "还有错误的行
      <WA>-F_ERROR = '品种下限大于上限'.
    ENDIF.
    IF <WA>-CSXX > <WA>-CSSX.
      F_ERROR = 'X'.              "还有错误的行
      <WA>-F_ERROR = '册数下限大于上限'.
    ENDIF.
    IF <WA>-MYXX > <WA>-MYSX.
      F_ERROR = 'X'.              "还有错误的行
      <WA>-F_ERROR = '码洋下限大于上限'.
    ENDIF.
  ENDLOOP.

  IF F_ERROR = 'X'.
*还存在错误的行
*更新屏幕ALV
    SORT IT_ALV_100 BY F_ERROR DESCENDING  .   "让错误的放在前面
    DATA:F_LINES TYPE I.          "序号
    F_LINES = 0.
    LOOP AT IT_ALV_100 ASSIGNING <WA>.
      F_LINES = F_LINES + 1.
      <WA>-F_LINES = F_LINES.
    ENDLOOP.
    CALL METHOD G_ALV_grid->refresh_table_display.
    MESSAGE '存在错误的行信息!' TYPE 'I'.
  ELSE.
*没有错误的行了
    REFRESH IT_ALV_100_2.
    CLEAR IT_ALV_100_2.
*删除数据库中存在的WERKS.
    IT_ALV_100_2[] = IT_ALV_100[].
    DELETE ADJACENT DUPLICATES FROM IT_ALV_100_2 COMPARING WERKS.
    LOOP AT IT_ALV_100_2.
      DELETE FROM ZCPDWB WHERE WERKS = IT_ALV_100_2-WERKS.
    ENDLOOP.
    IF SY-SUBRC = 0.
      COMMIT WORK.
    ELSE.
      ROLLBACK WORK.
      MESSAGE '删除数据库数据失败!' TYPE 'E'.
      EXIT.
    ENDIF.

    DATA: F_ANSWER(1).
    CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
      EXPORTING
*         DEFAULTOPTION        = 'Y'
        TEXTLINE1            = '数据将保存到数据库中,是否确定要进行?'
*         TEXTLINE2            = ' '
        TITEL                = '保存提示'
*         START_COLUMN         = 25
*         START_ROW            = 6
       CANCEL_DISPLAY       = 'X'
     IMPORTING
       ANSWER               = F_ANSWER
              .
    CASE: F_ANSWER.
      WHEN: 'J'.
        INSERT ZCPDWB FROM TABLE IT_ALV_100.
        IF SY-SUBRC = 0.
          COMMIT WORK.
          MESSAGE '保存数据成功' TYPE 'I'.
          CLEAR IT_ALV_100.
          REFRESH IT_ALV_100.
          CALL METHOD G_ALV_grid->refresh_table_display.
        ELSE.
          ROLLBACK WORK.
          MESSAGE '保存数据有错' TYPE 'I'.
          EXIT.
        ENDIF.

      WHEN: 'N' OR 'A'.
    ENDCASE.


  ENDIF.

ENDFORM.                    " DO_SAVE
*&---------------------------------------------------------------------*
*&      Form  DO_DBTAB
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM DO_DBTAB .
  CALL SCREEN '200'.
ENDFORM.                    " DO_DBTAB
*&---------------------------------------------------------------------*
*&      Form  DO_DELETE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM DO_DELETE .
  DATA: lt_rows TYPE lvc_t_row.
  DATA: f_lines TYPE i.
  DATA:wa_it_alv_l LIKE it_alv_100.
  DATA:wa_lt_row TYPE lvc_s_row .

  CALL METHOD g_ALV_grid->get_selected_rows     "得到选中的
             IMPORTING
               et_index_rows = lt_rows.

  IF lt_rows[] IS NOT INITIAL .
    DATA: F_ANSWER(1).
    CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
      EXPORTING
*         DEFAULTOPTION        = 'Y'
        TEXTLINE1            = '确定要删除选中的行?'
*         TEXTLINE2            = ' '
        TITEL                = '提示'
*         START_COLUMN         = 25
*         START_ROW            = 6
       CANCEL_DISPLAY       = 'X'
     IMPORTING
       ANSWER               = F_ANSWER
              .
    CASE: F_ANSWER.
      WHEN: 'J'.
        CLEAR wa_lt_row.
        DATA:IT_ALV_100_12 LIKE TABLE OF IT_MY_ALV_100 WITH HEADER LINE.
        LOOP AT lt_rows INTO wa_lt_row.
          READ TABLE IT_ALV_100 INDEX wa_lt_row-index.
          APPEND IT_ALV_100 TO IT_ALV_100_12.
        ENDLOOP.
        LOOP AT  IT_ALV_100_12.
          DELETE TABLE IT_ALV_100 FROM IT_ALV_100_12.
        ENDLOOP.
        CALL METHOD G_ALV_grid->refresh_table_display.
      WHEN: 'N' OR 'A'.
    ENDCASE.

  ELSE.
    MESSAGE '没有选中行!' TYPE 'I'.
  ENDIF.

ENDFORM.                    " DO_DELETE
*&---------------------------------------------------------------------*
*&      Form  DO_ADD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM DO_ADD .
  F_SCREEN = '100'.
  CALL SCREEN 400 STARTING AT 20 20.
ENDFORM.                    " DO_ADD

 

 

 

 

 

 

例子2:
*&---------------------------------------------------------------------*
*&  包括              ZBD002_40_CLASS                                  *
*&---------------------------------------------------------------------*
*  类的定义-按征订代码统计
CLASS  lcl_alv_100 DEFINITION.
  PUBLIC SECTION.
    METHODS:
    handle_double                             "执行双击事件
        FOR EVENT double_click OF cl_gui_alv_grid
        IMPORTING e_row e_column es_row_no ,
    handle_toolbar
        FOR EVENT toolbar OF cl_gui_alv_grid  "TOOLBAR
            IMPORTING e_object e_interactive,
    handle_user_command                       "执行toolbar的UCOMM
    FOR EVENT user_command OF cl_gui_alv_grid
            IMPORTING e_ucomm,
    handle_data_changed
       FOR EVENT data_changed OF cl_gui_alv_grid
           IMPORTING er_data_changed.
ENDCLASS.                                     "lcl_event_receiver DEFINITION
*  类执行-按征订代码统计
CLASS lcl_alv_100 IMPLEMENTATION.
*-----------------------------------------------------------------
  METHOD handle_double .
    CALL METHOD g_grid_100->check_changed_data.
    CASE e_column-fieldname.
      WHEN 'BOOKC'.
        CLEAR: f_bookc_200,f_cb_200,f_qj_200.
*  双击进入征订代码+地点统计
        READ TABLE it_alv_bookc INTO it_alv_bookc INDEX e_row-index.
        IF sy-subrc = 0.
          f_bookc_200 = it_alv_bookc-bookc.    "ALV上面的字段
          f_cb_200 = it_alv_bookc-ky_cb.
          f_qj_200 = it_alv_bookc-qj_fh.
          PERFORM get_table_2 USING it_alv_bookc-bookc.
        ENDIF.
        CALL SCREEN 200.
*  双击请减发货数,可以列出发货的转储信息,双击转储单号,可以修改未发货过账并
*  且没有截单的转储单数量
      WHEN 'QJ_FH'.
        READ TABLE it_alv_bookc INTO it_alv_bookc INDEX e_row-index.
        IF sy-subrc = 0.
          IF it_alv_bookc-qj_menge > it_alv_bookc-qj_fh.
* 如果有直配客户,就只能到明细去做确认
            PERFORM check_zpkh_bookc.
* 取发货的转储明细
            PERFORM get_data_ekpo USING p_perid it_alv_bookc-bookc.
            REFRESH it_alv_ekpo.
            CLEAR   it_alv_ekpo.
            it_alv_ekpo[] = it_ekpo[].

            DELETE it_alv_ekpo WHERE zzbookc <> it_alv_bookc-bookc.
*  根据单据数量 结单状态 发货数量 计算可减少的数量
            LOOP AT it_alv_ekpo INTO it_alv_ekpo .
              IF it_alv_ekpo-zclose_order = ''.
                it_alv_ekpo-shy_m = it_alv_ekpo-menge - it_alv_ekpo-glmng.
              ELSE.
                it_alv_ekpo-shy_m = 0.
              ENDIF.
              MODIFY it_alv_ekpo FROM it_alv_ekpo INDEX sy-tabix.
            ENDLOOP.

            f_screen = '0100'.
            CLEAR r_menge.
            PERFORM alv_list_ekpo USING f_screen.
            it_alv_bookc-qj_fh = it_alv_bookc-qj_fh + r_menge.
            IF it_alv_bookc-qj_fh <= 0.
              it_alv_bookc-qj_fh = 0.
            ENDIF.
            MODIFY it_alv_bookc FROM it_alv_bookc INDEX e_row-index.
          ENDIF.
        ENDIF.
    ENDCASE.
    CALL METHOD cl_gui_cfw=>set_new_ok_code
      EXPORTING
        new_code = 'OK'.
  ENDMETHOD.                   "HANDLE_double

*-----------------------TOOLBAR------------------------------------*
  METHOD handle_toolbar.
*删除需要的ALV按钮
    DELETE e_object->mt_toolbar WHERE function = '&MB_SUM'.
    DELETE e_object->mt_toolbar WHERE function = '&MB_SUBTOT'.
    DELETE e_object->mt_toolbar WHERE function = '&&SEP05'.
    DELETE e_object->mt_toolbar WHERE function = '&PRINT_BACK'.
    DELETE e_object->mt_toolbar WHERE function = '&MB_VIEW'.
    DELETE e_object->mt_toolbar WHERE function = '&COL0'.
    DELETE e_object->mt_toolbar WHERE function = '&&SEP06'.
    DELETE e_object->mt_toolbar WHERE function = '&GRAPH'.
    DELETE e_object->mt_toolbar WHERE function = '&&SEP07'.
    DELETE e_object->mt_toolbar WHERE function = '&INFO'.
    DELETE e_object->mt_toolbar WHERE function = ''.
    DELETE e_object->mt_toolbar WHERE function = '&&SEP00'.
    DELETE e_object->mt_toolbar WHERE function = '&CHECK'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&CUT'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&COPY'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&PASTE'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&APPEND'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&INSERT_ROW'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&DELETE_ROW'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&UNDO'.
*    DELETE e_object->mt_toolbar WHERE FUNCTION = '&MB_SUM'.
*    DELETE e_object->mt_toolbar WHERE FUNCTION = '&MB_SUBTOT'.
    DELETE e_object->mt_toolbar WHERE function = '&MB_VIEW'.
    DELETE e_object->mt_toolbar WHERE function = '&GRAPH'.
    DELETE e_object->mt_toolbar WHERE function = '&INFO'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&COPY_ROW'. 
    DELETE e_object->mt_toolbar WHERE function = '&REFRESH'.

*对同个征订代码合并追加和请减
    CLEAR ls_toolbar.
    MOVE 'HB' TO ls_toolbar-function.
    MOVE '合并'(114) TO ls_toolbar-quickinfo.
    MOVE '合并' TO  ls_toolbar-text.
    MOVE ' ' TO ls_toolbar-disabled.
    APPEND ls_toolbar TO e_object->mt_toolbar.

    CLEAR ls_toolbar.  "分割线
    MOVE '&&SEP07' TO ls_toolbar-function.
    MOVE 3 TO ls_toolbar-butn_type.
    APPEND ls_toolbar TO e_object->mt_toolbar.

*  确认选择
    CLEAR ls_toolbar.
    MOVE 'ZHJ' TO ls_toolbar-function.
    MOVE '确认追加'(114) TO ls_toolbar-quickinfo.
    MOVE '确认追加' TO  ls_toolbar-text.
    MOVE ' ' TO ls_toolbar-disabled.
    APPEND ls_toolbar TO e_object->mt_toolbar.

    CLEAR ls_toolbar.  "分割线
    MOVE '&&SEP07' TO ls_toolbar-function.
    MOVE 3 TO ls_toolbar-butn_type.
    APPEND ls_toolbar TO e_object->mt_toolbar.

*  确认选择
    CLEAR ls_toolbar.
    MOVE 'QJ' TO ls_toolbar-function.
    MOVE '确认请减'(114) TO ls_toolbar-quickinfo.
    MOVE '确认请减' TO  ls_toolbar-text.
    MOVE ' ' TO ls_toolbar-disabled.
    APPEND ls_toolbar TO e_object->mt_toolbar.

    CLEAR ls_toolbar.  "分割线
    MOVE '&&SEP07' TO ls_toolbar-function.
    MOVE 3 TO ls_toolbar-butn_type.
    APPEND ls_toolbar TO e_object->mt_toolbar.

*  查看已确认
    CLEAR ls_toolbar.
    MOVE 'LIST' TO ls_toolbar-function.
    MOVE '查看已确认明细'(114) TO ls_toolbar-quickinfo.
    MOVE '查看已确认明细' TO  ls_toolbar-text.
    MOVE ' ' TO ls_toolbar-disabled.
    APPEND ls_toolbar TO e_object->mt_toolbar.

    CLEAR ls_toolbar.  "分割线
    MOVE '&&SEP07' TO ls_toolbar-function.
    MOVE 3 TO ls_toolbar-butn_type.
    APPEND ls_toolbar TO e_object->mt_toolbar.

*  查看被锁的征订代码
    CLEAR ls_toolbar.
    MOVE 'LOCK' TO ls_toolbar-function.
    MOVE '查看被锁的征订代码'(114) TO ls_toolbar-quickinfo.
    MOVE '查看被锁的征订代码' TO  ls_toolbar-text.
    MOVE ' ' TO ls_toolbar-disabled.
    APPEND ls_toolbar TO e_object->mt_toolbar.
  ENDMETHOD.                    "handle_toolbar
*---------------user_command-----------------------------------*
  METHOD handle_user_command.
    IF g_grid_100 IS INITIAL.
      EXIT.
    ENDIF.
    CALL METHOD g_grid_100->check_changed_data.
    PERFORM process_ucomm_100 USING e_ucomm.
  ENDMETHOD.                           "lcl_event_receiver
*-------------------------------------------------------------------
  METHOD handle_data_changed.
    PERFORM data_changed_100 USING er_data_changed.
  ENDMETHOD.                    "handle_menu_button
ENDCLASS.                    "lcl_ALV_event_receiver

*  类的定义-按征订代码+地点统计
CLASS lcl_alv_200 DEFINITION.
  PUBLIC SECTION.
    METHODS:
    handle_double                             "执行双击事件
        FOR EVENT double_click OF cl_gui_alv_grid
        IMPORTING e_row e_column es_row_no ,
    handle_toolbar
        FOR EVENT toolbar OF cl_gui_alv_grid  "TOOLBAR
            IMPORTING e_object e_interactive,
    handle_user_command                       "执行toolbar的UCOMM
    FOR EVENT user_command OF cl_gui_alv_grid
            IMPORTING e_ucomm,
    handle_data_changed
       FOR EVENT data_changed OF cl_gui_alv_grid
           IMPORTING er_data_changed.
ENDCLASS.                                     "lcl_event_receiver DEFINITION
*  类执行-按征订代码统计
CLASS lcl_alv_200 IMPLEMENTATION.
*-----------------------------------------------------------------
  METHOD handle_double .
    DATA:wa_zs901 LIKE it_zs901,
    wa_alv_bookc_werks LIKE it_alv_bookc_werks.
    CALL METHOD g_grid_200->check_changed_data.
    CASE e_column-fieldname.
      WHEN 'BOOKC'.
        CLEAR: f_bookc_300,f_werks,f_cb_300,f_qj_300,wa_alv_bookc_werks.
        READ TABLE it_alv_bookc_werks INTO wa_alv_bookc_werks INDEX e_row-index.
        IF sy-subrc = 0.
          f_bookc_300 = wa_alv_bookc_werks-bookc.
          f_werks     = wa_alv_bookc_werks-werks.
*获取可以储备数,这个数会随着确认数而变化的,确认时会修改这个表
          LOOP AT it_zs901 INTO wa_zs901 WHERE bookc = wa_alv_bookc_werks-bookc.
            f_cb_300 = f_cb_300 + wa_zs901-menge_41.
          ENDLOOP.
          f_qj_300    = wa_alv_bookc_werks-qj_fh.
          PERFORM get_table_3 USING wa_alv_bookc_werks.
          CALL SCREEN 300.
        ENDIF.

      WHEN 'QJ_FH'.
        READ TABLE it_alv_bookc_werks INTO it_alv_bookc_werks INDEX e_row-index.
        IF sy-subrc = 0.
          IF it_alv_bookc_werks-qj_menge > it_alv_bookc_werks-qj_fh .
*  如果有直配客户就只能到明细里面去做修改
            PERFORM check_zpkh.
            PERFORM get_data_ekpo USING p_perid it_alv_bookc_werks-bookc.
            REFRESH it_alv_ekpo.
            CLEAR   it_alv_ekpo.
            it_alv_ekpo[] = it_ekpo[].
            DELETE it_alv_ekpo WHERE werks <> it_alv_bookc_werks-werks OR
                                     zzbookc <> it_alv_bookc_werks-bookc.
*  根据单据数量 结单状态 发货数量 计算可减少的数量
            LOOP AT it_alv_ekpo INTO it_alv_ekpo .
              IF it_alv_ekpo-zclose_order = ''.
                it_alv_ekpo-shy_m = it_alv_ekpo-menge - it_alv_ekpo-glmng.
              ELSE.
                it_alv_ekpo-shy_m = 0.
              ENDIF.
              MODIFY it_alv_ekpo FROM it_alv_ekpo INDEX sy-tabix.
            ENDLOOP.
            f_screen = '0200'.
            CLEAR r_menge.
            PERFORM alv_list_ekpo USING f_screen.
          ENDIF.
        ENDIF.

    ENDCASE.
    CALL METHOD cl_gui_cfw=>set_new_ok_code
      EXPORTING
        new_code = 'OK'.
  ENDMETHOD.                   "HANDLE_double

*-----------------------TOOLBAR------------------------------------*
  METHOD handle_toolbar.
*删除需要的ALV按钮
    DELETE e_object->mt_toolbar WHERE function = '&MB_SUM'.
    DELETE e_object->mt_toolbar WHERE function = '&MB_SUBTOT'.
    DELETE e_object->mt_toolbar WHERE function = '&&SEP05'.
    DELETE e_object->mt_toolbar WHERE function = '&PRINT_BACK'.
    DELETE e_object->mt_toolbar WHERE function = '&MB_VIEW'.
    DELETE e_object->mt_toolbar WHERE function = '&COL0'.
    DELETE e_object->mt_toolbar WHERE function = '&&SEP06'.
    DELETE e_object->mt_toolbar WHERE function = '&GRAPH'.
    DELETE e_object->mt_toolbar WHERE function = '&&SEP07'.
    DELETE e_object->mt_toolbar WHERE function = '&INFO'.
    DELETE e_object->mt_toolbar WHERE function = ''.
    DELETE e_object->mt_toolbar WHERE function = '&&SEP00'.
    DELETE e_object->mt_toolbar WHERE function = '&CHECK'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&CUT'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&COPY'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&PASTE'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&APPEND'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&INSERT_ROW'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&DELETE_ROW'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&UNDO'.
*    DELETE e_object->mt_toolbar WHERE FUNCTION = '&MB_SUM'.
*    DELETE e_object->mt_toolbar WHERE FUNCTION = '&MB_SUBTOT'.
    DELETE e_object->mt_toolbar WHERE function = '&MB_VIEW'.
    DELETE e_object->mt_toolbar WHERE function = '&GRAPH'.
    DELETE e_object->mt_toolbar WHERE function = '&INFO'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&COPY_ROW'. 
    DELETE e_object->mt_toolbar WHERE function = '&REFRESH'.

*  追加确认
    CLEAR ls_toolbar.
    MOVE 'ZHJ' TO ls_toolbar-function.
    MOVE '确认追加'(114) TO ls_toolbar-quickinfo.
    MOVE '确认追加' TO  ls_toolbar-text.
    MOVE ' ' TO ls_toolbar-disabled.
    APPEND ls_toolbar TO e_object->mt_toolbar.

    CLEAR ls_toolbar.  "分割线
    MOVE '&&SEP07' TO ls_toolbar-function.
    MOVE 3 TO ls_toolbar-butn_type.
    APPEND ls_toolbar TO e_object->mt_toolbar.

*  确认选择
    CLEAR ls_toolbar.
    MOVE 'QJ' TO ls_toolbar-function.
    MOVE '确认请减'(114) TO ls_toolbar-quickinfo.
    MOVE '确认请减' TO  ls_toolbar-text.
    MOVE ' ' TO ls_toolbar-disabled.
    APPEND ls_toolbar TO e_object->mt_toolbar.

    CLEAR ls_toolbar.  "分割线
    MOVE '&&SEP07' TO ls_toolbar-function.
    MOVE 3 TO ls_toolbar-butn_type.
    APPEND ls_toolbar TO e_object->mt_toolbar.

*  查看已确认
    CLEAR ls_toolbar.
    MOVE 'LIST' TO ls_toolbar-function.
    MOVE '查看已确认明细'(114) TO ls_toolbar-quickinfo.
    MOVE '查看已确认明细' TO  ls_toolbar-text.
    MOVE ' ' TO ls_toolbar-disabled.
    APPEND ls_toolbar TO e_object->mt_toolbar.

    CLEAR ls_toolbar.  "分割线
    MOVE '&&SEP07' TO ls_toolbar-function.
    MOVE 3 TO ls_toolbar-butn_type.
    APPEND ls_toolbar TO e_object->mt_toolbar.

*  查看被锁的征订代码
    CLEAR ls_toolbar.
    MOVE 'LOCK' TO ls_toolbar-function.
    MOVE '查看被锁的征订代码'(114) TO ls_toolbar-quickinfo.
    MOVE '查看被锁的征订代码' TO  ls_toolbar-text.
    MOVE ' ' TO ls_toolbar-disabled.
    APPEND ls_toolbar TO e_object->mt_toolbar.

  ENDMETHOD.                    "handle_toolbar
*---------------user_command-----------------------------------*
  METHOD handle_user_command.
    IF g_grid_200 IS INITIAL.
      EXIT.
    ENDIF.
    CALL METHOD g_grid_200->check_changed_data.
    PERFORM process_ucomm_200 USING e_ucomm.
  ENDMETHOD.                           "lcl_event_receiver
*-------------------------------------------------------------------
  METHOD handle_data_changed.
    PERFORM data_changed_200 USING er_data_changed.
  ENDMETHOD.                    "handle_menu_button
ENDCLASS.                    "lcl_ALV_event_receiver

*  类的定义-明细
CLASS lcl_alv_300 DEFINITION.
  PUBLIC SECTION.
    METHODS:
    handle_double                             "执行双击事件
        FOR EVENT double_click OF cl_gui_alv_grid
        IMPORTING e_row e_column es_row_no ,
    handle_toolbar
        FOR EVENT toolbar OF cl_gui_alv_grid  "TOOLBAR
            IMPORTING e_object e_interactive,
    handle_user_command                       "执行toolbar的UCOMM
    FOR EVENT user_command OF cl_gui_alv_grid
            IMPORTING e_ucomm,
    handle_data_changed
       FOR EVENT data_changed OF cl_gui_alv_grid
           IMPORTING er_data_changed.
ENDCLASS.                                     "lcl_event_receiver DEFINITION
*  类执行-明细
CLASS lcl_alv_300 IMPLEMENTATION.
*-----------------------------------------------------------------
  METHOD handle_double .
    DATA: w_menge TYPE i.
    CALL METHOD g_grid_100->check_changed_data.
    CASE e_column-fieldname.
      WHEN 'SHY_FH'.
        READ TABLE it_alv_mingxi INTO it_alv_mingxi INDEX e_row-index.
        IF sy-subrc = 0.
          CLEAR w_menge.
          w_menge = it_alv_mingxi-qj_fh + it_alv_mingxi-shy_fh.
          IF it_alv_mingxi-qj_menge >  w_menge .
            PERFORM get_data_ekpo USING p_perid it_alv_bookc-bookc.
            REFRESH it_alv_ekpo.
            CLEAR   it_alv_ekpo.
            it_alv_ekpo[] = it_ekpo[].
*  非直发的转储单不能分配到直发客户,
            IF it_alv_mingxi-zpkh = ''.
              DELETE it_alv_ekpo WHERE zzbookc <> it_alv_mingxi-bookc OR
                                       werks   <> it_alv_mingxi-werks OR
                                       kunnr   <> ''.
            ELSE.
              DELETE it_alv_ekpo WHERE zzbookc <> it_alv_mingxi-bookc OR
                                       werks   <> it_alv_mingxi-werks OR
                                       kunnr   <> it_alv_mingxi-kunnr.
            ENDIF.
            it_alv_ekpo-zpkh = it_alv_mingxi-zpkh.
            MODIFY it_alv_ekpo FROM it_alv_ekpo TRANSPORTING zpkh WHERE ebeln <> ''.
*  根据单据数量 结单状态 发货数量 计算可减少的数量
            LOOP AT it_alv_ekpo INTO it_alv_ekpo .
              IF it_alv_ekpo-zclose_order = ''.
                it_alv_ekpo-shy_m = it_alv_ekpo-menge - it_alv_ekpo-glmng.
              ELSE.
                it_alv_ekpo-shy_m = 0.
              ENDIF.
              MODIFY it_alv_ekpo FROM it_alv_ekpo INDEX sy-tabix.
            ENDLOOP.
            CLEAR r_menge.
            f_screen = '0300'.
            PERFORM alv_list_ekpo USING f_screen.
          ENDIF.
        ENDIF.
    ENDCASE.
  ENDMETHOD.                   "HANDLE_double

*-----------------------TOOLBAR------------------------------------*
  METHOD handle_toolbar.
*删除需要的ALV按钮
    DELETE e_object->mt_toolbar WHERE function = '&MB_SUM'.
    DELETE e_object->mt_toolbar WHERE function = '&MB_SUBTOT'.
    DELETE e_object->mt_toolbar WHERE function = '&&SEP05'.
    DELETE e_object->mt_toolbar WHERE function = '&PRINT_BACK'.
    DELETE e_object->mt_toolbar WHERE function = '&MB_VIEW'.
    DELETE e_object->mt_toolbar WHERE function = '&COL0'.
    DELETE e_object->mt_toolbar WHERE function = '&&SEP06'.
    DELETE e_object->mt_toolbar WHERE function = '&GRAPH'.
    DELETE e_object->mt_toolbar WHERE function = '&&SEP07'.
    DELETE e_object->mt_toolbar WHERE function = '&INFO'.
    DELETE e_object->mt_toolbar WHERE function = ''.
    DELETE e_object->mt_toolbar WHERE function = '&&SEP00'.
    DELETE e_object->mt_toolbar WHERE function = '&CHECK'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&CUT'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&COPY'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&PASTE'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&APPEND'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&INSERT_ROW'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&DELETE_ROW'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&UNDO'.
*    DELETE e_object->mt_toolbar WHERE FUNCTION = '&MB_SUM'.
*    DELETE e_object->mt_toolbar WHERE FUNCTION = '&MB_SUBTOT'.
    DELETE e_object->mt_toolbar WHERE function = '&MB_VIEW'.
    DELETE e_object->mt_toolbar WHERE function = '&GRAPH'.
    DELETE e_object->mt_toolbar WHERE function = '&INFO'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&COPY_ROW'. 
    DELETE e_object->mt_toolbar WHERE function = '&REFRESH'.

*  拒绝追加
    CLEAR ls_toolbar.
    MOVE 'JJ_ZHJ' TO ls_toolbar-function.
    MOVE '拒绝追加'(114) TO ls_toolbar-quickinfo.
    MOVE '拒绝追加' TO  ls_toolbar-text.
    MOVE ' ' TO ls_toolbar-disabled.
    APPEND ls_toolbar TO e_object->mt_toolbar.

*  确认选择
    CLEAR ls_toolbar.
    MOVE 'ZHJ' TO ls_toolbar-function.
    MOVE '确认追加'(114) TO ls_toolbar-quickinfo.
    MOVE '确认追加' TO  ls_toolbar-text.
    MOVE ' ' TO ls_toolbar-disabled.
    APPEND ls_toolbar TO e_object->mt_toolbar.

    CLEAR ls_toolbar.  "分割线
    MOVE '&&SEP07' TO ls_toolbar-function.
    MOVE 3 TO ls_toolbar-butn_type.
    APPEND ls_toolbar TO e_object->mt_toolbar.
*  确认选择
    CLEAR ls_toolbar.
    MOVE 'JJ_QJ' TO ls_toolbar-function.
    MOVE '拒绝请减'(114) TO ls_toolbar-quickinfo.
    MOVE '拒绝请减' TO  ls_toolbar-text.
    MOVE ' ' TO ls_toolbar-disabled.
    APPEND ls_toolbar TO e_object->mt_toolbar.


    CLEAR ls_toolbar.
    MOVE 'QJ' TO ls_toolbar-function.
    MOVE '确认请减'(114) TO ls_toolbar-quickinfo.
    MOVE '确认请减' TO  ls_toolbar-text.
    MOVE ' ' TO ls_toolbar-disabled.
    APPEND ls_toolbar TO e_object->mt_toolbar.

    CLEAR ls_toolbar.  "分割线
    MOVE '&&SEP07' TO ls_toolbar-function.
    MOVE 3 TO ls_toolbar-butn_type.
    APPEND ls_toolbar TO e_object->mt_toolbar.

*  查看已确认
    CLEAR ls_toolbar.
    MOVE 'LIST' TO ls_toolbar-function.
    MOVE '查看已确认明细'(114) TO ls_toolbar-quickinfo.
    MOVE '查看已确认明细' TO  ls_toolbar-text.
    MOVE ' ' TO ls_toolbar-disabled.
    APPEND ls_toolbar TO e_object->mt_toolbar.

    CLEAR ls_toolbar.  "分割线
    MOVE '&&SEP07' TO ls_toolbar-function.
    MOVE 3 TO ls_toolbar-butn_type.
    APPEND ls_toolbar TO e_object->mt_toolbar.
*  查看被锁的征订代码
    CLEAR ls_toolbar.
    MOVE 'LOCK' TO ls_toolbar-function.
    MOVE '查看被锁的征订代码'(114) TO ls_toolbar-quickinfo.
    MOVE '查看被锁的征订代码' TO  ls_toolbar-text.
    MOVE ' ' TO ls_toolbar-disabled.
    APPEND ls_toolbar TO e_object->mt_toolbar.
  ENDMETHOD.                    "handle_toolbar
*---------------user_command-----------------------------------*
  METHOD handle_user_command.
    IF g_grid_300 IS INITIAL.
      EXIT.
    ENDIF.
    CALL METHOD g_grid_300->check_changed_data.
    PERFORM process_ucomm_300 USING e_ucomm.
  ENDMETHOD.                           "lcl_event_receiver
*-------------------------------------------------------------------
  METHOD handle_data_changed.
    PERFORM data_changed_300 USING er_data_changed.
  ENDMETHOD.                    "handle_menu_button
ENDCLASS.                    "lcl_ALV_event_receiver
*&---------------------------------------------------------------------*
*&      Form  get_table_2
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_IT_ALV_BOOKC_BOOKC  text
*----------------------------------------------------------------------*
FORM get_table_2  USING    p_it_alv_bookc_bookc LIKE ztblc-bookc.
*获取BOOKC+WERKS层的ALV显示数据
  CLEAR it_alv_bookc_werks.
  REFRESH it_alv_bookc_werks.

  SORT it_bookc_werks BY bookc werks.
  LOOP AT it_bookc_werks WHERE bookc = p_it_alv_bookc_bookc.
    APPEND it_bookc_werks TO it_alv_bookc_werks.
  ENDLOOP.
  SORT it_alv_bookc_werks BY bookc werks zhj_menge.
  CLEAR f_menge.
  f_menge = it_alv_bookc-ky_cb.
  IF f_menge < 0.
    f_menge = 0.
  ENDIF.
*  对追加分配储备数(从小到大的满足)
  LOOP AT it_alv_bookc_werks WHERE zhj_menge > 0.
    IF f_menge = 0.
      EXIT.
    ENDIF.
    f_tabix = sy-tabix.
    IF it_alv_bookc_werks-zhj_menge < f_menge.
      it_alv_bookc_werks-fp_cb = it_alv_bookc_werks-zhj_menge.
      f_menge = f_menge - it_alv_bookc_werks-fp_cb.
      MODIFY it_alv_bookc_werks INDEX f_tabix.
    ELSE.
      it_alv_bookc_werks-fp_cb = f_menge.
      f_menge = 0.
      MODIFY it_alv_bookc_werks INDEX f_tabix.
    ENDIF.
  ENDLOOP.

*追加
  it_alv_bookc_werks-ky_cb  = f_menge.               "分配后剩下的
  it_alv_bookc_werks-zhj    = it_alv_bookc-zhj.      "追加确认
  it_alv_bookc_werks-zhj_v  = it_alv_bookc-zhj_v.    "是否向供应商报(和上一层一致)
  it_alv_bookc_werks-use_aq = it_alv_bookc-use_aq.   "是否用安全储备来满足(和上一层一样)
  it_alv_bookc_werks-aq_cb   = it_alv_bookc-aq_cb.
  MODIFY it_alv_bookc_werks  TRANSPORTING ky_cb zhj zhj_v use_aq  aq_cb
                             WHERE zhj_menge > 0.

*请减
  it_alv_bookc_werks-qj     = it_alv_bookc-qj.
  it_alv_bookc_werks-qj_v   = it_alv_bookc-qj_v.
  MODIFY it_alv_bookc_werks  TRANSPORTING  qj qj_v
                             WHERE qj_menge > 0.
ENDFORM.                    " get_table_2

*---------------------------------------------------------------------*
*       CLASS lcl_alv_500 DEFINITION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS  lcl_alv_500 DEFINITION.
  PUBLIC SECTION.
    METHODS:
    handle_double                             "执行双击事件
        FOR EVENT double_click OF cl_gui_alv_grid
        IMPORTING e_row e_column es_row_no ,
    handle_toolbar
        FOR EVENT toolbar OF cl_gui_alv_grid  "TOOLBAR
            IMPORTING e_object e_interactive,
    handle_user_command                       "执行toolbar的UCOMM
    FOR EVENT user_command OF cl_gui_alv_grid
            IMPORTING e_ucomm,
    handle_data_changed
       FOR EVENT data_changed OF cl_gui_alv_grid
           IMPORTING er_data_changed.
ENDCLASS.                                     "lcl_event_receiver DEFINITION

*---------------------------------------------------------------------*
*       CLASS lcl_alv_500 IMPLEMENTATION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS lcl_alv_500 IMPLEMENTATION.
*-----------------------------------------------------------------
  METHOD handle_double .
    DATA:  w_menge TYPE i.
    CLEAR  w_menge.
    CASE e_column-fieldname.
      WHEN 'FH_M'.
        READ TABLE it_qx INTO it_qx INDEX e_row-index.
        w_menge = it_qx-fh_m + it_qx-fp_m.
        IF w_menge < it_qx-menge .
          PERFORM get_data_ekpo USING p_perid it_qx-bookc.
          REFRESH it_alv_ekpo.
          CLEAR   it_alv_ekpo.
          it_alv_ekpo[] = it_ekpo[].
          IF it_qx-zpkh = ''.
            DELETE it_alv_ekpo WHERE zzbookc <> it_qx-bookc OR
                                     werks   <> it_qx-werks OR
                                     kunnr   <> ''.
          ELSE.
            DELETE it_alv_ekpo WHERE zzbookc <> it_qx-bookc OR
                                     werks   <> it_qx-werks OR
                                     kunnr   <> it_qx-kunnr.
          ENDIF.
          it_alv_ekpo-zpkh = it_qx-zpkh.
          MODIFY it_alv_ekpo FROM it_alv_ekpo TRANSPORTING zpkh WHERE ebeln <> ''.
*  根据单据数量 结单状态 发货数量 计算可减少的数量
          LOOP AT it_alv_ekpo INTO it_alv_ekpo .
            IF it_alv_ekpo-zclose_order = ''.
              it_alv_ekpo-shy_m = it_alv_ekpo-menge - it_alv_ekpo-glmng.
            ELSE.
              it_alv_ekpo-shy_m = 0.
            ENDIF.
            MODIFY it_alv_ekpo FROM it_alv_ekpo INDEX sy-tabix.
          ENDLOOP.
          f_screen = '0500'.
          CLEAR r_menge.
          PERFORM alv_list_ekpo USING f_screen.
        ENDIF.
    ENDCASE.
    CALL METHOD g_grid_500->check_changed_data.
  ENDMETHOD.                   "HANDLE_double

*-----------------------TOOLBAR------------------------------------*
  METHOD handle_toolbar.
*删除需要的ALV按钮
    DELETE e_object->mt_toolbar WHERE function = '&MB_SUM'.
    DELETE e_object->mt_toolbar WHERE function = '&MB_SUBTOT'.
    DELETE e_object->mt_toolbar WHERE function = '&&SEP05'.
    DELETE e_object->mt_toolbar WHERE function = '&PRINT_BACK'.
    DELETE e_object->mt_toolbar WHERE function = '&MB_VIEW'.
    DELETE e_object->mt_toolbar WHERE function = '&COL0'.
    DELETE e_object->mt_toolbar WHERE function = '&&SEP06'.
    DELETE e_object->mt_toolbar WHERE function = '&GRAPH'.
    DELETE e_object->mt_toolbar WHERE function = '&&SEP07'.
    DELETE e_object->mt_toolbar WHERE function = '&INFO'.
    DELETE e_object->mt_toolbar WHERE function = ''.
    DELETE e_object->mt_toolbar WHERE function = '&&SEP00'.
    DELETE e_object->mt_toolbar WHERE function = '&CHECK'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&CUT'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&COPY'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&PASTE'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&APPEND'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&INSERT_ROW'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&DELETE_ROW'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&UNDO'.
*    DELETE e_object->mt_toolbar WHERE FUNCTION = '&MB_SUM'.
*    DELETE e_object->mt_toolbar WHERE FUNCTION = '&MB_SUBTOT'.
    DELETE e_object->mt_toolbar WHERE function = '&MB_VIEW'.
    DELETE e_object->mt_toolbar WHERE function = '&GRAPH'.
    DELETE e_object->mt_toolbar WHERE function = '&INFO'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&COPY_ROW'. 
    DELETE e_object->mt_toolbar WHERE function = '&REFRESH'.

    CLEAR ls_toolbar.  "分割线
    MOVE '&&SEP07' TO ls_toolbar-function.
    MOVE 3 TO ls_toolbar-butn_type.
    APPEND ls_toolbar TO e_object->mt_toolbar.

*  确认选择
    CLEAR ls_toolbar.
    MOVE 'UN_SURE' TO ls_toolbar-function.
    MOVE '取消确认'(114) TO ls_toolbar-quickinfo.
    MOVE '取消确认' TO  ls_toolbar-text.
    MOVE ' ' TO ls_toolbar-disabled.
    APPEND ls_toolbar TO e_object->mt_toolbar.

    CLEAR ls_toolbar.  "分割线
    MOVE '&&SEP07' TO ls_toolbar-function.
    MOVE 3 TO ls_toolbar-butn_type.
    APPEND ls_toolbar TO e_object->mt_toolbar.

*  确认选择
    CLEAR ls_toolbar.
    MOVE 'LIST' TO ls_toolbar-function.
    MOVE '察看已经取消的明细'(114) TO ls_toolbar-quickinfo.
    MOVE '察看明细' TO  ls_toolbar-text.
    MOVE ' ' TO ls_toolbar-disabled.
    APPEND ls_toolbar TO e_object->mt_toolbar.
  ENDMETHOD.                    "handle_toolbar
*---------------user_command-----------------------------------*
  METHOD handle_user_command.
    IF g_grid_500 IS INITIAL.
      EXIT.
    ENDIF.
    CALL METHOD g_grid_500->check_changed_data.
    PERFORM process_ucomm_500 USING e_ucomm.
  ENDMETHOD.                           "lcl_event_receiver
*-------------------------------------------------------------------
  METHOD handle_data_changed.
    PERFORM data_changed_500 USING er_data_changed.
  ENDMETHOD.                    "handle_menu_button
ENDCLASS.                    "lcl_ALV_event_receiver

*---------------------------------------------------------------------*
*       CLASS lcl_alv_100 DEFINITION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS  lcl_alv_600 DEFINITION.
  PUBLIC SECTION.
    METHODS:
    handle_double                             "执行双击事件
        FOR EVENT double_click OF cl_gui_alv_grid
        IMPORTING e_row e_column es_row_no ,
    handle_toolbar
        FOR EVENT toolbar OF cl_gui_alv_grid  "TOOLBAR
            IMPORTING e_object e_interactive,
    handle_user_command                       "执行toolbar的UCOMM
    FOR EVENT user_command OF cl_gui_alv_grid
            IMPORTING e_ucomm,
    handle_data_changed
       FOR EVENT data_changed OF cl_gui_alv_grid
           IMPORTING er_data_changed.
ENDCLASS.                                     "lcl_event_receiver DEFINITION
*---------------------------------------------------------------------*
*       CLASS lcl_alv_500 IMPLEMENTATION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS lcl_alv_600 IMPLEMENTATION.
*-----------------------------------------------------------------
  METHOD handle_double .
*  直配的请减,需要删除转储单后才能去做确认
    DATA:  w_menge TYPE i.
    CLEAR  w_menge.
    CASE e_column-fieldname.
      WHEN 'FH_M'.
        READ TABLE it_qj_zp INTO it_qj_zp INDEX e_row-index.
        w_menge = it_qj_zp-qj_fh + it_qj_zp-shy_fh.
        IF w_menge < it_qj_zp-qj_menge.
          PERFORM get_data_ekpo_zp USING it_qj_zp-bookc it_qj_zp-kunnr.
          REFRESH it_alv_ekpo.
          CLEAR   it_alv_ekpo.
          it_alv_ekpo[] = it_ekpo[].
          DELETE it_alv_ekpo WHERE zzbookc <> it_qj_zp-bookc OR
                                   kunnr <> it_qj_zp-kunnr.
          PERFORM alv_list_ekpo_zp.
          CLEAR t_menge.
          LOOP AT it_ekpo INTO it_ekpo WHERE loekz <> ''.
            t_menge = t_menge + it_ekpo-menge - it_ekpo-wamng.
          ENDLOOP.
          it_qj_zp-shy_fh = it_qj_zp-shy_fh + t_menge.
          DELETE it_ekpo WHERE loekz <> ''.
        ENDIF.
    ENDCASE.
  ENDMETHOD.                    "handle_double

*--------------------------------------------------------------------
  METHOD handle_toolbar.
*删除需要的ALV按钮
    DELETE e_object->mt_toolbar WHERE function = '&MB_SUM'.
    DELETE e_object->mt_toolbar WHERE function = '&MB_SUBTOT'.
    DELETE e_object->mt_toolbar WHERE function = '&&SEP05'.
    DELETE e_object->mt_toolbar WHERE function = '&PRINT_BACK'.
    DELETE e_object->mt_toolbar WHERE function = '&MB_VIEW'.
    DELETE e_object->mt_toolbar WHERE function = '&COL0'.
    DELETE e_object->mt_toolbar WHERE function = '&&SEP06'.
    DELETE e_object->mt_toolbar WHERE function = '&GRAPH'.
    DELETE e_object->mt_toolbar WHERE function = '&&SEP07'.
    DELETE e_object->mt_toolbar WHERE function = '&INFO'.
    DELETE e_object->mt_toolbar WHERE function = ''.
    DELETE e_object->mt_toolbar WHERE function = '&&SEP00'.
    DELETE e_object->mt_toolbar WHERE function = '&CHECK'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&CUT'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&COPY'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&PASTE'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&APPEND'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&INSERT_ROW'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&DELETE_ROW'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&UNDO'.
*    DELETE e_object->mt_toolbar WHERE FUNCTION = '&MB_SUM'.
*    DELETE e_object->mt_toolbar WHERE FUNCTION = '&MB_SUBTOT'.
    DELETE e_object->mt_toolbar WHERE function = '&MB_VIEW'.
    DELETE e_object->mt_toolbar WHERE function = '&GRAPH'.
    DELETE e_object->mt_toolbar WHERE function = '&INFO'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&COPY_ROW'. 
    DELETE e_object->mt_toolbar WHERE function = '&REFRESH'.

*  拒绝追加
    CLEAR ls_toolbar.
    MOVE 'JJ' TO ls_toolbar-function.
    MOVE '拒绝请减'(114) TO ls_toolbar-quickinfo.
    MOVE '拒绝请减' TO  ls_toolbar-text.
    MOVE ' ' TO ls_toolbar-disabled.
    APPEND ls_toolbar TO e_object->mt_toolbar.

    CLEAR ls_toolbar.
    MOVE 'QJ' TO ls_toolbar-function.
    MOVE '确认请减'(114) TO ls_toolbar-quickinfo.
    MOVE '确认请减' TO  ls_toolbar-text.
    MOVE ' ' TO ls_toolbar-disabled.
    APPEND ls_toolbar TO e_object->mt_toolbar.

    CLEAR ls_toolbar.  "分割线
    MOVE '&&SEP07' TO ls_toolbar-function.
    MOVE 3 TO ls_toolbar-butn_type.
    APPEND ls_toolbar TO e_object->mt_toolbar.

*  查看已确认
    CLEAR ls_toolbar.
    MOVE 'LIST' TO ls_toolbar-function.
    MOVE '查看已确认明细'(114) TO ls_toolbar-quickinfo.
    MOVE '查看已确认明细' TO  ls_toolbar-text.
    MOVE ' ' TO ls_toolbar-disabled.
    APPEND ls_toolbar TO e_object->mt_toolbar.

    CLEAR ls_toolbar.  "分割线
    MOVE '&&SEP07' TO ls_toolbar-function.
    MOVE 3 TO ls_toolbar-butn_type.
    APPEND ls_toolbar TO e_object->mt_toolbar.
*  查看被锁的征订代码
    CLEAR ls_toolbar.
    MOVE 'LOCK' TO ls_toolbar-function.
    MOVE '查看被锁的征订代码'(114) TO ls_toolbar-quickinfo.
    MOVE '查看被锁的征订代码' TO  ls_toolbar-text.
    MOVE ' ' TO ls_toolbar-disabled.
    APPEND ls_toolbar TO e_object->mt_toolbar.
  ENDMETHOD.                    "handle_toolbar
*--------------------------------------------------------------------
  METHOD handle_user_command.
    IF g_grid_600 IS INITIAL.
      EXIT.
    ENDIF.
    PERFORM user_command_600 USING e_ucomm.
  ENDMETHOD.                    "handle_user_command
*--------------------------------------------------------------------
  METHOD handle_data_changed.
    PERFORM data_changed_600 USING er_data_changed.
  ENDMETHOD.                    "handle_data_change
ENDCLASS.                    "lcl_alv_500 IMPLEMENTATION

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值