文章目录
一、需求
通过工厂+物料,查询当前非限制库存、供应商库存、销售订单库存、客户寄售库存。
二、设计思路
1、可以将界面上下切分为两个屏幕,上半部分用于输入选择条件,而下半部分用于显示当前的库存数据。用户需要在上半部分输入所需的查询条件,例如物料号码、工厂等等,然后点击“查询”按钮以执行查询操作。当查询完成后,系统将会在下半部分屏幕中显示与查询条件匹配的所有库存数据。通过将界面切分为上下两个屏幕,可以使用户更加方便地输入和查看库存数据。此外,用户还可以根据自己的需求对查询结果进行进一步的筛选、排序以及导出等操作;
2、可以采用将选择屏幕内嵌为子屏幕使用的设计方式,实现上半部分屏幕的选择功能。这种设计方式可以简化画屏幕元素的过程,同时也方便了用户输入和选择查询条件。
3、为了显示不同类型的库存数据,采用将下半部分屏幕分成多个子屏幕页签,并使用切换的方式来显示不同的库存类型数据。这种设计方式可以使得用户方便地查看不同类型的库存数据,并且减少界面的混乱度。具体而言,我们可以在下半部分屏幕上方设置一个页签栏,每个页签对应一个库存类型,例如非限制库存、供应商库存、销售订单库存和客户寄售库存等。当用户需要查看某一种库存类型时,他们可以单击相应的页签来切换到对应的子屏幕中。每个子屏幕都会显示当前库存类型的所有库存数据,并且可以按照不同的属性进行排序、过滤或导出。通过使用多个子屏幕页签的方式,可以使得界面更加清晰、易于理解。同时,这种设计方式还可以增加系统的可扩展性和可维护性,以便根据未来的需求进一步调整和优化界面。
三、实现难点
1.选择屏幕内嵌为子屏幕
代码如下(示例):
SELECTION-SCREEN BEGIN OF SCREEN 100 AS SUBSCREEN.
PARAMETERS:p_werks TYPE mard-werks OBLIGATORY.
SELECT-OPTIONS: s_matnr FOR mard-matnr.
SELECTION-SCREEN END OF SCREEN 100.
屏幕逻辑流中代码实现如下:
屏幕布局设置如下:
2.多页签子屏幕切换
可使用标准向导自动生成页签及对应代码,具体过程如下所示:
选择标签条(含向导)按钮,划定屏幕区域。
输入标签条名称:
输入标签文本,需要创建几个页签输入几个文本即可。本例我们需要显示 非限制库存、供应商库存、销售订单库存、客户寄售库存四种类型库存,输入TAB1~TAB4四个标签名称。
系统根据输入的标签文本,自动生成对应的子屏幕编号及页签按钮对应的功能码,如项目上有明确的命名规范要求,请根据规范修改命名规则即可;如无特殊要求,使用自动生成的命名规则即可。
选择向导自动生成代码存放的程序位置,若输入的程序不存在,将自动创建该包含程序 。
点击完成即可。
自动生成的代码如下所示:(上述截图具体数据只做测试,如屏幕编号等,故代码截图和上述向导截图中的屏幕编号可能不太匹配,以代码屏幕编号为准)
定义部分:
屏幕PBO部分:
屏幕PAI部分:
四、实例代码
主程序:
*======================================================================*
*& <项目名称>:
*& <程序类型>:
*& <功能模块>:
*& <事物代码>:
*& <程序名称>:
*& <程序描述>:
*& <创 建 人>:
*& <创建日期>:
*& <功能顾问>:
*& <功能说明>:
*&
*&---------------------------------------------------------------------*
*& Modification Log<程序修改日志>
*&<日期> <开发者> <修改者> <修改描述>
*&---------------------------------------------------------------------*
REPORT zmzhdemo03.
"ALV 通用方法
INCLUDE zcmx_alv.
"ALV 通用事件及本地类注册
INCLUDE zcmx_alvevt.
"定义声明部分
INCLUDE zmzhdemo03top .
"程序逻辑处理
INCLUDE zmzhdemo03f01 .
"程序界面处理
INCLUDE zmzhdemo03f02 .
"程序界面PBO部分
INCLUDE zmzhdemo03pbo .
"程序界面PAI部分
INCLUDE zmzhdemo03pai .
定义声明:
*&---------------------------------------------------------------------*
*& 包含 ZMZHDEMO03TOP
*&---------------------------------------------------------------------*
************************************************************************
* <1.声明>
************************************************************************
TYPE-POOLS: slis.
*----------------------------------------------------------------------*
* <1.1-表工作区>
*----------------------------------------------------------------------*
TABLES:mard.
*----------------------------------------------------------------------*
* <1.2-类型>
*----------------------------------------------------------------------*
*----------------------------------------------------------------------*
* <1.3-内表>
*----------------------------------------------------------------------*
DATA:
gt_tab1 TYPE TABLE OF mard,
gt_tab2 TYPE TABLE OF mslb,
gt_tab3 TYPE TABLE OF mska,
gt_tab4 TYPE TABLE OF msku.
*----------------------------------------------------------------------*
* <1.4-工作区>
*----------------------------------------------------------------------*
DATA:
gt_fieldcat TYPE lvc_t_fcat,
gs_alvtitle TYPE lvc_title,
gs_layout TYPE lvc_s_layo.
*----------------------------------------------------------------------*
* <1.5-常量>
*----------------------------------------------------------------------*
*&SPWIZARD: FUNCTION CODES FOR TABSTRIP 'TAB9000'
CONSTANTS:
BEGIN OF c_tab9000,
tab1 LIKE sy-ucomm VALUE 'TAB9000_FC1',
tab2 LIKE sy-ucomm VALUE 'TAB9000_FC2',
tab3 LIKE sy-ucomm VALUE 'TAB9000_FC3',
tab4 LIKE sy-ucomm VALUE 'TAB9000_FC4',
END OF c_tab9000.
*&SPWIZARD: DATA FOR TABSTRIP 'TAB9000'
CONTROLS:
tab9000 TYPE TABSTRIP.
CONSTANTS:
g_container_name1 TYPE char10 VALUE 'CUSTOM1',
g_container_name2 TYPE char10 VALUE 'CUSTOM2',
g_container_name3 TYPE char10 VALUE 'CUSTOM3',
g_container_name4 TYPE char10 VALUE 'CUSTOM4'.
*----------------------------------------------------------------------*
* <1.6-全局变量> Global Variants Declaration
*----------------------------------------------------------------------*
DATA:
BEGIN OF g_tab9000,
subscreen LIKE sy-dynnr,
prog LIKE sy-repid VALUE 'ZMZHDEMO03',
pressed_tab LIKE sy-ucomm VALUE c_tab9000-tab1,
END OF g_tab9000.
DATA:
save_ok LIKE sy-ucomm,
ok_code LIKE sy-ucomm.
DATA:
g_alv_grid1 TYPE REF TO cl_gui_alv_grid,
g_alv_container1 TYPE REF TO cl_gui_custom_container,
g_alv_grid2 TYPE REF TO cl_gui_alv_grid,
g_alv_container2 TYPE REF TO cl_gui_custom_container,
g_alv_grid3 TYPE REF TO cl_gui_alv_grid,
g_alv_container3 TYPE REF TO cl_gui_custom_container,
g_alv_grid4 TYPE REF TO cl_gui_alv_grid,
g_alv_container4 TYPE REF TO cl_gui_custom_container.
*----------------------------------------------------------------------*
* <1.7-宏>
*----------------------------------------------------------------------*
*DEFINE fc.
*
*END-OF-DEFINITION.
*----------------------------------------------------------------------*
* <1.8-类> CLASS lcl_event_receiver DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
*----------------------------------------------------------------------*
* <1.9-选择屏幕>
*----------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF SCREEN 100 AS SUBSCREEN.
PARAMETERS:p_werks TYPE mard-werks OBLIGATORY.
SELECT-OPTIONS: s_matnr FOR mard-matnr.
SELECTION-SCREEN END OF SCREEN 100.
************************************************************************
* <2.处理过程>
************************************************************************
*----------------------------------------------------------------------*
* <2.1-用于程序的初始化,在标准显示选择屏调用前执行,>
*----------------------------------------------------------------------*
INITIALIZATION.
*----------------------------------------------------------------------*
* AT SELECTION-SCREEN
*----------------------------------------------------------------------*
*----------------------------------------------------------------------*
* <2.3-在选择屏幕被处理后触发的事件>
*----------------------------------------------------------------------*
START-OF-SELECTION.
END-OF-SELECTION.
*----------------------------------------------------------------------*
* <2.4-运行时环境中最后被触发的事件>
*----------------------------------------------------------------------*
CALL SCREEN 9000.
程序逻辑处理:
*&---------------------------------------------------------------------*
*& Include ZMZHDEMO03F01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form frm_get_data
*&---------------------------------------------------------------------*
*& 数据获取
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_get_data .
"根据选择界面输入条件 筛选数据
"普通库存
SELECT * FROM mard INTO TABLE gt_tab1 UP TO 100 ROWS WHERE werks = p_werks AND matnr IN s_matnr.
"供应商库存
SELECT * FROM mslb INTO TABLE gt_tab2 UP TO 100 ROWS WHERE werks = p_werks AND matnr IN s_matnr.
"销售订单库存
SELECT * FROM mska INTO TABLE gt_tab3 UP TO 100 ROWS WHERE werks = p_werks AND matnr IN s_matnr.
"客户库存
SELECT * FROM msku INTO TABLE gt_tab4 UP TO 100 ROWS WHERE werks = p_werks AND matnr IN s_matnr.
ENDFORM.
程序界面处理:
*&---------------------------------------------------------------------*
*& 包含 ZMZHDEMO03F02
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form frm_data_display
*&---------------------------------------------------------------------*
*& ALV显示处理
*&---------------------------------------------------------------------*
*& --> T_TABLE
*& --> ALV_GRID
*& --> ALV_CONTAINER
*& --> CONTAINER_NAME
*&---------------------------------------------------------------------*
FORM frm_data_display TABLES t_table TYPE STANDARD TABLE
USING alv_grid TYPE REF TO cl_gui_alv_grid
alv_container TYPE REF TO cl_gui_custom_container
container_name TYPE c
handle TYPE slis_handl.
"ALV 初始化
IF alv_grid IS INITIAL .
"LAYOUT 布局设定
PERFORM frm_alv_layout.
"FIELDCAT 字段填充设定
PERFORM frm_fieldcat_build TABLES t_table.
"容器实例化及ALV界面显示
PERFORM frm_report_display TABLES t_table USING alv_grid alv_container container_name handle.
ELSE.
"内表数据刷新
PERFORM frm_alv_refresh_no_scroll USING alv_grid.
"优化列宽设定
PERFORM frm_alv_col_optimize USING alv_grid.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_ALV_LAYOUT
*&---------------------------------------------------------------------*
* 设定Layout
*----------------------------------------------------------------------*
FORM frm_alv_layout .
CLEAR gs_layout.
"设置行颜色变化
gs_layout-zebra = 'X'.
"列宽自适应
gs_layout-cwidth_opt = 'X'.
"设置选择按钮
gs_layout-sel_mode = 'D'.
ENDFORM. " FRM_ALV_LAYOUT
*&---------------------------------------------------------------------*
*& Form FIELDCAT_BUILD
*&---------------------------------------------------------------------*
* 设定Fieldcat
*----------------------------------------------------------------------*
FORM frm_fieldcat_build TABLES t_table TYPE STANDARD TABLE.
"FIELDCAT 字段填充
zcl_common=>get_fieldcat( EXPORTING i_tabname = t_table[] CHANGING t_fieldcat = gt_fieldcat ).
ENDFORM. " FIELDCAT_BUILD
*&---------------------------------------------------------------------*
*& Form REPORT_DISPLAY
*&---------------------------------------------------------------------*
* ALV显示输出
*----------------------------------------------------------------------*
FORM frm_report_display TABLES t_table TYPE STANDARD TABLE
USING alv_grid TYPE REF TO cl_gui_alv_grid
alv_container TYPE REF TO cl_gui_custom_container
container_name TYPE c
handle TYPE slis_handl.
DATA:
lt_exclude TYPE ui_functions,
ls_variant TYPE disvariant.
"创建container对象
CREATE OBJECT alv_container
EXPORTING
container_name = container_name.
"创建alv对象
CREATE OBJECT alv_grid
EXPORTING
i_parent = alv_container.
* "隐藏按钮
* PERFORM frm_exclude_code CHANGING lt_exclude.
"变式布局
ls_variant-report = sy-repid.
ls_variant-handle = handle.
"调用Alv显示方法
CALL METHOD alv_grid->set_table_for_first_display
EXPORTING
is_layout = gs_layout
is_variant = ls_variant
it_toolbar_excluding = lt_exclude "去掉后不隐藏功能键
i_save = 'X'
i_default = 'X'
CHANGING
it_outtab = t_table[]
it_fieldcatalog = gt_fieldcat
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.
ENDFORM. " REPORT_DISPLAY
*&---------------------------------------------------------------------*
*& Form frm_exclude_code
*&---------------------------------------------------------------------*
*& 排除不需要的标准Alv按钮
*&---------------------------------------------------------------------*
*& <-- Lt_exclude
*&---------------------------------------------------------------------*
FORM frm_exclude_code CHANGING lt_exclude TYPE ui_functions.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_ALV_TOOLBAR
*&---------------------------------------------------------------------*
* 给ALV TOOLBar添加自定义按钮
*----------------------------------------------------------------------*
* -->E_OBJECT Toolbar Object
* -->E_INTERACTIVE Interactive Call
*----------------------------------------------------------------------*
FORM frm_alv_toolbar USING e_object TYPE REF TO cl_alv_event_toolbar_set
e_interactive TYPE char01.
ENDFORM. " FRM_IT_TOOLBAR
*&---------------------------------------------------------------------*
*& Form FRM_ADD_SEPERATOR
*&---------------------------------------------------------------------*
* 添加分隔符
*----------------------------------------------------------------------*
* <--ET_TOOLBAR text
*----------------------------------------------------------------------*
FORM frm_add_seperator CHANGING et_toolbar TYPE ttb_button.
DATA: ls_toolbar TYPE stb_button.
ls_toolbar-function = 'DUMMY'.
ls_toolbar-butn_type = '3'.
APPEND ls_toolbar TO et_toolbar.
ENDFORM. " FRM_ADD_SEPERATOR
*&---------------------------------------------------------------------*
*& Form FRM_ADD_BUTTON
*&---------------------------------------------------------------------*
* 添加按钮(正常)
*----------------------------------------------------------------------*
* -->I_FUNCTION Function Code
* -->I_ICON 图标名称
* -->I_QUICKINFO 简要信息
* -->I_TEXT 图标文本
* <--ET_TOOLBAR 工具栏按钮
*----------------------------------------------------------------------*
FORM frm_add_button USING i_function TYPE stb_button-function
i_icon "TYPE STB_BUTTON-ICON
i_quickinfo "TYPE STB_BUTTON-TEXT
i_text TYPE flag
CHANGING et_toolbar TYPE ttb_button.
DATA: ls_toolbar TYPE stb_button.
"功能代码
ls_toolbar-function = i_function.
"图标名称
ls_toolbar-icon = i_icon.
"工具栏按钮类型
ls_toolbar-butn_type = '0'.
"不能使用
ls_toolbar-disabled = space.
"文本
ls_toolbar-quickinfo = i_quickinfo.
IF i_text = 'X'.
ls_toolbar-text = i_quickinfo.
ENDIF.
ls_toolbar-checked = space.
APPEND ls_toolbar TO et_toolbar.
ENDFORM. " FRM_ADD_BUTTON
*&---------------------------------------------------------------------*
*& Form FRM_ALV_USER_COMMAND
*&---------------------------------------------------------------------*
* ALV 用户命令处理
*----------------------------------------------------------------------*
* -->I_UCOMM
*----------------------------------------------------------------------*
FORM frm_alv_user_command USING i_ucomm TYPE sy-ucomm.
ENDFORM. " FRM_IT_USER_COMMAND
程序界面PBO部分:
*&---------------------------------------------------------------------*
*& Include ZMZHDEMO03PBO
*&---------------------------------------------------------------------*
"由程序自动生成,用于定义tabstrip标签页
*&SPWIZARD: OUTPUT MODULE FOR TS 'TAB9000'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: SETS ACTIVE TAB
MODULE tab9000_active_tab_set OUTPUT.
"将当前选中的标签页赋值给tab9000-activetab
tab9000-activetab = g_tab9000-pressed_tab.
CASE g_tab9000-pressed_tab.
"当当前标签页为c_tab9000-tab1时,设置g_tab9000-subscreen为'9001'
WHEN c_tab9000-tab1.
g_tab9000-subscreen = '9001'.
"当当前标签页为c_tab9000-tab2时,设置g_tab9000-subscreen为'9002'
WHEN c_tab9000-tab2.
g_tab9000-subscreen = '9002'.
"当当前标签页为c_tab9000-tab3时,设置g_tab9000-subscreen为'9003'
WHEN c_tab9000-tab3.
g_tab9000-subscreen = '9003'.
"当当前标签页为c_tab9000-tab4时,设置g_tab9000-subscreen为'9004'
WHEN c_tab9000-tab4.
g_tab9000-subscreen = '9004'.
"当前标签页为其他页时,不做处理
WHEN OTHERS.
ENDCASE.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module INTI_DATA OUTPUT
*&---------------------------------------------------------------------*
*&数据处理做界面展示
*&---------------------------------------------------------------------*
MODULE inti_data OUTPUT.
"根据当前选中的标签页进行判断
CASE g_tab9000-pressed_tab.
WHEN c_tab9000-tab1.
"普通库存
PERFORM frm_data_display TABLES gt_tab1
USING g_alv_grid1 g_alv_container1 g_container_name1 '1'.
WHEN c_tab9000-tab2.
"供应商库存
PERFORM frm_data_display TABLES gt_tab2
USING g_alv_grid2 g_alv_container2 g_container_name2 '2'.
WHEN c_tab9000-tab3.
"销售订单库存
PERFORM frm_data_display TABLES gt_tab3
USING g_alv_grid3 g_alv_container3 g_container_name3 '3'.
WHEN c_tab9000-tab4.
"客户库存
PERFORM frm_data_display TABLES gt_tab4
USING g_alv_grid4 g_alv_container4 g_container_name4 '4'.
WHEN OTHERS.
ENDCASE.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module STATUS_9000 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_9000 OUTPUT.
"设置屏幕的PF状态为'PF9000'
SET PF-STATUS 'PF9000'.
"设置屏幕的标题栏为'T9000'
SET TITLEBAR 'T9000'.
ENDMODULE.
程序界面PAI部分
*&---------------------------------------------------------------------*
*& Include ZMZHDEMO03PAI
*&---------------------------------------------------------------------*
*&SPWIZARD: INPUT MODULE FOR TS 'TAB9000'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: GETS ACTIVE TAB
MODULE tab9000_active_tab_get INPUT.
"将ok_code的值赋给变量save_ok
save_ok = ok_code.
"清空 ok_code
CLEAR ok_code.
"判断用户点击页签切换按钮操作
CASE save_ok.
WHEN c_tab9000-tab1.
g_tab9000-pressed_tab = c_tab9000-tab1.
WHEN c_tab9000-tab2.
g_tab9000-pressed_tab = c_tab9000-tab2.
WHEN c_tab9000-tab3.
g_tab9000-pressed_tab = c_tab9000-tab3.
WHEN c_tab9000-tab4.
g_tab9000-pressed_tab = c_tab9000-tab4.
WHEN OTHERS.
ENDCASE.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_9000 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_9000 INPUT.
"将sy-ucomm.的值赋给变量save_ok
save_ok = sy-ucomm.
"清空 ok_code
CLEAR ok_code.
"判断用户操作
CASE save_ok.
"返回初始屏幕
WHEN 'BACK'.
"返回初始屏幕
LEAVE TO SCREEN 0.
"数据查询
WHEN 'SEARCH'.
"数据读取
PERFORM frm_get_data.
WHEN OTHERS.
ENDCASE.
ENDMODULE.
文本元素:
屏幕:
状态栏 :
五、实现效果图