Show TOC Anfang des Inhaltsbereichs

Vorgehensweisen Änderungen im Metadatenmodell  Dokument im Navigationsbaum lokalisieren

Verwendung

Auch im Bereich des Metadatenmodells wurden mit dem neuen JCo API einige wesentliche Änderungen vorgenommen.

Trennung von Metadaten-Typen

Die wichtigste Neuerung beruht auf der Trennung der Datencontainer-Klassen für Strukturen und Tabellen. Bisher waren JCo.Structure und JCo.Table einer gemeinsamen parent class zugeordnet. Im neuen API wurden die Structure- und Table-Metadaten zwei unterschiedlichen Metadatentypen zugeordnet, um ungewollte Vermischungen zu vermeiden.  Durch diese Aufteilung haben jeder Record und jede ParameterList eine Referenz zu einem eigenen Metadaten-Objekt.

Erweiterung der Metadaten-Objekte

Mit dem neuen JCo API enthalten die Metadaten-Objekte sowohl Unicode- als auch Non-Unicode-Informationen. Hierdurch wird eine möglicherweise fehlerhafte Konfiguration des Repository verhindert.

Hinweis

Bei der allgemeinen Konfiguration des Repository ist natürlich weiterhin Vorsicht geboten. Z.B. sollte eine Namensgleichheit verschiedener Funktionen in unterschiedlichen Systemen unbedingt verhindert werden.

Reduzierung der Metadaten-Objekte im Speicher

Zudem wird für ein bestimmtes Metadaten-Layout nur ein einziges Objekt im Speicher gehalten das von allen entsprechenden Tabellen bzw. Strukturen referenziert wird. Dies ermöglicht eine deutliche Reduzierung des Speicherverbrauchs insbesondere bei geschachtelten Tabellen.

Folgen

      Als Konsequenz dieser Änderungen sind bestimmte Metadatenoperation (z.B. addinfo()) bei Record- und List-Objekten nicht mehr möglich.

      Auch die Methode ParameterList.appendValue() existiert nicht mehr.

      Es besteht jedoch nach wie vor die Möglichkeit, JCoFunction und seine JcoParameterLists on the fly zu erzeugen.

      Desweiteren ist es nunmehr möglich, ein Metadatenobjekt nach seiner Erzeugung zu sperren, um ungewollte Änderungen zu verhindern.

Voraussetzungen

Die folgenden Aktivitäten sind nur relevant, wenn Sie eine Anwendung mit hart codierten Metadaten oder mit metadaten-relevanten APIs verwenden.

Vorgehensweise

Nehmen Sie die erforderlichen Änderungen in Ihrem Code vor, um das Metadatenmodell anzupassen.

Beispiel

Die folgenden Beispiele zeigen die Veränderungen zwichen JCo 2.x und 3.0 in drei verschiedenen Bereichen:

       Metadatenbeschaffung, wenn nur der Datencontainer verfügbar ist

       Erzeugung einer ParameterList on the fly

       Einrichten hartcodierter Metadaten

 

Metadatenbeschaffung

 

Beispiel JCo 2.x

JCO.Function function = template.getFunction();

 

JCO.ParameterList exports=function.getExportParameterList();

for (int i=0; i<exports.getFieldCount(); i++)

    System.out.println("Parameter: " + exports.getName(i) +

                       " length " + exports.getLength(i) +

                       " is " + (exports.isOptional(i)?"":"not ") + "optional");

 

JCO.ParameterList tables=function.getTableParameterList();

JCO.Table theTable = tables.getTable("THE_TABLE");

for (int i=0; i<theTable.getFieldCount(); i++)

    System.out.println("Field: " + theTable.getName(i) +

                       " length " + theTable.getLength(i) +

                       " offset " + theTable.getOffset(i));

System.out.println("Table length: " + theTable.getTabLength());

 

 

Beispiel JCo 3.0

 

JCoFunction function = template.getFunction();

JCoParameterList exports=function.getExportParameterList();

