表维护视图

3 篇文章 1 订阅

目录

创建表维护视图一般步骤

1)创建数据库表

2)创建维护视图

3)选择显示字段

4)创建表维护

5)修改table control显示控制

6)添加自定义module,为单位 维护日期 ,维护人赋值

7)SM30维护

8)为维护视图分配T-code

动态控制显示列,显示范围

1)设置组

2)写控制代码

3)调用维护视图

单元格级别编辑

视图簇View cluster的创建

1)视图簇简介

2)创建视图簇

FUNCTION 'VIEW_MAINTENANCE_CALL'详解

1)参数ACTION

2)表DBA_SELLIST

3)表EXCL_CUA_FUNCT


创建表维护视图一般步骤

1)创建数据库表

  

 物料、工厂设置外键。

2)创建维护视图

 选中MARA,关联文本表

3)选择显示字段

把文本字段维护进去

4)创建表维护

 创建,报错,激活

5)修改table control显示控制

双击概述屏幕:9001,点布局

 必填字段修改为必输。

把描述等字段设置为不可输入

修改列描述。(这个其实是可以动态可控的,后续再讲)

把字段显示长度调整到一半比较舒服的距离。

保存,激活。

6)添加自定义module,为单位 维护日期 ,维护人赋值

7)SM30维护

8)为维护视图分配T-code

SE93创建T-code

 

动态控制显示列,显示范围

有时候不同部门维护不同的列,比如财务维护财务相关的,采购维护采购相关的数据,但是又在同一个维护视图中。

当然,你可以建多个维护视图。也可以直接修改table control 动态显示列,来实现这个需求。

真正的项目里应该是判断权限对象,然后判断是否显示某些列。

这个demo里简单一些,就不同工厂显示的列不一样得了。

反正原理都一样。

以下具体步骤:

1)设置组

数量和单位,在CN1下

金额在CN3下

2)写控制代码

在PBO 加代码如下

或者在这个地方控制

其实只要你对table control 足够熟悉,想在哪儿加就在哪儿加,想控制什么就能控制什么。

但是这个时候就肯定不能使用SM30去维护了,需要建一个自定义的程序call view 来维护数据。不然同时存在CN01 CN03数据,就导致工厂控制的列都不显示了。

3)调用维护视图

SE38创建自定义程序,代码如下:

*&---------------------------------------------------------------------*
*& Report ZTEST_LING
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZTEST_LING.

TABLES: ZTEST_V_LING.

SELECT-OPTIONS:
  S_MATNR FOR ZTEST_V_LING-MATNR,
  S_WERKS FOR ZTEST_V_LING-WERKS OBLIGATORY.

DATA: LT_SELTAB    TYPE STANDARD TABLE OF VIMSELLIST.
DATA: GT_EXCLUDE  TYPE TABLE OF VIMEXCLFUN,
      GWA_EXCLUDE TYPE VIMEXCLFUN.

START-OF-SELECTION.

  CLEAR LT_SELTAB[].

  CALL FUNCTION 'VIEW_RANGETAB_TO_SELLIST'
    EXPORTING
      FIELDNAME          = 'MATNR'
      APPEND_CONJUNCTION = 'AND'
    TABLES
      SELLIST            = LT_SELTAB
      RANGETAB           = S_MATNR.

  CALL FUNCTION 'VIEW_RANGETAB_TO_SELLIST'
    EXPORTING
      FIELDNAME          = 'WERKS'
      APPEND_CONJUNCTION = 'AND'
    TABLES
      SELLIST            = LT_SELTAB
      RANGETAB           = S_WERKS.

  CALL FUNCTION 'VIEW_MAINTENANCE_CALL'
    EXPORTING
      ACTION      = 'U'
      VIEW_NAME   = 'ZTEST_V_LING'
    TABLES
      DBA_SELLIST = LT_SELTAB[].

 执行效果:

单元格级别编辑

