alv弹出ALV实例2

*&---------------------------------------------------------------------*

*& Report  ZMMTEST

*&

*&---------------------------------------------------------------------*

*&

*&

*&---------------------------------------------------------------------*

REPORT  zmmtest.

TYPE-POOLS: slis.

INCLUDE:zsy_xy_tcus.

************************************************************************

*TABLES

************************************************************************

TABLES: mara,marc ,mdma.

************************************************************************

*internal table

************************************************************************

DATA: BEGIN OF wa_mt61d.

        INCLUDE STRUCTURE mt61d.

DATA: END OF wa_mt61d.

DATA: BEGIN OF wa_mdkp.

        INCLUDE STRUCTURE mdkp.

DATA: END OF wa_mdkp.

DATA: BEGIN OF wa_mdsta.

        INCLUDE STRUCTURE mdsta.

DATA: END OF wa_mdsta.

DATA: BEGIN OF it_mdps  OCCURS 0.

        INCLUDE STRUCTURE mdps.

DATA: END OF it_mdps.

DATA: BEGIN OF it_mdez  OCCURS 0.

        INCLUDE STRUCTURE mdez.

DATA: END OF it_mdez.

DATA: it_mdez1 LIKE TABLE OF it_mdez WITH HEADER LINE .

DATA: BEGIN OF i_list OCCURS 0.

        INCLUDE STRUCTURE mdez.

DATA: matnr LIKE mara-matnr.

DATA: werks LIKE marc-werks.

DATA: berid LIKE mdma-berid.

DATA: pr_qty TYPE i .

DATA: END OF i_list.

DATA: i_list3 LIKE TABLE OF i_list WITH HEADER LINE .

DATA: BEGIN OF it_mdsu  OCCURS 0.

        INCLUDE STRUCTURE mdsu.

DATA: END OF it_mdsu.

DATA:BEGIN OF i_list1 OCCURS 0 ,

matnr LIKE mara-matnr ,

werks LIKE marc-werks ,

END OF i_list1 .

TYPES:BEGIN OF ty_item,

matnr LIKE mara-matnr ,

werks LIKE marc-werks ,

END OF ty_item.

DATA gt_item_ls TYPE STANDARD TABLE OF ty_item."临时存放信息

DATA:gs_item TYPE ty_item,

     gt_item TYPE STANDARD TABLE OF ty_item.

*   显示BOM ITEM信息alv

DATA: gs_dialogbox TYPE REF TO cl_gui_dialogbox_container,

      go_splitter_container      TYPE REF TO cl_gui_splitter_container,

      go_toolbar                 TYPE REF TO cl_gui_toolbar.

DATA gr_alvgrid TYPE REF TO  cl_gui_alv_grid.

DATA gs_toolbar TYPE LINE OF ttb_button.

DATA gt_fieldcat1 TYPE lvc_t_fcat.

DATA gs_layout1 TYPE lvc_s_layo.

DATA :e_hype  TYPE lvc_s_hype,

      ts_hype TYPE lvc_t_hype.

DATA m_have TYPE i .

DATA: infotext(150) TYPE c ,

ymatnr(50) TYPE c.

DATA: l_repid LIKE sy-repid.

DATA: g_list_top_of_page TYPE slis_t_listheader.

CONSTANTS:c_formname_top_of_page TYPE slis_formname VALUE 'TOP_OF_PAGE'.

l_repid = sy-repid.

************************************************************************

*SELECT-SRECCN

************************************************************************

SELECTION-SCREEN BEGIN OF BLOCK bl1 WITH FRAME TITLE text-bl1.

SELECT-OPTIONS:

               s_matnr FOR mara-matnr ,

               s_werks FOR marc-werks .

*PARAMETERS:              s_berid LIKE mdma-berid OBLIGATORY.

SELECTION-SCREEN END OF BLOCK bl1.

************************************************************************

*SELECT-OF-SELECTION

************************************************************************

START-OF-SELECTION.

  PERFORM sub_get_data .

*  IF m_have = 0 .

*    MESSAGE '您查找的数据未在数据库中找到,请重新输入!' TYPE 'I' .