JCoListMetaData listMetaData=exports.getListMetaData();

for (int i=0; i< listMetaData.getFieldCount(); i++)

    System.out.println("Parameter: " + listMetaData.getName(i) +

                       " length " + listMetaData.getByteLength(i) +

                       " is " + (listMetaData.isOptional(i)?"":"not ") + "optional");

 

JCoParameterList tables=function.getTableParameterList();

JCoTable theTable = tables.getTable("THE_TABLE");

JCoRecordMetaData recordMetaData = theTable.getRecordMetaData();

for (int i=0; i< recordMetaData.getFieldCount(); i++)

    System.out.println("Field: " + recordMetaData.getName(i) +

                       " length " + recordMetaData.getByteLength(i) +

                       " offset " + recordMetaData.getByteOffset(i));

System.out.println("Table length: " + recordMetaData.getRecordLength());

 

 

ParameterList on the fly

 

Beispiel JCo 2.x

 

JCO.ParameterList imports = new JCO.ParameterList();

 

//no exports, tables and exceptions for this function

JCO.Function function = new JCO.Function("JCO_HELLO_WORLD", imports, null, null);

imports.appendValue("PARAM", JCO.TYPE_CHAR, 30, "Hello World!");

 

 

Beispiel JCo 3.0

 

JCoListMetaData importsMeta = JCo.createParameterList();

importsMeta.add("PARAM", JCoMetaData.TYPE_CHAR, 30, 60, 0, null, null, 0, null, null);

importsMeta.lock();

 

//no exports, changings, tables and exceptions for this function

JCoFunction function = JCo.createFunctionTemplate("JCO_HELLO_WORLD", imports, null,

                                                   null, null, null).getFunction();

JCoParameterList imports = function.getImportParameterList();

imports.setValue("PARAM", "Hello World!");

 

 

Hart codierte Metadaten 

 

Beispiel JCo 2.x

 

JCO.MetaData bapiReturnUC = new JCO.MetaData("BAPIRETURN", 9);

JCO.MetaData bapiReturn = new JCO.MetaData("BAPIRETURN", 9);

 

JCO.MetaData companyListUC = new JCO.MetaData("BAPI0014_1", 2);

JCO.MetaData companyList = new JCO.MetaData("BAPI0014_1", 2);

 

bapiReturnUC.addInfo("TYPE",       IMetaData.TYPE_CHAR,   1,   2,   0, 0, null, null, 0,

                     null, null);

bapiReturnUC.addInfo("CODE",       IMetaData.TYPE_CHAR,   5,  10,   2, 0, null, null, 0,

                     null, null);

bapiReturnUC.addInfo("MESSAGE",    IMetaData.TYPE_CHAR, 220, 440,  12, 0, null, null, 0,

                     null, null);

bapiReturnUC.addInfo("LOG_NO",     IMetaData.TYPE_NUM,   20,  40, 452, 0, null, null, 0,

                     null, null);

bapiReturnUC.addInfo("LOG_MSG_NO", IMetaData.TYPE_CHAR,   6,  12, 492, 0, null, null, 0,

                     null, null);

bapiReturnUC.addInfo("MESSAGE_V1", IMetaData.TYPE_CHAR,  50, 100, 504, 0, null, null, 0,

                     null, null);

bapiReturnUC.addInfo("MESSAGE_V2", IMetaData.TYPE_CHAR,  50, 100, 604, 0, null, null, 0,

                     null, null);

bapiReturnUC.addInfo("MESSAGE_V3", IMetaData.TYPE_CHAR,  50, 100, 704, 0, null, null, 0,

                     null, null);

bapiReturnUC.addInfo("MESSAGE_V4", IMetaData.TYPE_CHAR,  50, 100, 804, 0, null, null, 0,

                     null, null);

bapiReturnUC.setTabLength(904); 

 

bapiReturn.addInfo("TYPE",       IMetaData.TYPE_CHAR,   1,   1,   0, 0, null, null, 0,

                   null, null);

