现在的位置: 首页 > 综合 > 正文

SAP ALV Class方式显示、事件响应、双击打开ALV窗口

2013年09月21日 ⁄ 综合 ⁄ 共 14878字 ⁄ 字号 评论关闭

原文地址:http://blog.sina.com.cn/s/blog_3f3df76a0100ajxi.html

 

  (1)屏幕100:OK_CODE(事件码传递),ALVCONTAINER(容器)

 PROCESS BEFORE OUTPUT.
   MODULE STATUS_0100.
*
PROCESS AFTER INPUT.
 MODULE USER_COMMAND_0100.

(2)屏幕:200-OK_CODE(事件码传递),CON_DIABOX(容器)

  PROCESS BEFORE OUTPUT.
 MODULE STATUS_0200.
*
PROCESS AFTER INPUT.
 MODULE USER_COMMAND_0200.

(3)屏幕:2000-OK_CODE(事件码传递),SUB111(子屏幕)

  PROCESS BEFORE OUTPUT.
MODULE status_2000.
CALL SUBSCREEN sub111 INCLUDING sy-repid '9999'.

PROCESS AFTER INPUT.
MODULE user_command_2000.
 CALL SUBSCREEN sub111.

(4)main200-状态栏 ,

      main100-状态栏 ,

*&---------------------------------------------------------------------*
*& Report  Z_WBH_ALV_CLASS
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  Z_WBH_ALV_CLASS.
TYPE-POOLS slis.
DATA:con_diabox TYPE REF TO cl_gui_dialogbox_container.
DATA: l_alv TYPE REF TO cl_gui_alv_grid ,
      lt_sflight TYPE TABLE OF sflight .
*DATA: ok_code LIKE sy-ucomm.

TABLES: ekko.
DATA: BEGIN OF itab OCCURS 0 ,
        flag ,
        werks LIKE ekpo-werks,
        ebeln LIKE ekko-ebeln,
        lifnr LIKE ekko-lifnr,
        name1 LIKE lfa1-name1,
        telf1 LIKE lfa1-telf1,
        aedat LIKE ekko-aedat,
*        zzreagree LIKE ekko-zzreagree,
*        zzredate LIKE ekko-zzredate,
*        zzrereason LIKE ekko-zzrereason,
*        zzreperson LIKE ekko-zzreperson,
*        zzremode   LIKE ekko-zzremode,
*        zzpostatus LIKE ekko-zzpostatus,
      END OF itab .
DATA: ok_code LIKE sy-ucomm .
DATA: l_valid(1) TYPE c.
DATA: go_grid             TYPE REF TO cl_gui_alv_grid,
      g_container TYPE scrfname VALUE 'ALVCONTAINER',
      g_custom_container TYPE REF TO cl_gui_custom_container.
DATA: gt_fieldcat TYPE lvc_t_fcat,
      gs_fieldcat TYPE lvc_s_fcat,
      gs_variant  TYPE disvariant ,
      gt_sort     TYPE lvc_t_sort,
      gs_sort     TYPE lvc_s_sort,
      gt_filt     TYPE lvc_t_filt,
      gs_filt     TYPE lvc_s_filt,
      ls_cell     TYPE lvc_s_styl,
      sla         TYPE lvc_s_layo,
      gt_f4       TYPE lvc_t_f4,
      gs_f4       TYPE lvc_s_f4.
DATA: lt_exclude TYPE ui_functions.

SELECTION-SCREEN BEGIN OF SCREEN 9999 ."as SUBSCREEN."当使用自定义屏幕显示选择条件时,此处必须将选择条件定义成子屏幕

PARAMETERS p_werks LIKE ekpo-werks OBLIGATORY.
SELECT-OPTIONS:
            s_ebeln FOR ekko-ebeln ,
            s_lifnr FOR ekko-lifnr,
            s_aedat FOR ekko-aedat ."OBLIGATORY.
SELECTION-SCREEN END OF SCREEN 9999.
DATA  cl_gui_alv_grid.

