SAP JCo 例子 | SAP Java Connector 参考

本例子使用的的版本为 jco_31

准备

下载SAP Java Connector: https://support.sap.com/en/product/connectors/jco.html

导入 JCo sapjco.jar(Windows and Linux) 到开发路径

windows 导入 sapjco3.dll,Linux 导入 libsapjco3.so 带 Path

代码

  1. import java.io.File;
  2. import java.io.FileOutputStream;
  3. import java.util.Properties;
  4. import com.sap.conn.jco.JCoDestination;
  5. import com.sap.conn.jco.JCoDestinationManager;
  6. import com.sap.conn.jco.JCoException;
  7. import com.sap.conn.jco.ext.DestinationDataProvider;
  8. public class Generator {
  9. static String DESTINATION_NAME1 = "ABAP_AS_WITHOUT_POOL";
  10. static String DESTINATIOn_NAME2 = "ABAP_AS_WITH_POOL";
  11. static void createDestinationDataFile(String destinationName, Properties connectProperties) {
  12. File destConfigiration = new File(destinationName + ".jcoDestination");
  13. try {
  14. FileOutputStream fos = new FileOutputStream(destConfigiration, false);
  15. connectProperties.store(fos, "Generator");
  16. fos.close();
  17. } catch (Exception e) {
  18. throw new RuntimeException("Unable create file!");
  19. }
  20. }
  21. public static void stepConnectionWithoutPool() throws JCoException {
  22. JCoDestination destination = JCoDestinationManager.getDestination(DESTINATION_NAME1);
  23. System.out.println("Attributes:");
  24. System.out.println(destination.getAttributes());
  25. System.out.println();
  26. }
  27. public static void stepConnectionWithPool() throws JCoException {
  28. JCoDestination destination = JCoDestinationManager.getDestination(DESTINATIOn_NAME2);
  29. destination.ping();
  30. System.out.println("Attributes");
  31. System.out.println(destination.getAttributes());
  32. System.out.println();
  33. }
  34. public static void main(String[] args) throws JCoException {
  35. Properties connectProperties = new Properties();
  36. // Basic configuration
  37. connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST, "{{your host}}");
  38. connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR, "00");
  39. connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT, "500");
  40. connectProperties.setProperty(DestinationDataProvider.JCO_USER, "{{USERNAME}}");
  41. connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD, "{{PASSWORD}}");
  42. connectProperties.setProperty(DestinationDataProvider.JCO_LANG, "ZH");
  43. connectProperties.setProperty(DestinationDataProvider.JCO_POOL_CAPACITY, "3");
  44. connectProperties.setProperty(DestinationDataProvider.JCO_PEAK_LIMIT, "10");
  45. // Further configuration
  46. connectProperties.setProperty(DestinationDataProvider.JCO_SERIALIZATION_FORMAT, "columnBased");
  47. connectProperties.setProperty(DestinationDataProvider.JCO_NETWORK, "lan");
  48. connectProperties.setProperty(DestinationDataProvider.JCO_EXPIRATION_TIME, "600000");
  49. connectProperties.setProperty(DestinationDataProvider.JCO_EXPIRATION_PERIOD, "120000");
  50. createDestinationDataFile(DESTINATION_NAME1, connectProperties);
  51. createDestinationDataFile(DESTINATIOn_NAME2, connectProperties);
  52. System.out.println("Generate DESTINATION_NAME1 finished!");
  53. System.out.println("Generate DESTINATION_NAME2 finished!");
  54. // Test connection
  55. Generator.stepConnectionWithoutPool();
  56. Generator.stepConnectionWithPool();
  57. }
  58. }
  1. import com.sap.conn.jco.AbapException;
  2. import com.sap.conn.jco.JCoDestination;
  3. import com.sap.conn.jco.JCoDestinationManager;
  4. import com.sap.conn.jco.JCoException;
  5. import com.sap.conn.jco.JCoFunction;
  6. import com.sap.conn.jco.JCoStructure;
  7. import com.sap.conn.jco.JCoTable;
  8. public class Invoker {
  9. public static void main(String[] args) throws JCoException {
  10. String functionName = "BAPI_COMPANYCODE_GETLIST"; // 调用的 Function moudule 名称,需要开启远程调用
  11. JCoDestination destination = JCoDestinationManager.getDestination("ABAP_AS_WITH_POOL"); // 获取工程根目录下的文件 ABAP_AS_WITH_POOL.jcoDestination
  12. JCoFunction function = destination.getRepository().getFunction(functionName);
  13. if (function == null) {
  14. throw new RuntimeException(functionName + " not found in SAP");
  15. }
  16. try {
  17. function.execute(destination);
  18. } catch (AbapException e) {
  19. System.out.println(e);
  20. return;
  21. }
  22. JCoStructure exportStructure = function.getExportParameterList().getStructure("RETURN"); // 获取导出参数
  23. for(int i = 0; i < exportStructure.getMetaData().getFieldCount(); i++) {
  24. System.out.println(exportStructure.getString(i));
  25. }
  26. JCoTable exportTable = function.getTableParameterList().getTable("COMPANYCODE_LIST"); // 获取 Table 参数
  27. for(int i = 0; i < exportTable.getNumRows(); i++) {
  28. exportTable.setRow(i);
  29. System.out.println(exportTable.getString("COMP_CODE") + "\t" + exportTable.getString("COMP_NAME"));
  30. }
  31. }
  32. }

Type mapping

参考文档

异常处理

  • JCO.AbapException:ABAP 函数执行过程中出现异常,在 JAVA 进程中触发该异常
  • JCO.ConversionException:当执行参数的 get,set 方法时,如果在 Java 类型和 ABAP 类型间转换失败

Debug

  1. JCO.Pool pool = JCO.getClientPoolManage().getPool(POOL_NAME);
  2. pool.setAbapDebug(true);

连接池

连接池的使用可以参考这篇博客

SAP JCo Architecture

Java Application -> JCo Java API -> JNI Layer -> CPI-C -> RFC -> SAP System

拓展库

Reference