SAP-ABAP-OOALV方法实现程序源码,仅供参考

下列程序为本人备忘使用,复制后无法直接使用,但也有参考意义,
OOALV重点如下
1.类参数定义 5-31行
2.类方法定义 66-79行
3.类方法实现 183-567行
4.ALV调用类 577-640 行

REPORT zqmf002.
"$. Region 定义


DATA: ok_code LIKE sy-ucomm.


CLASS lcl_event_receiver DEFINITION DEFERRED.
DATA: event_receiver TYPE REF TO lcl_event_receiver.

DATA GV_CCC TYPE C .

DATA: gt_fieldcat TYPE lvc_t_fcat,
      gs_layout            TYPE lvc_s_layo,
      gt_select            TYPE lvc_t_cell,
      gs_select            TYPE lvc_s_cell,
      gs_variant           TYPE disvariant,
      gt_t_f4              TYPE lvc_t_f4,
      it_toolbar_excluding TYPE ui_functions.

DATA: stbl TYPE lvc_s_stbl. "鼠标游标位置
DATA: et_filtered TYPE lvc_t_fidx.

DATA alv_grid TYPE REF TO cl_gui_alv_grid. "后面要用到CL_GUI_ALV_GRID类中的方法
"SET_TABLE_FIRST_DISPLAY,这个方法基于实例存在,必须
"为这个类创建一个对象。在此处声明。
DATA gs_parent TYPE REF TO cl_gui_custom_container . "定义容器


*DATA: gr_table TYPE REF TO cl_salv_table.
*DATA: lr_functions TYPE REF TO cl_salv_functions.


"$. Region 此处定义改为需要用到的定义
TABLES : lfa1 ,mara ,mseg ,syst , zmmzlkk02 , ztmm001 ,t001.

TYPES : BEGIN OF ty_item ,
          zjbj TYPE c ,  "增加标记
          xgbj TYPE c .   "修改标记
    include structure zmmzlkk02.
TYPES END OF ty_item.
DATA gt_item TYPE TABLE OF ty_item .
DATA gs_item TYPE ty_item .
DATA gs_data TYPE zmmzlkk02 .


DATA gv_zxh TYPE zmmzlkk02-zxh .

RANGES S_USER FOR SY-uname .
TYPES : BEGIN OF TY_MBLNR ,
          MATNR TYPE MSEG-MATNR,
          CHARG TYPE MSEG-CHARG,
          MBLNR TYPE MSEG-MBLNR,
*        ZEILE  TYPE MSEG-ZEILE ,
        END OF TY_MBLNR .
DATA GT_MBLNR TYPE TABLE OF TY_MBLNR .
DATA GS_MBLNR TYPE TY_MBLNR .

"$. Endregion 此处定义改为需要用到的定义

*&---------------------------------------------------------------------*
*&       Class LCL_EVENT_RECEIVER
*&---------------------------------------------------------------------*
*        Text
*----------------------------------------------------------------------*
CLASS lcl_event_receiver DEFINITION.
  PUBLIC SECTION.
    METHODS:
      handle_onf4 FOR EVENT onf4 OF cl_gui_alv_grid
        IMPORTING e_fieldname es_row_no er_event_data,
      handle_double_click 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
        IMPORTING e_object e_interactive,
      handle_user_command 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 e_onf4 e_onf4_before e_onf4_after e_ucomm.
ENDCLASS. "LCL_EVENT_RECEIVER
"$. Endregion 定义

"$. Region 选择屏幕

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001 .

SELECT-OPTIONS : s_BUKRS FOR t001-BUKRS . "公司代码
SELECT-OPTIONS : s_lifnr FOR lfa1-lifnr . "供应商
SELECT-OPTIONS : s_matnr FOR mara-matnr . "物料编码
SELECT-OPTIONS : s_mblnr FOR mseg-mblnr . "物料凭证
SELECT-OPTIONS : s_charg FOR mseg-charg . "批次
SELECT-OPTIONS : s_zcpcs FOR ztmm001-zcpcs . "层数
SELECT-OPTIONS : s_zbudt FOR sy-datum . "日期
SELECT-OPTIONS : s_name1 FOR sy-uname . "用户

SELECTION-SCREEN END OF BLOCK b1.


"$. Endregion 选择屏幕

INITIALIZATION.
  stbl-row = 'X'.
  stbl-col = 'X'.

AT SELECTION-SCREEN.

  S_LIFNR-SIGN   = 'E' .
  S_LIFNR-OPTION = 'EQ' .
  S_BUKRS-SIGN   = 'E' .
  S_BUKRS-OPTION = 'EQ' .

  SELECT bukrs , LIFNR
    FROM lfb1
    WHERE lifnr IN @s_lifnr
    AND   BUKRS IN @S_BUKRS
    INTO TABLE @DATA(gt_bukrs)  .

  LOOP AT gt_bukrs INTO DATA(gs_bukrs).

    AUTHORITY-CHECK OBJECT 'F_LFA1_BUK'
                ID 'BUKRS' FIELD gs_bukrs-BUKRS
                 ID 'ACTVT' FIELD '03'.
    IF sy-subrc <> 0.
           s_lifnr-LOW = gs_bukrs-LIFNR .
      APPEND s_lifnr .
           S_BUKRS-LOW = gs_bukrs-BUKRS .
      APPEND S_BUKRS .

    ENDIF.
  ENDLOOP.

