给维护表添加选择屏幕筛选条件

419 阅读4分钟

前言

在开发中,经常需要自定义维护表 Z 表,然后需要给到用户进行查询,但是直接用 SM30 生成的报表是没有选择屏幕的,本文介绍了一种从选择屏幕调用 SM30 表维护生成的方法。

SM30 事务码

显示表维护对话框的标准方法是通过 SM30,调用视图维护:

image.png

或为特定表调用 SM30 的自定义参数事务,其中参数 VIEWNAMEUPDATE = '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.

最后效果

image.png