需求:使用表维护实现维护一个对象的不同属性。
解决:实现的方式有很多种,比如如果属性固定,可以将属性放到列上来维护处理,如果动态可配置属性也可以选择自定义表维护,或者增强表维护。这里给出其中一种可复用的实现示例以供参考。
操作步骤如下:
1、依次创建对象表,属性表,以及对象属性配置表
2、为对象属性表创建维护视图,并为所有表和视图创建表维护
3. 创建视图簇
点击代码编辑创建form程序,再次点击生成对应form,填写代码逻辑如下
FORM exi_10 .
" 抬头表
TYPES: BEGIN OF ty_ylc_class_extra.
INCLUDE TYPE ylc_class.
TYPES: mode1 TYPE char1,
mode2 TYPE char1,
END OF ty_ylc_class_extra.
" 关联表
TYPES: BEGIN OF ty_ylc_class_attr_v_extra.
INCLUDE TYPE ylc_class_attr_v.
TYPES: mode1 TYPE char1,
mode2 TYPE char255,
END OF ty_ylc_class_attr_v_extra.
" 逻辑处理使用
DATA: lt_ylc_class_extra TYPE TABLE OF ty_ylc_class_extra,
ls_ylc_class_extra TYPE ty_ylc_class_extra,
lt_ylc_class_attr_v_extra TYPE TABLE OF ty_ylc_class_attr_v_extra,
ls_ylc_class_attr_v_extra TYPE ty_ylc_class_attr_v_extra.
DATA:lt_ylc_class_attr_v TYPE TABLE OF ylc_class_attr_v,
ls_ylc_class_attr_v TYPE ylc_class_attr_v,
ls_ylc_class_attr TYPE ylc_class_attr,
lt_ylc_attribute TYPE TABLE OF ylc_attribute,
ls_ylc_attribute TYPE ylc_attribute.
DATA: lv_chg_flag TYPE char1.
STATICS: lt_ylc_class_attr_add TYPE TABLE OF ylc_class_attr.
FIELD-SYMBOLS: <fs_value> TYPE any,
<fs_tab> TYPE any.
CONSTANTS: c_action TYPE string VALUE '(SAPLSVCM)VCL_ACTION', " 修改模式
c_function TYPE string VALUE '(SAPLSVCM)VCL_FUNCTION', " 动作代码,切换为 EV_NAVI
c_last_view TYPE string VALUE '(SAPLSVCM)VCL_LAST_VIEW', " 切换前的维护表
c_next_view TYPE string VALUE '(SAPLSVCM)VCL_NEXT_VIEW', " 切换后的维护表
c_extract_m_1 TYPE string VALUE '(SAPLSVCM)VCL_EXTRACT_M_1', " 顺序为1的表维护对应展示数据
c_extract_m_2 TYPE string VALUE '(SAPLSVCM)VCL_EXTRACT_M_2', " 顺序为2的表维护对应展示数据
c_total_m_2 TYPE string VALUE '(SAPLSVCM)VCL_TOTAL_M_2'. " 顺序为2的表维护对应所有数据
ASSIGN (c_action) TO <fs_value>.
IF sy-subrc = 0 AND <fs_value> = 'U'.
ASSIGN c_function TO <fs_value>.
IF sy-subrc = 0 AND <fs_value> = 'EV_NAVI'.
ASSIGN (c_last_view) TO <fs_value>.
IF sy-subrc = 0 AND <fs_value> = 'YLC_CLASS'.
ASSIGN (c_next_view) TO <fs_value>.
IF sy-subrc = 0 AND <fs_value> = 'YLC_CLASS_ATTR_V'. " 限制为 由 抬头表切换到关联表
ASSIGN (c_extract_m_1) TO <fs_tab>.
lt_ylc_class_attr_v_extra = <fs_tab>.
IF sy-subrc = 0.
ASSIGN (c_extract_m_2) TO <fs_tab>.
IF sy-subrc = 0.
lt_ylc_class_extra = <fs_tab>.
ASSIGN (c_total_m_2) TO <fs_tab>.
IF sy-subrc = 0.
" 逻辑处理部分
lt_ylc_class_attr_v = <fs_tab>.
SELECT *
FROM ylc_attribute
INTO TABLE lt_ylc_attribute.
LOOP AT lt_ylc_class_extra INTO ls_ylc_class_extra WHERE mode2 = 'M'.
LOOP AT lt_ylc_attribute INTO ls_ylc_attribute.
READ TABLE lt_ylc_class_attr_v INTO ls_ylc_class_attr_v WITH KEY class = ls_ylc_class_extra-class
attribute = ls_ylc_attribute-attribute.
IF sy-subrc <> 0.
lv_chg_flag = abap_true.
ls_ylc_class_attr_v-mandt = sy-mandt.
ls_ylc_class_attr_v-class = ls_ylc_class_extra-class.
ls_ylc_class_attr_v-attribute = ls_ylc_attribute-attribute.
ls_ylc_class_attr_v-attdesc = ls_ylc_attribute-attdesc.
ls_ylc_class_attr_v-isactivate = ''.
APPEND ls_ylc_class_attr_v TO lt_ylc_class_attr_v.
MOVE-CORRESPONDING ls_ylc_class_attr_v TO ls_ylc_class_attr .
APPEND ls_ylc_class_attr TO lt_ylc_class_attr_add.
ENDIF.
ENDLOOP.
ENDLOOP.
IF lv_chg_flag = abap_true.
<fs_tab> = lt_ylc_class_attr_v.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ELSEIF sy-subrc = 0 AND <fs_value> = 'SAVE' AND lt_ylc_class_attr_add IS NOT INITIAL." 保存
LOOP AT lt_ylc_class_attr_v_extra INTO ls_ylc_class_attr_v_extra WHERE mode1 = 'U' OR mode1 = 'I' OR mode1 = 'M'.
DELETE lt_ylc_class_attr_add WHERE class = ls_ylc_class_attr_v_extra-class AND attribute = ls_ylc_class_attr_v_extra-attribute.
ENDLOOP.
MODIFY ylc_class_attr FROM TABLE lt_ylc_class_attr_add.
CLEAR lt_ylc_class_attr_add.
ENDIF.
ENDIF.
ENDFORM.
激活
4、效果展示