*  ELSE.

*    PERFORM sub_process_data .

  PERFORM sub_display_data .

*  ENDIF.

************************************************************************

*END-OF-SELECTION

************************************************************************

END-OF-SELECTION .

*&--------------------------------------------------------------------*

*&      Form  top_of_page

*&--------------------------------------------------------------------*

FORM top_of_page.

  CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'

    EXPORTING

      it_list_commentary = g_list_top_of_page.

ENDFORM.                    " top_of_page

**&---------------------------------------------------------------------*

*&      Form  SUB_GET_DATA

*&---------------------------------------------------------------------*

FORM sub_get_data .

  i_list-matnr = '4001' .

  i_list-werks = '1000' .

  APPEND i_list .

ENDFORM .                    "sub_get_data

*==========================class  定义事件=============================

CLASS lcl_event_handler DEFINITION.

  PUBLIC SECTION.

    METHODS:

*      关闭dialogbox

      on_close

        FOR EVENT close OF cl_gui_dialogbox_container

          IMPORTING sender,

*    设置工具栏

     handle_toolbar     FOR EVENT toolbar OF cl_gui_alv_grid

       IMPORTING

         e_object,

*    用户命令响应

     handle_user_command FOR EVENT user_command OF cl_gui_alv_grid

       IMPORTING

         e_ucomm.

ENDCLASS.                    "LCL_EVENT_HANDLER DEFINITION

*----------------------------------------------------------------------*

*       CLASS LCL_EVENT_HANDLER IMPLEMENTATION

*----------------------------------------------------------------------*

*

*----------------------------------------------------------------------*

CLASS lcl_event_handler IMPLEMENTATION.

*----------------------------------------------------------------------

* Handles the Close event of the dialogbox. The colse event is

* triggered when the close button in the top right corner of the

* dialogbox is pushed. Closes the dialog box

*----------------------------------------------------------------------

  METHOD on_close.

    IF NOT sender IS INITIAL.

      CALL METHOD sender->free

        EXCEPTIONS

          OTHERS = 1.

      IF sy-subrc <> 0.

*   Error handling

      ENDIF.

      FREE gs_dialogbox.

      CLEAR gs_dialogbox.

    ENDIF.

  ENDMETHOD.                    "ON_CLOSE

*   method toolbar handler

  METHOD handle_toolbar.

    PERFORM set_toolbar CHANGING e_object.

  ENDMETHOD.                    "handle_toolbar

  METHOD handle_user_command.

*   Handle own functions defined in the toolbar

*    CASE e_ucomm.

*      WHEN 'OK'.

*         GR_ALVGRID->CHECK_CHANGED_DATA( ).

*

*         LOOP AT gt_item_ls INTO gs_item.

*           modify gt_item from gs_item INDEX gs_item-tabix.

*         ENDLOOP.

*

*        CALL METHOD GS_DIALOGBOX->FREE.

*        FREE GS_DIALOGBOX.

*        CLEAR GS_DIALOGBOX.

*    ENDCASE.

  ENDMETHOD.                    "handle_user_command

ENDCLASS.                    "LCL_EVENT_HANDLER IMPLEMENTATION

*&---------------------------------------------------------------------*

*&      Form  set_toolbar

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

*      -->PRF_OBJECT text

*----------------------------------------------------------------------*

FORM set_toolbar

 CHANGING prf_object TYPE REF TO cl_alv_event_toolbar_set.

  CLEAR prf_object->mt_toolbar.

  CLEAR  gs_toolbar.

  MOVE 'OK' TO gs_toolbar-function.

  MOVE icon_okay TO gs_toolbar-icon.

  MOVE 'OK' TO gs_toolbar-quickinfo.

  MOVE ' ' TO gs_toolbar-disabled.

  MOVE text-016 TO gs_toolbar-text.

  APPEND gs_toolbar       TO prf_object->mt_toolbar .

ENDFORM.                    "set_toolbar

*

FORM display_popup.

*  DATA:

*    BEGIN OF ls_popup,

*      text(60) TYPE c,