这个其实属于table control 技术的范畴。

比如根据table control 内容的某列的值,来判断该行某列是否可编辑等等。

在表维护视图的时候也会用到。

以下实现当物料 = 100840 的时候,日期字段不可编辑。

在loop里面,这个位置添加一个module。

 添加如下代码:

*----------------------------------------------------------------------*
***INCLUDE LZTEST_V_LINGO03.
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module MDL_CONTRL_INPUT OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE MDL_CONTRL_INPUT OUTPUT.
  DATA:LV_MATRN TYPE MATNR.
  LV_MATRN =  ZTEST_V_LING-MATNR .

  SHIFT LV_MATRN LEFT DELETING LEADING '0'.

  IF LV_MATRN  = '100840'.

    LOOP AT SCREEN.
      IF SCREEN-NAME = 'ZTEST_V_LING-DATUM'.
        SCREEN-INPUT = 0.   "不可输入状态
        MODIFY SCREEN.
      ENDIF.
    ENDLOOP.

  ENDIF.
ENDMODULE.

执行效果:

但是,到这里还没有结束,你如果编辑这个字段,然后点保存,发现修改的不起作用。

所以如果想保存编辑字段的值。还需要做下面的处理。

针对这个字段加一个on request module。(根本不用加,就注释之前的自动日期赋值就可以了)

 把之前的自动日期赋值给注释掉。

代码:

*----------------------------------------------------------------------*
***INCLUDE LZTEST_V_LINGI02.
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Module  MDL_CHANGE_DATE  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE MDL_CHANGE_DATE INPUT.
  FIELD-SYMBOLS <LFS_LINE> TYPE ANY.
  FIELD-SYMBOLS <LFS_FIELD> TYPE ANY.
  FIELD-SYMBOLS <LFS_KEY> TYPE ANY.

  LOOP AT EXTRACT ASSIGNING <LFS_LINE>.

    "按物料做主键(表维护程序前台工厂必输)
    ASSIGN COMPONENT 'MATNR' OF STRUCTURE <LFS_LINE> TO <LFS_KEY>.
    CHECK <LFS_KEY> = ZTEST_V_LING-MATNR.

    ASSIGN COMPONENT 'DATUM' OF STRUCTURE <LFS_LINE> TO <LFS_FIELD>.
    IF SY-SUBRC = 0.
      <LFS_FIELD> = ZTEST_V_LING-DATUM.
    ENDIF.

  ENDLOOP.
ENDMODULE.

修改日期,回车或者点保存即可。

视图簇View cluster的创建

1)视图簇简介

在SAP系统中我们经常会看到带层次结构的维护视图,尤其是在后台IMG配置中,如事务代码OKKP。其实它就是一个视图簇(View cluster),视图簇可以通过事务代码SE54将多个表维护视图按照一定的关联关系链接起来,形成层次结构,方便维护数据。

 我们不妨用事务代码SE93查看上述事务代码,可以看到维护视图簇是调用了事务代码SM34,也就是说将来创建了视图簇可以用该事务代码进行维护(或者创建单独的事务代码)。

 

2)创建视图簇

首先得创建有层次关系的两张表,这里我们以新建采购订单的抬头/行项目表为例进行演示。

创建完成之后记得新建“表格维护生成器”(同SM30维护表一样)。

 其中行项目表中的“EBELN”字段需要创建一个外键,与抬头表进行关联。

 接着我们就可以通过事务代码SE54创建视图簇了。

在“对象结构”中新建输入上面创建好的两个Table,维护好它们之间的关系显示顺序。

之后先选中“ZPO_HEAD”行,点击右上角的按钮“字段相关”,完成后系统会提示“字段相关性已完成”的信息。其次选中“ZPO_ITEM”行,点击左边的“字段附属”按钮,维护好两个Table之间的对应关系(通过外键将Head表和Item表联系起来)。 

 最后“激活”整个操作。 

 之后可以通过事务代码SM34进行维护了。

