SAP ABAP 子屏幕中定义选择条件

记录了一个简单的demo,方便使用,更多复杂功能在此基础上添加即可。
一个查询报表,上半屏幕输入查询条件,下半屏幕输出结果报表。

发布日期:2025.03.05

  1. 主程序代码:
    在这里插入图片描述
REPORT zmm_rpt_wu_dmeo.
*全局变量
INCLUDE zmm_rpt_wu_demo_top.

START-OF-SELECTION.

end-of-selection.
  PERFORM frm_display_alv.

  INCLUDE zmm_rpt_wu_demo_f01.

  INCLUDE zmm_rpt_wu_demo_o01.

  INCLUDE zmm_rpt_wu_demo_i01.
  1. INCLUDE zmm_rpt_wu_demo_top.
TABLES:ekko.
CLASS lcl_alv_grid DEFINITION INHERITING FROM cl_gui_alv_grid.
  PUBLIC SECTION.
    METHODS: m_optimize_all_cols.
ENDCLASS.

* 类的定义
CLASS lcl_event_handler DEFINITION.
  PUBLIC SECTION.
    METHODS:
      handle_user_command FOR EVENT user_command OF cl_gui_alv_grid
        IMPORTING e_ucomm,
      handle_hotspot_click
        FOR EVENT hotspot_click OF cl_gui_alv_grid
        IMPORTING e_row_id e_column_id,
*     自定义工具栏按钮
      handle_toolbar  FOR EVENT toolbar OF cl_gui_alv_grid
        IMPORTING e_object,
      after_user_command FOR EVENT after_user_command OF cl_gui_alv_grid
        IMPORTING e_ucomm.
ENDCLASS.

* 类的实现
CLASS lcl_event_handler IMPLEMENTATION.

  METHOD handle_user_command.

  ENDMETHOD.

  METHOD handle_hotspot_click.
    PERFORM frm_handle_hotspot_click USING e_row_id  e_column_id.
  ENDMETHOD.

  METHOD handle_toolbar.
    PERFORM frm_event_toolbar USING e_object.
  ENDMETHOD.

  METHOD after_user_command.
    CASE e_ucomm.
      WHEN '&ALL'.
        PERFORM frm_select_all.
      WHEN '&DLL'.
        PERFORM frm_deselect_all.
      WHEN OTHERS.
    ENDCASE.

  ENDMETHOD.
ENDCLASS.

CLASS lcl_alv_grid IMPLEMENTATION.
  METHOD m_optimize_all_cols.
    CALL METHOD me->optimize_all_cols.
  ENDMETHOD.
ENDCLASS.

TYPES: BEGIN OF ts_item,
         zbox         TYPE c,          "复选框
         ebeln        TYPE ebeln,
         ebelp        TYPE ebelp,
         lifnr        TYPE ekko-lifnr, "供应商代码
         name1        TYPE lfa1-name1, "供应商名称
         bukrs        TYPE bukrs,      "公司代码
         butxt        TYPE t001-butxt, "公司代码描述
         werks        TYPE werks_d,    "工厂
         matnr        TYPE matnr,      "物料编号
         maktx        TYPE maktx,      "物料描述
         menge        TYPE mseg-menge,
         meins        TYPE mseg-meins,
         discount(20) TYPE c,          "折扣金额
       END OF ts_item.

TYPES: BEGIN OF ts_extab,
         fcode TYPE sy-ucomm,
       END OF ts_extab.

DATA: gr_lifnr         TYPE RANGE OF lifnr,
      gr_bukrs         TYPE RANGE OF bukrs,
      gv_code          TYPE sy-ucomm,
      gt_item          TYPE STANDARD TABLE OF ts_item,
      go_alv           TYPE REF TO cl_gui_alv_grid,
      gs_layout        TYPE lvc_s_layo,
      gt_fieldcat      TYPE lvc_t_fcat,
      go_event_handler TYPE REF TO lcl_event_handler,
      go_container     TYPE REF TO cl_gui_custom_container.

*创建子屏幕9102
SELECTION-SCREEN:BEGIN OF SCREEN 9102 AS SUBSCREEN.
  SELECT-OPTIONS: s_ebeln FOR EKkO-ebeln.
  PARAMETERS:p_lifnr TYPE lifnr,
             p_bukrs TYPE bukrs.
