SAP dialog使用选择屏幕+容器展现 步骤+源码

系统自带的选择都是单选的,但是需求不一定是单选的,那么需要和选择屏幕一样的范围选择要怎么做呢,以下是一个样例,通过查询物料号来展现物料表的数据。

9000屏幕

创建屏幕

设置屏幕类型

布局编辑

构建一个子屏幕subscreen用于防止选择屏幕,构建一个客制化容器contain用于存放查询结果展现

添加ok_code

9001子屏幕

在主程序中添加子屏幕的选择屏幕

SELECTION-SCREEN BEGIN OF SCREEN 9001 AS SUBSCREEN.
  SELECTION-SCREEN: BEGIN OF BLOCK blk1 WITH FRAME.
    SELECT-OPTIONS:
      s_matnr FOR mara-matnr.
  SELECTION-SCREEN: END OF BLOCK blk1.
SELECTION-SCREEN END OF SCREEN 9001.

9000 PBO&PAI

PROCESS BEFORE OUTPUT.
 MODULE STATUS_9000.
*
PROCESS AFTER INPUT.
 MODULE USER_COMMAND_9000.
 MODULE user_exit_9000 AT EXIT-COMMAND.

PBO

一般来说PBO 和 PAI 我会分成两个包含文件,也是后期维护的时候便于查找

MODULE status_9000 OUTPUT.
  SET PF-STATUS 'STANDARD_9000'.
  SET TITLEBAR 'TITLE_9000'.
ENDMODULE.

创建状态栏

其中注意以下 $exit 需要改成退出命令

创建标题

PAI

MODULE user_command_9000 INPUT.
  save_ok = ok_code.
  CLEAR:ok_code.

  CASE save_ok.
    WHEN '$BACK'.
      LEAVE TO SCREEN 0.
    WHEN '$ROLL'.
      LEAVE TO SCREEN 0.
    WHEN '$SEARCH'.
      PERFORM frm_get_data.
    WHEN OTHERS.
  ENDCASE.
ENDMODULE.

MODULE user_exit_9000 INPUT.
  LEAVE PROGRAM.
ENDMODULE.

将子屏幕放入9000屏幕中

代码变更

PROCESS BEFORE OUTPUT.
  CALL SUBSCREEN: subscreen INCLUDING sy-repid dynn_9001.
  MODULE status_9000.
*
PROCESS AFTER INPUT.
  CALL SUBSCREEN: subscreen.
  MODULE user_command_9000.
  MODULE user_exit_9000 AT EXIT-COMMAND.

选择屏幕展示

到了这里已经完成了一半的工作量了,使用dialog已经可以通过范围选择来进行数据查询了

获取数据

这里就简单的获取数据,展示两个字段即可

FORM frm_get_data .
  SELECT
    from mara
  FIELDS
    mara~matnr,
    mara~mtart
  where mara~matnr in @s_matnr
  INTO CORRESPONDING FIELDS OF TABLE @gt_mara.

ENDFORM.

定义并实例化内表

TYPES: BEGIN OF ty_mara,
         matnr TYPE mara-matnr,
         mtart TYPE mara-mtart,
       END OF ty_mara.

DATA: gt_mara TYPE STANDARD TABLE OF ty_mara.

构建展示容器

PBO代码更新

MODULE status_9000 OUTPUT.
  SET PF-STATUS 'STANDARD_9000'.
  SET TITLEBAR 'TITLE_9000'.
  PERFORM frm_screen.
ENDMODULE.

变量

DATA : wa_container        TYPE scrfname VALUE 'CONTAIN',
       alv_grid            TYPE REF TO cl_gui_alv_grid,
       wa_custom_container TYPE REF TO cl_gui_custom_container.

DATA: gt_fieldcat TYPE lvc_t_fcat,
      gs_layout   TYPE lvc_s_layo.

例程frm_screen

  PERFORM frm_set_layout.  "设置ALV输出格式
  PERFORM frm_set_fieldcat.  "设置ALV输出字段
  PERFORM frm_set_toolbar.   "设置alv状态栏

  IF wa_custom_container IS INITIAL .
    CREATE OBJECT wa_custom_container
      EXPORTING
        container_name = wa_container.

    CREATE OBJECT alv_grid
      EXPORTING
        i_parent = wa_custom_container.

    "实例化方法
*    CREATE OBJECT event_receiverundo.

    "新增按钮
