2010-11-12 67 views
8

L'exigence dans mon programme java/groovy est comme suit: Les utilisateurs sont autorisés à entrer des noms de table et des champs de table en tant que paramètres d'entrée de requête SÈVE. A partir de l'entrée utilisateur, j'obtiens le nom de la table [CDPOS] et [CDHDR]. Après avoir lu les documentations SAP et googling, j'ai trouvé que ce sont des tableaux qui stockent les journaux de changements de documents. Mais je n'ai trouvé aucune fonction d'appel à distance qui puisse être utilisée dans Java pour effectuer ce type de requêtes. Ensuite, j'ai utilisé la RFC obsolète, "RFC_READ_TABLE" et essayé de construire des requêtes personnalisées uniquement en fonction de cette RFC. Cependant, j'ai trouvé que si le nombre de champs désirés que j'ai passé à cette RFC est supérieur à 2, j'ai toujours l'erreur DATA_BUFFER_EXCEED même si je limite les lignes max.Pourquoi j'ai obtenu DATA_BUFFER_EXCEED lors de l'appel RFC_READ_TABLE à CDPOS dans java

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

Est-ce que je fais quelque chose de mal? Pourriez-vous me donner quelques indices à ce sujet?

Merci beaucoup d'avance!

Répondre

8

DATA_BUFFER_EXCEEDED se produit uniquement si la largeur totale des champs que vous voulez 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. Il n'a rien à voir avec le nombre de lignes, mais la taille d'un seul ensemble de données. La question est donc: quels sont les contenus du paramètre FIELDS? Si c'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 de 774 caractères de large. Le problème principal serait les champs VALUE_OLD et VALUE_NEW, les deux 245 caractères. Même si vous n'avez pas accès au développeur, vous devriez encourager quelqu'un à obtenir un accès au dictionnaire en lecture seule pour pouvoir examiner les structures en détail.

Bouchon sans ébranchage: RCER contient une classe wrapper pour RFC_READ_TABLE qui prend en charge la gestion des champs et garantit que la largeur totale des champs sélectionnés est inférieure à la limite imposée par le module fonction.

Sachez également que ces tables peuvent être ÉNORMES dans les environnements de production - pensez à des milliards d'entrées. Vous pouvez facilement interrompre votre base de données en effectuant des opérations de lecture excessives sur ces tables.

+0

Merci beaucoup! Votre explication est très claire. Je vais creuser dans le RCER et vérifier la classe de wrapper. Je me demande s'il existe des modules de fonction distants ou BAPIS afin que nous puissions lire les informations du document modifié, comme le fait la transaction "rsscd100". –

+0

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

+0

Salut vwegert, j'ai vérifié le projet RCER. Avez-vous une version de branche indépendante des applications Eclipse RCP? –

0

Il existe un moyen de contourner l'erreur DATA_BUFFER_EXCEED. Bien que cette fonction ne soit pas disponible pour un usage client selon la note SAP OSS 382318, vous pouvez contourner ce problème en modifiant votre façon de transmettre les paramètres à cette fonction. Ce n'est pas un seul champ qui provoque votre erreur, mais si la ligne de données dépasse 512 octets, cette erreur sera soulevée. CDPOS aura ce problème à coup sûr!

Si vous savez comment appeler la fonction à l'aide des paramètres JCO et passer la table, vous devez indiquer les champs exacts que vous voulez renvoyer. Vous pouvez ensuite conserver vos résultats renvoyé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é en ..

listParams.setValue (ce.getpObjectclas(), "OBJECTCLAS"); En limitant les champs que vous renvoyez, vous pouvez éviter cette erreur.

+0

... c'est exactement ce que j'ai répondu en novembre l'année dernière, juste formulé différemment? – vwegert

+2

J'ai tenté de clarifier votre explication avec un exemple en utilisant le paramètre "FIELDS" et un exemple Java ... Plutôt que de simplement faire référence à une "classe wrapper". Vous n'avez pas mentionné la note OSS 382318, qui stipule que ce module de fonction n'est pas distribué aux clients. C'est un module fonction non pris en charge par SAP et je voulais en informer la communauté. – SteveB