Skip to content

ALV

整理下ALV用到的几种方法。

参考数据类型
TYPES:
  BEGIN OF ty_data,
    zsel         TYPE xfeld, " 勾选项
    mtype        TYPE bapi_mtype, " 处理结果
    msg          TYPE bapi_msg, " 处理文本
    rcol         TYPE char04, " 行颜色
    t_scol       TYPE lvc_t_scol, " 单元格颜色
    t_styl       TYPE lvc_t_styl, " 单元格样式
  END OF ty_data.
TYPES tt_data TYPE STANDARD TABLE OF ty_data WITH EMPTY KEY.

DATA gt_data TYPE tt_data.

LVC

LVC好在不用画屏幕,直接调用即可。

INCLUDE_LVC
*&---------------------------------------------------------------------*
*& Form frm_display
*&---------------------------------------------------------------------*
*& ALV展示
*&---------------------------------------------------------------------*
FORM frm_display TABLES ct_data TYPE STANDARD TABLE.

    DATA ls_layout TYPE lvc_s_layo.
    DATA lt_fieldcat TYPE STANDARD TABLE OF lvc_s_fcat.

    PERFORM frm_set_layout CHANGING ls_layout.
    PERFORM frm_set_fieldcat TABLES lt_fieldcat.
    PERFORM frm_set_style.
    PERFORM frm_set_color.

    CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
        EXPORTING
        i_callback_program       = sy-repid
        i_callback_pf_status_set = 'FRM_PF_STATUS'
        i_callback_user_command  = 'FRM_USER_COMMAND'
        is_layout_lvc            = ls_layout
        it_fieldcat_lvc          = lt_fieldcat
        i_default                = abap_true
        i_save                   = 'A'
        TABLES
        t_outtab                 = ct_data[]
        EXCEPTIONS
        program_error            = 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.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_set_layout
*&---------------------------------------------------------------------*
*& 报表布局设置
*&---------------------------------------------------------------------*
FORM frm_set_layout CHANGING cs_layout TYPE lvc_s_layo.

    CLEAR cs_layout.
    cs_layout-zebra = abap_true. " 斑马线
    cs_layout-cwidth_opt = abap_true. " 自动调整ALV列宽
    cs_layout-sel_mode = 'A'. " 选择模式
    cs_layout-info_fname = 'RCOL'. " 行颜色设置
    cs_layout-ctab_fname = 'T_SCOL'. " 单元格颜色设置
    cs_layout-stylefname = 'T_STYL'. " 单元格控制

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_set_fieldcat
*&---------------------------------------------------------------------*
*& 字段目录设置
*&---------------------------------------------------------------------*
FORM frm_set_fieldcat TABLES ct_fieldcat TYPE lvc_t_fcat.

    DATA ls_fieldcat TYPE lvc_s_fcat.

    DEFINE _init_fieldcat.
        CLEAR ls_fieldcat.
        ls_fieldcat-fieldname = &1.
        ls_fieldcat-scrtext_s = 
        ls_fieldcat-scrtext_m =
        ls_fieldcat-scrtext_l =
        ls_fieldcat-tooltip =
        ls_fieldcat-coltext =
        ls_fieldcat-seltext = &2.
        ls_fieldcat-ref_table = &3.
        ls_fieldcat-ref_field = &4.
        INSERT ls_fieldcat INTO TABLE ct_fieldcat.
    END-OF-DEFINITION.

    _init_fieldcat 'ZSEL' '选择项' '' ''.
    _init_fieldcat 'MTYPE' '处理状态' '' ''.
    _init_fieldcat 'MSG' '处理消息' '' ''.

    " 个性化自己输出数据格式
    LOOP AT ct_fieldcat REFERENCE INTO DATA(lr_fieldcat).
        IF lr_fieldcat->fieldname = 'ZSEL'.
        lr_fieldcat->checkbox = abap_true.
        lr_fieldcat->edit = abap_true.
        ENDIF.
    ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_set_style
