SAP SM30及ABAP维护ADRC中央地址主数据(BAS)

news2024/9/29 13:15:11

文章背景:

项目组员在创建SM30的时候,发现了下图的报错,原因是因为自建表中的地址编号ADRNR字段使用了标准的数据元素AD_ADDRNUM,当使用包含该数据元素的视图在SM30进行维护时,就会出现下面的报错AM287。

后续了解到,项目成员的需求这里要维护的地址编号并不是ADRC中的地址主数据,而是一个流水号用于区分业务信息,所以改成其他自定义数据元素后重新生成视图即可解决该问题。


正文:

再回到这个问题进一步了解后发现,这里是可以直接维护ADRC中地址主数据的信息的,又称之为中央地址管理(Business Address Services),如果想要在SM30维护地址信息,就需要按照上图的提示去做进一步配置,配置如下:

自建表信息:

SM30:TSADRV

SM30:TSAD7

添加完上面两个配置后,重新生成维护视图,即可发现,不会有之前的报错,并且SM30标准界面上方出现了一个按钮。

点击这个按钮,即可进行地址主数据信息的维护,并将信息更新回ADRC表中,不过ADRNR字段是会被标准逻辑隐藏起来的。

点击维护地址按钮,就会发现,跟前台标准事务代码中维护地址信息的窗口是一样的。

这让我想起了之前业务顾问提到的一个需求,想在标准界面的增强页签中添加一个这样的按钮,用来维护客户的自定义地址信息,当时觉得可能没那么好做,不过在对SM30这个按钮进行调试后,发现其实并不难实现,主要使用的函数包含下面几个:

ADDR_DIALOG:根据参数maint_mode决定弹窗显示的形式(CREATE / CHANGE / DISPLAY)

ADDR_MEMORY_CLEAR:实际写代码测试发现如果是新增自定义地址主数据之前,需要清空掉一些缓存,否则会有报错,调用该函数可以进行清空。

ADDR_INSERT:地址主数据创建。

ADDR_UPDATE:地址主数据修改。

ADDR_DELETE:地址主数据删除(未测试)。

ADDR_NUMBER_GET:创建之后,使用该函数来获取内存中生成的地址主数据编号ADRNR。

ADDR_SINGLE_SAVE:传入地址编号,进行数据库提交保存。


测试程序:

以下为测试demo程序,用来模拟当初那个需求的实现,逻辑并没有写的很严谨,只是为了测试可行性。

主要测试逻辑为:当地址号为空时,点击按钮会进行创建,创建完成后将地址号反写回屏幕,再次点击按钮时,如果地址号有值,则以显示模式或者更改模式呼出弹窗。


测试源码:

*&---------------------------------------------------------------------*
*& Report ZTESTADRC_DIALOG
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ztestadrc_dialog.

TYPES:
  tt_handle TYPE STANDARD TABLE OF addr1_dia,
  tt_values TYPE STANDARD TABLE OF addr1_data.

DATA:
  gv_adrnr  TYPE adrc-addrnumber,
  gv_okcode TYPE sy-ucomm,
  okcode    TYPE sy-ucomm.

CALL SCREEN 9000.
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_9000  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_9000 INPUT.
  gv_okcode = okcode.
  CLEAR okcode.

  CASE gv_okcode.
    WHEN 'BACK'.
      LEAVE PROGRAM.
    WHEN 'MAINTAIN'.
      PERFORM frm_maintain_adrc.
    WHEN OTHERS.
  ENDCASE.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module STATUS_9000 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_9000 OUTPUT.
  IF gv_adrnr IS NOT INITIAL.
    LOOP AT SCREEN.
      IF screen-name = 'GV_ADRNR'.
        screen-input = 0.
        MODIFY SCREEN.
      ENDIF.
    ENDLOOP.
  ENDIF.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Form frm_maintain_adrc
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
FORM frm_maintain_adrc .
  DATA:
    lv_mode    TYPE addr1_dia-maint_mode,
    lt_handle  TYPE STANDARD TABLE OF addr1_dia,
    ls_handle  TYPE addr1_dia,
    lt_values  TYPE STANDARD TABLE OF addr1_data,
    ls_values  TYPE addr1_data,
    lv_ok_code TYPE sy-ucomm.

  IF gv_adrnr IS INITIAL.
    lv_mode = 'CREATE'.
  ELSE.
