Änderungen der Schnittstelle eines RFC Bausteins

Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Rund um Java und SAP®.
5 Beiträge • Seite 1 von 1
5 Beiträge Seite 1 von 1

Änderungen der Schnittstelle eines RFC Bausteins

Beitrag von Heiko ( / / 0 / 3 ) »
Hi,

ich habe folgendes Problem. In meiner JSP basierten Web Applikation verwende ich JCo, um Daten aus einem RFC Baustein in einem R/3 System auszulesen. Die Schnittstelle einiger Übergabetabellen kann sich jedoch im Laufe der Zeit ändern. Ich möchte aber nicht ständig solche Änderungen in meinem Java Coding nachpflegen. Gibt es eine Möglichkeit dies dynamisch zu lösen?

gruss,

Heiko

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


JCo: Dynamische Schnittstellen über Metadaten

Beitrag von Tim (ForumUser / 91 / 0 / 0 ) »
Hallo Heiko,

Dein Problem lässt sich beispielsweise prinzipiell dadurch lösen, dass Du entweder vor jedem Zugriff auf den RFC Baustein dessen Metadaten liest, oder diese initial beim Start Deiner Web Applikation ausliest. Der Vorteil der ersten Variante ist, dass Du Deine Web Applikation nicht neu starten musst, wenn sich Änderungen ergeben. Der Nachteil liegt aber darin, dass Du, anstatt einem, zwei Zugriffe auf den RFC hast, was die Performance negativ beeinflusst. Die zweite Variante ist daher zu empfehlen.

Verwendest Du innerhalb Deiner Web Applikation ein Java Controller Framework wie Struts oder Java Server Faces?

mfg,

Tim

Beitrag von Heiko ( / / 0 / 3 ) »
Das Struts Framework wird als MVC Framework verwendet. Deine Antwort hilft mir aber nicht so wirklich weiter. Könntest Du vielleicht konkreter werden (z.B. in Form eines Coding Beispiels)?

JCo: Metadaten auslesen

Beitrag von Tim (ForumUser / 91 / 0 / 0 ) »
Hi,

Um ja überhaupt einen Zugriff auf einen RFC Baustein über JCo zu bekommen, musst Du die Metadaten seiner Schnittstelle kennen. Diese Metadaten liest Du direkt von dem Baustein. Du brauchst hierzu einen JCO Connection Pool, davon einen JCO.Client und natürlich den Namen des RFC Bausteins. Falls Du dies alles hast, kannst Du das Auslesen der Metadaten folgendermaßen machen:

Code: Alles auswählen.

try
{
      //Erzeugen eines IFunction Templates für einen RFC Baustein
      IFunctionTemplate ft = 
          JCO.createRepository("Your System", client).getFunctionTemplate
          ("YourRfcName");
            
      //Aus dem Template werden die Import, Export und Table Infos 
      //ausgelesen:
      JCO.MetaData importMetaData =  
                (JCO.MetaData) ft.getImportParameterList();
      JCO.MetaData exportMetaData = 
                (JCO.MetaData)  ft.getExportParameterList();
      JCO.MetaData tableMetaData = 
                (JCO.MetaData)ft.getTableParameterList();

      JCO.ParameterList jcoImportParams = new JCO.ParameterList
                (importMetaData);
      JCO.ParameterList jcoExportParams = new JCO.ParameterList
               (exportMetaData);
      JCO.ParameterList jcoTableParams = new JCO.ParameterList
               (tableMetaData);
catch(Exception e)
{
}
Den obigen Part machst Du am besten innerhalb der init() Methode Deines ActionServlets und legst das Ganze dabei im web application Context ab. Bedenke aber, dass Du Dies für jeden Baustein machen musst, dessen Schnittstelle sich ändern kann.
Um diese Metadaten auch verwenden zu können, musst Du diese in diejenige(n) Methode(n) integrieren, die den RFC aufruft (aufrufen):

Code: Alles auswählen.

try
{
        //Wichtig: JCO.Client Objekt erforderlich!!!
        JCO.Function function = new JCO.Function(rfcName, 
                        jcoImportParams, jcoExportParams, jcoTableParams);
        client.execute(function);
 
}
        catch(com.sap.mw.jco.JCO.Exception jcoException)
{
}
Nun hast Du den Baustein ausgeführt. Den generischen Zugriff auf die Schnittstelle kannst Du wie folgt machen:

Code: Alles auswählen.

JCO.Table yourTable = jcoTableParams.getTable("YOUR_TABLE");
JCO.FieldIterator it = yourTable.fields();
Arraylist listTable = new ArrayList();

int n=0

if (yourTable.getNumRows() > 0)
{
     do
     {
           HashMap row = new HashMap();
           while (it.hasMoreFields())
           {
                 JCO.Field field = it.nextField();
                 String name = field.getName();
                 row.put(name, field);
           }

           listTable.add(row);
           n++;
      }
      while (table.nextRow());
}
nun hast die gewüschten Daten generisch in einer ArrayList abgelegt. Du musst Sie nur noch innerhalb einer Struts Action im aktuellen request ablegen und kannst Sie daraufhin in einer JSP auslesen.

mfg,

Tim

Thx

Beitrag von Heiko ( / / 0 / 3 ) »
Danke, ich werde das Ganze nun mal bei mir testen... :D

Seite 1 von 1

Vergleichbare Themen

3
Antw.
2017
Views
Schnittstelle zu SAP
von KristinF » 18.06.2007 12:51 • Verfasst in ABAP® für Anfänger
2
Antw.
5180
Views
XML-RPC-Schnittstelle
von Otscho » 01.04.2008 13:11 • Verfasst in ABAP® Core
7
Antw.
6507
Views
Schnittstelle SD => FI ?
von Matthias_L. » 27.11.2005 07:03 • Verfasst in Sales and Distribution
4
Antw.
2652
Views
URL für RFC Schnittstelle
von cschmoel » 01.10.2012 14:23 • Verfasst in ABAP® für Anfänger
2
Antw.
2462
Views
API Schnittstelle fehler
von Bright4.5 » 05.10.2023 19:35 • Verfasst in ABAP® für Anfänger

Über diesen Beitrag


Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Unbeantwortete Forenbeiträge

GUIXT Tabellen in Container ansprechen
vor 4 Wochen von Denaris 1 / 26386
Speichern Popup in MM42 verhindern
vor 4 Wochen von Noodl 1 / 26864
Meine Inbox
letzen Monat von Rabea1103 1 / 42121