SELECTION-SCREEN:END OF SCREEN 9102 .
  1. ZMM_RPT_WU_DEMO_F01
*&---------------------------------------------------------------------*
*& Form frm_display_alv
*&---------------------------------------------------------------------*
FORM frm_display_alv .
  PERFORM frm_build_layout.
  PERFORM frm_build_fieldcat.
  CALL SCREEN 9100.
ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  FRM_BUILD_LAYOUT
*&---------------------------------------------------------------------*
FORM frm_build_layout.
  CLEAR gs_layout.
  gs_layout-sel_mode   = 'A'.
  gs_layout-box_fname = 'ZBOX'.
ENDFORM.

*&---------------------------------------------------------------------*
*& Form FRM_BUILD_FIELDCAT
*&---------------------------------------------------------------------*
FORM frm_build_fieldcat.
  CLEAR: gt_fieldcat[].
  gt_fieldcat = VALUE #( ( fieldname = 'ZBOX' outputlen = '5'  coltext = '选择框' hotspot = 'X'  checkbox = 'X' ) ).
  gt_fieldcat = VALUE #( BASE gt_fieldcat ( fieldname = 'EBELN' coltext = '采购订单号'  just = 'C' ) ).
  gt_fieldcat = VALUE #( BASE gt_fieldcat ( fieldname = 'EBELP' coltext = '采购订单行项目'  just = 'C' ) ).
  gt_fieldcat = VALUE #( BASE gt_fieldcat ( fieldname = 'LIFNR' coltext = '供应商'  just = 'C' ) ).
  gt_fieldcat = VALUE #( BASE gt_fieldcat ( fieldname = 'NAME1' coltext = '供应商名称'  just = 'C' ) ).
  gt_fieldcat = VALUE #( BASE gt_fieldcat ( fieldname = 'BUKRS' coltext = '公司代码'  just = 'C' ) ).
  gt_fieldcat = VALUE #( BASE gt_fieldcat ( fieldname = 'BUTXT' coltext = '公司代码名称'  just = 'C' ) ).
  gt_fieldcat = VALUE #( BASE gt_fieldcat ( fieldname = 'WERKS' coltext = '工厂'  just = 'C' ) ).
  gt_fieldcat = VALUE #( BASE gt_fieldcat ( fieldname = 'MATNR' coltext = '物料编码' just = 'C' ) ).
  gt_fieldcat = VALUE #( BASE gt_fieldcat ( fieldname = 'MAKTX' coltext = '物料描述'  just = 'C') ).
  gt_fieldcat = VALUE #( BASE gt_fieldcat ( fieldname = 'MENGE' coltext = '数量'  just = 'C' ) ). "
  gt_fieldcat = VALUE #( BASE gt_fieldcat ( fieldname = 'MEINS' coltext = '单位'  just = 'C' ) ).
ENDFORM.

