RFC_READ_TABLEを呼び出すときにdata_buffer_exexエラー?
質問
私のJava/Groovyプログラムは、ユーザー入力からテーブル名とテーブルフィールドを受け取り、SAPのテーブルを照会し、その内容を返します。
ユーザーの入力は、テーブルに関係する場合があります CDPOS
と CDHDR
. 。 SAPドキュメンテーションとグーグルを読んだ後、これらはドキュメントログの変更を保存するテーブルであることがわかりました。しかし、この種のクエリを実行するためにJavaで使用できるリモートコール関数は見つかりませんでした。
次に、非推奨RFC関数モジュールを使用しました RFC_READ_TABLE
このRFCに応じてのみカスタマイズされたクエリを構築しようとしました。しかし、私がこのRFCに渡した目的のフィールドの数が2以上である場合、私は常に持っています DATA_BUFFER_EXCEEDED
最大行を制限している場合でもエラー。
私はSAPシステムのABAP開発者であることを許可されておらず、既存のシステムにFMを追加することはできないため、Javaでこの要件を達成するためのコードのみを記述することができます。
私は何か間違ったことをしていますか?その問題に関するいくつかのヒントを教えていただけますか?
解決
DATA_BUFFER_EXCEEDED
読みたいフィールドの総幅が 幅 の DATA
パラメーターは、SAPリリースによって異なる場合があります - 現在のシステムの512文字。それは数とは何の関係もありません 行, 、しかし、単一のデータセットのサイズ。
質問は次のとおりです。 FIELDS
パラメーター?空の場合、これは「すべてのフィールドを読む」ことを意味します。 CDHDR
幅は192文字ですので、問題は CDPOS
幅774文字です。主な問題はフィールドです VALUE_OLD
と VALUE_NEW
, 、両方とも245文字。
開発者のアクセスを取得しなくても、誰かに読み取り専用の辞書アクセスを取得して、構造を詳細に調べることができるようにする必要があります。
恥知らずなプラグ: RCER のラッパークラスが含まれています RFC_READ_TABLE
これにより、フィールドハンドリングが処理され、選択したフィールドの総幅が関数モジュールによって課される制限を下回ることが保証されます。
また、これらのテーブルは生産環境で巨大になる可能性があることに注意してください - 何十億ものエントリを考えてください。これらのテーブルで過度の読み取り操作を実行することにより、データベースを粉砕停止に簡単に持ち込むことができます。
PS: RFC_READ_TABLE
SAPノートに従って顧客の使用のためにリリースされていません 382318, 、およびメモ 758278 独自の関数モジュールを作成することをお勧めし、改善されたロジックを備えたテンプレートを提供します。
他のヒント
data_buffer_ex cehedエラーを回避する方法があります。この関数は、SAP OSS Note 382318に従って顧客の使用のためにリリースされていませんが、この関数にパラメーターを渡す方法の変更でこの問題を回避できます。エラーを引き起こしている単一のフィールドではありませんが、データの行が512バイトを超えると、このエラーが発生します。 CDPOSは確かにこの問題を抱えています!
JCOを使用して関数を呼び出してテーブルパラメーターをパスする方法を知っている場合は、回復したい正確なフィールドを指定することです。その後、512バイトの制限の下で返された結果を維持できます。
テーブルCDPOの例を使用して、このようなものを指定してください。
fields = 'objectclas' .... fields = 'objectid'
Javaでは、次のように表現できます。
listParams.setValue(this.getPobjectclas()、 "objectclas");
返品するフィールドを制限することにより、このエラーを回避できます。