*&---------------------------------------------------------------------*
*& 字段样式设置
*&---------------------------------------------------------------------*
FORM frm_set_style.

  DATA ls_styl TYPE lvc_s_styl.

  LOOP AT gt_data REFERENCE INTO DATA(lr_data).
    CLEAR lr_data->t_styl.

    " 设置ALV字段或行的状态
    " 常用有禁止编辑CL_GUI_ALV_GRID=>MC_STYLE_DISABLED
    " 禁止删除行CL_GUI_ALV_GRID=>MC_STYLE_NO_DELETE_ROW

  ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_set_color
*&---------------------------------------------------------------------*
*& 字段颜色设置
*&---------------------------------------------------------------------*
FORM frm_set_color.

  STATICS:
    BEGIN OF color,
      r_light   TYPE char04,
      r_success TYPE char04,
      r_error   TYPE char04,
      light     TYPE lvc_s_scol-color,
      success   TYPE lvc_s_scol-color,
      error     TYPE lvc_s_scol-color,
    END OF color.
  IF color IS INITIAL.
    color-r_light = 'C300'.
    color-r_success = 'C500'.
    color-r_error = 'C600'.
    color-light = VALUE #( col = 3 ).
    color-success = VALUE #( col = 5 ).
    color-error = VALUE #( col = 6 ).
  ENDIF.

  DATA ls_scol TYPE lvc_s_scol.

  LOOP AT gt_data REFERENCE INTO DATA(lr_data).
    CLEAR lr_data->t_scol.

    IF lr_data->zsel = abap_true.
      lr_data->rcol = color-r_light.
    ENDIF.

    IF lr_data->mtype = 'E'.
      lr_data->t_scol = VALUE #( BASE lr_data->t_scol color = color-error
        ( fname = 'MTYPE' )
        ( fname = 'MSG' )
      ).
    ENDIF.
  ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_pf_status
*&---------------------------------------------------------------------*
*& 设置GUI状态
*&---------------------------------------------------------------------*
FORM frm_pf_status USING ct_extab TYPE slis_t_extab.
    SET PF-STATUS 'STATUS'.
    SET TITLEBAR 'TITLE'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_user_command
*&---------------------------------------------------------------------*
*& 功能响应
*&---------------------------------------------------------------------*
FORM frm_user_command USING cv_ucomm LIKE sy-ucomm
                            cs_selfield TYPE slis_selfield.

    " 刷新屏幕数据到内表
    DATA: lo_grid TYPE REF TO cl_gui_alv_grid.
    CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
        IMPORTING
        e_grid = lo_grid.
    CALL METHOD lo_grid->check_changed_data.

    PERFORM frm_get_data_selection.

    " 按钮功能实现
    CASE cv_ucomm.
        WHEN '&IC1'. " 双击

        WHEN OTHERS.
    ENDCASE.

*  PERFORM frm_reset_data_selection.

    " 刷新ALV 显示值
    cs_selfield-refresh = abap_true .
    cs_selfield-row_stable = abap_true .
    cs_selfield-col_stable = abap_true .

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_get_data_selection
*&---------------------------------------------------------------------*
*& 将侧边栏选择也传递到ZSEL字段上
*&---------------------------------------------------------------------*
FORM frm_get_data_selection.

    " 刷新屏幕数据到内表
    DATA: lo_grid TYPE REF TO cl_gui_alv_grid.
    CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
        IMPORTING
        e_grid = lo_grid.

    " 获取ALV选取行
    DATA lt_rows TYPE lvc_t_row.
    CALL METHOD lo_grid->get_selected_rows
        IMPORTING
        et_index_rows = lt_rows.

    " 获取已过滤行
    DATA lt_filter TYPE lvc_t_fidx.
    CALL METHOD lo_grid->get_filtered_entries
      IMPORTING
        et_filtered_entries = lt_filter.

    LOOP AT lt_rows INTO DATA(ls_row).
        READ TABLE lt_filter TRANSPORTING NO FIELDS WITH KEY table_line = ls_row-index.
        IF sy-subrc = 0.
          CONTINUE.
        ENDIF.
        READ TABLE gt_data REFERENCE INTO DATA(lr_data) INDEX ls_row-index.
        IF sy-subrc = 0.
        lr_data->zsel = abap_true.
        ENDIF.
    ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_reset_data_selection
