背景
最近MDG的项目,有个需求是通过接口传输过来的数据,修改Domain的域值(单值),需要通过ABAP代码实现
原理
通过调查和闻讯,得知函数组SDIF可以修改数据字典,包括修改域值、数据元素、结构、表&&视图、索引、搜索帮助等
我们使用到的函数如下
- DDIF_DOMA_GET:获取域值的信息
- DDIF_DOMA_PUT:修改域值的信息
- DDIF_DOMA_ACTIVATE:激活不活动的域,用于修改后使用
示例代码
*&---------------------------------------------------------------------*
*& 场景:维护域值的多个版本描述
*&----------------------------------------------------------------------
form sub_after_save.
data:ls_domain type zmdgv_domain_i,
lt_domain type table of zmdgv_domain_i,
ls_domain_head_zh type dd01v,
ls_domain_head_en type dd01v,
lt_domain_value_zh type table of dd07v,
lt_domain_value_en type table of dd07v,
ls_domain_value type dd07v.
loop at total assigning field-symbol(<fs_total>).
clear ls_domain.
ls_domain = <fs_total>.
append ls_domain to lt_domain.
endloop.
sort lt_domain by zzdom_code.
loop at lt_domain into ls_domain.
at new zzdom_code.
call function 'DDIF_DOMA_GET'
exporting
name = conv ddobjname( ls_domain-zzdom_code )
langu = conv syst_langu( '1' )
importing
* GOTSTATE =
dd01v_wa = ls_domain_head_zh
tables
dd07v_tab = lt_domain_value_zh
exceptions
illegal_input = 1
others = 2.
if sy-subrc <> 0.
continue.
endif.
call function 'DDIF_DOMA_GET'
exporting
name = conv ddobjname( ls_domain-zzdom_code )
langu = conv syst_langu( 'E' )
importing
* GOTSTATE =
dd01v_wa = ls_domain_head_en
tables
dd07v_tab = lt_domain_value_en
exceptions
illegal_input = 1
others = 2.
if sy-subrc <> 0.
continue.
endif.
data(lv_zh_count) = conv i( lines( lt_domain_value_zh ) ).
data(lv_en_count) = conv i( lines( lt_domain_value_en ) ).
endat.
if ls_domain-zzdel eq abap_true."域值已删除
delete lt_domain_value_zh where domvalue_l eq ls_domain-zzdom_value.
delete lt_domain_value_en where domvalue_l eq ls_domain-zzdom_value.
else.
"中文描述
read table lt_domain_value_zh into ls_domain_value with key domvalue_l = ls_domain-zzdom_value
ddlanguage = '1' .
if sy-subrc eq 0."修改
ls_domain_value-ddtext = ls_domain-zzdom_t_cn.
modify lt_domain_value_zh from ls_domain_value index sy-tabix.
else."新增
append initial line to lt_domain_value_zh assigning field-symbol(<fs_value>).
<fs_value>-domname = ls_domain-zzdom_code.
add 1 to lv_zh_count.
<fs_value>-valpos = lv_zh_count.
<fs_value>-domvalue_l = ls_domain-zzdom_value.
<fs_value>-ddtext = ls_domain-zzdom_t_cn.
<fs_value>-ddlanguage = '1'.
endif.
"英文描述
read table lt_domain_value_en into ls_domain_value with key domvalue_l = ls_domain-zzdom_value
ddlanguage = 'E' .
if sy-subrc eq 0.
ls_domain_value-ddtext = ls_domain-zzdom_t_en.
modify lt_domain_value_en from ls_domain_value index sy-tabix..
else.
append initial line to lt_domain_value_en assigning <fs_value>.
<fs_value>-domname = ls_domain-zzdom_code.
add 1 to lv_en_count.
<fs_value>-valpos = lv_en_count.
<fs_value>-domvalue_l = ls_domain-zzdom_value.
<fs_value>-ddtext = ls_domain-zzdom_t_en.
<fs_value>-ddlanguage = 'E'.
endif.
endif.
at end of zzdom_code.
call function 'DDIF_DOMA_PUT'
exporting
name = conv ddobjname( ls_domain-zzdom_code )
dd01v_wa = ls_domain_head_zh
tables
dd07v_tab = lt_domain_value_zh
exceptions
doma_not_found = 1
name_inconsistent = 2
doma_inconsistent = 3
put_failure = 4
put_refused = 5
others = 6.
if sy-subrc <> 0.
continue.
endif.
call function 'DDIF_DOMA_PUT'
exporting
name = conv ddobjname( ls_domain-zzdom_code )
dd01v_wa = ls_domain_head_en
tables
dd07v_tab = lt_domain_value_en
exceptions
doma_not_found = 1
name_inconsistent = 2
doma_inconsistent = 3
put_failure = 4
put_refused = 5
others = 6.
if sy-subrc <> 0.
continue.
endif.
call function 'DDIF_DOMA_ACTIVATE'
exporting
name = conv ddobjname( ls_domain-zzdom_code )
exceptions
not_found = 1
put_failure = 2
others = 3.
if sy-subrc <> 0.
continue.
endif.
endat.
endloop.
endform.