【业务案例】F.13——SAP系统标准的清帐程序有BUG?

肯定是没有BUG的啦,是我又当标题党了

问题来源于,用户气势汹汹地跑来质问,为什么测试运行F.13的时候也没有报错全部都能成功,但是正式运行清帐功能的时候就少了好多数据,一点规律都没有!SAP系统有BUG!!

嗯,那就让我们来看看"BUG"~

目录

业务名称:

背景说明:

解决方案:

第一个方案:

第二个方案:


业务名称:

会计凭证增强

背景说明:

用户反馈在使用F.13进行自动清帐的时候,总有一部分凭证不能清掉。并且测试运行的时候也不会报错,但是一旦正式运行就会遗漏很多凭证,不能一次性全部清完。

和业务顾问进行问题复刻的时候发现系统在正式运行的时候有报错(如下截图),用户看不懂就直接忽略了,认为是被系统遗漏了。但确实这个报错需要分析原因,是由于两张凭证上面带的贸易伙伴不同导致的,而且同一张凭证下,只要有一对凭证的行项目的贸易伙伴不相同,就会导致所有行项目都清帐失败。

解决方案:

解决方案有两个:

第一个方案:

是对于已经生成的凭证,这些凭证因为账期已经关闭了,所以不能冲销重做,所以是一个临时方案,即手动打断点进行数据更改,然后跳过报错,直接清账,这种方案其实会导致同一凭证的不同行项目全部都清账生成到同一个凭证里面,但是由于业务没有要求太多,只要保证能够清账就可以了,所以可行,具体步骤如下:

1、根据报错消息编号和消息名称,找到报错的位置

这里消息名称是F5,编号是080,使用SE91进入

2、从使用位置查询源代码

3、源代码截图如下,打上断点

可以看到报错是在一个IF...ENDIF里面的,只要在调用函数ASSOCIATED_COMP_COMPARE后,系统变量SY-SUBRC=1就会报错,在DEBUG的时候可以清楚看到这里BSEG-VBUND是有值的话就会报错,所以我们在CALL FUNCTION的时候打上断点,手动修改BSEG-VBUND的值,使其为空就可以了。

这个方法就会使同一凭证编号下不同行项目的凭证都会清到同一个清账凭证下面。也可以直接将SY-SUBRC改成0,只要跳过报错就行。

第二个方案:

第二个是长久方案,就是做会计凭证增强/替代,把VBUND贸易伙伴字段替换成空值。最开始是在OBBH里面做替代,但是由于拆分凭证的原因(或者其他原因,emm原因暂时还没有找到,因为我找了其它的增强地方,也没有看到字段被覆盖),总之就是替代没有成功,所以考虑做增强。

1、逻辑如下:

2、使用BADI名称:AC_DOCUMENT,做增强实施

按照平时的增强实施步骤来做就可以了,我这里因为之前同事做了增强,所以找到名称就直接进去修改就可以了。

因为VBUND贸易伙伴是凭证行项目的字段,对于行项目,一般是在方法CHANGE_AFTER_CHECK里面做修改。CHANGE_INITIAL是初始化的方法,我一般没有使用。

3、进入方法CHANGE_AFTER_CHECK,看到方法上面的参数,IM_DOCUMENT表示进入增强前的数据,EX-DOCUMENT表示做了增强之后出去的数据,所以我们要将EX_DOCUMENT里面的VBUND的值做替代。

这里有一个注意点就是,IM_DOCUMENT参考的是ACC_DOCUMENT结构,EX_DOCUMENT参考的是ACC_DOCUMENT_SUBST结构,两个结构不同,我们点进去看一下。

可以看到上面截图种IM_DOCUMENT-ITEM里面有字段VBUND(点进去就可以看见)

4、EX_DOCUMENT的ITEM里面没有VBUND字段,所以要在结构ACCIT_SUB里面加上字段VBUND,再激活,如下

ACCIT_SUB这个结构可以直接加字段,激活也很快(如果需要替代的字段在结构里面本身就有,那就直接使用,不需要再加了)。

5、结构激活后,再返回增强点,加上代码。

要记得APPEND行到EX_DOCUMENT里面即可。

代码如下:

复制代码
*IF SY-TCODE = 'MIRO' OR  IM_DOCUMENT-HEADER-TCODE EQ 'MIRO' .
      DATA:LS_ACCIT_T TYPE ACCIT.
      DATA:LS_ACCIT   TYPE ACCIT.
      DATA:LS_ACCIT_SUB TYPE ACCIT_SUB.
      LOOP AT IM_DOCUMENT-ITEM INTO LS_ACCIT.
IF ( LS_ACCIT-BLART = 'WA' OR LS_ACCIT-BLART = 'WE' OR LS_ACCIT-BLART = 'RE' )
  AND ( LS_ACCIT-HKONT = '0014010100' OR  LS_ACCIT-HKONT = '0033101999' ).
MOVE-CORRESPONDING LS_ACCIT TO LS_ACCIT_SUB.
LS_ACCIT_SUB-VBUND = ''.
APPEND LS_ACCIT_SUB TO EX_DOCUMENT-ITEM.
CLEAR:LS_ACCIT.
ENDIF.
      ENDLOOP.
*      ENDIF.
相关推荐
眠修18 分钟前
Kuberrnetes 服务发布
linux·运维·服务器
开-悟25 分钟前
嵌入式编程-使用AI查找BUG的启发
c语言·人工智能·嵌入式硬件·bug
一入JAVA毁终身29 分钟前
Data的时区格式BUG
bug
好奇的菜鸟1 小时前
Docker 配置项详解与示例
运维·docker·容器
xcs194052 小时前
集运维 麒麟桌面版v10 sp1 2403 aarch64 离线java开发环境自动化安装
运维·自动化
BAOYUCompany2 小时前
暴雨服务器成功中标华中科技大学集成电路学院服务器采购项目
运维·服务器
超龄超能程序猿2 小时前
Bitvisse SSH Client 安装配置文档
运维·ssh·github
奈斯ing3 小时前
【Redis篇】数据库架构演进中Redis缓存的技术必然性—高并发场景下穿透、击穿、雪崩的体系化解决方案
运维·redis·缓存·数据库架构
鳄鱼皮坡3 小时前
仿muduo库One Thread One Loop式主从Reactor模型实现高并发服务器
运维·服务器
即将头秃的程序媛3 小时前
centos 7.9安装tomcat,并实现开机自启
linux·运维·centos