BDC在FICO模块是经常用到的,用于批量过账程序时使用的,但是稳定性不如使用BAPI的好,但是BDC可以有多种T-CODE进行过账,也有不同的模式,功能也不错,但是在写程序或者是出现问题的时候需要考虑下面几个问题:
1、可以在程序加入BDC的模式选择,默认为N模式,但是可以选择A模式,方便调试。当然这个也可以debug进去之后进行改值。
2、LOOP里面有call BDC的情况,在每一次call TRANSACTION 之后,可以适当延时几秒,可以防止在有些t-code过账的时候出现profit center被锁着的情况:
CALL TRANSACTION 'F-30' USING BDCDATA
MODE P_MODE
MESSAGES INTO L_BDCMSG.
WAIT UP TO p_wait SECONDS.
有时候,当你直接跑,过账失败,而你debug跑的话就成功,也可以看看是不是锁的问题,然后页可以考虑下对两次生成凭证进行延时。
3、可能会出现的A模式下过账成功,N模式过账不成功:
原因是:有些事你的BDC在这一屏没有这个字段,然后会返回一个这个字段不存在的S类型的message,然后BDC退出了,就没有完全成功过账。
同一个屏幕,不同的过账码+科目可能有不同的字段。所以录屏完写程序的时候,这个光标的问题,最好还是要有if判断或者是基本排除光标,这个基本没有用。在写BDC程序的时候,最好自己要对这个t-code的不同条件下会有不一样的屏幕显示有一定的了解,然后写程序的时候一定要注意使用if语句,去判断在这个公司代码下,这个屏幕有没有这个字段。
4、LOOP里面过账完,要记得清BDCDATA,和BDCMESSAGE(这个就是低级错误了)
5、过账完了,生产的message里面,提取凭证号:
LOOP AT L_BDCMSG.
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
msgid = L_BDCMSG-MSGID
msgnr = L_BDCMSG-MSGNR
msgv1 = L_BDCMSG-MSGV1
msgv2 = L_BDCMSG-MSGV2
msgv3 = L_BDCMSG-MSGV3
msgv4 = L_BDCMSG-MSGV4
IMPORTING
message_text_output = WA_LOG-MSG.
其中,L_BDCMSG-MSGV1就是返回的凭证号!
6、遇见BDC程序跑了,报错了,最好跑A模式去查看报错处在哪个环节了!
7、一个FB60的BDC程序,有些成功并返回了凭证号,有些成功生成了凭证号,但是没有返回message。
reason:这种问题通常是一些增强导致。
方法:在S F5 312 message前面设断点,然后跑N模式,查看没有返回凭证号的情况,是在前面那里跳出了而没有跑这个312的message。通常都是增强导致。(遇到一个是增强里面的更新表,然后commit work的时候直接跳出了,但是实际表已经更新成功了。因为modify是不需要commit work的。因为通过call transaction FB60的话,里面有个选项opt,通过这个选项可以选择执行commit work是否跳出。这也就是为什么FB60直接跑这段,即使有commit work也没有问题,但是通过call transaction会有问题。)
8、