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系统截图,如有侵权联系本人进行删除,感谢,如有疑问请在下方留言共同学习!