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)
{
//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)
{
}
- 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)
{
//Wichtig: JCO.Client Objekt erforderlich!!!
jcoImportParams, jcoExportParams, jcoTableParams);
client.execute(function);
}
catch(com.sap.mw.jco.JCO.Exception jcoException)
{
}
- 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)
JCO.Table yourTable = jcoTableParams.getTable("YOUR_TABLE");
JCO.FieldIterator it = yourTable.fields();
Arraylist listTable = new ArrayList();
int n=0
if &#
40;yourTable
.getNumRows
&#
40;
&#
41;
> 0&#
41;
{
{
HashMap row = new HashMap();
while &#
40;it
.hasMoreFields
&#
40;
&#
41;
&#
41;
{
JCO.Field field = it.nextField();
String name = field.getName();
row.put(name, field);
}
listTable.add(row);
n++;
}
while &#
40;
table.nextRow
&#
40;
&#
41;
&#
41;;
}
- 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