Die Anforderung in meinem Java / Groovy-Programm lautet folgendermaßen: Benutzer dürfen Tabellennamen und Tabellenfelder als Abfrage-Eingabeparameter eingeben und erwarten, dass sie das Abfrageergebnis von SAP erhalten. Aus der Benutzereingabe erhalte ich den Tabellennamen [CDPOS] und [CDHDR]. Nach dem Lesen der SAP-Dokumentationen und des Googelns habe ich festgestellt, dass es sich um Tabellen handelt, die Änderungsbelegprotokolle speichern. Aber ich habe keine Fernaufruffunktionen gefunden, die in Java verwendet werden können, um diese Art von Abfragen durchzuführen. Dann habe ich den veralteten RFC "RFC_READ_TABLE" verwendet und versucht, angepasste Abfragen nur in Abhängigkeit von diesem RFC aufzubauen. Ich fand jedoch, wenn die Anzahl der gewünschten Felder, die ich an diesen RFC übergab, mehr als 2 sind, bekam ich immer den Fehler DATA_BUFFER_EXCEED, selbst wenn ich die maximalen Zeilen beschränkte.
Ich bin nicht berechtigt, ein ABAP-Entwickler im SAP-System zu sein und kann keine FM zu bestehenden Systemen hinzufügen, also kann ich nur Code schreiben, um diese Anforderung in JAVA zu erfüllen.
Mache ich etwas falsch? Könnten Sie mir ein paar Hinweise zu diesem Thema geben?
Vielen Dank im Voraus!
DATA_BUFFER_EXCEEDED tritt nur dann auf, wenn die Gesamtbreite der Felder, die Sie lesen möchten, die Breite des DATA-Parameters überschreitet, die je nach SAP-Release variieren kann - 512 Zeichen für aktuelle Systeme. Es hat nichts mit der Anzahl der Zeilen zu tun, sondern mit der Größe eines einzelnen Datensatzes. Die Frage ist also: Was ist der Inhalt des Parameters FIELDS? Wenn es leer ist, bedeutet dies "lese alle Felder". CDHDR ist 192 Zeichen breit, also nehme ich an, dass das Problem CDPOS ist, das 774 Zeichen breit ist. Das Hauptproblem wären die Felder VALUE_OLD und VALUE_NEW, beide 245 Zeichen. Selbst wenn Sie keinen Entwicklerzugriff erhalten, sollten Sie jemanden dazu bringen, Lesezugriff auf das Wörterbuch zu erhalten, um die Strukturen im Detail untersuchen zu können.
Shameless Plug: RCER enthält eine Wrapper-Klasse für RFC_READ_TABLE, die sich um die Feldbehandlung kümmert und dafür sorgt, dass die Gesamtbreite der ausgewählten Felder eingehalten wird liegt unter der vom Funktionsbaustein vorgegebenen Grenze.
Seien Sie sich auch bewusst, dass diese Tabellen in Produktionsumgebungen RIESIG sein können - denken Sie an Milliarden von Einträgen. Sie können Ihre Datenbank leicht zum Erliegen bringen, indem Sie übermäßige Leseoperationen an diesen Tabellen ausführen.
Es gibt einen Weg um den Fehler DATA_BUFFER_EXCEED. Obwohl diese Funktion nicht für die Verwendung durch den Kunden gemäß SAP-OSS-Hinweis 382318 freigegeben ist, können Sie dieses Problem mit Änderungen an der Übergabe von Parametern an diese Funktion umgehen. Es ist nicht ein einzelnes Feld, das Ihren Fehler verursacht, aber wenn die Datenzeile 512 Bytes überschreitet, wird dieser Fehler ausgelöst. CDPOS wird dieses Problem sicher haben!
Wenn Sie wissen, wie Sie die Funktion mithilfe von Jco- und pass table-Parametern aufrufen, müssen Sie genau angeben, welche Felder zurückgegeben werden sollen. Sie können dann Ihre zurückgegebenen Ergebnisse unter der 512-Byte-Grenze halten.
Verwenden Sie Ihr Beispiel für Tabelle CDPOS, geben Sie etwas wie diese und Sie sollten gut gehen ... (seien Sie vorsichtig, CDPOS kann massiv werden! Sie sollten angeben und übergeben eine Where-Klausel!)
FIELDS = 'OBJECTCLAS' .... FIELDS = 'OBJECTID'
In Java kann es ausgedrückt werden als ..
listParams.setValue (this.getpObjectclas (), "OBJECTCLAS");
Durch die Begrenzung der Felder, die Sie zurückgeben, können Sie diesen Fehler vermeiden.