*&---------------------------------------------------------------------*
*& Form frm_handle_hotspot_click
*&---------------------------------------------------------------------*
FORM frm_handle_hotspot_click USING p_row_id
                                    p_column_id.
  IF p_column_id = 'ZBOX'.
    READ TABLE gt_item ASSIGNING FIELD-SYMBOL(<lfs_item>) INDEX p_row_id.
    IF <lfs_item>-zbox = abap_true.
      CLEAR  <lfs_item>-zbox .
    ELSE.
      <lfs_item>-zbox  = abap_true.
    ENDIF.
  ENDIF.

  CALL METHOD cl_gui_cfw=>set_new_ok_code
    EXPORTING
      new_code = 'RELOAD'.

  CALL METHOD go_alv->check_changed_data.
  DATA: ls_stable TYPE lvc_s_stbl.
  CLEAR ls_stable.
  ls_stable-row = 'X'.
  ls_stable-col = 'X'.
  CALL METHOD go_alv->refresh_table_display
    EXPORTING
      i_soft_refresh = 'X'
      is_stable      = ls_stable.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form frm_event_toolbar
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> E_OBJECT
*&---------------------------------------------------------------------*
FORM frm_event_toolbar  USING  pv_object TYPE REF TO cl_alv_event_toolbar_set..

  DATA: lv_quickinfo TYPE stb_button-quickinfo, "Toolbar quickinfo
        lv_icon      TYPE stb_button-icon.      "Toolbar icon

  PERFORM frm_set_toolbar USING '&ALL' '@4B@' ''
        lv_quickinfo '' '' 0 pv_object.
  PERFORM frm_set_toolbar USING '&DLL' '@4D@' ''
        lv_quickinfo '' '' 0 pv_object.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_set_toolbar
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> P_
*&      --> P_
*&      --> P_
*&      --> LV_QUICKINFO
*&      --> TEXT_B01
*&      --> P_
*&      --> P_0
*&      --> PV_OBJECT
*&---------------------------------------------------------------------*
FORM frm_set_toolbar  USING   iv_function TYPE stb_button-function
      iv_icon      TYPE stb_button-icon
      iv_disabled  TYPE stb_button-disabled
      iv_quickinfo TYPE stb_button-quickinfo
      iv_text      TYPE stb_button-text
      iv_type      TYPE stb_button-butn_type
      iv_pos       TYPE i
      iv_object    TYPE REF TO cl_alv_event_toolbar_set.

  DATA: ls_toolbar  TYPE stb_button.

  CLEAR ls_toolbar.
  MOVE iv_function TO ls_toolbar-function.
  MOVE iv_icon  TO ls_toolbar-icon.
  MOVE iv_disabled TO ls_toolbar-disabled.
  MOVE iv_quickinfo TO ls_toolbar-quickinfo.
  MOVE iv_type TO ls_toolbar-butn_type.
  MOVE iv_text  TO ls_toolbar-text.

  IF iv_pos EQ 0.
    APPEND ls_toolbar TO iv_object->mt_toolbar.
  ELSE.
    INSERT ls_toolbar INTO iv_object->mt_toolbar INDEX iv_pos.
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_select_all
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_select_all .
  DATA: ls_stable TYPE lvc_s_stbl.

  LOOP AT gt_item ASSIGNING FIELD-SYMBOL(<lfs_item>).
    <lfs_item>-zbox = 'X'.
  ENDLOOP.

  CALL METHOD go_alv->check_changed_data.

  CLEAR ls_stable.
  ls_stable-row = 'X'.
  CALL METHOD go_alv->refresh_table_display
    EXPORTING
      i_soft_refresh = 'X'
      is_stable      = ls_stable.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_deselect_all
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_deselect_all .
  DATA: ls_stable TYPE lvc_s_stbl.
  LOOP AT gt_item ASSIGNING FIELD-SYMBOL(<lfs_item>).
    <lfs_item>-zbox = ''.
  ENDLOOP.

  CALL METHOD go_alv->check_changed_data.

  CLEAR ls_stable.
  ls_stable-row = 'X'.
  CALL METHOD go_alv->refresh_table_display
    EXPORTING
      i_soft_refresh = 'X'
      is_stable      = ls_stable.
ENDFORM.

*&---------------------------------------------------------------------*
*& Form frm_get_data
*&---------------------------------------------------------------------*
FORM frm_get_data .
  IF p_lifnr IS NOT INITIAL.
    gr_lifnr = VALUE #( ( sign = 'I' option = 'EQ' low = p_lifnr ) ).
  ENDIF.

  IF p_bukrs IS NOT INITIAL.
    gr_bukrs = VALUE #( ( sign = 'I' option = 'EQ' low = p_bukrs ) ).
  ENDIF.
  SELECT a~ebeln,e~ebelp,a~lifnr,b~name1,a~bukrs,c~butxt,e~werks,e~matnr,d~maktx,e~menge,e~meins
    FROM ekko AS a
   INNER JOIN ekpo AS e
      ON a~ebeln = e~ebeln
    LEFT JOIN lfa1 AS b
      ON a~lifnr = b~lifnr
    LEFT JOIN t001 AS c
      ON a~bukrs = c~bukrs
    LEFT JOIN makt AS d
      ON e~matnr = d~matnr
     AND d~spras = @sy-langu
   WHERE a~ebeln IN @s_ebeln
     AND a~lifnr IN @gr_lifnr
     AND a~bukrs IN @gr_bukrs
    INTO CORRESPONDING FIELDS OF TABLE @gt_item.