START-OF-SELECTION.
  PERFORM frm_get_data.
  CALL SCREEN 9000.


  "$. Region FORM
MODULE status_9000 OUTPUT.
  SET PF-STATUS '9000'.
  SET TITLEBAR '9000'.
  DATA(gv_frist) = 'X' . "判断是不是第一次运行,自添加按钮需要刷新才能显示
  PERFORM frm_display_alv.
  IF gv_frist = 'X'.
    CALL METHOD alv_grid->refresh_table_display  "增加按钮需要刷新才会显示出来,否则无法显示。
      EXPORTING
        is_stable = stbl.
    gv_frist = '0' ."判断是否为第一次,为第一次则刷新
  ENDIF.
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_9000  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_9000 INPUT.
  CASE ok_code.
    WHEN 'BACK'.
      PERFORM FRM_EXIT_CHACK .
      IF GV_CCC = 'X'.
        refresh: gt_item.
        LEAVE TO SCREEN 0.
      ENDIF.
    WHEN 'SAVE'.
      PERFORM frm_save.
    WHEN 'EXIT'.
      PERFORM FRM_EXIT_CHACK .
      IF GV_CCC = 'X'.
        LEAVE PROGRAM.
      ENDIF.
    WHEN 'CANCEL'.
      PERFORM FRM_EXIT_CHACK .
      IF GV_CCC = 'X'.

        LEAVE TO SCREEN 0.
      ENDIF.
  ENDCASE.
ENDMODULE.

*----------------------------------------------------------------------*
*       CLASS LCL_EVENT_RECEIVER IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_event_receiver IMPLEMENTATION.

  METHOD handle_data_changed.
    DATA: lv_ref TYPE c.
    CALL METHOD alv_grid->get_selected_cells
      IMPORTING
        et_cell = gt_select.
    LOOP AT GT_SELECT INTO DATA(GS_TEM).
      READ TABLE GT_ITEM INDEX GS_TEM-ROW_ID ASSIGNING FIELD-SYMBOL(<FS_TMP>) .
      IF <FS_TMP>-zjbj <> 'X' .
        <FS_TMP>-XGBJ = 'X' .
      ENDIF.
    ENDLOOP.
    CLEAR lv_ref.
    LOOP AT er_data_changed->mt_good_cells ASSIGNING FIELD-SYMBOL(<ls_good>).
      IF <ls_good>-FIELDNAME = 'MATNR'.
        READ TABLE gt_item ASSIGNING FIELD-SYMBOL(<fs_item>) INDEX <ls_good>-row_id.
        IF SY-SUBRC = 0.
          SELECT SINGLE MAKT~MATNR ,
                        MAKT~MAKTX ,
*                        MSEG~CHARG ,
                        ZTMM001~ZCPCS
            FROM MAKT
            LEFT JOIN ZTMM001 ON MAKT~MATNR = ZTMM001~MATNR AND MAKT~SPRAS = '1'
*            LEFT JOIN MSEG    ON MAKT~MATNR = ZTMM001~MATNR AND MAKT~SPRAS = '1'
            WHERE MAKT~MATNR = @<ls_good>-VALUE
            INTO @DATA(GS_MATNR)
            .
          <fs_item>-MAKTX = GS_MATNR-MAKTX .
          <fs_item>-ZCPCS = GS_MATNR-ZCPCS .
*            <fs_item>-CHARG = GS_MATNR-CHARG .
          CLEAR : <fs_item>-MBLNR , <fs_item>-ZEILE , <fs_item>-VBELN .
          CLEAR : <fs_item>-POSNR , <fs_item>-CHARG .
        ENDIF.
      ELSEIF <ls_good>-FIELDNAME = 'ZGYS'.
        READ TABLE gt_item ASSIGNING <fs_item> INDEX <ls_good>-row_id.
        IF SY-SUBRC = 0.
          SELECT SINGLE LFA1~LIFNR  ,
                        LFA1~NAME1
            FROM  LFA1
            WHERE LFA1~LIFNR = @<LS_GOOD>-VALUE
            INTO  @DATA(LS_LIFNR)
            .
          <fs_item>-NAME1 = LS_LIFNR-NAME1 .
        ENDIF.
      ENDIF.
    ENDLOOP.
*    IF lv_ref = 'X'.
    CALL METHOD alv_grid->refresh_table_display
      EXPORTING
        is_stable = stbl.
  ENDMETHOD.

  METHOD handle_onf4.   "F4帮助handle_onf4
    DATA: ls_modi    TYPE lvc_s_modi,
          lt_ret_tab TYPE TABLE OF ddshretval.
    IF e_fieldname = 'MBLNR'.
      READ TABLE gt_item INDEX es_row_no-row_id ASSIGNING FIELD-SYMBOL(<fs_item>).