*&---------------------------------------------------------------------*
*& 重置勾选项
*&---------------------------------------------------------------------*
FORM frm_reset_data_selection.

    DATA: lo_grid TYPE REF TO cl_gui_alv_grid.
    CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
      IMPORTING
        e_grid = lo_grid.

    " 获取已过滤行
    DATA lt_filter TYPE lvc_t_fidx.
    CALL METHOD lo_grid->get_filtered_entries
      IMPORTING
        et_filtered_entries = lt_filter.

    LOOP AT gt_data REFERENCE INTO DATA(lr_data).
        READ TABLE lt_filter TRANSPORTING NO FIELDS WITH KEY table_line = sy-tabix.
        IF sy-subrc = 0.
          CONTINUE.
        ENDIF.
        CLEAR lr_data->zsel.
    ENDLOOP.

ENDFORM.

ALV GRID

OOALV可定制的功能更完善,适合复杂的报表开发。

INCLUDE_ALV_GRID
CLASS lcl_event_handler DEFINITION DEFERRED.

DATA go_container TYPE REF TO cl_gui_container.
DATA go_alv_grid TYPE REF TO cl_gui_alv_grid.
DATA go_handler TYPE REF TO lcl_event_handler.

*&---------------------------------------------------------------------*
*& Form lcl_event_handler
*&---------------------------------------------------------------------*
CLASS lcl_event_handler DEFINITION.
PUBLIC SECTION.
    " 数据变更事件
    METHODS on_data_changed_finished FOR EVENT data_changed_finished OF cl_gui_alv_grid
    IMPORTING
        e_modified
        et_good_cells.

    " 工具栏调整
    METHODS on_toolbar FOR EVENT toolbar OF cl_gui_alv_grid
    IMPORTING
        e_object
        e_interactive.

    " 响应工具栏事件
    " 点击按钮之类的事件
    METHODS on_user_command FOR EVENT user_command OF cl_gui_alv_grid
    IMPORTING
        e_ucomm.
ENDCLASS.
*&---------------------------------------------------------------------*
*& Form lcl_event_handler
*&---------------------------------------------------------------------*
CLASS lcl_event_handler IMPLEMENTATION.
*&---------------------------------------------------------------------*
*& on_data_changed_finished
*&---------------------------------------------------------------------*
METHOD on_data_changed_finished.

    CHECK e_modified = abap_true.

    LOOP AT et_good_cells INTO DATA(ls_cell).
    READ TABLE gt_data REFERENCE INTO DATA(lr_data) INDEX ls_cell-row_id.
    IF sy-subrc = 0.

    ENDIF.
    ENDLOOP.

    PERFORM frm_refresh_display.

ENDMETHOD.

*&---------------------------------------------------------------------*
*& on_toolbar
*&---------------------------------------------------------------------*
METHOD on_toolbar.

    " 移除编辑相关的按钮
    DELETE e_object->mt_toolbar WHERE function CS '&LOCAL&'.

    " 新增按钮
    DATA ls_button LIKE LINE OF e_object->mt_toolbar.
    CLEAR ls_button.
    ls_button-function = 'Z10'.
    ls_button-icon = icon_system_copy.
    ls_button-quickinfo =
    ls_button-text      = ''.
    INSERT ls_button INTO TABLE e_object->mt_toolbar.

ENDMETHOD.

*&---------------------------------------------------------------------*
*& on_user_command
*&---------------------------------------------------------------------*
METHOD on_user_command.

    " 获取ALV选取行
    DATA lt_rows TYPE lvc_t_row.
    DATA ls_row TYPE lvc_s_row.
    CALL METHOD go_alv_grid->get_selected_rows
    IMPORTING
        et_index_rows = lt_rows.

    CASE e_ucomm.
    WHEN 'Z10'.

    WHEN OTHERS.
    ENDCASE.

    PERFORM frm_refresh_display.

ENDMETHOD.

ENDCLASS.

