如何通过ALE审计发送/检查发送到SAP ECC的IDOC的状态?

时间:2016-10-21 20:36:23

标签: sap sap-erp sap-r3

我正在开发一个Java应用程序,它从ECC接收iDoc并将iDocs传递给ECC。

我们的应用程序就像ECC和其他系统之间的brigde一样,它从我们的应用程序中存储在磁盘中的ECC接收iDoc,然后后台进程负责检查保存iDocs的文件的文件系统位置然后通过HTTP请求发送到其他目的地。该应用程序还与这些其他系统通信,以检索也保存到文件的信息,然后在后台进程上读取它们并构建要发送到ECC的iDoc。

当应用程序从ECC收到iDoc时,会向ECC发送一个确认iDoc,发送到ECC时需要做类似的事情,也就是说,当Java应用程序向其发送iDoc时,我们希望ECC发送ALE确认对于我们的应用程序,如果正确发送iDocs,那么我们的应用程序知道发送的批处理可以安全地移动到我们的历史文件夹中,并且如果确认表明存在问题,则应该另外尝试发送iDocs。 / p>

我们如何配置ECC以向我们的Java应用程序发送确认?

我们用来从Java发送到ECC的代码是:

    try {
        destination= JCoDestinationManager.getDestination(PROGID);
        iDocRepository = JCoIDoc.getIDocRepository(destination);
        tid = destination.createTID();
        iDocFactory = JCoIDoc.getIDocFactory();
    } catch (JCoException e) {
        e.printStackTrace();
    }
    List<Invoic02> invoic02s = new ArrayList<>();

    EDI_DC40 edi_dc40 = IdocUtil.generateIdocControlRecordObject(IdocUtil.invoiceIdocType, IdocUtil.invoiceMsgType);

    for(InvoiceIdoc invoicIdoc : invoices){
        Invoic02 invoic02 = new Invoic02();
        invoicIdoc.setBEGIN("1");
        invoicIdoc.setEDI_DC40(edi_dc40);
        invoic02.getInvoiceIdoc().add(invoicIdoc);
    }

    String invoicesIdocString = XmlParser.objectToXmlString(invoices, Invoic02.class);

    try {
        IDocXMLProcessor processor= iDocFactory.getIDocXMLProcessor();
        IDocDocumentList iDocList=processor.parse(iDocRepository, invoicesIdocString.toString());
        JCoIDoc.send(iDocList, IDocFactory.IDOC_VERSION_DEFAULT, destination, tid);
    } catch (JCoException e) {
        e.printStackTrace();
    } catch (IDocParseException e) {
        e.printStackTrace();
    }

要收听传入的IDOC,我们使用私有库,但它也使用JCO IDOC库。

是否可以使用JCO IDOC库来检查发送的IDOC的状态?或者有没有办法配置ECC以发送它收到的每个IDOC的确认?

3 个答案:

答案 0 :(得分:0)

如果您使用的是标准IDOC输入法(http和函数),则返回IDOC保存号。所以你不需要等待另一个IDOC。只需检查IDOC保存号码即可。

答案 1 :(得分:0)

我想,检查 TID 是Java端唯一可以确保成功收到IDoc的方法。 SAP best practice没有给我们任何方式:

  

tid = destination.createTID();
  ...
  JCoIDoc.send(iDocList,IDocFactory.IDOC_VERSION_DEFAULT,destination,tid);
  的 destination.confirmTID(TID);
  返回true;

这一行throws errors如果ERP方面出现问题。

答案 2 :(得分:0)

正如我在Suncatcher答案下的评论中所见,您想在IDoc在ECC端处理后查询IDoc的状态。

首先,您正在使用事务RFC,因此ECC端的处理是异步的,因此必须等待不确定的时间,直到IDoc被SAP处理。

因此,您有两种可能:

  • 您的应用程序都定期在ECC端查询IDoc的状态
  • 或者您将程序 RBDSTATE 安排在ECC端,作为有规律的时间间隔触发的后台作业,发送对已处理IDoc的确认,然后开发一个额外的Java应用程序来监听这些确认。我建议您选择RFC协议发送确认。
    • RBDSTATE扫描已处理的IDoc,并将类型为 ALEAUD01 的确认IDoc发送到发送方系统,其中包含已处理的IDoc的编号及其处理状态(成功) ,错误),消息,创建或更改的业务对象...
    • 您必须配置伙伴配置文件,端口,连接数据(事务代码WE20WE21BD97SM59
    • 您必须开发一个新的Java应用程序,它可以作为RFC服务器使用,它可以侦听到达的所有内容,并处理入站ALEAUD01 IDoc。
    • 您可以在SAP Library about ALE Audit中获取更多信息。
    • 关于Java中RFC服务器应用程序的开发,您可以在SAP Library about SAP JCO Server Programming中获得更多信息。