*    END OF ls_popup,

*    lt_popup   LIKE TABLE OF ls_popup,

*    lt_fcat    TYPE slis_t_fieldcat_alv,

*    ls_fcat    TYPE slis_fieldcat_alv,

*    lt_excl    TYPE slis_t_extab,

*    ls_excl    TYPE slis_extab,

*    lv_exit    TYPE c.

*

*  ls_popup-text = '打算的撒打算的'.  APPEND ls_popup TO lt_popup.

*  ls_popup-text = 'Second line'. APPEND ls_popup TO lt_popup.

*  ls_popup-text = 'Third line'.  APPEND ls_popup TO lt_popup.

*

*  ls_fcat-col_pos = 1.

*  ls_fcat-fieldname = 'TEXT'.

*  ls_fcat-outputlen = 60.

*  ls_fcat-seltext_m = 'Title of the table'.

*  APPEND ls_fcat TO lt_fcat.

*

*  ls_excl-fcode = '&ETA'. APPEND ls_excl TO lt_excl.

*  ls_excl-fcode = '%SC'.  APPEND ls_excl TO lt_excl.

*  ls_excl-fcode = '%SC+'. APPEND ls_excl TO lt_excl.

*  ls_excl-fcode = '&OUP'. APPEND ls_excl TO lt_excl.

*  ls_excl-fcode = '&ODN'. APPEND ls_excl TO lt_excl.

*  ls_excl-fcode = '&ILT'. APPEND ls_excl TO lt_excl.

*  ls_excl-fcode = '&OL0'. APPEND ls_excl TO lt_excl.

*  ls_excl-fcode = '&CRB'. APPEND ls_excl TO lt_excl.

*  ls_excl-fcode = '&CRL'. APPEND ls_excl TO lt_excl.

*  ls_excl-fcode = '&CRR'. APPEND ls_excl TO lt_excl.

*  ls_excl-fcode = '&CRE'. APPEND ls_excl TO lt_excl.

** ls_excl-fcode = '&AC1'. APPEND ls_excl TO lt_excl. " cancel

*  ls_excl-fcode = '&ALL'. APPEND ls_excl TO lt_excl.

*  ls_excl-fcode = '&SAL'. APPEND ls_excl TO lt_excl.

*

*  CALL FUNCTION 'REUSE_ALV_POPUP_TO_SELECT'

*    EXPORTING

*      i_title               = '详细资料'

*      i_selection           = ''

*      i_screen_start_column = 1

*      i_screen_start_line   = 1

*      i_screen_end_column   = 62

*      i_screen_end_line     = 10

*      i_tabname             = 'LT_POPUP'

*      it_fieldcat           = lt_fcat

*      it_excluding          = lt_excl

*    IMPORTING

*      e_exit                = lv_exit

*    TABLES

*      t_outtab              = lt_popup.

*

*  IF lv_exit = 'X'.

**   cancel

*  ELSE.

**   do action

*  ENDIF.

  gs_item-matnr = '4001'.

  gs_item-werks = '1000' .

  APPEND gs_item TO gt_item_ls.

*  APPEND gs_item .

  DATA go_event_handler           TYPE REF TO lcl_event_handler.

*  CLEAR gt_item_ls.

*  *   创建 dialogbox 对象

  CREATE OBJECT gs_dialogbox

    EXPORTING

      parent                      = cl_gui_container=>screen0

      width                       = 900

      height                      = 300

      style                       = cl_gui_control=>ws_sysmenu

*       REPID                       = SY-REPID

*       DYNNR                       = SY-DYNNR

*       LIFETIME                    = LIFETIME_DEFAULT

      top                         = 80

      left                        = 50

      caption                     = 'BOM行项目'

**        NO_AUTODEF_PROGID_DYNNR     =

**        METRIC                      = 0

**        NAME                        =

    EXCEPTIONS

      cntl_error                  = 1

      cntl_system_error           = 2

      create_error                = 3

      lifetime_error              = 4

      lifetime_dynpro_dynpro_link = 5

      event_already_registered    = 6

      error_regist_event          = 7

      OTHERS                      = 8.

  IF sy-subrc <> 0.

