OO ALV 测试关闭ALV按钮

*&---------------------------------------------------------------------*
*& Report YWWZ_TEST904
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ywwz_test904.

*INCLUDE ywwz_test904_c01 .
*INCLUDE ywwz_test904_t01 .
*INCLUDE ywwz_test904_f01 .
*INCLUDE ywwz_test904_m01 .

*&---------------------------------------------------------------------*
*& 包含               YWWZ_TEST904_T01
*&---------------------------------------------------------------------*
TABLES:vbak.
*TYPES:BEGIN OF ty_head,
*
*        vbeln TYPE vbak-vbeln,
*        erdat TYPE vbak-erdat,
*        erzet TYPE vbak-erzet,
*        ernam TYPE vbak-ernam,
*        auart TYPE vbak-auart,
*
*
*      END OF ty_head.
*
*TYPES:BEGIN OF ty_item,
*        vbeln TYPE vbap-vbeln,
*        posnr TYPE vbap-posnr,
*        matnr TYPE vbap-matnr,
*        matkl TYPE vbap-matkl,
*        arktx TYPE vbap-arktx,
*      END OF ty_item.

DATA:gt_head TYPE TABLE OF vbak,
     gt_item TYPE TABLE OF vbap.

DATA:gv_title_9000 TYPE char30 VALUE '测试'.


DATA:g_container_9000_top    TYPE REF TO cl_gui_custom_container,
     g_container_9000_bottom TYPE REF TO cl_gui_docking_container.

DATA:go_alv_grid_head TYPE REF TO cl_gui_alv_grid,
     go_alv_grid_item TYPE REF TO cl_gui_alv_grid.

"ALV容器 cl_gui_docking_container 不用画屏幕容器 ,
"ALV container容器 cl_gui_custom_container 需要画屏幕容器
DATA:gv_item_alv_flag  TYPE c.


SELECT-OPTIONS   s_erdat FOR vbak-erdat.
**&---------------------------------------------------------------------*
**& DESC:搜索条件子屏幕的定义
**&---------------------------------------------------------------------*
*SELECTION-SCREEN BEGIN OF SCREEN 9010  AS SUBSCREEN.
*  SELECTION-SCREEN BEGIN OF LINE .
*    "---系统状态
*    SELECTION-SCREEN COMMENT 1(10) TEXT-001 .
*    SELECT-OPTIONS s_erdat FOR vbak-erdat.
*
*    "---执行按钮
*    SELECTION-SCREEN PUSHBUTTON 81(30) zexec USER-COMMAND zexec.
*  SELECTION-SCREEN END OF LINE .
*
*SELECTION-SCREEN END OF SCREEN 9010.


INITIALIZATION.
  PERFORM frm_initial.

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


*&---------------------------------------------------------------------*
*& 包含               YWWZ_TEST904_F01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module STATUS_9000 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_9000 OUTPUT.
  SET PF-STATUS 'STATUS_9000'.
  SET TITLEBAR 'TITLE_9000' WITH gv_title_9000.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module DISPLAY_ALV OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE display_alv OUTPUT.
  PERFORM frm_display_alv.
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_9000  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_9000 INPUT.

  CASE sy-ucomm.
    WHEN '&F03' OR '&F15'.
      LEAVE TO SCREEN 0.
    WHEN '&F12'.
      LEAVE PROGRAM.
    WHEN 'ZTEST'.
      PERFORM frm_close_item_alv.
    WHEN OTHERS.
  ENDCASE.

ENDMODULE.
*&---------------------------------------------------------------------*
*& Form frm_display_alv
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_initial .
*  zexec = icon_execute_object && '执行'.
ENDFORM.
FORM frm_display_alv .


  IF g_container_9000_top IS NOT BOUND.

    CREATE OBJECT g_container_9000_top
      EXPORTING
*       parent                      =
        container_name              = 'GRID1'
*       style                       =
*       lifetime                    = lifetime_default
*       repid                       =
*       dynnr                       =
*       no_autodef_progid_dynnr     =
      EXCEPTIONS
        cntl_error                  = 1
        cntl_system_error           = 2
        create_error                = 3
        lifetime_error              = 4
        lifetime_dynpro_dynpro_link = 5
        OTHERS                      = 6.
    IF sy-subrc <> 0.
 MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
    ENDIF.