bapiReturn.addInfo("CODE",       IMetaData.TYPE_CHAR,   5,   5,   1, 0, null, null, 0,

                   null, null);

bapiReturn.addInfo("MESSAGE",    IMetaData.TYPE_CHAR, 220, 220,   6, 0, null, null, 0,

                   null, null);

bapiReturn.addInfo("LOG_NO",     IMetaData.TYPE_NUM,   20,  20, 226, 0, null, null, 0,

                   null, null);

bapiReturn.addInfo("LOG_MSG_NO", IMetaData.TYPE_CHAR,   6,   6, 246, 0, null, null, 0,

                   null, null);

bapiReturn.addInfo("MESSAGE_V1", IMetaData.TYPE_CHAR,  50,  50, 252, 0, null, null, 0,

                   null, null);

bapiReturn.addInfo("MESSAGE_V2", IMetaData.TYPE_CHAR,  50,  50, 302, 0, null, null, 0,

                   null, null);

bapiReturn.addInfo("MESSAGE_V3", IMetaData.TYPE_CHAR,  50,  50, 352, 0, null, null, 0,

                   null, null);

bapiReturn.addInfo("MESSAGE_V4", IMetaData.TYPE_CHAR,  50,  50, 402, 0, null, null, 0,

                   null, null);

bapiReturn.setTabLength(452);

 

companyListUC.addInfo("COMPANY", IMetaData.TYPE_CHAR,  6, 12,  0, 0, null, null, 0,

                      null, null);

companyListUC.addInfo("NAME1",   IMetaData.TYPE_CHAR, 30, 60, 12, 0, null, null, 0,

                      null, null);

companyListUC.setTabLength(72);

 

companyList.addInfo("COMPANY", IMetaData.TYPE_CHAR,  6,  6, 0, 0, null, null, 0, null,

                     null);

companyList.addInfo("NAME1",   IMetaData.TYPE_CHAR, 30, 30, 6, 0, null, null, 0, null,

                     null);

companyList.setTabLength(36);

 

JCO.MetaData exportsMetaUC=new JCO.MetaData("EXPORTS", 1);

exportsMetaUC.addInfo("RETURN", IMetaData.TYPE_STRUCTURE, 452, 904, 0, 0, null, null, 0,

                      bapiReturnUC, null);

 

JCO.MetaData exportsMeta=new JCO.MetaData("EXPORTS", 1);

exportsMeta.addInfo("RETURN", IMetaData.TYPE_STRUCTURE, 452, 452, 0, 0, null, null, 0,

                    bapiReturn, null);

 

JCO.MetaData tablesMetaUC=new JCO.MetaData("TABLES", 1);

tablesMetaUC.addInfo("COMPANY_LIST", IMetaData.TYPE_TABLE, 36, 72, 0, 0, null, null, 0,

                     companyListUC, null);

 

JCO.MetaData tablesMeta=new JCO.MetaData("TABLES", 1);

tablesMeta.addInfo("COMPANY_LIST", IMetaData.TYPE_TABLE, 36, 36, 0, 0, null, null, 0,

                   companyList, null);

 

JCO.Client client = JCO.getClient("FOO");

try

{

    client.connect();

    boolean isUnicode = client.getAttributes().getPartnerBytesPerChar()==2;

    JCO.Function bapiCompanyGetList=null;

    if (isUnicode)

        bapiCompanyGetList=JCO.createFunction("BAPI_COMPANY_GETLIST", null,

                                              JCO.createParameterList(exportsMetaUC),

                                              JCO.createParameterList(tablesMetaUC));

    else

        bapiCompanyGetList=JCO.createFunction("BAPI_COMPANY_GETLIST", null,

                                              JCO.createParameterList(exportsMeta),

                                              JCO.createParameterList(tablesMeta));

    client.execute(bapiCompanyGetList);

 

    JCO.ParameterList tables= bapiCompanyGetList.getTableParameterList();

    JCO.Table companies=tables.getTable("COMPANY_LIST");

    for (int i=0; i<companies.getNumRows(); i++)

    {

        companies.setRow(i);

        System.out.println(companies.getString("COMPANY")+

                           ":  "+companies.getString("NAME1"));

    }

}

