Auch im Bereich des Metadatenmodells wurden mit dem neuen JCo API einige wesentliche Änderungen vorgenommen.
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.
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.
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.
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.
● 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.
Die folgenden Aktivitäten sind nur relevant, wenn Sie eine Anwendung mit hart codierten Metadaten oder mit metadaten-relevanten APIs verwenden.
Nehmen Sie die erforderlichen Änderungen in Ihrem Code vor, um das Metadatenmodell anzupassen.
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
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());
|
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());
|
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!");
|
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!");
|
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); }
|
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()); }
|