*      CHECK sy-subrc = 0.
      IF SY-SUBRC = 0.
        IF <fs_item>-MATNR IS INITIAL OR <fs_item>-CHARG IS INITIAL.
          MESSAGE '请先输入物料编码及物料对应批次' TYPE 'S' DISPLAY LIKE 'E' .
        ELSE.
          SELECT MSEG~MATNR ,
                 MSEG~CHARG ,
                 MSEG~MBLNR
            FROM MSEG
            WHERE MSEG~MATNR = @<FS_ITEM>-MATNR
            AND   MSEG~CHARG = @<FS_ITEM>-CHARG
            INTO TABLE @GT_MBLNR
            .
          CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
            EXPORTING
              retfield   = 'MBLNR'
              value_org  = 'S'
            TABLES
              value_tab  = GT_MBLNR
              return_tab = lt_ret_tab.
          IF sy-subrc = 0.
            READ TABLE lt_ret_tab INDEX 1 ASSIGNING FIELD-SYMBOL(<fs_ret>).
            IF sy-subrc = 0.
              <fs_item>-MBLNR = <fs_ret>-fieldval.
              READ TABLE GT_MBLNR ASSIGNING FIELD-SYMBOL(<fs_MATNR>)
                WITH KEY MBLNR = <fs_item>-MBLNR.
              <fs_item>-MBLNR = <fs_MATNR>-MBLNR.
*          <fs_item>-ZEILE = <fs_MATNR>-ZEILE.
            ENDIF.
          ENDIF.
          er_event_data->m_event_handled = 'X'.
          CALL METHOD alv_grid->refresh_table_display
            EXPORTING
              is_stable = stbl.
        ENDIF.

      ENDIF.
    ELSEIF e_fieldname = 'VBELN'.
      READ TABLE gt_item INDEX es_row_no-row_id ASSIGNING <fs_item>.
*         CHECK sy-subrc = 0.
      IF SY-SUBRC = 0.
        IF <fs_item>-MATNR IS INITIAL .
          MESSAGE '请先输入物料编码' TYPE 'S' DISPLAY LIKE 'E' .
        ELSE.
          SELECT VBAP~MATNR  ,
*                 VBAP~CHARG  ,
                 VBAP~VBELN
*                    VBAP~POSNR
            FROM VBAP
            WHERE VBAP~MATNR = @<FS_ITEM>-MATNR
*            AND   VBAP~CHARG = @<FS_ITEM>-CHARG
            INTO TABLE @DATA(GT_VBELN)
            .
          CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
            EXPORTING
              retfield   = 'VBELN'
              value_org  = 'S'
            TABLES
              value_tab  = GT_VBELN
              return_tab = lt_ret_tab.
          IF sy-subrc = 0.
            READ TABLE lt_ret_tab INDEX 1 ASSIGNING <fs_ret>.
            IF sy-subrc = 0.
              DATA LV_VBELN TYPE VBELN .
              CLEAR : LV_VBELN .
              LV_VBELN = <fs_ret>-fieldval .
              CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT' "补齐前导零
                EXPORTING
                  INPUT  = LV_VBELN
                IMPORTING
                  OUTPUT = LV_VBELN.
              <fs_item>-VBELN = LV_VBELN.
              READ TABLE GT_VBELN ASSIGNING FIELD-SYMBOL(<fs_VBELN>)
                WITH KEY VBELN = <fs_item>-VBELN.
*             <fs_item>-POSNR = <fs_VBELN>-POSNR.
            ENDIF.
          ENDIF.
          er_event_data->m_event_handled = 'X'.
          CALL METHOD alv_grid->refresh_table_display
            EXPORTING
              is_stable = stbl.
        ENDIF.
      ENDIF.
    ELSEIF e_fieldname = 'CHARG'.
      READ TABLE gt_item INDEX es_row_no-row_id ASSIGNING <fs_item>.
*         CHECK sy-subrc = 0.
      IF SY-SUBRC = 0.
        IF <fs_item>-MATNR IS INITIAL.
          MESSAGE '请先输入物料编码' TYPE 'S' DISPLAY LIKE 'E' .
        ELSE.
          SELECT MCHA~MATNR  ,
                 MCHA~CHARG
            FROM MCHA
            WHERE MCHA~MATNR = @<FS_ITEM>-MATNR
            INTO TABLE @DATA(GT_MCHA)
            .
          CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
            EXPORTING
              retfield   = 'CHARG'
              value_org  = 'S'
            TABLES
              value_tab  = GT_MCHA
              return_tab = lt_ret_tab.
          IF sy-subrc = 0.
            READ TABLE lt_ret_tab INDEX 1 ASSIGNING <fs_ret>.
            IF sy-subrc = 0.
              <fs_item>-CHARG = <fs_ret>-fieldval.
*             READ TABLE GT_VBELN ASSIGNING FIELD-SYMBOL(<fs_VBELN>)
*               WITH KEY CHARG = <fs_item>-VBELN.
*             <fs_item>-POSNR = <fs_VBELN>-POSNR.
            ENDIF.
          ENDIF.
          er_event_data->m_event_handled = 'X'.
          CALL METHOD alv_grid->refresh_table_display
            EXPORTING
              is_stable = stbl.
        ENDIF.
      ENDIF.
    ELSEIF e_fieldname = 'ZMEINS'.
      READ TABLE gt_item INDEX es_row_no-row_id ASSIGNING <fs_item>.
*         CHECK sy-subrc = 0.
      IF SY-SUBRC = 0.