*     MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO

*                WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

  ENDIF.

*   创建alv对象

  CREATE OBJECT gr_alvgrid

    EXPORTING

      i_parent          = gs_dialogbox

    EXCEPTIONS

      error_cntl_create = 1

      error_cntl_init   = 2

      error_cntl_link   = 3

      error_dp_create   = 4

      OTHERS            = 5.

  IF sy-subrc <> 0.

    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno

               WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

  ENDIF.

  CLEAR:gt_fieldcat1.

  PERFORM prepare_field_catalog CHANGING gt_fieldcat1.

  PERFORM prepare_layout CHANGING gs_layout1.

  CALL METHOD gr_alvgrid->set_table_for_first_display

    EXPORTING

      is_layout                     = gs_layout1

      it_hyperlink                  = ts_hype

    CHANGING

      it_outtab                     = gt_item_ls

      it_fieldcatalog               = gt_fieldcat1

    EXCEPTIONS

      invalid_parameter_combination = 1

      program_error                 = 2

      too_many_lines                = 3

      OTHERS                        = 4.

  IF sy-subrc <> 0.

    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno

               WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

  ENDIF.

*    module user_command_9000 at exit-command .

  CREATE OBJECT go_event_handler.

*   注册事件

*  SET HANDLER go_event_handler->handle_user_command FOR gr_alvgrid.

*  SET HANDLER go_event_handler->handle_toolbar  FOR gr_alvgrid.

  SET HANDLER go_event_handler->on_close FOR gs_dialogbox.

  CALL METHOD gr_alvgrid->set_toolbar_interactive.

ENDFORM.                    "display_popup

*&---------------------------------------------------------------------*

*&      Form  PREPARE_FIELD_CATALOG

*&---------------------------------------------------------------------*

*       设置输出属性

*----------------------------------------------------------------------*

*      <--P_GT_FIELDCAT  text

*----------------------------------------------------------------------*

FORM prepare_field_catalog  CHANGING pt_fieldcat TYPE lvc_t_fcat.

* 行项目类别

  DATA ls_fcat TYPE lvc_s_fcat .

* 物料

  ls_fcat-fieldname = 'MATNR' .

  ls_fcat-inttype = 'C' .

  ls_fcat-outputlen = '10' .

  ls_fcat-coltext = '物料编码' .

  ls_fcat-seltext = text-010 .

  APPEND ls_fcat TO pt_fieldcat .

  CLEAR ls_fcat .

* 物料

  ls_fcat-fieldname = 'WERKS' .

  ls_fcat-inttype = 'C' .

  ls_fcat-outputlen = '10' .

  ls_fcat-coltext = '工厂' .

  ls_fcat-seltext = text-010 .

  APPEND ls_fcat TO pt_fieldcat .

  CLEAR ls_fcat .

ENDFORM.                    " PREPARE_FIELD_CATALOG

*&---------------------------------------------------------------------*

*&      Form  PREPARE_LAYOUT

*&---------------------------------------------------------------------*

*       设置layout

*----------------------------------------------------------------------*

*      <--P_GS_LAYOUT  text

*----------------------------------------------------------------------*

FORM prepare_layout  CHANGING ps_layout TYPE lvc_s_layo.

  ps_layout-zebra = 'X' .

*  PS_LAYOUT-GRID_TITLE = 'BOM 行项目信息' .

  ps_layout-smalltitle = 'X' .

*  PS_LAYOUT-NO_TOOLBAR = 'X'.

ENDFORM.                    " PREPARE_LAYOUT

*&---------------------------------------------------------------------*

*&      Form  SUB_DISPLAY_DATA

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

*  -->  p1        text

*  <--  p2        text

*----------------------------------------------------------------------*

FORM sub_display_data .

*****initial datatab

  DATA: l_i_output LIKE i_list OCCURS 0 WITH HEADER LINE.

*****initial title

  PERFORM build_comment_summary TABLES l_i_output

    USING g_list_top_of_page[].

****initial field category

  DATA: l_i_fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE.

  PERFORM init_alv_summary TABLES l_i_fieldcat. "Initial ALV

