为什么在java中调用RFC_READ_TABLE到CDPOS时得到DATA_BUFFER_EXCEED

时间:2010-11-12 14:21:33

标签: sap jco saprfc

我的java / groovy程序中的要求是这样的:允许用户输入表名和表字段作为查询输入参数,并希望从SAP获得一些查询结果。 从用户输入,我得到表名[CDPOS]和[CDHDR]。在阅读了SAP文档和谷歌搜索后,我发现这些是存储更改文档日志的表。但是我没有找到任何可以在java中用来执行这种查询的远程调用函数。然后我使用了已弃用的RFC“RFC_READ_TABLE”,并尝试仅根据此RFC构建自定义查询。但是,我发现如果我传递给这个RFC的所需字段的数量超过2,即使我限制了最大行,我总是得到DATA_BUFFER_EXCEED错误。

我无权成为SAP系统中的ABAP开发人员,无法将FM添加到现有系统,因此我只能编写代码来完成JAVA中的此要求。

我做错了吗?你能否就这个问题给我一些提示?

非常感谢提前!

3 个答案:

答案 0 :(得分:11)

DATA_BUFFER_EXCEEDED仅在您要读取的字段的总宽度超过DATA参数的宽度时发生,该参数可能因SAP版本而异 - 当前系统为512个字符。它与的数量无关,而与单个数据集的大小无关。所以问题是:FIELDS参数的内容是什么?如果它为空,则表示“读取所有字段”。 CDHDR的宽度为192个字符,因此我假设问题是CDPOS,宽度为774个字符。主要问题是字段VALUE_OLD和VALUE_NEW,都是245个字符。即使您没有获得开发人员访问权限,也应该促使某人获得只读字典访问权限,以便能够详细检查结构。

无耻插件:RCER包含RFC_READ_TABLE的包装类,它负责字段处理并确保所选字段的总宽度低于功能模块强加的限制。

还要注意,这些表在生产环境中可能很大 - 想想数十亿条目。通过对这些表执行过多的读取操作,您可以轻松地将数据库暂停。

答案 1 :(得分:0)

有一种解决DATA_BUFFER_EXCEED错误的方法。虽然根据SAP OSS说明382318,此功能未发布供客户使用,但您可以通过更改将参数传递给此功能的方式来解决此问题。它不是导致错误的单个字段,但如果数据行超过512字节,则会引发此错误。 CDPOS肯定会有这个问题!

如果您知道如何使用Jco调用函数并传递表参数,那么解决方法是指定要返回的确切字段。然后,您可以将返回的结果保持在512字节限制之下。

使用表格CDPOS的例子,指定这样的东西,你应该好好去......(小心,CDPOS会变得很大!你应该指定并传递一个where子句!)

FIELDS ='OBJECTCLAS'.... FIELDS ='OBJECTID'

在Java中,它可以表示为..

listParams.setValue(this.getpObjectclas(),“OBJECTCLAS”);

通过限制您返回的字段,您可以避免此错误。

答案 2 :(得分:0)

改为使用BBP_RFC_READ_TABLE