*           IF <fs_item>-MATNR IS INITIAL.
*             MESSAGE '请先输入物料编码' TYPE 'S' DISPLAY LIKE 'E' .
*           ELSE.
        SELECT T006A~MSEHI  ,
               T006A~MSEHL
          FROM T006A
          WHERE T006A~SPRAS = '1'
          INTO TABLE @DATA(GT_MSEHI)
          .
        CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
          EXPORTING
            retfield   = 'MSEHI'
            value_org  = 'S'
          TABLES
            value_tab  = GT_MSEHI
            return_tab = lt_ret_tab.
        IF sy-subrc = 0.
          READ TABLE lt_ret_tab INDEX 1 ASSIGNING <fs_ret>.
          IF sy-subrc = 0.
            <fs_item>-ZMEINS = <fs_ret>-fieldval.
*             READ TABLE GT_VBELN ASSIGNING FIELD-SYMBOL(<fs_VBELN>)
*               WITH KEY CHARG = <fs_item>-VBELN.
*             <fs_item>-POSNR = <fs_VBELN>-POSNR.
          ENDIF.
        ENDIF.
        er_event_data->m_event_handled = 'X'.
        CALL METHOD alv_grid->refresh_table_display
          EXPORTING
            is_stable = stbl.
*           ENDIF.
      ENDIF.
    ELSEIF e_fieldname = 'ZBB'.
      READ TABLE gt_item INDEX es_row_no-row_id ASSIGNING <fs_item>.
*         CHECK sy-subrc = 0.
      IF SY-SUBRC = 0.
*           IF <fs_item>-MATNR IS INITIAL.
*             MESSAGE '请先输入物料编码' TYPE 'S' DISPLAY LIKE 'E' .
*           ELSE.
        SELECT TCURT~WAERS  ,
               TCURT~KTEXT
          FROM TCURT
          WHERE TCURT~SPRAS = '1'
          INTO TABLE @DATA(GT_TCURT)
          .
        CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
          EXPORTING
            retfield   = 'WAERS'
            value_org  = 'S'
          TABLES
            value_tab  = GT_TCURT
            return_tab = lt_ret_tab.
        IF sy-subrc = 0.
          READ TABLE lt_ret_tab INDEX 1 ASSIGNING <fs_ret>.
          IF sy-subrc = 0.
            <fs_item>-ZBB = <fs_ret>-fieldval.
*             READ TABLE GT_VBELN ASSIGNING FIELD-SYMBOL(<fs_VBELN>)
*               WITH KEY CHARG = <fs_item>-VBELN.
*             <fs_item>-POSNR = <fs_VBELN>-POSNR.
          ENDIF.
        ENDIF.
        er_event_data->m_event_handled = 'X'.
        CALL METHOD alv_grid->refresh_table_display
          EXPORTING
            is_stable = stbl.
*           ENDIF.
      ENDIF.
    ENDIF.
  ENDMETHOD.                    "HANDLE_ONF4



  METHOD handle_toolbar.
    DATA: ls_toolbar        TYPE stb_button.
    CLEAR ls_toolbar.
    MOVE 3                  TO ls_toolbar-butn_type.      "分隔符
    APPEND ls_toolbar       TO e_object->mt_toolbar.

    CLEAR ls_toolbar.
    MOVE 'ADD'            TO ls_toolbar-function.        "功能码
    MOVE icon_insert_row  TO ls_toolbar-icon.      "图标
    MOVE '插入行'         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 'DEL'            TO ls_toolbar-function.        "功能码
    MOVE icon_delete_row  TO ls_toolbar-icon.      "图标
    MOVE '选择单元格删除当前行'         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.
  ENDMETHOD.                    "HANDLE_TOOLBAR

  METHOD handle_user_command.
    CASE e_ucomm.
      WHEN 'ADD'.

        APPEND INITIAL LINE TO gt_item ASSIGNING FIELD-SYMBOL(<fs_item>) .
        <fs_item>-zbb =    'CNY' .
        <fs_item>-zmeins = 'M2'   .
        <fs_item>-zjbj = 'X'   .


        SELECT zxh
          FROM zmmzlkk02
          INTO TABLE @DATA(gt_zxh)
        .
        SORT gt_zxh BY zxh .
        READ TABLE gt_zxh INTO DATA(gs_zxh) INDEX sy-tfill .
        gv_zxh = gs_zxh-zxh .
        LOOP AT gt_item ASSIGNING <fs_item> WHERE zjbj = 'X' .
          gv_zxh  = gv_zxh + 1 .
          <fs_item>-zxh  = gv_zxh  .
        ENDLOOP.
        <fs_item>-zxh = gv_zxh .

        CALL METHOD alv_grid->refresh_table_display
          EXPORTING
            is_stable = stbl.
      WHEN 'DEL' .

        CALL METHOD alv_grid->get_selected_cells
          IMPORTING
            et_cell = gt_select.
        LOOP AT gt_select INTO gs_select.
          READ TABLE gt_item INDEX gs_select-row_id INTO gs_item.
*                      DELETE  gt_item INDEX GS_SELECT-ROW_ID . "临时录入的数据删除内表即可
          DATA lv_answer TYPE c LENGTH 1 .
          CALL FUNCTION 'POPUP_TO_CONFIRM'  "弹出对话框
            EXPORTING
              titlebar       = '删除'
*             DIAGNOSE_OBJECT             = ' '
              text_question  = '确认要删除此条数据???'
              text_button_1  = '确认'