CLASS lcl_event_handler DEFINITION."弹出窗口关闭事件定义
  PUBLIC SECTION.
    CLASS-METHODS:
   on_close FOR EVENT close OF cl_gui_dialogbox_container IMPORTING sender.
ENDCLASS.                    "lcl_event_handler DEFINITION
*----------------------------------------------------------------------*
*       CLASS lcl_event_handler IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_event_handler IMPLEMENTATION.
  METHOD on_close.
    CALL METHOD sender->free.
    FREE: con_diabox, l_alv.
      CALL SCREEN '100'.
  ENDMETHOD.                    "on_close
ENDCLASS.
*---------------------------------------------------------------------*
*       CLASS lcl_event_receiver DEFINITION,以下为声明事件和实现事件方法类
*---------------------------------------------------------------------*
CLASS lcl_event_receiver DEFINITION."alv显示f4和双击事件定义
  PUBLIC SECTION.
    METHODS handle_f4
      FOR EVENT onf4 OF cl_gui_alv_grid
      IMPORTING e_fieldname
                es_row_no
                er_event_data
                et_bad_cells.
    METHODS catch_doubleclick
      FOR EVENT double_click OF cl_gui_alv_grid
      IMPORTING e_row
                e_column
                es_row_no .
ENDCLASS.                    "lcl_event_receiver DEFINITION
*---------------------------------------------------------------------*
*       CLASS lcl_event_receiver IMPLEMENTATION
*---------------------------------------------------------------------*
CLASS lcl_event_receiver IMPLEMENTATION.
  METHOD handle_f4.
    PERFORM f4 USING e_fieldname
                     es_row_no
                     er_event_data
                     et_bad_cells.
  ENDMETHOD.                                                "handle_f4
  METHOD catch_doubleclick.
    PERFORM atdoubleclick USING e_row
                                e_column
                                es_row_no.
  ENDMETHOD.                    "catch_doubleclick
ENDCLASS.                    "lcl_event_receiver IMPLEMENTATION

DATA: event_receiver TYPE REF TO lcl_event_receiver.
DATA:pm(10) TYPE c.
INITIALIZATION.
*  gd_repid = sy-repid.
  PERFORM fieldcat_init USING gt_fieldcat[]."初始化alv要显示的列及能否编辑状态等

START-OF-SELECTION.
  CALL SELECTION-SCREEN 9999."调用选择屏幕
  CALL SCREEN '100'."执行事件后alv结果显示窗口
* CALL SCREEN 2000."直接调用自定义显示选择条件的屏幕

at USER-COMMAND ."在屏幕显示时该代码无用
  CASE sy-ucomm .
    WHEN 'EXIT' OR 'BACK'.
      LEAVE PROGRAM.
    WHEN 'SAVE'.
      PERFORM save.
    WHEN 'ALL'.
      PERFORM all.
    WHEN 'NONE'.
      PERFORM none.
  ENDCASE.
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
  CASE ok_code."注意在屏幕中必须定义ok_code
    WHEN 'EXIT' OR 'BACK'.
*    CALL METHOD sender->free.
    FREE: g_custom_container, go_grid.
      call SELECTION-SCREEN 9999 . "返回选择屏幕
*      LEAVE PROGRAM."直接退出
*      CALL SCREEN 2000.“调用自定义显示选择条件屏幕
*      LEAVE TO SCREEN 2000.”调用自定义显示选择条件屏幕
    WHEN 'SAVE'.
      PERFORM save.
    WHEN 'SEL'.
      PERFORM all.
    WHEN 'CAL'.
      PERFORM none.
  ENDCASE.
  CLEAR ok_code .
ENDMODULE.                 " USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*&      Form  load_data_into_grid
*&---------------------------------------------------------------------*
FORM load_data_into_grid.
  "产生要输出的数据存到内表itab中
  SELECT  ekko~ebeln
          ekko~lifnr
          ekko~aedat
