肯定是没有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.