11
votes

Data_Buffer_Exeeded Error lors de l'appel RFC_Read_Table?

Mon programme Java / Groovy reçoit des noms de table et des champs de table de l'entrée de l'utilisateur, il interroge les tables de SAP et renvoie son contenu.

L'entrée de l'utilisateur peut concerner les tables CDPOS et CDHDR . Après avoir lu les documentations SAP et googling, j'ai constaté que ce sont des tables stockant des journaux de document de modification. Mais je n'ai trouvé aucune fonction d'appel à distance pouvant être utilisée dans Java pour effectuer ce type de requêtes.

Puis j'ai utilisé le module de fonction RFC déprécée rfc_read_table et essayé de construire des requêtes personnalisées uniquement en fonction de ce RFC. Cependant, j'ai trouvé si le nombre de champs désirés que j'ai passé à ce RFC est supérieur à 2, j'ai toujours obtenu l'erreur data_buffer_exeded 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 ajouter aucune FM aux systèmes existants, je ne peux donc écrire que du code pour accomplir cette exigence en Java.

Est-ce que je fais quelque chose de mal? Pourriez-vous me donner des indices sur ce problème?


0 commentaires

3 Réponses :


17
votes

data_buffer_exeded 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 Sur la version SAP - 512 caractères pour les systèmes actuels. Il n'a rien à voir avec le nombre de lignes , mais la taille d'un seul jeu de données.

La question est la suivante: quels sont les contenus du paramètre champs ? Si c'est vide, cela signifie "lire tous les champs". CDHDR est de 192 caractères de largeur. Je suppose donc que le problème est CDPOS de 774 caractères. Le problème principal serait les champs value_old et valse_new , tous deux 245 caractères.

Même si vous n'obtenez pas l'accès au développeur, vous devriez proditer quelqu'un pour obtenir un accès de dictionnaire en lecture seule pour pouvoir examiner les structures en détail.

Plug Shameless: RCER contient une classe wrapper pour rfc_read_table qui prend soin de soints de manutention sur le terrain et garantit 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 facilement apporter votre base de données à une halte de meulage en effectuant des opérations de lecture excessives sur ces tables.

PS: rfc_read_table n'est pas publié pour une utilisation du client selon SAP Remarque 382318 , et la note 758278 Recommande de créer votre propre module de fonction et fournit un modèle avec une logique améliorée.


4 commentaires

Merci beaucoup! Votre explication est très claire. Je vais creuser dans la crise et vérifier la classe wrapper. Je me demande s'il existe des modules de fonction à distance ou de BAPIS afin que nous puissions lire les informations de changeocument, car la transaction "RSSCD100" fait.


Je ne sais aucun, désolé. C'est plutôt rare d'accéder aux documents de changement - de quoi avez-vous besoin?


Bonjour Vwegerert, j'ai vérifié le projet RCER. Avez-vous une version de succursale indépendante des applications Eclipse RCP?


Non, mais la tableReader ne dépend pas du truc de RCP.



0
votes

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.


3 commentaires

... C'est exactement ce que j'ai répondu en novembre dernier, je suis parti différemment?


J'ai tenté de clarifier votre explication avec un exemple en utilisant le paramètre "champs" et un exemple de java ... plutôt que simplement une référence à une "classe d'emballage". Vous n'avez pas mentionné OSS Note 382318, qui indique que ce module de fonction n'est pas publié aux clients. Ceci est un module de fonction non pris en charge par SAP et je souhaitais que la communauté soit au courant de cela.


J'ai fusionné le lien à la note 382318 dans la réponse principale. Pour le reste, je ne vois pas quelle valeur il ajoute (une ligne de code Java peut-être, mais sans le reste du code, ce n'est pas vraiment utile et de toute façon ce n'est pas la question).



1
votes

Utilisez bbp_rfc_read_table à la place


0 commentaires