*          ekko~zzreagree
*          ekko~zzredate
*          ekko~zzrereason
*          ekko~zzreperson
*          ekko~zzremode
*          ekko~zzpostatus
          lfa1~name1
          lfa1~telf1
          ekpo~werks
  FROM ekko INNER JOIN ekpo ON ekko~ebeln = ekpo~ebeln AND
                               ekpo~ebelp = '00010'
            INNER JOIN lfa1 ON ekko~lifnr = lfa1~lifnr
  INTO CORRESPONDING FIELDS OF TABLE itab
  WHERE ekko~ebeln IN s_ebeln AND
        ekko~lifnr IN s_lifnr AND
        ekko~aedat IN s_aedat AND
        ekpo~werks = p_werks.

  sla-cwidth_opt = 'X'."显示样式设置
  sla-zebra      = 'X'.
  sla-no_toolbar = ''."是否显示标准工具条
*  sla-edit = 'X' .
  CALL METHOD go_grid->set_table_for_first_display
    EXPORTING
      is_variant                    = gs_variant
      i_save                        = 'A'
      is_layout                     = sla
*      IT_TOOLBAR_EXCLUDING          =
    CHANGING
      it_outtab                     = itab[]
      it_fieldcatalog               = gt_fieldcat[]
    EXCEPTIONS
      invalid_parameter_combination = 1
      program_error                 = 2
      too_many_lines                = 3
      OTHERS                        = 4.
  CALL METHOD go_grid->set_ready_for_input "??????
    EXPORTING
      i_ready_for_input = 1.
ENDFORM.                    " load_data_into_grid

*&--------------------------------------------------------------------*
*&      Form  fieldcat_init
*&--------------------------------------------------------------------*
FORM fieldcat_init USING rt_fieldcat TYPE lvc_t_fcat.
  DATA: ls_fieldcat TYPE lvc_s_fcat.
  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname     = 'FLAG'."用于产生复选框按钮列
  ls_fieldcat-scrtext_l     = 'Flag'.
  ls_fieldcat-checkbox      = 'X'."复选框表示
  ls_fieldcat-edit          = 'X'."可编辑标示
  ls_fieldcat-key           = 'X'.
  APPEND ls_fieldcat TO  rt_fieldcat .
  CLEAR ls_fieldcat.
  PERFORM frm_catlg_set USING:
  'WERKS'  '' '门店'         '' 'WERKS' 'EKPO' rt_fieldcat,
  'EBELN'  '' 'PO号码'       '' 'EBELN' 'EKKO' rt_fieldcat,
  'AEDAT'  '' 'PO日期'       '' 'AEDAT' 'EKKO' rt_fieldcat,
  'LIFNR'  '' '供应商'       '' 'LIFNR' 'EKKO' rt_fieldcat, "
  'NAME1'  '' '供应商名称'   '' 'NAME1' 'LFA1' rt_fieldcat,
  'TELF1'  '' '供应商电话'   '' 'TELF1' 'LFA1' rt_fieldcat,
  'ZZREAGREE'  '' '是否同意'  'X'  'ZZREAGREE'  'EKKO' rt_fieldcat,"X选项表示该列可以编辑
  'ZZREDATE'  '' '日期'   'X'  'ZZREDATE'  'EKKO' rt_fieldcat,
  'ZZREPERSON'  '' '回复人'   'X'  'ZZREPERSON' 'EKKO' rt_fieldcat,
  'ZZREMODE'  '' '退货方式'   'X'  'ZZREMODE' 'EKKO' rt_fieldcat,
  'ZZPOSTATUS'  '' 'PO状态'   'X'  'ZZPOSTATUS' 'EKKO' rt_fieldcat,
  'ZZREREASON'  '' '不同意原因'   'X'  'ZZREREASON' 'EKKO' rt_fieldcat.
  gs_f4-fieldname = 'ZZREPERSON'.
  gs_f4-register = 'X'.
  gs_f4-getbefore = 'X'.
  gs_f4-chngeafter = 'X'.
  INSERT gs_f4 INTO TABLE gt_f4."gt_f4用于保存产生f4事件的字段