*&---------------------------------------------------------------------*
*& Form frm_display
*&---------------------------------------------------------------------*
*& ALV展示
*&---------------------------------------------------------------------*
FORM frm_display TABLES ct_data TYPE STANDARD TABLE.

    IF go_container IS NOT BOUND.
        go_container = NEW cl_gui_custom_container( 'CON_9000' ).
    ENDIF.

    IF go_alv_grid IS BOUND.
        PERFORM frm_refresh_display.
        RETURN.
    ENDIF.

    " 新建对象
    go_alv_grid = NEW cl_gui_alv_grid( go_container ).

    DATA ls_layout TYPE lvc_s_layo.
    DATA lt_fieldcat TYPE STANDARD TABLE OF lvc_s_fcat.

    PERFORM frm_set_layout CHANGING ls_layout.
    PERFORM frm_set_fieldcat TABLES lt_fieldcat.
    PERFORM frm_set_event.
    PERFORM frm_set_style.
    PERFORM frm_set_color.

    " 展示
    CALL METHOD go_alv_grid->set_table_for_first_display
      EXPORTING
        is_layout                     = ls_layout
        i_default                     = 'X'
        i_save                        = 'A'
      CHANGING
        it_outtab                     = ct_data[]
        it_fieldcatalog               = lt_fieldcat
      EXCEPTIONS
        invalid_parameter_combination = 1
        program_error                 = 2
        too_many_lines                = 3
        OTHERS                        = 4.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_display
*&---------------------------------------------------------------------*
*& 刷新ALV
*&---------------------------------------------------------------------*
FORM frm_refresh_display.

    PERFORM frm_set_style.
    PERFORM frm_set_color.

    go_alv_grid->refresh_table_display( is_stable = CONV #( 'XX' ) ).

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_set_layout
*&---------------------------------------------------------------------*
*& 报表布局设置
*&---------------------------------------------------------------------*
FORM frm_set_layout CHANGING cs_layout TYPE lvc_s_layo.

    CLEAR cs_layout.
    cs_layout-zebra = abap_true. " 斑马线
    cs_layout-cwidth_opt = abap_true. " 自动调整ALV列宽
    cs_layout-sel_mode = 'A'. " 选择模式
    cs_layout-info_fname = 'RCOL'. " 行颜色
    cs_layout-ctab_fname = 'T_SCOL'. " 单元格颜色设置
    cs_layout-stylefname = 'T_STYL'. " 单元格控制

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_set_fieldcat
*&---------------------------------------------------------------------*
*& 字段目录设置
*&---------------------------------------------------------------------*
FORM frm_set_fieldcat TABLES ct_fieldcat TYPE lvc_t_fcat.

    DATA ls_fieldcat TYPE lvc_s_fcat.

    DEFINE _init_fieldcat.
        CLEAR ls_fieldcat.
        ls_fieldcat-fieldname = &1.
        ls_fieldcat-scrtext_s = 
        ls_fieldcat-scrtext_m =
        ls_fieldcat-scrtext_l =
        ls_fieldcat-tooltip =
        ls_fieldcat-coltext =
        ls_fieldcat-seltext = &2.
        ls_fieldcat-ref_table = &3.
        ls_fieldcat-ref_field = &4.
        INSERT ls_fieldcat INTO TABLE ct_fieldcat.
    END-OF-DEFINITION.

    _init_fieldcat 'ZSEL' '选择项' '' ''.
    _init_fieldcat 'MTYPE' '检查状态' '' ''.
    _init_fieldcat 'MSG  ' '检查消息' '' ''.

    " 个性化自己输出数据格式
    LOOP AT ct_fieldcat REFERENCE INTO DATA(lr_fieldcat).
        IF lr_fieldcat->fieldname = 'ZSEL'.
        lr_fieldcat->checkbox = abap_true.
        lr_fieldcat->edit = abap_true.
        ENDIF.
    ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_set_event
*&---------------------------------------------------------------------*
*& 绑定ALV事件
*&---------------------------------------------------------------------*
FORM frm_set_event.

    IF go_handler IS BOUND.
        RETURN.
    ENDIF.

    go_handler = NEW lcl_event_handler( ).

    " 数据变更
    go_alv_grid->register_edit_event( i_event_id = cl_gui_alv_grid=>mc_evt_modified ).
    SET HANDLER go_handler->on_data_changed_finished FOR go_alv_grid.

    " 工具栏相关
    SET HANDLER go_handler->on_toolbar FOR go_alv_grid.
    SET HANDLER go_handler->on_user_command FOR go_alv_grid.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_set_style
*&---------------------------------------------------------------------*
*& 字段样式设置
*&---------------------------------------------------------------------*
FORM frm_set_style.

    DATA ls_styl TYPE lvc_s_styl.

    LOOP AT gt_data REFERENCE INTO DATA(lr_data).
        CLEAR lr_data->t_styl.

        " 设置ALV字段或行的状态
        " 常用有禁止编辑CL_GUI_ALV_GRID=>MC_STYLE_DISABLED
        " 禁止删除行CL_GUI_ALV_GRID=>MC_STYLE_NO_DELETE_ROW

    ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_set_color
*&---------------------------------------------------------------------*
*& 字段颜色设置
*&---------------------------------------------------------------------*
FORM frm_set_color.

    STATICS:
        BEGIN OF color,
            r_light   TYPE char04,
            r_success TYPE char04,
            r_error   TYPE char04,
            light     TYPE lvc_s_scol-color,
            success   TYPE lvc_s_scol-color,
            error     TYPE lvc_s_scol-color,
        END OF color.
    IF color IS INITIAL.
        color-r_light = 'C300'.
        color-r_success = 'C500'.
        color-r_error = 'C600'.
        color-light = VALUE #( col = 3 ).
        color-success = VALUE #( col = 5 ).
        color-error = VALUE #( col = 6 ).
    ENDIF.

    DATA ls_scol TYPE lvc_s_scol.

    LOOP AT gt_data REFERENCE INTO DATA(lr_data).
        CLEAR lr_data->t_scol.

        IF lr_data->zsel = abap_true.
            lr_data->rcol = color-r_light.
        ENDIF.

        IF lr_data->mtype = 'E'.
            lr_data->t_scol = VALUE #( BASE lr_data->t_scol color = color-error
                ( fname = 'MTYPE' )
                ( fname = 'MSG' )
            ).
        ENDIF.
    ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_get_data_selection
