ABAP修改Domain域值

背景

最近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.

猜你喜欢

转载自blog.csdn.net/u012232542/article/details/91825004
今日推荐