Question

Mon programme java / groovy reçoit les noms de table et les champs de table à partir de l'entrée utilisateur, il interroge les tables dans SAP et retourne son contenu.

L'entrée utilisateur peut concerner les tables CDPOS et CDHDR. Après avoir lu les SAP et documentations googler, je trouve ces tables sont le stockage des journaux de documents de changement. Mais je ne l'ai pas trouvé de fonctions d'appel à distance qui peuvent être utilisés en Java pour effectuer ce type de requêtes.

J'ai ensuite utilisé le module de fonction RFC désapprouvée RFC_READ_TABLE et a essayé de construire que les requêtes personnalisées en fonction de cette RFC. Cependant, j'ai trouvé si le nombre de champs désirés je suis passé à cette RFC sont plus de 2, j'ai toujours eu l'erreur de DATA_BUFFER_EXCEEDED même si je limite les lignes max.

Je ne suis pas autorisé à être un développeur ABAP dans le système SAP et ne peut pas ajouter de FM aux systèmes existants, donc je ne peux que écrire du code pour accomplir cette exigence en JAVA.

Ai-je fait quelque chose de mal? Pourriez-vous me donner quelques conseils sur cette question?

Était-ce utile?

La solution

DATA_BUFFER_EXCEEDED ne se produit que si la largeur totale des champs que vous souhaitez lire dépasse la largeur du paramètre DATA, qui peut varier en fonction de la version SAP - 512 caractères pour les systèmes actuels. Cela n'a rien à voir avec le nombre de lignes , mais la taille d'un jeu de données.

La question est: Quel est le contenu du paramètre FIELDS? Si elle est vide, cela signifie « lire tous les champs. » CDHDR est de 192 caractères de largeur, donc je suppose que le problème est CDPOS qui est 774 caractères large. La question principale serait les champs VALUE_OLD et VALUE_NEW, les deux 245 caractères.

Même si vous ne recevez pas un accès développeur, vous devez pousser quelqu'un pour obtenir accès en lecture seule dictionnaire pour pouvoir examiner les structures en détail.

Shameless plug: contient une URCE-Ab classe wrapper pour RFC_READ_TABLE qui prend en charge la gestion sur le terrain et assure que la largeur totale des champs sélectionnés est inférieure à la limite imposée par le module de fonction.

Il faut aussi savoir que ces tables peuvent être énormes dans des environnements de production - penser des milliards d'entrées. Vous pouvez apporter facilement votre base de données à un arrêt de broyage en effectuant des opérations de lecture excessive sur ces tables.

PS: RFC_READ_TABLE n'est pas libéré pour une utilisation à la clientèle selon la note SAP 382318 , et la note 758278 recommande de créer votre propre fonction module et fournit un modèle avec une logique améliorée.

Autres conseils

Il y a un moyen de contourner l'erreur de DATA_BUFFER_EXCEED. Bien que cette fonction ne soit pas libéré pour une utilisation à la clientèle conformément à la note SAP OSS 382318, vous pouvez contourner ce problème avec des changements à la façon dont vous passer des paramètres à cette fonction. Ce ne est pas un seul champ qui est la cause de votre erreur, mais si la ligne de données dépasse 512 octets cette erreur sera soulevée. CDPOS aura ce problème pour vous!

Le travail autour si vous savez comment appeler la fonction à l'aide Jco et passer des paramètres de table est de préciser les champs précis que vous souhaitez renvoyer. Vous pouvez alors garder vos résultats retournés sous la limite de 512 octets.

En utilisant votre exemple de CDPOS de table, spécifiez quelque chose comme ça et vous devriez être bon d'aller ... (attention, CDPOS peut obtenir énorme! Vous devez spécifier et passer une clause where!)

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

En Java, il peut être exprimé sous la forme ..

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

En limitant les champs que vous vous retournerez pouvez éviter cette erreur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top