ENDFORM.   "fieldcat_init

*---------------------------------------------------------------------*
*       FORM frm_catlg_set                                            *
*---------------------------------------------------------------------*
FORM frm_catlg_set USING p_field p_key p_text p_edit ref_f ref_t
                          rt_fieldcat  TYPE lvc_t_fcat .
  DATA:  tmp_fieldcat TYPE lvc_s_fcat.
  tmp_fieldcat-fieldname     =  p_field.
  tmp_fieldcat-key           =  p_key .
  tmp_fieldcat-scrtext_l     =  p_text.
  tmp_fieldcat-edit          =  p_edit.
  tmp_fieldcat-f4availabl    = 'X'.
  tmp_fieldcat-ref_field     = ref_f.
  tmp_fieldcat-ref_table     = ref_t.
  APPEND tmp_fieldcat TO rt_fieldcat .
  CLEAR tmp_fieldcat .
ENDFORM.                    " FRM_CATLG_SET
*&---------------------------------------------------------------------*
*&      Form  change
*&---------------------------------------------------------------------*
FORM change .
  IF go_grid->is_ready_for_input( ) = 0.
    CALL METHOD go_grid->set_ready_for_input
      EXPORTING
        i_ready_for_input = 1.
  ELSE.
    CALL METHOD go_grid->check_changed_data  "????????????
      IMPORTING
        e_valid = l_valid.
    CALL METHOD go_grid->set_ready_for_input
      EXPORTING
        i_ready_for_input = 0.
    CALL METHOD go_grid->refresh_table_display.
  ENDIF.
ENDFORM.                    " change

*&--------------------------------------------------------------------*
*&      Form  f4
*&--------------------------------------------------------------------*
FORM f4 USING r_fieldname TYPE lvc_fname
              rs_row_no TYPE lvc_s_roid
              rr_event_data TYPE REF TO cl_alv_event_data
              rt_bad_cells TYPE lvc_t_modi.
  MESSAGE 'f4' TYPE 'I'.
  rr_event_data->m_event_handled = 'X'.
ENDFORM.                                                    " F4
*&---------------------------------------------------------------------*
*&      Module  STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
  SET PF-STATUS 'MAIN200'.
  gs_variant-report = sy-repid.
  "注册事件到alv
  IF g_custom_container IS INITIAL.
    CREATE OBJECT g_custom_container
           EXPORTING container_name = g_container.
  IF go_grid IS INITIAL.
    CREATE OBJECT go_grid
      EXPORTING
        i_parent = g_custom_container."cl_gui_container=>screen0."当需要back到选择屏幕时,不能防止放置在默认容器screen0中,
    CREATE OBJECT event_receiver.
    SET HANDLER event_receiver->handle_f4 FOR go_grid.
    CALL METHOD go_grid->register_f4_for_fields
      EXPORTING
        it_f4 = gt_f4."gt_f4用于保存产生f4事件的字段
    SET HANDLER event_receiver->catch_doubleclick FOR go_grid.
    IF sy-batch IS INITIAL.
      CALL METHOD go_grid->register_edit_event
        EXPORTING
          i_event_id = cl_gui_alv_grid=>mc_evt_enter.
    ENDIF.
    PERFORM load_data_into_grid.
  ENDIF.
  ENDIF.
ENDMODULE.                 " STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
*&      Form  save
*&---------------------------------------------------------------------*
FORM save.
  CALL METHOD go_grid->check_changed_data
    IMPORTING
      e_valid = l_valid.
  IF l_valid = 'X'.
    LOOP AT itab WHERE flag = 'X'.
*      UPDATE ekko SET
*                zzreagree = itab-zzreagree
*                zzredate = itab-zzredate
*                zzrereason = itab-zzrereason
*                zzreperson = itab-zzreperson
*                zzremode   = itab-zzremode
*                zzpostatus = itab-zzpostatus
*      WHERE ebeln = itab-ebeln .
      IF sy-subrc NE 0.
        MESSAGE e000(z900) WITH 'Update Error!'.
      ENDIF.
    ENDLOOP.
    IF sy-subrc = 0.
      MESSAGE i000(z900) WITH 'Update Success!'.
    ENDIF.
  ELSE.
    MESSAGE e000(z900) WITH 'Data Error'.
  ENDIF.