*    CREATE OBJECT g_container_9000_top
*      EXPORTING
*        parent                      = cl_gui_container=>screen0
*        repid                       = sy-repid
*        dynnr                       = '9000'
**       side                        = cl_gui_docking_container=>dock_at_right      ”ALV贴屏幕右边,从屏幕右边开始算宽度
**       side                        = cl_gui_docking_container=>dock_at_top       "ALV贴屏幕左边,从左边算屏幕宽度,
**       extension                   = 5000                                          "屏幕宽度
**       ratio                       = 95  "屏幕比例 小于5大于95会报cntl_error异常
**       style                       = cl_gui_control=>ws_child                     "可选参数,设置ALV是否可用手动拖动大小
*      EXCEPTIONS
*        cntl_error                  = 1
*        cntl_system_error           = 2
*        create_error                = 3
*        lifetime_error              = 4
*        lifetime_dynpro_dynpro_link = 5
*        OTHERS                      = 6.

    CREATE OBJECT go_alv_grid_head
      EXPORTING
*       i_shellstyle      = 0
*       i_lifetime        =
        i_parent          = g_container_9000_top
*       i_appl_events     = SPACE
*       i_parentdbg       =
*       i_applogparent    =
*       i_graphicsparent  =
*       i_name            =
*       i_fcat_complete   = SPACE
*       o_previous_sral_handler =
*       i_use_one_ux_appearance = ABAP_FALSE
      EXCEPTIONS
        error_cntl_create = 1
        error_cntl_init   = 2
        error_cntl_link   = 3
        error_dp_create   = 4
        OTHERS            = 5.

    PERFORM frm_alv_head.

  ENDIF.


  IF go_alv_grid_head IS BOUND.


*    CALL METHOD g_container_9000_top->set_height( height = 1000 ).
    PERFORM frm_refresh_alv_9000 USING go_alv_grid_head.

  ENDIF.





*  CREATE OBJECT go_alv_grid_head"上半部分
*    EXPORTING
*      I_PARENT = G_CONTAINER_T.
*
*  CREATE OBJECT G_GRID_T"上半部分
*    EXPORTING
*      I_PARENT = G_CONTAINER_T.


ENDFORM.

FORM frm_alv_head .

  DATA: ls_layout   TYPE lvc_s_layo,
        lt_fieldcat TYPE lvc_t_fcat,
        lt_tools    TYPE ui_functions.

*&----layout
  ls_layout-zebra = 'X'.
  ls_layout-sel_mode   = 'C'.
  ls_layout-col_opt   = 'X'.
*  ls_layout-box_fname  = 'SEL'.

*&----fieldcat
  CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
    EXPORTING
*     I_BUFFER_ACTIVE        =
      i_structure_name       = 'VBAK'
*     I_CLIENT_NEVER_DISPLAY = 'X'
*     I_BYPASSING_BUFFER     =
*     I_INTERNAL_TABNAME     =
    CHANGING
      ct_fieldcat            = lt_fieldcat
    EXCEPTIONS
      inconsistent_interface = 1
      program_error          = 2
      OTHERS                 = 3.




  CALL METHOD go_alv_grid_head->set_table_for_first_display
    EXPORTING
      i_save                        = rs_c_true                      "#EC NOTEXT
      is_layout                     = ls_layout
*     it_toolbar_excluding          = lt_tools
    CHANGING
      it_outtab                     = gt_head
      it_fieldcatalog               = lt_fieldcat
    EXCEPTIONS
      invalid_parameter_combination = 1
      program_error                 = 2
      too_many_lines                = 3
      OTHERS                        = 4.
  IF sy-subrc NE 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

ENDFORM.

FORM frm_alv_item .

  DATA: ls_layout   TYPE lvc_s_layo,
        lt_fieldcat TYPE lvc_t_fcat,
        lt_tools    TYPE ui_functions.

*&----layout
  ls_layout-zebra = 'X'.
  ls_layout-sel_mode   = 'C'.
  ls_layout-col_opt   = 'X'.
*  ls_layout-box_fname  = 'SEL'.

*&----fieldcat
  CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
    EXPORTING
*     I_BUFFER_ACTIVE        =
      i_structure_name       = 'VBAP'
