今天遇到一个问题,说是一个RFC接口,在DEV和QAS怎么测试都是好用的,在PRD通过SE37测试好用,但是通过外部系统调用就报错。
看了一下程序,接口功能很简单,寥寥几行代码,通过BDC的方式,调用KO01创建内部订单。
首先使用ZILOG看调用日志,看返回时候的参数,如下图:
BDC返回的错误很常见:没有屏幕 XXXXXX NNNN 的批输入数据。就是说有屏幕在录屏的时候没有出现,但是在实际BDC执行中出现了,程序没有考虑到这个屏幕会出现,BDCDATA流程中没有这个SCREEN,所以报错了。
看样子是似乎是某个窗口没有录上。
我对KO01不熟悉,就手工做了一下,然后跟程序中的BDC流程对比,发现并没有未记录的SCREEN,而且DEV和QAS测试也都正常,看来事情没有那么简单。于是怀疑是不是接口用户权限不够,去看了下,用户类型为C,SAP_ALL权限,看来不是权限问题。
后来想到会不会是像MIRO那样,在第一次执行事务码的时候会弹出一个SCREEN让输入公司代码,这样:
我对KO01不熟悉,旁边又没有模块顾问可以问,但是我在前台做KO01的时候是没有弹出任何窗口的,应该也不像是这个情况,为此我还是退出GUI重新登录了一下,也还是没有出现弹出的窗口。
这下子有点陷入僵局了。
再捋一下:
一般这种弹出窗口的逻辑是首先GET PARAMETER ID 'XXX',如果获取不到数据,就弹出窗口,如果获取到了,就不再弹出了。
所以现在只有两个解释,一个是不需要弹出窗口,另一个就是在GET PARAMETER的获取到值了。
GET PARAMETER能获取到值一般有三个方法,一个是程序里面写SET PARAMETER,第二个是SCREEN的元素勾上了SET/GET而自动赋值,第三个就是在用户的主数据里面维护了这个PARAMETER ID。前两个明显不满足,所以去SU3看看有没有可能的参数。
果然有一个可疑的,先拿掉再去做KO01试试。
果然,KO01弹出窗口要求输入控制范围了:
到这儿问题就水落石出了,原因就是所有用来做SE37测试的用户,以及DEV、QAS的接口用户都维护了CAC参数,KO01的时候不需要弹出窗口,而PRD的接口用户没有维护,BDC需要有针对弹出窗口的逻辑,但是程序中没有,所以就报错了。开发人员对KO01不熟悉,不知道会需要控制范围,就导致了这个错误非常的隐蔽。
知道了错误的原因解决起来就很好办了,要么给PRD接口用户维护上这个参数,要么改一下程序,在BDC的CALL TRANSACTION之前加上一句:
欧了。