*    SET HANDLER event_receiverundo->handle_toolbar_prod FOR alv_grid_prod.
*    SET HANDLER event_receiverundo->handle_ucomm FOR alv_grid_prod.

  ENDIF.

  CALL METHOD alv_grid->set_table_for_first_display
    EXPORTING
      i_structure_name     = 'GS_PROD'
      is_layout            = gs_layout
      it_toolbar_excluding = gt_ui_func
    CHANGING
      it_outtab            = gt_mara
      it_fieldcatalog      = gt_fieldcat.
  PERFORM frm_refresh_alv USING alv_grid.

例程frm_set_layout

FORM frm_set_layout .
  gs_layout = VALUE #( zebra = abap_on
                        cwidth_opt = abap_on ).
ENDFORM.

例程frm_set_fieldcat

FORM frm_set_fieldcat .
  
  DEFINE _set_fieldcat.
    APPEND VALUE #(
      fieldname = &1
      ref_table = &2
      ref_field = &3
      coltext = &4
      scrtext_l = &4
      scrtext_m = &4
      scrtext_s = &4
    ) TO gt_fieldcat.
  END-OF-DEFINITION.

  _set_fieldcat 'MATNR' 'MARA' 'MATNR' '物料号'. "
  _set_fieldcat 'MTART' 'MARA' 'MTART' '物料类型'. "

ENDFORM.

例程frm_set_toolbar

控制容器中alv的按钮

FORM frm_set_toolbar .
 DATA: ls_ui_func TYPE ui_func.

  REFRESH: gt_ui_func.
  ls_ui_func = cl_gui_alv_grid=>mc_fc_loc_copy .
  APPEND ls_ui_func TO gt_ui_func.
  ls_ui_func = cl_gui_alv_grid=>mc_fc_loc_copy_row .
  APPEND ls_ui_func TO gt_ui_func.
  ls_ui_func = cl_gui_alv_grid=>mc_fc_loc_cut .
  APPEND ls_ui_func TO gt_ui_func.
  ls_ui_func = cl_gui_alv_grid=>mc_fc_refresh .
  APPEND ls_ui_func TO gt_ui_func.
  ls_ui_func = cl_gui_alv_grid=>mc_fc_loc_move_row .
  APPEND ls_ui_func TO gt_ui_func.
  ls_ui_func = cl_gui_alv_grid=>mc_fc_loc_paste .
  APPEND ls_ui_func TO gt_ui_func.
  ls_ui_func = cl_gui_alv_grid=>mc_fc_loc_paste_new_row .
  APPEND ls_ui_func TO gt_ui_func.
  ls_ui_func = cl_gui_alv_grid=>mc_fc_loc_undo .
  APPEND ls_ui_func TO gt_ui_func.
  ls_ui_func = cl_gui_alv_grid=>mc_fc_pc_file .
  APPEND ls_ui_func TO gt_ui_func.
  ls_ui_func = cl_gui_alv_grid=>mc_fc_loc_delete_row .
  APPEND ls_ui_func TO gt_ui_func.
  ls_ui_func = cl_gui_alv_grid=>mc_fc_loc_insert_row .
  APPEND ls_ui_func TO gt_ui_func.
  ls_ui_func = cl_gui_alv_grid=>mc_fc_loc_append_row.
  APPEND ls_ui_func TO gt_ui_func.

ENDFORM.

例程frm_refresh_alv

刷新容器中的数据

FORM frm_refresh_alv  USING pv_grid TYPE REF TO cl_gui_alv_grid.

  CALL METHOD pv_grid->check_changed_data. "检查ALV更改数据

  pv_grid->get_frontend_layout( IMPORTING es_layout = DATA(ls_layout) ).
  ls_layout-cwidth_opt = abap_on.
  pv_grid->set_frontend_layout( is_layout = ls_layout ).


  CALL METHOD cl_gui_control=>set_focus
    EXPORTING
      control = pv_grid.

  "刷新变量
  DATA: ls_stable TYPE lvc_s_stbl.

  "刷新显示
  CLEAR ls_stable.
  ls_stable-row = 'X'."基于行刷新
  ls_stable-col = 'X'."基于列刷新
  CALL METHOD pv_grid->refresh_table_display
    EXPORTING
      is_stable = ls_stable
    EXCEPTIONS
      finished  = 0.
ENDFORM.

这样就完成了,下过如上面最初展示的那样

以下是源码提供

我这边分了几个包含文件和主文件

主文件代码

*&---------------------------------------------------------------------*
*& Report Y_PNJ_DEMO15
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT y_pnj_demo15.

INCLUDE y_pnj_demo015_top.
INCLUDE y_pnj_demo015_pbo.
INCLUDE y_pnj_demo015_pai.
INCLUDE y_pnj_demo015_per.

TABLES: mara.

