Почему я получил DATA_BUFFER_EXCEED при вызове RFC_READ_TABLE для CDPOS в Java - PullRequest
9 голосов
/ 12 ноября 2010

Требование в моей java / groovy-программе следующее: пользователям разрешено вводить имена таблиц и поля таблиц в качестве входных параметров запроса и ожидать получения некоторого результата запроса из SAP. Из пользовательского ввода я получаю имя таблицы [CDPOS] и [CDHDR]. После прочтения документации SAP и поиска в Google я обнаружил, что это таблицы, в которых хранятся журналы изменений. Но я не нашел никаких функций удаленного вызова, которые можно было бы использовать в Java для выполнения такого рода запросов. Затем я использовал устаревший RFC, «RFC_READ_TABLE», и пытался создавать настраиваемые запросы только в зависимости от этого RFC. Тем не менее, я обнаружил, что если количество требуемых полей, которые я передал этому RFC, больше 2, я всегда получаю ошибку DATA_BUFFER_EXCEED, даже если я ограничиваю максимальное количество строк.

Я не уполномочен быть разработчиком ABAP в системе sap и не могу добавлять какие-либо FM в существующие системы, поэтому я могу писать только код для выполнения этого требования в JAVA.

Я что-то не так делаю? Не могли бы вы дать мне несколько советов по этому вопросу?

Большое спасибо заранее!

Ответы [ 2 ]

11 голосов
/ 12 ноября 2010

DATA_BUFFER_EXCEEDED происходит только в том случае, если общая ширина полей, которые вы хотите прочитать, превышает width параметра DATA, который может варьироваться в зависимости от версии SAP - 512 символов для текущих систем. Он не имеет ничего общего с числом строк , но имеет размер одного набора данных. Таким образом, вопрос заключается в следующем: каково содержание параметра FIELDS? Если он пуст, это означает «прочитать все поля». Ширина CDHDR составляет 192 символа, поэтому я предполагаю, что проблема в CDPOS, ширина которого составляет 774 символа. Основной проблемой будут поля VALUE_OLD и VALUE_NEW, оба по 245 символов. Даже если у вас нет доступа для разработчиков, вы должны заставить кого-то получить доступ к словарю только для чтения, чтобы иметь возможность детально изучить структуры.

Бесстыдный плагин: RCER содержит класс-оболочку для RFC_READ_TABLE, который заботится об обработке полей и гарантирует, что общая ширина выбранных полей ниже предела, наложенного функциональным модулем.

Также помните, что эти таблицы могут быть ОГРОМНЫМИ в производственных средах - подумайте о миллиардах записей. Вы можете легко привести свою базу данных в тупик, выполнив чрезмерные операции чтения этих таблиц.

0 голосов
/ 06 июня 2013

Существует способ обойти ошибку DATA_BUFFER_EXCEED.Хотя эта функция не доступна для использования клиентом согласно примечанию SAP OSS 382318, вы можете обойти эту проблему, изменив способ передачи параметров в эту функцию.Это не единственное поле, которое вызывает вашу ошибку, но если строка данных превышает 512 байт, эта ошибка будет вызвана.CDPOS наверняка столкнется с этой проблемой!

Чтобы обойти функцию, если вы знаете, как вызывать функцию с помощью Jco и передавать параметры таблицы, нужно указать точные поля, которые вы хотите вернуть.Затем вы можете сохранить свои возвращенные результаты под пределом в 512 байт.

Используя ваш пример таблицы CDPOS, укажите что-то вроде этого, и вы должны быть в порядке ... (будьте осторожны, CDPOS может стать массовым!следует указать и передать предложение where!)

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

В Java это можно выразить как ..

listParams.setValue (this.getpObjectclas (), "OBJECTCLAS");

Ограничивая возвращаемые поля, вы можете избежать этой ошибки.

...