catch(Exception e)

{

    System.err.println("Exception occured: "+e.toString());

}

finally

{

    JCO.releaseClient(client);

}

 

 

Beispiel JCo 3.0

 

JCoRecordMetaData bapiReturn = JCo.createRecordMetaData("BAPIRETURN", 9);

 

JCoRecordMetaData companyList = JCo.createRecordMetaData("BAPI0014_1", 2);

 

bapiReturn.add("TYPE",       JCoMetaData.TYPE_CHAR,   1,   0,   2,   0, 0, null, null,

               null);

bapiReturn.add("CODE",       JCoMetaData.TYPE_CHAR,   5,   1,  10,   2, 0, null, null,

               null);

bapiReturn.add("MESSAGE",    JCoMetaData.TYPE_CHAR, 220,   6, 440,  12, 0, null, null,

               null);

bapiReturn.add("LOG_NO",     JCoMetaData.TYPE_NUM,   20, 226,  40, 452, 0, null, null,

               null);

bapiReturn.add("LOG_MSG_NO", JCoMetaData.TYPE_CHAR,   6, 246,  12, 492, 0, null, null,

               null);

bapiReturn.add("MESSAGE_V1", JCoMetaData.TYPE_CHAR,  50, 252, 100, 504, 0, null, null,

               null);

bapiReturn.add("MESSAGE_V2", JCoMetaData.TYPE_CHAR,  50, 302, 100, 604, 0, null, null,

               null);

bapiReturn.add("MESSAGE_V3", JCoMetaData.TYPE_CHAR,  50, 352, 100, 704, 0, null, null,

               null);

bapiReturn.add("MESSAGE_V4", JCoMetaData.TYPE_CHAR,  50, 402, 100, 804, 0, null, null,

               null);

bapiReturn.setRecordLength(452, 904);

bapiReturn.lock(); 

 

companyList.add("COMPANY", IMetaData.TYPE_CHAR,  6,  0, 12,  0, 0, null, null, 0, null,

                null);

companyList.add("NAME1",   IMetaData.TYPE_CHAR, 30,  6, 60, 12, 0, null, null, 0, null,

                null);

companyList.setRecordLength(36, 72);

companyList.lock();

 

JCoListMetaData exportsMeta=JCo.createListMetaData("EXPORTS", 1);

exportsMeta.add("RETURN", JCoMetaData.TYPE_STRUCTURE, 452, 904, 0, null, null, 0,

                bapiReturn, null);

 

JCoListMetaData tablesMeta=JCo.createListMetaData("TABLES", 1);

tablesMeta.add("COMPANY_LIST", JCoMetaData.TYPE_TABLE, 36, 72, 0, null, null, 0,

               companyList, null);

 

JCoFunctionTemplate bapiCompanyGetListTemplate=JCo.createFunctionTemplate("BAPI_COMPANY_GETLIST",

              null, exportsMeta, null, tablesMeta, null);

 

try

{

    JCoDestination foo=JCoDestinationManager.getDestination("FOO");

    JCO.Function bapiCompanyGetList=bapiCompanyGetListTemplate.getFunction();

    bapiCompanyGetList.execute(foo);

 

    JCoParameterList tables= bapiCompanyGetList.getTableParameterList();

    JCoTable companies=tables.getTable("COMPANY_LIST");

    for (int i=0; i<companies.getNumRows(); i++)

    {

        conmpanies.setRow(i)

        System.out.println(companies.getString("COMPANY")+

                           ":  "+companies.getString("NAME1"));

    }

}

catch(Exception e)

{

    System.err.println("Exception occured: "+e.toString());

}

 

 

Ende des Inhaltsbereichs