*    lv_mode = 'CHANGE'.
    lv_mode = 'DISPLAY'.
  ENDIF.

  CASE lv_mode.
    WHEN 'CREATE'.
      ls_handle-handle     = 'TEST_CREATE'.
      ls_handle-maint_mode = lv_mode.
      ls_handle-addr_group = 'ZA01'.
    WHEN 'CHANGE'.
      ls_handle-addrnumber = gv_adrnr.
      ls_handle-maint_mode = lv_mode.
      ls_handle-addr_group = 'ZA01'.
    WHEN 'DISPLAY'.
      ls_handle-addrnumber = gv_adrnr.
      ls_handle-maint_mode = lv_mode.
      ls_handle-addr_group = 'ZA01'.
    WHEN OTHERS.
  ENDCASE.

  APPEND ls_handle TO lt_handle.
  CLEAR ls_handle.

* Maintain address info
  CALL FUNCTION 'ADDR_DIALOG'
*   EXPORTING
*     CHECK_ADDRESS                     = 'X'
*     SUPPRESS_TAXJURCODE_CHECK         = ' '
*     IV_TIME_DEPENDENT_COMM_DATA       = ' '
    IMPORTING
      ok_code           = lv_ok_code
    TABLES
      number_handle_tab = lt_handle
      values            = lt_values
    EXCEPTIONS
      address_not_exist = 1
      group_not_valid   = 2
      parameter_error   = 3
      internal_error    = 4
      OTHERS            = 5.

  IF sy-subrc <> 0.
*   Implement suitable error handling here
  ENDIF.

  CASE lv_mode.
    WHEN 'CREATE'.
      PERFORM frm_adrc_insert USING lt_handle lt_values.
    WHEN 'CHANGE'.
      PERFORM frm_adrc_update USING lt_handle lt_values.
    WHEN OTHERS.
  ENDCASE.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_ADRC_INSERT
*&---------------------------------------------------------------------*
*& Insert new records
*&---------------------------------------------------------------------*
*&      --> LT_VALUES
*&---------------------------------------------------------------------*
FORM frm_adrc_insert  USING ut_handle TYPE tt_handle
                            ut_values TYPE tt_values.
  DATA:
    ls_hanle   TYPE addr1_dia,
    ls_values  TYPE addr1_data,
    ls_addrref TYPE addr_ref.

  READ TABLE ut_handle INTO ls_hanle INDEX 1.
  READ TABLE ut_values INTO ls_values INDEX 1.

*  CALL FUNCTION 'ADDR_MEMORY_CLEAR_COMMIT_WORK'.

  CALL FUNCTION 'ADDR_MEMORY_CLEAR'
    EXPORTING
      force              = 'X'
    EXCEPTIONS
      unsaved_data_exist = 1
      internal_error     = 2
      OTHERS             = 3.
  IF sy-subrc <> 0.