FUNCTION 'VIEW_MAINTENANCE_CALL'详解

1)参数ACTION

决定调用的视图的活动(显示/维护/传输)

•S = Display
•U = Change
•T = Transport

2)表DBA_SELLIST

数据库访问选择条件

3)表EXCL_CUA_FUNCT

屏蔽视图中GUI的按钮

TABLES: MARC.
DATA: sellist TYPE TABLE OF vimsellist.
DATA: lv_ACTION TYPE char1 VALUE 'S'.

DATA: it_vimexclfun TYPE TABLE OF vimexclfun,
      iw_vimexclfun TYPE vimexclfun.

SELECT-OPTIONS: S_WERKS FOR MARC-WERKS OBLIGATORY.

DATA GR_WERKS TYPE RANGE OF T001W-WERKS.

SELECT WERKS INTO TABLE @DATA(LT_T001W)
  FROM T001W WHERE WERKS IN @S_WERKS.

REFRESH GR_WERKS[].
LOOP AT LT_T001W INTO DATA(LS_T001W).
  AUTHORITY-CHECK OBJECT 'ZS_ZWERKS'
  ID 'ZWERKS' FIELD LS_T001W-WERKS
  ID 'ACTVT' DUMMY.
  IF SY-SUBRC EQ 0.
    APPEND VALUE #( SIGN = 'I' OPTION = 'EQ' LOW = LS_T001W-WERKS ) TO GR_WERKS.
  ENDIF.
ENDLOOP.
IF GR_WERKS[] IS INITIAL.
  MESSAGE '您没有该工厂的操作权限,请检查!' TYPE 'E'.
ENDIF.

CALL FUNCTION 'VIEW_RANGETAB_TO_SELLIST'    "添加第一个筛选条件
  EXPORTING
    fieldname = 'WERKS'
*    append_conjunction = 'AND'
  TABLES
    sellist   = sellist
    rangetab  = GR_WERKS. "S_WERKS.

*屏蔽按钮
*iw_vimexclfun-function = 'NEWL'.
*APPEND iw_vimexclfun TO it_vimexclfun.
*iw_vimexclfun-function = 'KOPE'.
*APPEND iw_vimexclfun TO it_vimexclfun.
*iw_vimexclfun-function = 'DELE'.
*APPEND iw_vimexclfun TO it_vimexclfun.
iw_vimexclfun-function = 'AEND'.
APPEND iw_vimexclfun TO it_vimexclfun.

CALL FUNCTION 'VIEW_MAINTENANCE_CALL'   "调用SM30
  EXPORTING
    action                       = lv_ACTION
*   CORR_NUMBER                  = '          '
*   GENERATE_MAINT_TOOL_IF_MISSING       = ' '
*   SHOW_SELECTION_POPUP         = ' '
    view_name                    = 'ZVPPCPXH'
*   NO_WARNING_FOR_CLIENTINDEP   = ' '
*   RFC_DESTINATION_FOR_UPGRADE  = ' '
*   CLIENT_FOR_UPGRADE           = ' '
*   VARIANT_FOR_SELECTION        = ' '
    complex_selconds_used        = 'X'
*   CHECK_DDIC_MAINFLAG          = ' '
*   SUPPRESS_WA_POPUP            = ' '
  TABLES
    dba_sellist                  = sellist
    excl_cua_funct               = it_vimexclfun
  EXCEPTIONS
    client_reference             = 1
    foreign_lock                 = 2
    invalid_action               = 3
    no_clientindependent_auth    = 4
    no_database_function         = 5
    no_editor_function           = 6
    no_show_auth                 = 7
    no_tvdir_entry               = 8
    no_upd_auth                  = 9
    only_show_allowed            = 10
    system_failure               = 11
    unknown_field_in_dba_sellist = 12
    view_not_found               = 13
    maintenance_prohibited       = 14
    OTHERS                       = 15.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
     WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值