ENDFORM.
  1. ZMM_RPT_WU_DEMO_O01
*----------------------------------------------------------------------*
***INCLUDE ZMM_RPT_WU_DEMO_O01.
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module STATUS_9100 OUTPUT
*&---------------------------------------------------------------------*

MODULE status_9100 OUTPUT.
  SET PF-STATUS 'ZST01'.
ENDMODULE.


*&---------------------------------------------------------------------*
*& Module SET_INITIAL_SCREEN OUTPUT
*&---------------------------------------------------------------------*

MODULE set_initial_screen OUTPUT.

  DATA: lt_exclude TYPE ui_functions,
        ls_exclude TYPE ui_func.

  DATA: ls_stable TYPE lvc_s_stbl.

  CLEAR ls_stable.
  ls_stable-row = 'X'.
  ls_stable-col = 'X'.

*排除打印按钮
  ls_exclude = cl_gui_alv_grid=>mc_fc_print .
  APPEND ls_exclude TO lt_exclude.
*排除添加、删除、插入、复制按钮
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_append_row .
  APPEND ls_exclude TO lt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_copy_row .
  APPEND ls_exclude TO lt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_copy .
  APPEND ls_exclude TO lt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_cut .
  APPEND ls_exclude TO lt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_delete_row .
  APPEND ls_exclude TO lt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_insert_row .
  APPEND ls_exclude TO lt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_move_row .
  APPEND ls_exclude TO lt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_paste .
  APPEND ls_exclude TO lt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_paste_new_row .
  APPEND ls_exclude TO lt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_undo .
  APPEND ls_exclude TO lt_exclude.


  IF go_container IS INITIAL.

    CREATE OBJECT go_container
      EXPORTING
        container_name              = 'CONTAINER1'
      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 go_alv
      EXPORTING
        i_parent = go_container.

    IF go_event_handler IS INITIAL.
      CREATE OBJECT go_event_handler.
      SET HANDLER go_event_handler->handle_hotspot_click FOR go_alv.
      SET HANDLER go_event_handler->handle_toolbar FOR go_alv.
      SET HANDLER go_event_handler->after_user_command FOR go_alv.
    ENDIF.

    CALL METHOD go_alv->set_table_for_first_display
      EXPORTING
        i_buffer_active      = space
        i_bypassing_buffer   = space
        is_layout            = gs_layout
        it_toolbar_excluding = lt_exclude
        i_default            = 'X'
        i_save               = 'A'
      CHANGING
        it_outtab            = gt_item
        it_fieldcatalog      = gt_fieldcat.
  ELSE.
    CLEAR ls_stable.
    ls_stable-row = 'X'.
    CALL METHOD go_alv->refresh_table_display
      EXPORTING
        i_soft_refresh = 'X'
        is_stable      = ls_stable.
  ENDIF.
  CALL METHOD go_alv->set_ready_for_input( EXPORTING i_ready_for_input = 1 ).
ENDMODULE.
  1. ZMM_RPT_WU_DEMO_I01
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_9100  INPUT
*&---------------------------------------------------------------------*
MODULE user_command_9100 INPUT.

  CALL METHOD go_alv->check_changed_data.

  CASE sy-ucomm.
    WHEN 'BACK'.
      LEAVE TO SCREEN 0.

    WHEN 'SAVE'.
      PERFORM frm_save_data.

    WHEN 'RELOAD' OR space."回车
      PERFORM frm_get_data.
  ENDCASE.

  CALL METHOD go_alv->check_changed_data.

  CLEAR ls_stable.
  ls_stable-row = 'X'.
  CALL METHOD go_alv->refresh_table_display
    EXPORTING
      is_stable = ls_stable.
ENDMODULE.

*&---------------------------------------------------------------------*
*& Form frm_save_data
*&---------------------------------------------------------------------*
FORM frm_save_data .
  MESSAGE '数据保存成功' TYPE 'I'.
ENDFORM.
  1. 自定义状态栏
    在这里插入图片描述
  2. 9100屏幕为手动创建绘制,9102子屏幕由程序代码自动生成。
    在这里插入图片描述
  3. 最后看一下效果
    点击执行。
    在这里插入图片描述
    选择画面输入参数后回车。
    在这里插入图片描述
    全选后点击保存
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值