****initial others

  DATA: l_s_layout TYPE slis_layout_alv.

  l_s_layout-colwidth_optimize = 'X'.

****initial event

  DATA:l_events TYPE slis_t_event.

  PERFORM build_eventtab USING l_events[].

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'

    EXPORTING

      i_callback_program       = l_repid

      i_default                = 'X'

      i_save                   = 'X'

      i_callback_user_command  = 'USER_COMMAND'

      i_callback_pf_status_set = 'SET_PF_STATUS'

      it_events                = l_events[]

      is_layout                = l_s_layout

      it_fieldcat              = l_i_fieldcat[]

    TABLES

      t_outtab                 = i_list

    EXCEPTIONS

      program_error            = 1

      other                    = 2.

ENDFORM.                    " SUB_DISPLAY_DATA

*----------------------------------------------------------------------*

*&      Form  set_pf_status

*&--------------------------------------------------------------------*

*       text

*---------------------------------------------------------------------*

FORM set_pf_status USING rt_extab TYPE slis_t_extab.

  SET PF-STATUS 'ZMMTEST'."自建状态栏的名称

ENDFORM.                    "set_pf_status

*&---------------------------------------------------------------------*

*&      Form  build_eventtab

*&---------------------------------------------------------------------*

FORM build_eventtab USING v_events TYPE slis_t_event.

  DATA: l_event TYPE slis_alv_event.

  "Returns table of possible events for a list type

  CALL FUNCTION 'REUSE_ALV_EVENTS_GET'

    EXPORTING

      i_list_type = 0

    IMPORTING

      et_events   = v_events.            "List type (0,1,2,3)

  DATA: l_tabix LIKE sy-tabix.

  CLEAR l_event-form.

  READ TABLE v_events WITH KEY name = slis_ev_top_of_page

        INTO l_event.

  l_tabix = sy-tabix.

  IF sy-subrc = 0.

    MOVE c_formname_top_of_page TO l_event-form.

    MODIFY v_events FROM l_event INDEX l_tabix.

  ENDIF.

ENDFORM.                    " build_eventtab

*&---------------------------------------------------------------------*

*&      Form  build_comment_summary

*&--------------------------------------------------------------------*

FORM build_comment_summary TABLES v_i_output STRUCTURE i_list

                     USING v_list_top_of_page TYPE slis_t_listheader.

  """"Comment of Summary List

  DATA: l_line TYPE slis_listheader.

  CLEAR l_line.

  l_line-typ  = 'H'.

  l_line-key  = ''.

  l_line-info = '数据订单清单'.

  APPEND l_line TO v_list_top_of_page.

ENDFORM.                    "build_comment_summary

*&---------------------------------------------------------------------*

*&      Form  init_alv_summary

*&---------------------------------------------------------------------*

FORM init_alv_summary TABLES v_i_fieldcat TYPE slis_t_fieldcat_alv.

  """Init the field category of Summary List

  REFRESH v_i_fieldcat.

  CLEAR v_i_fieldcat.

  v_i_fieldcat-fieldname     = 'MATNR'.

  v_i_fieldcat-tabname       = 'I_LIST'.

  v_i_fieldcat-seltext_m     = '物料编码'.

  v_i_fieldcat-key          = 'X'.

  APPEND v_i_fieldcat.

  CLEAR v_i_fieldcat.

  v_i_fieldcat-fieldname     = 'WERKS'.

  v_i_fieldcat-tabname       = 'I_LIST'.

  v_i_fieldcat-seltext_m     = '工厂'.

  v_i_fieldcat-key           = 'X'.

  APPEND v_i_fieldcat.

ENDFORM.                    "init_alv_summary

*&--------------------------------------------------------------------*

*&      Form  USER_COMMAND

*&--------------------------------------------------------------------*

*       text

*---------------------------------------------------------------------*

*      -->UCOMM      text

*     -->SELFIELD   text

*---------------------------------------------------------------------*