*             ICON_BUTTON_1  = ' '
*             TEXT_BUTTON_2  = 'Nein'(002)
*             ICON_BUTTON_2  = ' '
*             DEFAULT_BUTTON = '1'
*             DISPLAY_CANCEL_BUTTON       = 'X'
*             USERDEFINED_F1_HELP         = ' '
*             START_COLUMN   = 25
*             START_ROW      = 6
*             POPUP_TYPE     =
*             IV_QUICKINFO_BUTTON_1       = ' '
*             IV_QUICKINFO_BUTTON_2       = ' '
            IMPORTING
              answer         = lv_answer
*                         TABLES
*             PARAMETER      =
            EXCEPTIONS
              text_not_found = 1
              OTHERS         = 2.
          IF sy-subrc <> 0.
*           Implement suitable error handling here
          ENDIF.

          IF lv_answer = '1'.
            IF gs_item-zjbj IS  INITIAL.

              IF SY-UNAME IN S_USER.
                CLEAR gs_data .
                MOVE-CORRESPONDING gs_item TO  gs_data .
                DELETE  zmmzlkk02 FROM  gs_data .
                DELETE  gt_item   INDEX gs_select-row_id .
                MESSAGE '删除成功' TYPE 'S' .
              ELSE  .
                MESSAGE '保存后的数据只有指定用户允许删除' TYPE 'S' DISPLAY LIKE 'E' .
              ENDIF.
            ELSE .
              DELETE  gt_item   INDEX gs_select-row_id .
              MESSAGE '删除成功' TYPE 'S' .
            ENDIF.
          ELSE.
            EXIT.
          ENDIF.
        ENDLOOP.

        SELECT zxh
          FROM zmmzlkk02
          INTO TABLE @gt_zxh
        .
        IF gt_zxh IS NOT INITIAL.
          SORT gt_zxh BY zxh .
          READ TABLE gt_zxh INTO gs_zxh INDEX sy-tfill .
          gv_zxh = gs_zxh-zxh .
          LOOP AT gt_item ASSIGNING <fs_item> WHERE zjbj = 'X' .
            gv_zxh  = gv_zxh + 1 .
            <fs_item>-zxh  = gv_zxh  .
          ENDLOOP.
        ENDIF.
*        <FS_ITEM>-ZXH = GV_ZXH .
        CALL METHOD alv_grid->refresh_table_display
          EXPORTING
            is_stable = stbl.

      WHEN OTHERS .
    ENDCASE.
  ENDMETHOD.

  METHOD handle_double_click.
*    MESSAGE '双击事件触发' TYPE 'S'.
  ENDMETHOD.                    "HANDLE_DOUBLE_CLICK

ENDCLASS. "LCL_EVENT_RECEIVER IMPLEMENTATION

*&---------------------------------------------------------------------*
*& Form FRM_DISPLAY_ALV
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_display_alv .
  CLEAR: gt_fieldcat,gs_layout,it_toolbar_excluding.
  IF  alv_grid IS INITIAL.

******实例化 容器
    CREATE OBJECT gs_parent
      EXPORTING
        container_name = 'ALV'. " 界面中的一个CUNSTOMER CONTROL控件 用于存放类对象。
    "使用这个控件把名称赋值给CONTAINER_NAME

******将alv植入到容器中
    CREATE OBJECT alv_grid
      EXPORTING
        i_parent = gs_parent.
    PERFORM prepare_field_catalog CHANGING gt_fieldcat.
    PERFORM prepare_layout        CHANGING gs_layout.
    PERFORM toolbar_excluding_item     CHANGING it_toolbar_excluding.

    CALL METHOD alv_grid->set_table_for_first_display
      EXPORTING
        is_variant           = gs_variant
        is_layout            = gs_layout
        it_toolbar_excluding = it_toolbar_excluding
        i_save               = 'A'
      CHANGING
        it_outtab            = gt_item
        it_fieldcatalog      = gt_fieldcat.

    CREATE OBJECT event_receiver. "创建事件
    SET HANDLER event_receiver->handle_onf4         FOR alv_grid.
    SET HANDLER event_receiver->handle_toolbar      FOR alv_grid.
    SET HANDLER event_receiver->handle_user_command FOR alv_grid.
    SET HANDLER event_receiver->handle_double_click FOR alv_grid.
    SET HANDLER event_receiver->handle_data_changed FOR alv_grid.

    gt_t_f4 = VALUE #( BASE gt_t_f4 ( fieldname = 'MBLNR'  register = 'X' getbefore = 'X' chngeafter = 'X' ) ) .
    gt_t_f4 = VALUE #( BASE gt_t_f4 ( fieldname = 'VBELN'  register = 'X' getbefore = 'X' chngeafter = 'X' ) ) .
    gt_t_f4 = VALUE #( BASE gt_t_f4 ( fieldname = 'CHARG'  register = 'X' getbefore = 'X' chngeafter = 'X' ) ) .
    gt_t_f4 = VALUE #( BASE gt_t_f4 ( fieldname = 'ZMEINS'  register = 'X' getbefore = 'X' chngeafter = 'X' ) ) .
    gt_t_f4 = VALUE #( BASE gt_t_f4 ( fieldname = 'ZBB'  register = 'X' getbefore = 'X' chngeafter = 'X' ) ) .

    CALL METHOD alv_grid->register_f4_for_fields
      EXPORTING
        it_f4 = gt_t_f4.


    CALL METHOD cl_gui_control=>set_focus
      EXPORTING
        control = alv_grid.
    CALL METHOD cl_gui_cfw=>flush.

    CALL METHOD alv_grid->register_edit_event "注册编辑事件,否则不会触发更新事件
      EXPORTING
        i_event_id = cl_gui_alv_grid=>mc_evt_modified.