"定义 9002的选择屏幕
SELECTION-SCREEN BEGIN OF SCREEN 9001 AS SUBSCREEN.
  SELECTION-SCREEN: BEGIN OF BLOCK blk1 WITH FRAME.
    SELECT-OPTIONS:
      s_matnr FOR mara-matnr.
  SELECTION-SCREEN: END OF BLOCK blk1.
SELECTION-SCREEN END OF SCREEN 9001.

*&---------------------------------------------------------------------*
*&INITIALIZATION/选择屏幕前初始化(选择屏幕展示之前执行)
*&---------------------------------------------------------------------*
INITIALIZATION .

*&---------------------------------------------------------------------*
*& AT SELECTION-SCREEN OUTPUT/选择屏幕控制(第二屏输出)
*&---------------------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT .

*&---------------------------------------------------------------------*
*& AT SELECTION-SCREEN/选择屏幕执行(参数输入检查)
*&---------------------------------------------------------------------*
AT SELECTION-SCREEN .

*&---------------------------------------------------------------------*
*& START-OF-SELECTION/开始选择屏幕(点击执行按钮之后执行的语块)
*&---------------------------------------------------------------------*
START-OF-SELECTION .
  CALL SCREEN 9000.

*&---------------------------------------------------------------------*
*& END-OF-SELECTION/结束选择屏幕(程序结束处理,输出等)
*&---------------------------------------------------------------------*
END-OF-SELECTION .

*&---------------------------------------------------------------------*
*& Form frm_get_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_get_data .

  SELECT
    from mara
  FIELDS
    mara~matnr,
    mara~mtart
  where mara~matnr in @s_matnr
  INTO CORRESPONDING FIELDS OF TABLE @gt_mara.

ENDFORM.

Y_PNJ_DEMO015_TOP

变量文件

*&---------------------------------------------------------------------*
*& 包含               Y_PNJ_DEMO015_TOP
*&---------------------------------------------------------------------*

*&---Variable
DATA: ok_code TYPE sy-ucomm, " 用于接收屏幕操作
      save_ok TYPE sy-ucomm. " 接入屏幕操作 并清空ok_code

DATA: dynn_9001(4) VALUE '9001'.

TYPES: BEGIN OF ty_mara,
         matnr TYPE mara-matnr,
         mtart TYPE mara-mtart,
       END OF ty_mara.

DATA: gt_mara TYPE STANDARD TABLE OF ty_mara,
      gs_mara TYPE ty_mara.

"屏幕的容器
DATA : wa_container        TYPE scrfname VALUE 'CONTAIN',
       alv_grid            TYPE REF TO cl_gui_alv_grid,
       wa_custom_container TYPE REF TO cl_gui_custom_container.

DATA: gt_fieldcat TYPE lvc_t_fcat,
      gs_layout   TYPE lvc_s_layo.

DATA: gt_ui_func TYPE ui_functions. "隐藏alv菜单控件

Y_PNJ_DEMO015_PBO

PBO

*&---------------------------------------------------------------------*
*& 包含               Y_PNJ_DEMO015_PBO
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module STATUS_9000 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_9000 OUTPUT.
  SET PF-STATUS 'STANDARD_9000'.
  SET TITLEBAR 'TITLE_9000'.
  PERFORM frm_screen.
ENDMODULE.

Y_PNJ_DEMO015_PAI

PAI

*&---------------------------------------------------------------------*
*& 包含               Y_PNJ_DEMO015_PAI
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_9000  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_9000 INPUT.
  save_ok = ok_code.
  CLEAR:ok_code.

  CASE save_ok.
    WHEN '$BACK'.
      LEAVE TO SCREEN 0.
    WHEN '$ROLL'.
      LEAVE TO SCREEN 0.
    WHEN '$SEARCH'.
      PERFORM frm_get_data.
    WHEN OTHERS.
  ENDCASE.
ENDMODULE.

*&---------------------------------------------------------------------*
*&      Module  USER_EXIT_9000  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_exit_9000 INPUT.
  LEAVE PROGRAM.
ENDMODULE.

Y_PNJ_DEMO015_PER

例程

*&---------------------------------------------------------------------*
*& 包含               Y_PNJ_DEMO015_PER
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form frm_screen
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_screen .

  PERFORM frm_set_layout.  "设置ALV输出格式
  PERFORM frm_set_fieldcat.  "设置ALV输出字段
  PERFORM frm_set_toolbar.   "设置alv状态栏

  IF wa_custom_container IS INITIAL .
    CREATE OBJECT wa_custom_container
      EXPORTING
        container_name = wa_container.

    CREATE OBJECT alv_grid
      EXPORTING
        i_parent = wa_custom_container.

    "实例化方法
