前言
在开发中,经常需要自定义维护表 Z 表,然后需要给到用户进行查询,但是直接用 SM30 生成的报表是没有选择屏幕的,本文介绍了一种从选择屏幕调用 SM30 表维护生成的方法。
SM30 事务码
显示表维护对话框的标准方法是通过 SM30,调用视图维护:
或为特定表调用 SM30 的自定义参数事务,其中参数 VIEWNAME 和 UPDATE = 'X'。
这些都不提供初始选择屏幕。可以通过选中“输入条件”单选按钮来限制条目,但用户更熟悉选择屏幕而不是弹出的对话框。因此,使用选择屏幕而不是“输入条件”单选按钮是很好的 UI。
正常的选择屏幕逻辑
方法是通过 vimsellist 来进行数据选择,然后定义正常的 SELECT-OPTIONS 选择屏幕:
REPORT zsdr040.
*----------------------------------------------------------------------*
* 数据库表声明/Database table declaration
*----------------------------------------------------------------------*
TABLES: zsdt057 . " 销售凭证 : 抬头数据
DATA:gt_dba_sellist TYPE TABLE OF vimsellist WITH HEADER LINE,
gt_excl_cua_funct TYPE TABLE OF vimexclfun,
gt_x_header TYPE TABLE OF vimdesc,
gt_x_namtab TYPE TABLE OF vimnamtab,
gt_dpl_sellist TYPE TABLE OF vimsellist.
" 使用该程序的目的是在不分配用户SM30权限的条件下,仍然能够进入某一特定表维护视图
*&---------------------------------------------------------------------*
*& Selection Screen/选择屏幕
*&---------------------------------------------------------------------*
*&---选择屏幕块
SELECTION-SCREEN BEGIN OF BLOCK blk01 WITH FRAME TITLE TEXT-001.
*&---范围
SELECT-OPTIONS: s_vbeln FOR zsdt057-vbeln MODIF ID m4, " OBLIGATORY NO-EXTENSION NO INTERVALS,
s_posnr FOR zsdt057-posnr MODIF ID m4,
s_dncpo FOR zsdt057-dncpo MODIF ID m4,
s_gotdt FOR zsdt057-badi_zgotdt MODIF ID m4,
* s_dnpos FOR zsdt057-dncpo_posnr,
s_mblnr FOR zsdt057-mblnr MODIF ID m4 ,
s_erdat FOR zsdt057-erdat_fp MODIF ID m4,
s_mjahr FOR zsdt057-mjahr MODIF ID m4,
s_laeda FOR zsdt057-erdat_pz MODIF ID m4.
SELECTION-SCREEN END OF BLOCK blk01.
SELECTION-SCREEN BEGIN OF BLOCK blk02 WITH FRAME TITLE text002.
SELECTION-SCREEN: BEGIN OF LINE.
PARAMETERS: p1 TYPE c RADIOBUTTON GROUP rb1.
SELECTION-SCREEN: COMMENT (30) FOR FIELD p1.
PARAMETERS: p2 TYPE c RADIOBUTTON GROUP rb1.
SELECTION-SCREEN: COMMENT (30) FOR FIELD p2.
PARAMETERS: p3 TYPE c RADIOBUTTON GROUP rb1 DEFAULT 'X'.
SELECTION-SCREEN: COMMENT (30) FOR FIELD p3.
SELECTION-SCREEN: END OF LINE.
SELECTION-SCREEN END OF BLOCK blk02.
选择屏幕结合到查询语句
当用户单击“执行”时,程序需要读取他们的选择并调用表维护对话框。以下代码显示了如何通过使用功能模块“VIEW_RANGETAB_TO_SELLIST”和“VIEW_MAINTENANCE_CALL”轻松完成此操作:
CALL FUNCTION 'VIEW_GET_DDIC_INFO'
EXPORTING
viewname = 'ZSDT057'
TABLES
sellist = gt_dba_sellist
x_header = gt_x_header
x_namtab = gt_x_namtab
EXCEPTIONS
no_tvdir_entry = 1
table_not_found = 2
OTHERS = 3.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
IF p1 = 'X'.
gt_dba_sellist-viewfield = 'VBELN_FP'.
gt_dba_sellist-leftpar = 1.
gt_dba_sellist-operator = 'NE'.
gt_dba_sellist-value = ''.
gt_dba_sellist-rightpar = 1.
gt_dba_sellist-and_or = 'AND'.
gt_dba_sellist-cond_kind = 'C'.
APPEND gt_dba_sellist.
ELSEIF p2 = 'X'.
gt_dba_sellist-viewfield = 'VBELN_FP'.
gt_dba_sellist-leftpar = 1.
gt_dba_sellist-operator = 'EQ'.
gt_dba_sellist-value = ''.
gt_dba_sellist-rightpar = 1.
gt_dba_sellist-and_or = 'AND'.
gt_dba_sellist-cond_kind = 'C'.
APPEND gt_dba_sellist.
ENDIF.
CALL FUNCTION 'VIEW_RANGETAB_TO_SELLIST' "添加第1个筛选条件
EXPORTING
fieldname = 'VBELN'
append_conjunction = 'AND'
TABLES
sellist = gt_dba_sellist
rangetab = s_vbeln.
CALL FUNCTION 'VIEW_RANGETAB_TO_SELLIST' "添加第2个筛选条件
EXPORTING
fieldname = 'POSNR'
append_conjunction = 'AND'
TABLES
sellist = gt_dba_sellist
rangetab = s_posnr.
CALL FUNCTION 'VIEW_RANGETAB_TO_SELLIST' "添加第3个筛选条件
EXPORTING
fieldname = 'DNCPO'
append_conjunction = 'AND'
TABLES
sellist = gt_dba_sellist
rangetab = s_dncpo.
CALL FUNCTION 'VIEW_RANGETAB_TO_SELLIST' "添加第4个筛选条件
EXPORTING
fieldname = 'BADI_ZGOTDT'
append_conjunction = 'AND'
TABLES
sellist = gt_dba_sellist
rangetab = s_gotdt.
CALL FUNCTION 'VIEW_RANGETAB_TO_SELLIST' "添加第5个筛选条件
EXPORTING
fieldname = 'MBLNR'
append_conjunction = 'AND'
TABLES
sellist = gt_dba_sellist
rangetab = s_mblnr.
CALL FUNCTION 'VIEW_RANGETAB_TO_SELLIST' "添加第6个筛选条件
EXPORTING
fieldname = 'ERDAT_FP'
append_conjunction = 'AND'
TABLES
sellist = gt_dba_sellist
rangetab = s_erdat.
CALL FUNCTION 'VIEW_RANGETAB_TO_SELLIST' "添加第7个筛选条件
EXPORTING
fieldname = 'MJAHR'
append_conjunction = 'AND'
TABLES
sellist = gt_dba_sellist
rangetab = s_mjahr.
CALL FUNCTION 'VIEW_RANGETAB_TO_SELLIST' "添加第8个筛选条件
EXPORTING
fieldname = 'ERDAT_PZ'
append_conjunction = 'AND'
TABLES
sellist = gt_dba_sellist
rangetab = s_laeda.
CALL FUNCTION 'VIEW_ENQUEUE'
EXPORTING
view_name = 'ZSDT057'
action = 'E'
enqueue_mode = 'E'
EXCEPTIONS
foreign_lock = 1
system_failure = 2
table_not_found = 5
client_reference = 7.
IF sy-subrc NE 0.
MESSAGE 'Data locked by' && sy-msgv1 TYPE 'S' DISPLAY LIKE 'E'.
RETURN.
ENDIF.
" tabix是根据上面函数VIEW_GET_DDIC_INFO找到的位置,不要乱填tabix,不然会出异常或者筛选不生效
LOOP AT gt_dba_sellist ASSIGNING FIELD-SYMBOL(<fs_dba>).
CASE <fs_dba>-viewfield.
WHEN 'MBLNR'.
<fs_dba>-tabix = 2.
WHEN 'MJAHR'.
<fs_dba>-tabix = 4.
WHEN 'VBELN'.
<fs_dba>-tabix = 5.
WHEN 'POSNR'.
<fs_dba>-tabix = 6.
WHEN 'DNCPO'.
<fs_dba>-tabix = 7.
WHEN 'VBELN_FP'.
<fs_dba>-tabix = 9.
WHEN 'ERDAT_FP'.
<fs_dba>-tabix = 11.
WHEN 'MATNR'.
<fs_dba>-tabix = 13.
WHEN 'BADI_ZGOTDT'.
<fs_dba>-tabix = 17.
WHEN 'ERDAT_PZ'.
<fs_dba>-tabix = 21.
WHEN OTHERS.
ENDCASE.
ENDLOOP.
调用维护表函数
CALL FUNCTION 'VIEW_MAINTENANCE'
EXPORTING
view_action = 'S' " "S = Display U = Change T=Transport
view_name = 'ZSDT057'
complex_selconds_used = 'X'
TABLES
dba_sellist = gt_dba_sellist
dpl_sellist = gt_dba_sellist
excl_cua_funct = gt_excl_cua_funct
x_header = gt_x_header
x_namtab = gt_x_namtab
EXCEPTIONS
missing_corr_number = 1
no_database_function = 2
no_editor_function = 3
no_value_for_subset_ident = 4
OTHERS = 5.
IF sy-subrc = 0.
ENDIF.