*    CALL METHOD cl_gui_cfw=>dispatch.
*    CALL METHOD alv_grid->check_changed_data.

  ELSE.
    CALL METHOD alv_grid->refresh_table_display
      EXPORTING
        is_stable = stbl.
  ENDIF.
ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  PREPARE_FIELD_CATALOG
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_GT_FIELDCAT  text
*----------------------------------------------------------------------*
FORM prepare_field_catalog CHANGING p_gt_fieldcat TYPE lvc_t_fcat.
  DATA ls_fcat TYPE lvc_s_fcat.
  DEFINE set_fcat.
    CLEAR ls_fcat.
    ls_fcat-fieldname = &1.
    ls_fcat-coltext   = &2.
    ls_fcat-key       = &3.
    ls_fcat-edit      = &4.
*    ls_fcat-ref_table = &5. "参考表
    ls_fcat-ref_field = &5. "参考字段
    ls_fcat-f4availabl = &6.   "F4帮助
    ls_fcat-no_zero = &7.   "前导零
    ls_fcat-checkbox = &8.   "复选框
    ls_fcat-OUTPUTLEN = &9.   "列的字符宽度
*    ls_fcat-f4availabl = &8.
    IF ls_fcat-fieldname = 'ZGYS'.
      ls_fcat-ref_table  = 'LFA1' .
    ENDIF.
    IF ls_fcat-fieldname = 'MATNR'.
      ls_fcat-ref_table  = 'MARA' .
    ENDIF.
    IF ls_fcat-fieldname = 'ZKKJE'.
      ls_fcat-ref_table  = 'ZMMZLKK02' .
    ENDIF.
    APPEND ls_fcat TO p_gt_fieldcat.
  END-OF-DEFINITION.
*  set_fcat 'ZXH'      '序号  '       ''    ''    ''       ''     'X'   ''    '03'  .
*  set_fcat 'BUKRS'    '公司代码'     ''    'X'   ''       ''     'X'   ''    '06'  .
*  set_fcat 'ZGYS'     '供应商  '     ''    'X'   'LIFNR'  'X'    'X'   ''    '06'  .
*  set_fcat 'NAME1'     '供应商名称'   ''   ''    ''        ''    ''    ''    '15'  .
*  set_fcat 'MATNR'    '物料编码  '    ''   'X'  'MATNR'   'X'    'X'   ''    '10'  .
*  set_fcat 'MAKTX'    '物料描述  '    ''   ''   ''         ''    ''    ''    '15'  .
*  set_fcat 'CHARG'    '批次  '        ''   'X'   ''       'X'    ''    ''    '8' .
*  set_fcat 'MBLNR'    '物料凭证'      ''   'X' 'MBLNR'    'X'    'X'  ''     '10'  .
*  set_fcat 'ZEILE'    '物料凭证行项目' ''   'X'  'MBLPO'    ''    'X'  ''     '6' .
*  set_fcat 'VBELN'    '销售凭证  '    ''   'X'  'VBELN'    'X'   'X'  ''     '10' .
*  set_fcat 'POSNR'    '销售凭证行项目' ''   'X'  'POSNR'   ''     'X'  ''     '6' .
*  set_fcat 'ZCPCS'    '层数  '        ''   ''    ''        ''    ''    ''     '2'  .
*  set_fcat 'ZMJ  '    '数量  '        ''   'X'   ''       ''     ''    ''     '8'  .
*  set_fcat 'ZMEINS'   '单位  '        ''   'X'   ''       'X'     ''   ''     '3' .
*  set_fcat 'ZKKJE'    '扣款金额  '    ''   'X'   'ZKKJE'  ''      ''    ''    '8'  .
*  set_fcat 'ZBB  '    '币别  '        ''   'X'   ''       'X'     ''   ''     '3'  .
*  set_fcat 'ZKKYY'    '扣款原因  '    ''   'X'   ''       ''      ''    ''    '20'  .
*  set_fcat 'ZISKK'    '是否扣款  '    ''   'X'   ''       ''      ''    'X'   '6' .
*  set_fcat 'ZBZ'       '备注  '       ''   'X'   ''       ''      ''    ''    '20'  .
*  set_fcat 'ZBUDAT'    '创建日期'     ''   ''    ''       ''      ''    ''    '8'  .
*  set_fcat 'ZPUTM_MKPF' '创建时间'    ''   ''    ''       ''      ''    ''    '8'   .
*  set_fcat 'ZUSNAM'    '创建人  '     ''   ''    ''      ''       ''    ''    '5'  .

  set_fcat 'ZXH'      '序号  '       ''    ''    ''       ''     'X'   ''    '04'  .
  set_fcat 'BUKRS'    '公司代码'     ''    'X'   ''       ''     'X'   ''    '08'  .
  set_fcat 'WERKS'    '工厂'         ''    'X'   ''       ''     'X'   ''    '08'  .
  set_fcat 'ZGYS'     '供应商  '     ''    'X'   'LIFNR'  'X'    'X'   ''    '08'  .
  set_fcat 'NAME1'     '供应商名称'   ''   ''    ''        ''    ''    ''    '15'  .
  set_fcat 'MATNR'    '物料编码  '    ''   'X'  'MATNR'   'X'    'X'   ''    '14'  .
  set_fcat 'MAKTX'    '物料描述  '    ''   ''   ''         ''    ''    ''    '15'  .
  set_fcat 'CHARG'    '批次  '        ''   'X'   ''       'X'    ''    ''    '10' .
  set_fcat 'MBLNR'    '物料凭证'      ''   'X' 'MBLNR'    'X'    'X'  ''     '10'  .
  set_fcat 'ZEILE'    '物料凭证行项目' ''   'X'  'MBLPO'    ''    'X'  ''     '6' .
  set_fcat 'VBELN'    '销售凭证  '    ''   'X'  'VBELN'    'X'   'X'  ''     '10' .
  set_fcat 'POSNR'    '销售凭证行项目' ''   'X'  'POSNR'   ''     'X'  ''     '6' .
  set_fcat 'ZCPCS'    '层数  '        ''   ''    ''        ''    ''    ''     '4'  .
  set_fcat 'ZMJ  '    '数量  '        ''   'X'   ''       ''     ''    ''     '8'  .
  set_fcat 'ZMEINS'   '单位  '        ''   'X'   ''       'X'     ''   ''     '3' .
  set_fcat 'ZKKJE'    '扣款金额  '    ''   'X'   'ZKKJE'  ''      ''    ''    '8'  .
  set_fcat 'ZBB  '    '币别  '        ''   'X'   ''       'X'     ''   ''     '3'  .
  set_fcat 'ZKKYY'    '扣款原因  '    ''   'X'   ''       ''      ''    ''    '20'  .
  set_fcat 'ZISKK'    '是否扣款  '    ''   'X'   ''       ''      ''    'X'   '8' .
  set_fcat 'ZBZ'     '备    注  '    ''   'X'   ''       ''      ''    ''    '255'  .
  set_fcat 'ZBUDAT'    '创建日期'     ''   ''    ''       ''      ''    ''    '10'  .
  set_fcat 'ZPUTM_MKPF' '创建时间'    ''   ''    ''       ''      ''    ''    '8'   .
  set_fcat 'ZUSNAM'    '创建人  '     ''   ''    ''      ''       ''    ''    '6'  .


ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  PREPARE_LAYOUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM prepare_layout CHANGING p_gs_layout TYPE lvc_s_layo.
  p_gs_layout-zebra = 'X'.