*   Implement suitable error handling here
  ENDIF.


  CALL FUNCTION 'ADDR_INSERT'
    EXPORTING
      address_data    = ls_values
      address_group   = ls_hanle-addr_group
      address_handle  = ls_hanle-handle
    EXCEPTIONS
      address_exists  = 1
      parameter_error = 2
      internal_error  = 3
      OTHERS          = 4.

  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid
          TYPE sy-msgty
        NUMBER sy-msgno
          WITH sy-msgv1
               sy-msgv2
               sy-msgv3
               sy-msgv4.

    CASE sy-subrc.
      WHEN 1.
        RAISE address_exists.
      WHEN 2.
        RAISE parameter_error.
      WHEN 3 OR 4.
        RAISE internal_error.
    ENDCASE.
  ELSE.
    ls_addrref-appl_table = 'ADRC'.
    ls_addrref-appl_field = 'ADDRNUMBER'.
    ls_addrref-appl_key(3) = sy-mandt.
    ls_addrref-addr_group = 'ZA01'.

    CALL FUNCTION 'ADDR_NUMBER_GET'
      EXPORTING
        address_handle           = ls_hanle-handle
        address_reference        = ls_addrref
      IMPORTING
        address_number           = gv_adrnr
      EXCEPTIONS
        address_handle_not_exist = 1
        internal_error           = 2
        parameter_error          = 3
        OTHERS                   = 4.

    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid
            TYPE sy-msgty
          NUMBER sy-msgno
            WITH sy-msgv1
                 sy-msgv2
                 sy-msgv3
                 sy-msgv4.

      CASE sy-subrc.
        WHEN 1.
          RAISE address_exists.
        WHEN 2.
          RAISE parameter_error.
        WHEN 3 OR 4.
          RAISE internal_error.
      ENDCASE.
    ELSE.
      CALL FUNCTION 'ADDR_SINGLE_SAVE'
        EXPORTING
          address_number         = gv_adrnr
        EXCEPTIONS
          address_not_exist      = 1
          person_not_exist       = 2
          address_number_missing = 3
          reference_missing      = 4
          internal_error         = 5
          database_error         = 6
          parameter_error        = 7
          OTHERS                 = 8.

      IF sy-subrc <> 0.
        MESSAGE ID sy-msgid
              TYPE sy-msgty
            NUMBER sy-msgno
              WITH sy-msgv1
                   sy-msgv2
                   sy-msgv3
                   sy-msgv4.

        CASE sy-subrc.
          WHEN 1.
            RAISE address_not_exist.
          WHEN 2.
            RAISE person_not_exist.
          WHEN 3.
            RAISE address_number_missing.
          WHEN 4.
            RAISE reference_missing.
          WHEN 5 OR 8.
            RAISE internal_error.
          WHEN 6.
            RAISE database_error.
          WHEN 7.
            RAISE parameter_error.
        ENDCASE.
      ELSE.
        MESSAGE |{ gv_adrnr } create successed| TYPE 'S'.
      ENDIF.
    ENDIF.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_ADRC_UPDATE
*&---------------------------------------------------------------------*
*& Update address records
*&---------------------------------------------------------------------*
*&      --> LT_VALUES
*&---------------------------------------------------------------------*
FORM frm_adrc_update  USING ut_handle TYPE tt_handle
                            ut_values TYPE tt_values.
  DATA:
    ls_hanle   TYPE addr1_dia,
    ls_values  TYPE addr1_data,
    ls_addrref TYPE addr_ref.

  READ TABLE ut_handle INTO ls_hanle INDEX 1.
  READ TABLE ut_values INTO ls_values INDEX 1.

  CALL FUNCTION 'ADDR_UPDATE'
    EXPORTING
      address_data    = ls_values
      address_number  = gv_adrnr
      address_handle  = ls_hanle-handle
    EXCEPTIONS
      address_exists  = 1
      parameter_error = 2
      internal_error  = 3
      OTHERS          = 4.

  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid
          TYPE sy-msgty
        NUMBER sy-msgno
          WITH sy-msgv1
               sy-msgv2
               sy-msgv3
               sy-msgv4.

    CASE sy-subrc.
      WHEN 1.
        RAISE address_exists.
      WHEN 2.
        RAISE parameter_error.
      WHEN 3 OR 4.
        RAISE internal_error.
    ENDCASE.
  ELSE.
    CALL FUNCTION 'ADDR_SINGLE_SAVE'
      EXPORTING
        address_number         = gv_adrnr
      EXCEPTIONS
        address_not_exist      = 1
        person_not_exist       = 2
        address_number_missing = 3
        reference_missing      = 4
        internal_error         = 5
        database_error         = 6
        parameter_error        = 7
        OTHERS                 = 8.

    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid
            TYPE sy-msgty
          NUMBER sy-msgno
            WITH sy-msgv1
                 sy-msgv2
                 sy-msgv3
                 sy-msgv4.

      CASE sy-subrc.
        WHEN 1.
          RAISE address_not_exist.
        WHEN 2.
          RAISE person_not_exist.
        WHEN 3.
          RAISE address_number_missing.
        WHEN 4.
          RAISE reference_missing.
        WHEN 5 OR 8.
          RAISE internal_error.
        WHEN 6.
          RAISE database_error.
        WHEN 7.
          RAISE parameter_error.
      ENDCASE.
    ELSE.
      MESSAGE |{ gv_adrnr } update successed| TYPE 'S'.
    ENDIF.
  ENDIF.
