|
远程调试
一般的情况下,在SAP服务器上通过事务代码SE37可以测试ABAP函数。在保证ABAP函数的正确性之后,Java客户端只需要检查输入输出参数是否正确即可。这时可以利用JCo库为了方便调试而提供的了一个很强大的功能,把所有继承自JCO.Record的类的对象格式化输出到一个指定的HTML文档中。通过这种方式,我们可以检查输入输出参数是否正确。比如如下代码输出前面得到的FLIGHT_LIST参数的内容:
JCO.Table flights = funGetList.getTableParameterList().getTable(
"FLIGHT_LIST");
flights.writeHTML("c:\\flight_list.html");
生成的HTML文件内容如下图所示:

更进一步地,通过启动ABAP的远程调试功能,可以像调试普通程序一样调试远程调用的ABAP函数。
要实现远程调试,首先需要在Java代码中,通过调用JCO.Client类或者JCO.Pool类的setAbapDebug方法激活JCo的ABAP调试功能。如下代码演示了如何激活一个连接池的ABAP调试功能:
JCO.Pool pool = JCO.getClientPoolManager().getPool(POOL_NAME);
pool.setAbapDebug(true);
如果一个连接池的ABAP调试功能被激活,那么其中的所有连接的ABAP调试功能都会被激活。使用这样一个连接来调用ABAP函数的时候,SAP系统会自动弹出一个调试器窗口(如下图所示)。当然,前提是客户端机器上已经安装了SAPGUI。

从上图可以看到,这时候调试器仅仅停留在RFC调用的入口处,而并未进入所调用的ABAP函数。
为了让调试器直接进入ABAP函数,需要在事务代码SE37中为该函数设置一个外部断点(External BreakPoint)。如下图所示:

设置好外部断点之后,还必须通过事务代码SRDEBUG激活远程调试功能。SRDEBUG启动后的界面如下图所示:

如果之前没有直接在代码上设置过外部断点的话,也可以直接在SRDEBUG中设置断点所在的Function Module。 要注意的是,在调试结束之前,不要关闭SRDEBUG的窗口,否则系统将会立即关闭远程调试功能。
此时,再执行Java代码,将会发现系统自动打开的DEBUG窗口自动停留在我们所设置的外部断点的位置,而Java进程在调试结束之前将会被挂起。

在ABAP调试器中,可以检查通过RFC协议传过来的参数,以及ABAP程序运行的结果。通过这种方式,可以更清晰地跟踪整个执行过程。
调试结束的时候,不要忘记关闭SRDEBUG的窗口和清除外部断点。
更多资源
限于篇幅,本文只能介绍关于JCo库的基本使用方法。更进一步的技术细节,可以查看JCo库的下载文件中自带的文档。
开发者还可以在如下连接的SAP的在线帮助文档中找到丰富的文档资料和示例程序:
http://help.sap.com/saphelp_nw70/helpdata/EN/6f/1bd5c6a85b11d6b28500508b5d5211/frameset.htm
此外,在SDN网站(www.sdn.sap.com)上也有许多关于JCo的讨论。 |