*  P_GS_LAYOUT-SEL_MODE = 'A'.
  p_gs_layout-cwidth_opt = 'X'.
  p_gs_layout-edit_mode = 'X'.
*  P_GS_LAYOUT-CTAB_FNAME = 'CELLCOLOR'.
ENDFORM.



FORM toolbar_excluding_item CHANGING pt_exclude TYPE ui_functions.
  DATA ls_exclude TYPE ui_func.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_delete_row.
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_insert_row.
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_append_row.
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_copy_row.
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_copy.
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_paste_new_row.
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_move_row.
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_paste.
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_cut.
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_undo.
  APPEND ls_exclude TO pt_exclude.
ENDFORM.



*&---------------------------------------------------------------------*
*& Form FRM_GET_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_get_data .
  PERFORM FRM_USER_APPEND .

  SELECT
           zmmzlkk02~zxh                    ,
           zmmzlkk02~zgys                   ,
           zmmzlkk02~BUKRS                  ,
           zmmzlkk02~name1                  ,
           zmmzlkk02~werks                  ,
           zmmzlkk02~matnr                  ,
           zmmzlkk02~maktx                  ,
           zmmzlkk02~mblnr                  ,
           zmmzlkk02~zeile                  ,
           zmmzlkk02~vbeln                  ,
           zmmzlkk02~posnr                  ,
           zmmzlkk02~charg                  ,
           zmmzlkk02~zcpcs                  ,
           zmmzlkk02~zmj                    ,
           zmmzlkk02~zmeins                 ,
           zmmzlkk02~zkkje                  ,
           zmmzlkk02~zbb                    ,
           zmmzlkk02~zkkyy                  ,
           zmmzlkk02~ziskk                  ,
           zmmzlkk02~zbz                    ,
           zmmzlkk02~zbudat                 ,
           zmmzlkk02~zputm_mkpf             ,
           zmmzlkk02~zusnam
    FROM   zmmzlkk02
    WHERE  zmmzlkk02~zgys   IN @s_lifnr
    AND    zmmzlkk02~matnr  IN @s_matnr
    AND    zmmzlkk02~mblnr  IN @s_mblnr
    AND    zmmzlkk02~charg  IN @s_charg
    AND    zmmzlkk02~zcpcs  IN @s_zcpcs
    AND    zmmzlkk02~zbudat IN @s_zbudt
    AND    zmmzlkk02~zusnam IN @s_name1
    AND    zmmzlkk02~BUKRS  IN @S_BUKRS
    INTO  CORRESPONDING FIELDS OF TABLE @gt_item
  .
  SORT gt_item by ZXH .

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SAVE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_save .
  PERFORM FRM_CHACK_DATA .
  DATA LV_CHAR TYPE C LENGTH 40 .
  CLEAR gs_item .

  LOOP AT gt_item INTO gs_item WHERE zjbj IS NOT INITIAL OR xgbj IS NOT INITIAL .
    IF gs_item-zjbj = 'X'.
      gs_item-zbudat      =  sy-datum .
      gs_item-zputm_mkpf  =  sy-uzeit .
      gs_item-zusnam      =  sy-uname .
      MOVE-CORRESPONDING gs_item TO gs_data .
      MODIFY zmmzlkk02 FROM gs_data .
      MESSAGE '保存成功' TYPE 'S' .
    ELSEIF gs_item-xgbj = 'X' .
      IF SY-UNAME IN S_USER .
        gs_item-zbudat      =  sy-datum .
        gs_item-zputm_mkpf  =  sy-uzeit .
        gs_item-zusnam      =  sy-uname .
        MOVE-CORRESPONDING gs_item TO gs_data .
        MODIFY zmmzlkk02 FROM gs_data .
      ELSE .
        MESSAGE '只有指定用户允许修改' TYPE  'S' DISPLAY LIKE 'E' .
      ENDIF.
    ENDIF.
  ENDLOOP.

  CLEAR gt_item .
  PERFORM frm_get_data .
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CHACK_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_CHACK_DATA .

  CLEAR : gs_item .
  LOOP AT gt_item INTO  gs_item WHERE zjbj IS NOT INITIAL OR xgbj IS NOT INITIAL.
    SELECT SINGLE BUKRS , LIFNR
      FROM LFb1
      INTO @DATA(LV_BUKRS)
      WHERE BUKRS = @gs_item-BUKRS
      AND   LIFNR = @GS_ITEM-ZGYS .
      IF LV_BUKRS IS INITIAL.
        MESSAGE '供应商不属于公司代码' && gs_item-BUKRS && ',请重新输入' TYPE 'E' .
      ENDIF.

    IF gs_item-ZGYS IS INITIAL.
      MESSAGE '序号' && gs_item-ZXH && '所在行供应商不能为空!!' TYPE 'E' DISPLAY LIKE 'E' .
    ELSEIF gs_item-matnr IS INITIAL.
      MESSAGE '序号' && gs_item-ZXH && '所在行物料编码不能为空!!' TYPE 'E' DISPLAY LIKE 'E' .
    ELSEIF gs_item-zkkje = '0'.
      MESSAGE '序号' && gs_item-ZXH && '所在行扣款金额不能为空!!' TYPE 'E' DISPLAY LIKE 'E' .
    ELSEIF gs_item-ZKKYY IS INITIAL .
      MESSAGE '序号' && gs_item-ZXH && '所在行扣款原因不能为空!!' TYPE 'E' DISPLAY LIKE 'E' .
    ENDIF.

        AUTHORITY-CHECK OBJECT 'F_LFA1_BUK'
                ID 'BUKRS' FIELD gs_item-BUKRS
                 ID 'ACTVT' FIELD '03'.
    IF sy-subrc <> 0.
     MESSAGE '您没有操作公司代码' &&  gs_item-BUKRS && '的权限'  TYPE 'E' DISPLAY LIKE 'E' .
    ENDIF.


  ENDLOOP.

  CALL METHOD alv_grid->refresh_table_display
    EXPORTING
      is_stable = stbl.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_USER_APPEND
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_USER_APPEND .

  S_USER-SIGN   = 'I'  .
  S_USER-OPTION = 'EQ'  .
  S_USER-LOW    = '1101305'  .
  APPEND S_USER .
  S_USER-LOW    = '00018881' .
  APPEND S_USER .
  S_USER-LOW    = '1501020'  .
  APPEND S_USER .
  S_USER-LOW    = '1802018'  .
  APPEND S_USER .

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_EXIT_CHACK
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_EXIT_CHACK .
  LOOP AT gt_item INTO DATA(GS_QWE) WHERE zjbj IS NOT INITIAL OR xgbj IS NOT INITIAL .
    DATA(LV_EC) = 'X' .
  ENDLOOP.
  IF LV_EC = 'X'.
    DATA lv_answer TYPE c LENGTH 1 .
    CALL FUNCTION 'POPUP_TO_CONFIRM'  "弹出对话框
      EXPORTING
        titlebar       = '退出'