*     I_CLIENT_NEVER_DISPLAY = 'X'
*     I_BYPASSING_BUFFER     =
*     I_INTERNAL_TABNAME     =
    CHANGING
      ct_fieldcat            = lt_fieldcat
    EXCEPTIONS
      inconsistent_interface = 1
      program_error          = 2
      OTHERS                 = 3.




  CALL METHOD go_alv_grid_item->set_table_for_first_display
    EXPORTING
      i_save                        = rs_c_true                      "#EC NOTEXT
      is_layout                     = ls_layout
*     it_toolbar_excluding          = lt_tools
    CHANGING
      it_outtab                     = gt_item
      it_fieldcatalog               = lt_fieldcat
    EXCEPTIONS
      invalid_parameter_combination = 1
      program_error                 = 2
      too_many_lines                = 3
      OTHERS                        = 4.
  IF sy-subrc NE 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

ENDFORM.
FORM frm_get_data.

  SELECT *
    FROM vbak
    WHERE erdat IN @s_erdat[]
    INTO TABLE @gt_head
    UP TO 20 ROWS.

  SELECT *
    FROM vbap
    FOR ALL ENTRIES IN @gt_head
    WHERE vbeln = @gt_head-vbeln
    INTO TABLE @gt_item
    UP TO 20 ROWS.

ENDFORM.
FORM frm_close_item_alv.

  IF gv_item_alv_flag IS INITIAL.

    gv_item_alv_flag = 'X'.
    PERFORM frm_open_item.

  ELSEIF gv_item_alv_flag = 'X'.

    CLEAR gv_item_alv_flag.
    PERFORM frm_close_item.

  ENDIF.





ENDFORM.
FORM frm_open_item.

  IF g_container_9000_bottom IS NOT BOUND.

    CREATE OBJECT g_container_9000_bottom
      EXPORTING
        repid                       = sy-repid
        dynnr                       = '9000'
*       side                        = cl_gui_docking_container=>dock_at_right      ”ALV贴屏幕右边,从屏幕右边开始算宽度
        side                        = cl_gui_docking_container=>dock_at_bottom       "ALV贴屏幕左边,从左边算屏幕宽度,
        extension                   = 1000                                          "屏幕宽度
        ratio                       = 30  "屏幕比例 小于5大于95会报cntl_error异常
        style                       = cl_gui_control=>ws_child                     "可选参数,设置ALV是否可用手动拖动大小
      EXCEPTIONS
        cntl_error                  = 1
        cntl_system_error           = 2
        create_error                = 3
        lifetime_error              = 4
        lifetime_dynpro_dynpro_link = 5
        OTHERS                      = 6.

    CREATE OBJECT go_alv_grid_item
      EXPORTING
        i_parent          = g_container_9000_bottom
      EXCEPTIONS
        error_cntl_create = 1
        error_cntl_init   = 2
        error_cntl_link   = 3
        error_dp_create   = 4
        OTHERS            = 5.

    PERFORM frm_alv_item.

  ENDIF.



ENDFORM.

FORM frm_close_item.

  CALL METHOD g_container_9000_bottom->free.

  FREE g_container_9000_bottom.
  FREE go_alv_grid_item.
  CLEAR g_container_9000_bottom.
  CLEAR go_alv_grid_item.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_REFRESH_ALV_9000
*&---------------------------------------------------------------------*
FORM frm_refresh_alv_9000 USING pv_grid TYPE REF TO cl_gui_alv_grid.
  DATA: lt_celltab TYPE lvc_t_styl,
        ls_celltab TYPE lvc_s_styl,
        ls_stable  TYPE lvc_s_stbl.

  ls_stable-row = 'X'.  "固定行
  ls_stable-col = 'X'.  "固定列

  CHECK pv_grid IS NOT INITIAL.

  CALL METHOD pv_grid->refresh_table_display
    EXPORTING
      is_stable = ls_stable
*     I_SOFT_REFRESH = 'X'
    EXCEPTIONS
      finished  = 1
      OTHERS    = 2.

  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
  CALL METHOD cl_gui_cfw=>flush.
ENDFORM.

 

posted @ 2025-04-15 17:40  Lan_dev  阅读(21)  评论(0)    收藏  举报