Änderungen der Schnittstelle eines RFC Bausteins

Rund um Java und SAP®.

Änderungen der Schnittstelle eines RFC Bausteins

Postby Elisabeth1898 » Tue Dec 03, 2002 10:46 am

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
Elisabeth1898
.
.
 
Posts: 5
Joined: Tue Dec 03, 2002 10:46 am

JCo: Dynamische Schnittstellen über Metadaten

Postby Christian4831 » Tue Dec 03, 2002 12:01 pm

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
Christian4831
..
..
 
Posts: 91
Joined: Mon Dec 02, 2002 7:33 pm

Postby Elisabeth1898 » Tue Dec 03, 2002 6:39 pm

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)?
Elisabeth1898
.
.
 
Posts: 5
Joined: Tue Dec 03, 2002 10:46 am

JCo: Metadaten auslesen

Postby Christian4831 » Wed Dec 04, 2002 11:21 am

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: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. {
  2.       //Erzeugen eines IFunction Templates für einen RFC Baustein
  3.       IFunctionTemplate ft =
  4.           JCO.createRepository("Your System", client).getFunctionTemplate
  5.           ("YourRfcName");
  6.            
  7.       //Aus dem Template werden die Import, Export und Table Infos
  8.       //ausgelesen:
  9.       JCO.MetaData importMetaData =  
  10.                 (JCO.MetaData) ft.getImportParameterList();
  11.       JCO.MetaData exportMetaData =
  12.                 (JCO.MetaData)  ft.getExportParameterList();
  13.       JCO.MetaData tableMetaData =
  14.                 (JCO.MetaData)ft.getTableParameterList();
  15.  
  16.       JCO.ParameterList jcoImportParams = new JCO.ParameterList
  17.                 (importMetaData);
  18.       JCO.ParameterList jcoExportParams = new JCO.ParameterList
  19.                (exportMetaData);
  20.       JCO.ParameterList jcoTableParams = new JCO.ParameterList
  21.                (tableMetaData);
  22. catch(Exception e)
  23. {
  24. }
  25.  
GeSHi ©


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: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. {
  2.         //Wichtig: JCO.Client Objekt erforderlich!!!
  3.         JCO.Function function = new JCO.Function(rfcName,
  4.                         jcoImportParams, jcoExportParams, jcoTableParams);
  5.         client.execute(function);
  6.  
  7. }
  8.         catch(com.sap.mw.jco.JCO.Exception jcoException)
  9. {
  10. }
GeSHi ©


Nun hast Du den Baustein ausgeführt. Den generischen Zugriff auf die Schnittstelle kannst Du wie folgt machen:
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. JCO.Table yourTable = jcoTableParams.getTable("YOUR_TABLE");
  2. JCO.FieldIterator it = yourTable.fields();
  3. Arraylist listTable = new ArrayList();
  4.  
  5. int n=0
  6.  
  7. if (yourTable.getNumRows() > 0)
  8. {
  9.      do
  10.      {
  11.            HashMap row = new HashMap();
  12.            while (it.hasMoreFields())
  13.            {
  14.                  JCO.Field field = it.nextField();
  15.                  String name = field.getName();
  16.                  row.put(name, field);
  17.            }
  18.  
  19.            listTable.add(row);
  20.            n++;
  21.       }
  22.       while (table.nextRow());
  23. }
  24.  
GeSHi ©


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
Christian4831
..
..
 
Posts: 91
Joined: Mon Dec 02, 2002 7:33 pm

Thx

Postby Elisabeth1898 » Wed Dec 04, 2002 11:51 am

Danke, ich werde das Ganze nun mal bei mir testen... :D
Elisabeth1898
.
.
 
Posts: 5
Joined: Tue Dec 03, 2002 10:46 am


Return to Java & SAP®

Who is online

Users browsing this forum: No registered users and 3 guests