*       DIAGNOSE_OBJECT             = ' '
        text_question  = '存在未保存数据,是否退出???'
        text_button_1  = '确认'
*       ICON_BUTTON_1  = ' '
*       TEXT_BUTTON_2  = 'Nein'(002)
*       ICON_BUTTON_2  = ' '
*       DEFAULT_BUTTON = '1'
*       DISPLAY_CANCEL_BUTTON       = 'X'
*       USERDEFINED_F1_HELP         = ' '
*       START_COLUMN   = 25
*       START_ROW      = 6
*       POPUP_TYPE     =
*       IV_QUICKINFO_BUTTON_1       = ' '
*       IV_QUICKINFO_BUTTON_2       = ' '
      IMPORTING
        answer         = lv_answer
*                         TABLES
*       PARAMETER      =
      EXCEPTIONS
        text_not_found = 1
        OTHERS         = 2.
    IF sy-subrc <> 0.
*           Implement suitable error handling here
    ENDIF.

    IF lv_answer = '1'.
      GV_CCC = 'X' .
    ELSE .
      EXIT .
    ENDIF .
  ELSE .
    GV_CCC = 'X' .
  ENDIF.
ENDFORM.

猜你喜欢

转载自blog.csdn.net/Qunending/article/details/113173771
今日推荐