ENDFORM.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1262022.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python操作Mysql学习

文章目录 版权声明准备&#xff1a;MYSQL数据库数据库简介数据库分类数据库管理系统SQL语句关系型数据库中核心元素MySQL环境搭建Mysql数据类型数据完整性和约束MYSql基本操作登录和退出数据库命令数据库基本操作命令数据表基本操作命令数据表结构修改命令表数据操作命令Mysql查…

Programming Abstractions in C阅读笔记:p197-p201

《Programming Abstractions in C》学习第64天&#xff0c;p196-p201总结。 一、技术总结 很难&#xff0c;唯有继续往下看才能让其变容易。 二、英语总结 1.psychologically是什么意思&#xff1f; 答&#xff1a; (1))psychology > psychological > psychologica…

filebeat日志收集工具

elk:filebeat日志收集工具和logstash相同 filebeat是一个轻量级的日志收集工具&#xff0c;所使用的系统资源比logstash部署和启动时使用的资源要小得多 filebeat可以运行在非Java环境&#xff0c;它可以代理logstash在非Java环境上收集日志 filebeat无法实现数据的过滤&…

Spring Security 6.x 系列(6)—— 显式设置和修改登录态信息

一、前言 此篇是对上篇 Spring Security 6.x 系列&#xff08;5&#xff09;—— Servlet 认证体系结构介绍 中4.9章节显式调用SecurityContextRepository#saveContext进行详解分析。 二、设置和修改登录态 2.1 登录态存储形式 使用Spring Security框架&#xff0c;认证成功…

Django回顾【一】

一、Web应用程序 Web应用程序是一种可以通过Web访问的应用程序&#xff0c;程序的最大好处是用户很容易访问应用程序&#xff0c;用户只需要有浏览器即可&#xff0c;不需要再安装其他软件。应用程序有两种模式C/S、B/S。 C/S&#xff1a;客户端<----->服务端 例如My…

第二十章,多线程

创建线程 有两种方式&#xff0c;分别为继承Java.lang.Thread类与实现Java.lang.Runnable接口 继承Thread类 Thread常用的两个构造方法语法 public Thread&#xff08;&#xff09;&#xff1b; public Thread&#xff08;String threadName&#xff09;&#xff1b; 继承…

揭秘Java三宝:final,static,volatile,面试中不可不知的关键字秘籍!

大家好&#xff0c;我是小米&#xff0c;一名热爱技术分享的程序员。最近在和小伙伴们聊天时&#xff0c;发现有不少小伙伴对于Java中的一些关键字&#xff0c;比如final&#xff0c;static&#xff0c;volatile等&#xff0c;还是感到有些懵懂。为了帮助大家更好地理解这些概念…

企业如何选择安全又快速的大文件传输平台

在现代信息化社会&#xff0c;数据已经成为各个行业的重要资源&#xff0c;而数据的传输和交换则是数据价值的体现。在很多场合&#xff0c;企业需要传输或接收大文件&#xff0c;例如设计图纸、视频素材、软件开发包、数据库备份等。这些文件的大小通常在几百兆字节到几十个字…

HashMap的实现原理

1.HashMap实现原理 HashMap的数据结构&#xff1a; *底层使用hash表数据结构&#xff0c;即数组链表红黑树 当我们往HashMap中put元素时&#xff0c;利用key的hashCode重新hash计算出当前对象的元素在数组中的下标 存储时&#xff0c;如果出现hash值相同的key&#xff0c;此时…

HarmonyOS-Service服务开发(一)

文章目录 创建新项目启动Serviceets获取service的bundleName DataAbility开发指导开发Data步骤创建Data 创建新项目 ServiceAbility开发指导 在config.json中也有配置出现 启动Service ets获取service的bundleName 项目的bundleName service的bundleName 这里serviceAbil…

模板上新|2023年10月DataEase模板市场上新动态

