`

Java和SAP的三种数据通信方式 RFC IDOC XI

阅读更多

JAVA与SAP数据交互的方式总结
RFC方式:Java程序直接通过RFC访问SAP的对象(或称函数,可能叫法不对)
SAP提供了BAPI(Business Application Programming Interface),BAPI是SAP系统对外提供的一系列接口,主要是使第三方程序通过这些接口来使用SAP,从而方便客户定制某些程序.VB,Java,C,C++等都可以通过BAPI来访问SAP.BAPI是通过R/3系统上的RFC(Remote function call)功能来实现的.因为BAPI的强大功能作为基础,SAP就完全可以选择Java在CRM上加强各种功能,比如可以用Java快速开发一个实现特定功能的客户端。针对Java,SAP也提供了一个API叫Java Connector(JCo),可以使用它方便的调用BAPI提供的接口。
举例说明 :在我们的某一个项目中,需要每个月从R3取出供应商的寄售和非寄售汇总结算数据和明细数据,展现在供应商信息平台上,供供应商开发票和财务部付款进行结算,那么可以做一个定时器,通过RFC在每个月的一号0点将结算数据取出。

private final static String FUNCTION_GET_NONVMI_DATA = "ZPUR_DATA_GET_TMP1";

 /**
  * 处理接口参数
  */
 private JCO.ParameterList getNonVmiTableParameterList(
   JCO.Client aConnection, String bukr, String month, String start,
   String end, String lifnr) {
  IRepository aRepository = new JCO.Repository("SAPRep", aConnection);
  IFunctionTemplate functionTemplate = aRepository
    .getFunctionTemplate(FUNCTION_GET_NONVMI_DATA);
  logger.debug("FunctionTemplate=" + functionTemplate);
  JCO.Function function = new JCO.Function(functionTemplate);
  JCO.ParameterList input = function.getImportParameterList();
  input.getField("BUKRS").setValue(bukr);
  //input.getField("SPMON").setValue(month);
  input.getField("LIFNR").setValue(lifnr);
  input.getField("ZBUDATB").setValue(start);
  input.getField("ZBUDATN").setValue(end);
  logger.debug("ImportParameterList=" + input);
  aConnection.execute(function);
  JCO.ParameterList tableParams = function.getTableParameterList();
  return tableParams;
 }

2、Idoc方式

 适用于中间文件的IDoc定义格式,是SAP企业系统软件的应用程序之间或SAP应用程序与外部程序之间电子数据交换用的标准数据格式。IDoc是SAP的应用程序连接系统的数据转换工具。IDoc用于数据异步处理:每个IDoc生成独立的文本文件,无需连接中央数据库,就可以传送给要求数据的工作平台。SAP的另一个系统业务应用程序接口则用于数据同步处理。  一个大公司的网络操作环境很可能需要各地分公司的电脑都能与公司的主数据库连接。这些电脑很可能是用不同的硬件或操作系统平台。因为IDoc对数据进行了压缩,所以它无需变换格式就能在不同的操作系统上使用。  IDoc类型指定不同种类的数据,比如说购买订单或发票,它们可能被划分为更细小的数据种类,即信息类型。更详细的分类意味着一个IDoc类型只能储存某一特定交易所需的数据,这样既提高了工作效率又降低了资源损耗。  在事务处理过程中,IDoc随时会生成。例如,在运货交易过程中,可能会产生打印货运清单所需数据的IDoc。客户在SAP系统执行完一项交易后,在数据传送过程中和经过ALE通讯层时,一个或多个IDoc会生成。通讯层执行远程功能调用,使用由客户模式规定得端口定义和RFC介面定义。IDoc的接收者可能为R/3、R/2或一些外部系统。

在采用IDOC方式的时候,可以采用IDOC落地或不落地的方式,一般只有在跟踪测试或做传输记录的时候的采用IDOC落地的方式,一般其他情况基本上都是采用不落地的方式。

public class JcoIdocServer extends JCoIDoc.Server {

  private final Log logger = LogFactory.getLog(JcoIdocServer.class);

  public JcoIdocServer(java.util.Properties properties,
    IRepository jcoRepository, IDoc.Repository idocRepository) {
   super(properties, jcoRepository, idocRepository);
  }// constructor MyIDocServer

  /**
   * Overridden method of JCoIDoc.Server. Function requests that do not
   * contain IDocs will be handled here. These requests will be stored as
   * XML file in the incoming path. No other action will be done. The
   * return values won't be filled and no exception will be thrown to the
   * caller.
   */
  protected void handleRequest(JCO.Function function) {
   logger.error("error:incoming function request '"
     + function.getName() + "',but this should be not happen.");
  }// method handleRequest

  /**
   * Overridden method of JCoIDoc.Server. Function requests that contain
   * IDocs will be handled here. All IDocs will be stored as XML files in
   * the incoming path. Additionally, IDocs that are part of an ORDERS
   * message will be processed specifically. Some relevant information is
   * extracted from these IDocs and will be stored in a text file in the
   * incoming path.
   */
  protected void handleRequest(IDoc.DocumentList documentList) {
   logger.debug("Incoming IDoc list request containing "
     + documentList.getNumDocuments() + " documents...");

   IDoc.DocumentIterator iterator = documentList.iterator();
   IDoc.Document doc = null;

   while (iterator.hasNext()) {
    doc = iterator.nextDocument();
    logger.debug("Processing document no. " + doc.getIDocNumber()
      + "...");

    JcoIdocAudit jcoIdocAudit = new JcoIdocAudit();

    jcoIdocAudit.setTabnam(doc.getTableStructureName());
    jcoIdocAudit.setMandt(doc.getClient());
    jcoIdocAudit.setDocnum(doc.getIDocNumber());
    jcoIdocAudit.setDocrel(doc.getIDocSAPRelease());
    jcoIdocAudit.setStatus(doc.getStatus());
    jcoIdocAudit.setDirect(doc.getDirection());
    jcoIdocAudit.setOutmod(doc.getOutputMode());
    jcoIdocAudit.setExprss(doc.getExpressFlag());
    jcoIdocAudit.setTest(doc.getTestFlag());
    jcoIdocAudit.setIdoctyp(doc.getIDocType());
    jcoIdocAudit.setCimtyp(doc.getIDocTypeExtension());
    jcoIdocAudit.setMestyp(doc.getMessageType());
    jcoIdocAudit.setMescod(doc.getMessageCode());
    jcoIdocAudit.setMesfct(doc.getMessageFunction());
    jcoIdocAudit.setStd(doc.getEDIStandardFlag());
    jcoIdocAudit.setStdvrs(doc.getEDIStandardVersion());
    jcoIdocAudit.setStdmes(doc.getEDIMessageType());
    jcoIdocAudit.setSndpor(doc.getSenderPort());
    jcoIdocAudit.setSndprt(doc.getSenderPartnerType());
    jcoIdocAudit.setSndpfc(doc.getSenderPartnerFunction());
    jcoIdocAudit.setSndprn(doc.getSenderPartnerNumber());
    jcoIdocAudit.setSndsad(doc.getSenderAddress());
    jcoIdocAudit.setSndlad(doc.getSenderLogicalAddress());
    jcoIdocAudit.setRcvpor(doc.getRecipientPort());
    jcoIdocAudit.setRcvprt(doc.getRecipientPartnerType());
    jcoIdocAudit.setRcvpfc(doc.getRecipientPartnerFunction());
    jcoIdocAudit.setRcvprn(doc.getRecipientPartnerNumber());
    jcoIdocAudit.setRcvsad(doc.getRecipientAddress());
    jcoIdocAudit.setRcvlad(doc.getRecipientLogicalAddress());
    jcoIdocAudit.setCredat(doc.getCreationDateAsString());
    jcoIdocAudit.setCretim(doc.getCreationTimeAsString());
    jcoIdocAudit.setRefint(doc.getEDITransmissionFile());
    jcoIdocAudit.setRefgrp(doc.getEDIMessageGroup());
    jcoIdocAudit.setRefmes(doc.getEDIMessage());
    jcoIdocAudit.setArckey(doc.getArchiveKey());
    jcoIdocAudit.setSerial(doc.getSerialization());

    jcoIdocAuditManager.create(jcoIdocAudit);
    String[] result = new String[] {
      JcoIdocAudit.OPERATION_FAILURE, "未知错误" };
    String msgType = doc.getMessageType();
    logger.debug("Processing message of type '" + msgType + "'...");
    if ("MATMAS".equals(msgType)) {
     logger.debug("idocManager.processMATMAS(doc),msgType="
       + msgType);
     logger.debug("idocManager=" + idocManager);
     result = idocManager.processMATMAS(doc);
    } else {
     logger.debug("invalid msgType:" + msgType);
     return;
    }
    jcoIdocAudit.setOpcod(result[0]);
    jcoIdocAudit.setOpmsg(result[1]);
    jcoIdocAuditManager.update(jcoIdocAudit);
   }
  }// method handleRequest

  /**
   * The following 4 methods for transaction management are not
   * implemented here in this sample program. For a description on how to
   * implement them in real production scenarios please see the JCo API
   * specification for the JCO.Server class.
   */
  protected boolean onCheckTID(String tid) {
   return true;
  }// method onCheckTID

  protected void onConfirmTID(String tid) {
  }// method onConfirmTID

  protected void onCommit(String tid) {
  }// method onCommit

  protected void onRollback(String tid) {
  }// method onRollback

@Override
  public String toString() {
   return "gwhost=" + this.getGWHost() + ";gwserv=" + this.getGWServ()
     + ";progid=" + this.getProgID();
  }
 }

3、XI方式

XI 的集成又可以分为两个层次,第一个层次称为Integration Broker,以消息的方式进行的数据的交换;另外一个层次是 BPM,即业务流程管理。
在 XI 中,数据(可以使一条记录,比如单个的物料主数据;也可以是多条记录,比如含主单明细的供应商主数据)从某一个业务系统通过 XI 发送到另外一个业务系统,站在业务系统的角度,前者称为 Sender,后者称为 Receiver 。
适配器(Adapter)进行 XI-XML 格式与业务系统的特定类型的数据格式之间的转换。依据业务系统的数据格式的不同,适配器可以分为多种类型,比如 SOAP Adapter, JDBC Adapter, File Adapter, RFC Adapter 和 IDoc Adapter 等。通常说的实现方式,譬如 SOAP+RFC,是指Sender 与 XI 之间使用 SOAP Adapter,XI 与 Receiver 之间使用 RFC Adapter。

 

在我们其中的一个项目中,是java做一个接口部署为Web service,然后由XI通过这个web service向java程序输入相应数据


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ovsynnia/archive/2008/11/14/3291047.aspx

分享到:
评论

相关推荐

    ECC系统发送供应商主数据(IDoc)到SAP_PI系统的配置步骤

    IDoc(Intermediate Document)是SAP中用于跨系统交换数据的标准化数据结构。SAP PI(Process Integration)系统是用于业务流程集成的工具,它可以通过IDoc与其他SAP系统进行数据交互。 当ECC系统需要将供应商主...

    SAP课程之BC621-SAP IDOC Interface

    在SAP系统中,IDOC(Intermediate Document)是用于企业间数据交换的一种标准接口。BC621课程专门聚焦于SAP IDOC接口,旨在深入理解其工作原理、结构以及如何在实际业务流程中实施。IDOC作为SAP与外部系统进行集成的...

    IBM 内部经典SAP Idoc 开发

    技术正确性涉及对IDoc消息的结构和数据元素的验证,性能分析着重于消息处理的效率,配置则是关于SAP系统中与IDoc相关的配置细节,例如确定使用哪个接口点或消息类型等。 此外,理解EDI(Electronic Data ...

    sap xi 学习指南

    4. **Exchange Infrastructure (XI)**:XI不仅是数据传输的平台,还包含了一套完整的工具集,如监控、错误处理和安全机制,以确保系统的稳定性和数据的安全性。 5. **SAP XI 实用信息**:这部分内容将涵盖XI的日常...

    SAP_RFC总结

    SAP Remote Function Call (RFC) 是SAP系统中用于不同系统间交互的核心技术之一,它提供了一种标准化的方式,使得不同系统能够安全地调用和交换数据。RFC允许外部系统(如Java、Python或其他编程语言的应用程序)与...

    IDoc Messages exchange between Flat and XML Format

    在SAP集成与流程集成(XI/PI)系统中,IDoc(Intermediate Document)是一种标准格式,用于在不同系统之间交换数据,特别是SAP与其他非SAP系统之间的交互。在PI 7.11版本中,引入了一个新的Java适配器用户模块,该...

    SAP XI 常用事务代码

    当在SAP XI和SAP系统之间进行数据转换时,如果遇到IDoc格式不匹配导致的转换失败,可以通过IDX2检查两个系统的IDoc结构是否一致。 2. IDX5:通过这个事务代码,你可以按照日期过滤,查看已发送和接收的IDocs以及XML...

    SAP XI集成应用简介

    与ALE(Application Link Enabling)的集成是SAP XI的另一个重要方面,ALE通过IDOC(Intermediate Document)和RFC(Remote Function Call)来实现数据交换。IDOC是SAP系统间数据交换的标准格式,而ALE则负责管理和...

    SAP_XI_常用事务代码_介绍_用法

    在SAP系统中,SAP XI(现在被称为SAP PI,即Process Integration)是一个关键的组件,用于不同系统之间的数据集成。以下是一些SAP XI的常用事务代码及其功能介绍,这些代码对于日常管理和问题排查至关重要。 1. IDX...

    SAP XI 常用事务代码(sap basis).txt

    本文将详细介绍SAP XI环境下的一些常用事务代码及其应用场景,帮助读者更好地管理和监控SAP系统的运行。 #### 事务代码详解 1. **IDX2 - IDOC元数据管理** - **功能**: 用于维护IDOC(Intermediate Document)的...

    SAP .Net Nco 3.0.24 windows 平台 32bit 64bit SAP ERP Solutions

    7. **性能优化**:NCO 3.0.24在前一版本的基础上进行了性能优化,提升了与SAP系统的连接速度和数据传输效率。 8. **兼容性**:此版本的NCO兼容.NET Framework 4.0,确保了与现代开发环境的兼容性。 至于提到的两个...

    sap xi - TBIT40_EN_Coll44_A4

    在本场景中,消息流主要涉及以下几种通信方式: - **HTTP:** 用于 Web 应用程序之间的通信。 - **JDBC:** 用于数据库访问。 - **IDoc (Intermediate Document):** SAP 内部用于系统间数据交换的标准格式。 - **...

    ALE_EDI_IDoc

    《ALE_EDI_IDoc》是一本专为对电子数据交换(EDI)感兴趣的IT专业人士和SAP用户准备的深度指南。本书全面介绍了SAP系统中EDI、高级后勤执行(ALE)和IDoc技术的关键概念和应用实践,对于希望深入了解并掌握这些技术在...

    SAP Interface

    - **定义**:RFC主要用于SAP R/3系统(即SAP ECC)之间的通信,支持多个SAP系统之间的数据交换和业务流程集成。 - **配置**:在R3系统中配置RFC连接通常需要通过事务代码SM59进行设置。这一过程涉及到目标系统的...

    行业分类-设备装置-基于SAP平台的接口和系统的监测方法及监测系统.zip

    SAP提供了多种接口技术,如BAPI(Business Application Programming Interface)、IDoc(Intermediate Document)、RFC(Remote Function Call)和ABAP(Advanced Business Application Programming)网关等。...

    学习SAP_PI的经验总结.docx

    SAP PI作为企业间信息集成的重要工具,通过中间件XI(eXtreme Integration)实现不同系统间的通信。以下是一些关于SAP PI监控和错误处理的知识点: 1. **自动信息集成监控**: - 为了预防网络故障或服务器问题导致...

Global site tag (gtag.js) - Google Analytics