SAP MM 供应商银行主数据更新报错!message R1228!

1、前台数据

供应商A

银行主数据原始数据长成这样:

xml 复制代码
 标识     国家      银行账户    控制码     有效日期从    	有效日期到
 CN01     CN       1000001      CN        20260801        99991231

此时我们前台BP去修改

第一种:我改账户,没问题

xml 复制代码
 标识     	国家      银行账户    控制码        有效日期从     有效日期到
 CN01      CN        1000002      CN           20260801        99991231

此时正常!

第二种:我新增一行,数据和原始数据一样

xml 复制代码
 标识     国家      银行账户    控制码          有效日期从    有效日期到
 CN01      CN       1000001       CN          20260801        99991231

此时候会报错,说明细标识CN01已经存在!(因为BUT0BK主键就是这个玩意,这个就不解释了,不可能再让你建一行一模一样的)

这时候,我把再标识换了,其他保持不变

xml 复制代码
 标识     	国家      银行账户     	 控制码       有效日期从    有效日期到
 US01      CN       1000001            CN          20260801        99991231 

此时候会报错R1228,有效期间的银行明细 CN 1000001 CN不唯一!

为什么会报R1228呢,这是因为SAP标准功能就是这样的。SAP NOTE 3164505

其实SAP NOTE说的少了一个唯一KEY 控制码,因为当你这样插入的时候是没有问题的

xml 复制代码
 标识     	国家      银行账户     	   控制码        有效日期从    有效日期到
 US01      CN       1000001            **留空**      20260801        99991231 

但是我就想把控制码和之前数据一样怎么插入呢,SAP NOTE解决方案说到了你改一下有效期间就行(改完BP直接保存就行,回车其实会报错,可以忽略!)

xml 复制代码
 标识     	国家      银行账户     	   控制码         有效日期从    有效日期到
 US01      CN       1000001              CN         **20260701     20260731**

2、前台你想怎么操作都是你可以控制,但是BAPI执行时候可不是那样的

本次用到供应商主数据创建类方法:

xml 复制代码
        CALL METHOD cl_md_bp_maintain=>maintain
          EXPORTING
            i_data   = it_data
          IMPORTING
            e_return = it_return

原始数据:

xml 复制代码
 标识     国家      银行账户    控制码     有效日期从    	有效日期到
 CN01     CN       1000001      CN        20260801        99991231

假如此时是8月2日,好了你传一条数据如下

xml 复制代码
 标识     国家      银行账户    控制码     有效日期从    	有效日期到
 CN01     CN       1000001      CN        20260801        99991231

结果:

xml 复制代码
 标识     国家      银行账户    控制码     有效日期从    	有效日期到
 0001     CN       1000001      CN        20260801        20260801
 CN01     CN       1000001      CN        20260802        99991231

对于这个结果是SAP标准逻辑,因为你传入的数据和原始数据一样,此时就会触发SAP NOTE说的那段逻辑,对SAP来说他会自动把这个8月1日的失效掉,并且插入一条8月2日的有效期进来,说实话这也解释得通,毕竟按NOTE说的不让主键重复。

假如又过了一天,此时8月3日了,你上午又传入一模一样数据传一条数据如下

xml 复制代码
 标识     国家      银行账户    控制码     有效日期从    	有效日期到
 CN01     CN       1000001      CN        20260801        99991231

结果:

xml 复制代码
 标识     国家      银行账户    控制码     有效日期从    	有效日期到
 0001     CN       1000001      CN        20260801        20260801
 0002     CN       1000001      CN        20260802        20260802
 CN01     CN       1000001      CN        20260803        99991231

这个结果应该也是正常的继续拆分没毛病。

好了到了8月3日晚上,你再传一条一模一样的数据或者你重传。

xml 复制代码
 标识     国家      银行账户    控制码     有效日期从    	有效日期到
 CN01     CN       1000001      CN        20260803        99991231

结果:此时候会报错R1228,有效期间的银行明细 CN 1000001 CN不唯一!

为什么在同一天传2次会报错呢,原因在于有0001和0002 在

从而触发RI228报错。

用的那个最上面供应商创建的类,追溯的源代码发现会走这些函数:

bupa_bankdetail_change

BUP_CHECK_BANK_ACCOUNTS_CHANGE

BUP_BUT0BK_SELECT_WITH_PARTNER

4、怎么解决这个问题

xml 复制代码
1调用:BAPI_BUPA_BANKDETAIL_REMOVE删除0001 0002 (根据那几个主键值先把相同这几个自动创建的行全部删除),这里删除目的不让底下那个报错R1228
2再调用类函数:
        CALL METHOD cl_md_bp_maintain=>maintain
          EXPORTING
            i_data   = it_data
          IMPORTING
            e_return = it_return
3再调用:BAPI_BUPA_BANKDETAIL_REMOVE删除0001 0002  (因为创建完还会生成0001 0002 .所以这里再删一遍这样供应商主数据生成就很完美 )

5、其实供应商银行拿这几个函数去操作即可,我觉得那个类方法不怎么好用,而且那个类写入删除标记D还不好使垃圾一批更新也LOW,DEBUG改数据更LOW一层层,都不如下面那个删除函数好。

BAPI_BUPA_BANKDETAIL_CHANGE 更新

BAPI_BUPA_BANKDETAIL_ADD 新增

BAPI_BUPA_BANKDETAIL_REMOVE 删除

以上只是个人理解分享的笔记仅供参考,如果喜欢帮忙点个赞!以上截图均来自SAP系统截图,如有侵权联系本人进行删除,感谢,如有疑问请在下方留言共同学习!

相关推荐
牢姐与蒯1 小时前
Linux基本指令及知识点(二)
linux·运维·服务器
去伪存真20252 小时前
数字样机、态势推演与3D汇报场景下的平台选型对比
运维·服务器
范什么特西2 小时前
知识总结03
java
一笑的小酒馆2 小时前
Android智能猫砂盆视频加载慢卡顿问题分析
android
空谷有来人2 小时前
Ubuntu22.04安装jdk17,配置环境变量
java·jdk
程序员雷欧3 小时前
ThreadPoolExecutor 深度解析:从核心参数到源码实现的全面剖析
java·开发语言·jvm
谢尔登3 小时前
分享一些我常用的Skill
java·人工智能·python·actionscript
AaronJonah3 小时前
企业级线程池 traceId 闭环:上下文传递与全链路追踪实战
java·线程池·traceid跨线程传递