*&---------------------------------------------------------------------*
*& 将侧边栏选择也传递到ZSEL字段上
*&---------------------------------------------------------------------*
FORM frm_get_data_selection.

  CHECK go_alv_grid IS BOUND.

  " 获取ALV选取行
  DATA lt_rows TYPE lvc_t_row.
  CALL METHOD go_alv_grid->get_selected_rows
    IMPORTING
      et_index_rows = lt_rows.

  " 获取已过滤行
  DATA lt_filter TYPE lvc_t_fidx.
  CALL METHOD lo_grid->get_filtered_entries
    IMPORTING
      et_filtered_entries = lt_filter.

  LOOP AT lt_rows INTO DATA(ls_row).
    READ TABLE lt_filter TRANSPORTING NO FIELDS WITH KEY table_line = ls_row-index.
    IF sy-subrc = 0.
      CONTINUE.
    ENDIF.
    READ TABLE gt_data REFERENCE INTO DATA(lr_data) INDEX ls_row-index.
    IF sy-subrc = 0.
      lr_data->zsel = abap_true.
    ENDIF.
  ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_reset_data_selection
*&---------------------------------------------------------------------*
*& 重置勾选项
*&---------------------------------------------------------------------*
FORM frm_reset_data_selection.

  DATA: lo_grid TYPE REF TO cl_gui_alv_grid.
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = lo_grid.

  " 获取已过滤行
  DATA lt_filter TYPE lvc_t_fidx.
  CALL METHOD lo_grid->get_filtered_entries
    IMPORTING
      et_filtered_entries = lt_filter.

  LOOP AT gt_data REFERENCE INTO DATA(lr_data).
    READ TABLE lt_filter TRANSPORTING NO FIELDS WITH KEY table_line = sy-tabix.
    IF sy-subrc = 0.
      CONTINUE.
    ENDIF.
    CLEAR lr_data->zsel.
  ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*& Module STATUS_9000 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_9000 OUTPUT.

    PERFORM frm_display TABLES gt_data.

    SET PF-STATUS 'STATUS'.
    SET TITLEBAR 'TITLE'.

ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_9000  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_9000 INPUT.

    PERFORM frm_get_data_selection.

    CASE sy-ucomm.
        WHEN '&F03' OR '&F15' OR '&F12'.
        LEAVE TO SCREEN 0.
        WHEN OTHERS.
    ENDCASE.
    CLEAR sy-ucomm.

ENDMODULE.

SALV