ENDFORM.                    " save
*&---------------------------------------------------------------------*
*&      Form  all
*&---------------------------------------------------------------------*
FORM all.
  LOOP AT itab.
    itab-flag = 'X'.
    MODIFY itab.
  ENDLOOP.
  CALL METHOD go_grid->refresh_table_display."设置编辑状态后,刷新alv显示
ENDFORM.                    " all
*&---------------------------------------------------------------------*
*&      Form  none
*&---------------------------------------------------------------------*
FORM none.
  LOOP AT itab.
    itab-flag = ' '.
    MODIFY itab.
  ENDLOOP.
  CALL METHOD go_grid->refresh_table_display.
ENDFORM.                    " none
*&---------------------------------------------------------------------*
*&      Form  atdoubleclick
*&---------------------------------------------------------------------*
FORM atdoubleclick USING    p_e_row
                            p_e_column
                            p_es_row_no.
*  MESSAGE '双击' TYPE 'I'.
  READ TABLE itab INDEX p_e_row.
  IF p_e_column = 'EBELN'.
    SET PARAMETER ID 'BES' FIELD itab-ebeln.
    CALL FUNCTION 'ME_DISPLAY_PURCHASE_DOCUMENT' "相应双击事件,根据双击列进行调用相应的方法
      EXPORTING
        i_ebeln = itab-ebeln
        i_enjoy = 'X'.
  ELSEIF p_e_column = 'LIFNR'.
    CALL FUNCTION 'MMPUR_VENDOR_DISPLAY'
      EXPORTING
        im_lifnr = itab-lifnr
        im_ekorg = 'B000'.
  else.
      CALL SCREEN 200..
  ENDIF.
ENDFORM. " atdoubleclick
*&---------------------------------------------------------------------*
*&      Module  STATUS_0200  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE STATUS_0200 OUTPUT.
*  SET PF-STATUS 'xxxxxxxx'.
*  SET TITLEBAR 'xxx'.
*  SET PF-STATUS 'MAIN100'.

  SELECT * FROM sflight INTO TABLE lt_sflight.
  IF con_diabox IS INITIAL.
    CREATE OBJECT con_diabox
      EXPORTING
        width   = 600
        height  = 200
        top     = 70
        left    = 140
        caption = 'Title'
      EXCEPTIONS
        OTHERS  = 1.
    SET HANDLER lcl_event_handler=>on_close FOR con_diabox .

    CREATE OBJECT l_alv
      EXPORTING
        i_parent = con_diabox.
  ENDIF.
  CALL METHOD l_alv->set_table_for_first_display
    EXPORTING
      i_structure_name = 'SFLIGHT'
    CHANGING
      it_outtab        = lt_sflight.

ENDMODULE.                 " STATUS_0200  OUTPUT
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0200  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_0200 INPUT."没用
  CASE ok_code.
    WHEN 'BACK'.
*      LEAVE PROGRAM.
      CALL SCREEN '100'.
  ENDCASE.

ENDMODULE.                 " USER_COMMAND_0200  INPUT
*&---------------------------------------------------------------------*
*&      Module  status_2000  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE status_2000 OUTPUT.

  SET PF-STATUS 'MAIN100'.

ENDMODULE.                 " status_2000  OUTPUT
*&---------------------------------------------------------------------*
*&      Module  user_command_2000  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_2000 INPUT.
CASE ok_code.
    WHEN 'BACK' or 'EXIT'.
      LEAVE PROGRAM.
    WHEN 'EXE'.
*      CALL SELECTION-SCREEN 222 STARTING AT 10 5 .
      CALL SCREEN 100.
  ENDCASE.

ENDMODULE.                 " user_command_2000  INPUT

抱歉!评论已关闭.