*    CREATE OBJECT event_receiverundo.

    "新增按钮
*    SET HANDLER event_receiverundo->handle_toolbar_prod FOR alv_grid_prod.
*    SET HANDLER event_receiverundo->handle_ucomm FOR alv_grid_prod.

    CALL METHOD alv_grid->set_table_for_first_display
      EXPORTING
        i_structure_name     = 'GS_MARA'
        is_layout            = gs_layout
        it_toolbar_excluding = gt_ui_func
      CHANGING
        it_outtab            = gt_mara
        it_fieldcatalog      = gt_fieldcat.
  ENDIF.

  PERFORM frm_refresh_alv USING alv_grid.


ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_set_layout
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_set_layout .
  gs_layout = VALUE #( zebra = abap_on
                        cwidth_opt = abap_on ).
ENDFORM.

*&---------------------------------------------------------------------*
*& Form frm_set_fieldcat
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_set_fieldcat .

  DEFINE _set_fieldcat.
    APPEND VALUE #(
      fieldname = &1
      ref_table = &2
      ref_field = &3
      coltext = &4
      scrtext_l = &4
      scrtext_m = &4
      scrtext_s = &4
    ) TO gt_fieldcat.
  END-OF-DEFINITION.

  _set_fieldcat 'MATNR' 'MARA' 'MATNR' '物料号'. "
  _set_fieldcat 'MTART' 'MARA' 'MTART' '物料类型'. "

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_set_toolbar
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_set_toolbar .
  DATA: ls_ui_func TYPE ui_func.

  REFRESH: gt_ui_func.
  ls_ui_func = cl_gui_alv_grid=>mc_fc_loc_copy .
  APPEND ls_ui_func TO gt_ui_func.
  ls_ui_func = cl_gui_alv_grid=>mc_fc_loc_copy_row .
  APPEND ls_ui_func TO gt_ui_func.
  ls_ui_func = cl_gui_alv_grid=>mc_fc_loc_cut .
  APPEND ls_ui_func TO gt_ui_func.
  ls_ui_func = cl_gui_alv_grid=>mc_fc_refresh .
  APPEND ls_ui_func TO gt_ui_func.
  ls_ui_func = cl_gui_alv_grid=>mc_fc_loc_move_row .
  APPEND ls_ui_func TO gt_ui_func.
  ls_ui_func = cl_gui_alv_grid=>mc_fc_loc_paste .
  APPEND ls_ui_func TO gt_ui_func.
  ls_ui_func = cl_gui_alv_grid=>mc_fc_loc_paste_new_row .
  APPEND ls_ui_func TO gt_ui_func.
  ls_ui_func = cl_gui_alv_grid=>mc_fc_loc_undo .
  APPEND ls_ui_func TO gt_ui_func.
  ls_ui_func = cl_gui_alv_grid=>mc_fc_pc_file .
  APPEND ls_ui_func TO gt_ui_func.
  ls_ui_func = cl_gui_alv_grid=>mc_fc_loc_delete_row .
  APPEND ls_ui_func TO gt_ui_func.
  ls_ui_func = cl_gui_alv_grid=>mc_fc_loc_insert_row .
  APPEND ls_ui_func TO gt_ui_func.
  ls_ui_func = cl_gui_alv_grid=>mc_fc_loc_append_row.
  APPEND ls_ui_func TO gt_ui_func.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_refresh_alv
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> ALV_GRID
*&---------------------------------------------------------------------*
FORM frm_refresh_alv  USING pv_grid TYPE REF TO cl_gui_alv_grid.

  CALL METHOD pv_grid->check_changed_data. "检查ALV更改数据

  pv_grid->get_frontend_layout( IMPORTING es_layout = DATA(ls_layout) ).
  ls_layout-cwidth_opt = abap_on.
  pv_grid->set_frontend_layout( is_layout = ls_layout ).


  CALL METHOD cl_gui_control=>set_focus
    EXPORTING
      control = pv_grid.

  "刷新变量
  DATA: ls_stable TYPE lvc_s_stbl.

  "刷新显示
  CLEAR ls_stable.
  ls_stable-row = 'X'."基于行刷新
  ls_stable-col = 'X'."基于列刷新
  CALL METHOD pv_grid->refresh_table_display
    EXPORTING
      is_stable = ls_stable
    EXCEPTIONS
      finished  = 0.
ENDFORM.
posted @ 2024-01-24 16:26  otowa  阅读(363)  评论(0编辑  收藏  举报