SALV最大问题在于不可编辑。尽管可以解决,但相当麻烦,不建议在复杂的开发场景中使用SALV。

SALV实际上也是ALV GRID,所以只要获取到核心的GRID对象,即可解决上述问题。但……都这样了,为什么不直接用ALV GRID开发?

示例代码
TYPES:
  BEGIN OF ty_detail,
    field1 TYPE string,
    field2 TYPE string,
  END OF ty_detail.
DATA gt_detail TYPE STANDARD TABLE OF ty_detail.
DATA go_salv TYPE REF TO cl_salv_table.

IF go_salv IS BOUND.
  go_salv->refresh( ).
  RETURN.
ENDIF.

TRY.
    cl_salv_table=>factory(
      IMPORTING
        r_salv_table = go_salv
      CHANGING
        t_table      = gt_detail ).
  CATCH cx_salv_msg.
    RETURN.
ENDTRY.

DATA(lo_setting) = go_salv->get_display_settings( ).
lo_setting->set_list_header( '标题' ).

DATA(lo_columns) = go_salv->get_columns( ).
lo_columns->set_optimize( abap_true ).
TRY.
    DATA lo_column TYPE REF TO cl_salv_column_table.
    DEFINE _set_savl_column.
      lo_column ?= lo_columns->get_column( &1 ).
      lo_column->set_long_text( &2 ).
      lo_column->set_medium_text( &2 ).
      lo_column->set_short_text( &2 ).
    END-OF-DEFINITION.

    _set_savl_column 'ZFIELD1' '字段1'.
    _set_savl_column 'ZFIELD2' '字段2'.

  CATCH cx_salv_not_found.
ENDTRY.

" 设置工具栏按钮
DATA(lo_functions) = go_salv->get_functions( ).
lo_functions->set_all( abap_true ).

" 弹窗模式,不弹窗的话,注释即可
go_salv->set_screen_popup(
  start_column = 30
  end_column   = 150
  start_line   = 2
  end_line     = 15 ).

" 展示SALV报表
go_salv->display( ).

选择屏幕

感觉选择屏幕的这段代码也挺好用的,放上来分享下

示例代码
*&---------------------------------------------------------------------*
*& INITIALIZATION
*&---------------------------------------------------------------------*
INITIALIZATION.
  PERFORM frm_sel_scr_init.

*&---------------------------------------------------------------------*
*& PBO
*&---------------------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT.
  PERFORM frm_sel_scr_pbo.

*&---------------------------------------------------------------------*
*& PAI
*&---------------------------------------------------------------------*
AT SELECTION-SCREEN.
  PERFORM frm_sel_scr_pai.

*&---------------------------------------------------------------------*
*& Form frm_sel_scr_init
*&---------------------------------------------------------------------*
*& 屏幕初始化
*&---------------------------------------------------------------------*
FORM frm_sel_scr_init .

  b900 = '选择条件'.
  %_s_werks_%_app_%-text = '工厂'.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_sel_scr_pbo
*&---------------------------------------------------------------------*
*& 屏幕PBO
*&---------------------------------------------------------------------*
FORM frm_sel_scr_pbo .

  " 关闭全部分组项目,未分组会展示
  LOOP AT SCREEN.
    IF screen-group1 IS NOT INITIAL.
      screen-input = '0'.
      screen-invisible = '1'.
      MODIFY SCREEN.
    ENDIF.
  ENDLOOP.

  " 显示分组
  DEFINE _active_grp.
    LOOP AT SCREEN.
      IF screen-group1 = &1.
        screen-input = '1'.
        screen-invisible = '0'.
        MODIFY SCREEN.
      ENDIF.
    ENDLOOP.
  END-OF-DEFINITION.

  " 隐藏分组
  DEFINE _inactive_grp.
    LOOP AT SCREEN.
      IF screen-group1 = &1.
        screen-input = '0'.
        screen-invisible = '1'.
        MODIFY SCREEN.
      ENDIF.
    ENDLOOP.
  END-OF-DEFINITION.

  _active_grp 'M01'.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_sel_scr_pai
*&---------------------------------------------------------------------*
*& 屏幕PAI
*&---------------------------------------------------------------------*
FORM frm_sel_scr_pai .

ENDFORM.