DataEase开源数据可视化分析平台于2022年6月正式发布模板市场&#xff08;https://dataease.io/templates/&#xff09;。模板市场旨在为DataEase用户提供专业、美观、拿来即用的仪表板模板&#xff0c;方便用户根据自身的业务需求和使用场景选择对应的仪表板模板&#xff0c;并…

easyExcel自定义导出,指定列,设置请求头背景色,加入合计行,设置合计行字体,背景色等等

效果图 1.引入easyExcel pom <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.1</version></dependency> 2.工具类-自定义样式handler-CustomCellWriteHandler import java.util…

skywalking告警UI界面有告警信息,webhook接口没有回调,400错误

400错误就是回调接口返回数据的属性对应不上 PostMapping(“/webhook”) public void webhook(RequestBody List alarmMessageList) 自定义的实体类AlarmMessage有问题 只能去官网找了 告警实体类官网 Getter EqualsAndHashCode RequiredArgsConstructor NoArgsConstructor(fo…

数据库基础入门 — 关联查询

我是南城余&#xff01;阿里云开发者平台专家博士证书获得者&#xff01; 欢迎关注我的博客&#xff01;一同成长&#xff01; 一名从事运维开发的worker&#xff0c;记录分享学习。 专注于AI&#xff0c;运维开发&#xff0c;windows Linux 系统领域的分享&#xff01; 本…

GAN:DCGAN-深度卷积生成对抗网络

论文&#xff1a;https://arxiv.org/pdf/1511.06434.pdf 发表&#xff1a;ICLR 2016 一、架构创新 1&#xff1a;全卷积网络&#xff1a;用逐步卷积代替确定性的空间池化函数&#xff08;如maxpooling&#xff09;&#xff0c;使网络学习自己的空间下采样。使用这种方法&#…

京东大数据(京东运营数据采集):2023年10月京东牛奶乳品行业品牌销售排行榜

鲸参谋监测的京东平台10月份牛奶乳品市场销售数据已出炉&#xff01; 10月份&#xff0c;牛奶乳品整体销售上涨。鲸参谋数据显示&#xff0c;今年10月&#xff0c;京东平台上牛奶乳品的销量将近1700万&#xff0c;同比增长1%&#xff1b;销售额将近17亿&#xff0c;同比增长约5…

双通道 12V 直流电机驱动芯片GC8548,可替代LV8548/LV8549/ONSEMI,内置 LDO,不需要逻辑电源,输入 兼容 3.3V 与 5V

GC8548 是一款双通道 12V 直流电机驱动芯 片&#xff0c;为摄像机、消费类产品、玩具和其他低压或 者电池供电的运动控制类应用提供了集成的电机 驱动解决方案。芯片一般用来驱动两个直流电机 或者驱动一个步进电机。 它可以工作在 3.8~12V 的电源电压上&#xff0c; 每通道能提…

如何通过内网穿透实现公网远程ssh连接kali系统

文章目录 1. 启动kali ssh 服务2. kali 安装cpolar 内网穿透3. 配置kali ssh公网地址4. 远程连接5. 固定连接SSH公网地址6. SSH固定地址连接测试 简单几步通过[cpolar 内网穿透](cpolar官网-安全的内网穿透工具 | 无需公网ip | 远程访问 | 搭建网站)软件实现ssh远程连接kali 1…

中小型公司如何搭建运维平台,rancher、kubersphere、rainbond

很多开发人员应该是了解过运维发布相关的平台或实际操作过应用发布&#xff0c;但又通常不是十分熟悉。在一个初创公司&#xff0c;或者没有成熟的运维发布平台的公司&#xff0c;如果让你来搭建一套发布平台&#xff0c;你应该如何去抉择呢&#xff1f; 这里我简单介绍几种。…

“大型”基础模型中幻觉的调查

Abstract 基础模型 (FM) 中的幻觉是指生成偏离事实或包含捏造信息的内容。这篇调查论文广泛概述了近期旨在识别、阐明和解决幻觉问题的努力&#xff0c;特别关注“大型”基础模型&#xff08;LFM&#xff09;。该论文对LFM特有的各种类型的幻觉现象进行了分类&#xff0c;并建…