FORM user_command USING ucomm LIKE sy-ucomm               "接收用户的命令

  selfield TYPE slis_selfield.

  READ TABLE i_list INDEX selfield-tabindex.

  CHECK sy-subrc = 0.

  DATA:  wl_answer  TYPE c.

  DATA: is_stable TYPE lvc_s_stbl .

  DATA:dd(22) TYPE  c .

*  i_list1-gamng * 1000.

****************************************

***自动刷新alv数据到内表中,省去点击保存之后才刷新数据

***注意 selfield-refresh = 'X'.只做这个是不够的

  DATA lr_grid TYPE REF TO cl_gui_alv_grid.

  is_stable-row = 'X'.

  is_stable-col = 'X' .

  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'

    IMPORTING

      e_grid = lr_grid.

  CALL METHOD lr_grid->check_changed_data.

*  PERFORM save_alv.

  PERFORM alv_refresh CHANGING  selfield-col_stable

                                    selfield-row_stable

                                    selfield-refresh.

  selfield-refresh = 'X'.

  selfield-row_stable = 'X'.

  selfield-col_stable = 'X'.

****************************************

  IF ucomm = '&JS'.

    CALL FUNCTION 'POPUP_TO_CONFIRM'

      EXPORTING

        text_question         = '您确定要执行该操作吗?'"TEXT-S07 "确定要删除吗?

        icon_button_1         = '是' "TEXT-S08 "是

        icon_button_2         = '否' "TEXT-S09 "否

        default_button        = '2'

        display_cancel_button = 'X'

        start_column          = 25

        start_row             = 6

      IMPORTING

        answer                = wl_answer

      EXCEPTIONS

        text_not_found        = 1

        OTHERS                = 2.

*******全选和取消全选

*  ELSEIF ucomm = 'ALL'.

*    PERFORM select_all.

*    PERFORM alv_refresh CHANGING selfield-col_stable

*                                 selfield-row_stable

*                                 selfield-refresh.

*  ELSEIF ucomm = 'DALL'.

*    PERFORM cancle_all.

*    PERFORM alv_refresh CHANGING  selfield-col_stable

*                                  selfield-row_stable

*                                  selfield-refresh.

*

*  ELSEIF ucomm = '&RF'.

*    PERFORM refresh_data .

*  ENDIF.

    IF wl_answer = '1'.

      CASE ucomm.

        WHEN '&JS'.

          PERFORM display_popup.

*      WHEN '&SURE'.

*REFRESH

**********判断是否有勾选记录

*        LOOP AT i_list1 WHERE cbox = 'X'.

*          zbz = 'X'.

*          EXIT .

*        ENDLOOP.

*        IF zbz = 'X'.

*          selfield-refresh = 'X'.                             "设置刷新标记  必须

*

*          LOOP AT i_mes.

*

*            MESSAGE  i_mes  TYPE 'I'.

*

*          ENDLOOP.

*

*        ELSE.

*          MESSAGE '请勾选更改状态的行项目!' TYPE 'I'.

*        ENDIF.

*        CLEAR i_mes[] .

*        CLEAR zbz.

      ENDCASE.

    ENDIF .

  ENDIF.

  CALL METHOD lr_grid->refresh_table_display

    EXPORTING

      is_stable      = is_stable

      i_soft_refresh = ''

    EXCEPTIONS

      finished       = 1

      OTHERS         = 2.

  IF sy-subrc <> 0 .

    LEAVE TO SCREEN 0 .

  ENDIF .

ENDFORM.                    "USER_COMMAND

*l_tabix = sy-tabix.

*IF sy-subrc = 0.

*ENDIF.

*

*ENDFORM.                    " build_eventtab

*&---------------------------------------------------------------------*

*&      Form  alv_refresh

*&---------------------------------------------------------------------*

*       更改选择的值

*----------------------------------------------------------------------*

FORM alv_refresh  CHANGING po_col_stable  po_row_stable  po_refresh.

  po_col_stable = 'X'.

  po_row_stable = 'X'.

  po_refresh = 'X'.

ENDFORM.                    " alv_refresh

猜你喜欢

转载自www.cnblogs.com/jimi520/p/12103025.html
alv