Month: June 2017

Unique Filenames with AS2 Communication Channel

Unique Filenames with AS2 Communication Channel

During the implementation of multiple AS2 interfaces, I found myself very often in a situation where the communication partner expected unique AS2 filenames. Unfortunately, if you leave the filename parameter in an AS2 Receiver Communication Channel (CC) blank, the filename will always be your PIs system name. In case you enter a value like “Invoice”, the filename will always be set to “Invoice”.

Solution:

  1. You can use a dynamic configuration to generate unique filenames. Just add a UDF to you message mapping which sets the property “AS2Filename” in the namespace “http://sap.com/xi/XI/AS2/AS2“. Also, do not forget to enable the checkbox “Respect parameters” in the AS2 Communication Channels configuration.
  2. If you want to generate random, unique filenames only, a dynamic configuration feels like to much effort. Fortunately, there is an easier way to generate unique filename. Just put “%MSGID” into the “Filename” parameter of your AS2 Receiver Communication Channel. The parameter will be replaced with the PIs message ID, which should be unique. Additionally, it is possible to combine the placeholer with static text like “%MSGID.xml”.
    MSGID placeholder in filename parameter in AS2 Receiver Communication Channel
    MSGID placeholder in filename parameter in AS2 Receiver Communication Channel

    Be aware that in case your message fails, in every attempt to resend the mesasge the filename will be the same. Luckily, there are more placeholders available:

    Placeholder Description
    %SEQNUM A sequence number, starting with 1
    %RTSEQNUM A server wide sequence number, starting with 1
    %START The start time of the adapter
    %TIME The archiving period in milliseconds
    %MSGID The XI message ID

If you would like to find out more about the AS2 Adapter, check out the SAP Documentation.

Archive Files with the File Receiver Communication Channel

Archive Files with the File Receiver Communication Channel

The File Sender Communication Channel is able to move processed file to an archive directory and append the current timestamp. The File Receiver Communication Channel lacks an parameter to archive files. This is okay in most cases. The receiving system should take care of the file after processing. But, what if the demand is to move a file to an archive directory on the receiving system before overwriting it?

Solutions:

  1. It is possible to use an (cc)BPM(N) which orchestrates the archiving and the creation of the new file. You would need a configuration, a File Sender Communication Channel, a File Receiver Communication Channel and dummy interfaces to grab the old file and move it to a new directory. After the archiving is done, you can use a second configuration to store the new file. In addition, a third configuration is necessary which receives the source file and triggers the ccBPM or BPM. One BPM and three configurations – a lot afford for a simple archive.
  2. The File Receiver Communication Channel has a parameter to run script or commands on the operating system before and after creating the file. A simple move command wil do the trick.
    If your SAP Process Integration / Process Orchestration runs on Unix, use

    mv test.xml archive/test_$(date +%Y-%m-%d).xml

    If your SAP Process Integration / Process Orchestration runs on Windows, use

    ren “test.xml” “test_%date:~10,4%%date:~7,2%%date:~4,2%.xml”

    Move command in File Receiver Communicaiton Channel
    Move command in File Receiver Communicaiton Channel

    In case you use dynamic filenames, you can use the following placeholders:

    Placeholder Description
    %F target file path
    %f target file name

    Unfortunately, this will only work in NFS mode. You could create a script which connects to the FTP server and archives the file and run this script with the Communication Channel, but I would highly advise against this.

To read more about the File Receiver Communication Channel, check out the SAP Documentation.

Filter for Filename or Subject in AS2 Sender Communication Channel

Filter for Filename or Subject in AS2 Sender Communication Channel

In a current project we had the demand to send XML files from a windows server to an SAP ERP system via SAP PO. As additional requirement the files should be signed and an acknowledgment should be send back to the sender system. Therefore, we decided against the classical (S)FTP(S) and for AS2, as signature and Message Delivery Notifications (MDN) are firm elements of the AS2 specification. With mendelson AS2 there is an excellent tool available, which grabs files out of a directory and sends it to an AS2 receiver, in this case SAP PO.
Unfortunately, XML files with different data structures (Receipts, Orders, Invoices, …) were stored in the same directory and therefore send to the same URL. As the filenames looked like “Order_xxxxxxx.xml” and “Invoice_xxxxxxxx.xml” we looked for a way to separate the different files on SAP PI.

Filter for AS2 filename on SAP Process Orchestration / Process Integration

The AS2 Sender communication channel is not able to filter for a filename schema, hence you would receive all the different files with one AS2 Sender Communication Channel and route them through one Integrated Configuration (ICO). There are multiple ways to handle this:

  • You could use the EDI Separator to filter the files in a second step, but I highly recommend against using the EDI Separator in XML scenarios.
  • The filename is available as dynamic configuration and can be used as condition in an ICO.

    AS2Filename as condition in an Integrated Configuration
    AS2Filename as condition in an Integrated Configuration
  • If the structure of the XML files is different you can use an exists check as condition in your ICO.

    Check for an XPath in the condition of an ICO
    Check for an XPath in the condition of an ICO

Separating the different files with conditions in the ICO is possible, but bad practice. You have to use a dummy Sender Interface, as the data can have different structures. As a result, the selection of an Operation Mapping and the PI checks wont work. Fortunately, with mendelson AS2 it is possible to use the filename as subject. Just open the Partner configuration and type “${filename}” into the Payload Subject field.

Configure mendelson AS2 to use the filename as subject
Configure mendelson AS2 to use the filename as subject

Filter for AS2 subject on SAP Process Orchestration / Process Integration

A great feature of the AS2 Sender Communication Channel is to use regular expressions for the different expected values, like the subject. If you would like to receive only AS2 messages with a subject starting with “Order_” you can simply use “Order_.*”.

Regular Expressions in AS2 Sender Communication Channel
Regular Expressions in AS2 Sender Communication Channel

The dot has the meaning of any character and the Asterisk means zero or more occurrences. To learn more about regular expressions or test your regular expression the page regex101.com is a good place to start.

Commit fault: ASJ.ejb.005043 (Failed in component: sap.com/com.sap.aii.ad)

Commit fault: ASJ.ejb.005043 (Failed in component: sap.com/com.sap.aii.ad)

Scenario

Simple ERP to PI communication via IDOC.

Error

The IDOC is not send out to PI and the following error message is shown in transaction SM58 on ERP system:

Commit fault: ASJ.ejb.005043 (Failed in component: sap.com/com.sap.aii.ad)

Error in SM58
Error in SM58

Solution

To find out why the IDOC cannot be send to our PO system we will check the channel monitoring of the IDOC sender communication channel first. If there is no error in the channel monitor, we have to do dive deeper into the system, by using the XPI Inspector:

  1. Open the XPI Inspector on your SAP PO system.

    http://po.host.name/xpi_inspector

  2. Select Example “50 (XI Channel)” and add your IDOC sender communication channel by searching for the channel name, checking the checkbox and clicking the “Add selected” button.

    XPI Inspector configuration page
    XPI Inspector configuration page
  3. It is best to stop the XPI inspector as soon as possible. Otherwise, you have to look through thousands of log entries. Therefore, open SM58 and search for you message to be prepared to resend the IDOC (Edit -> Execute LUW (F6)).
  4. Hit the “Start” button in XPI inspector and wait till the start page is loaded.
  5. Resend the IDOC (Edit -> Execute LUW (F6)) in SM58.
  6. Click the “Stop” button in XPI inspector and wait for the result page to show up.
  7. Click on the number in the “Records Count” column of the Server Nodes table. If you have multiple Server Nodes, you have to go through all of them.

    XPI Inspector result page
    XPI Inspector result page
  8. Search for a log entry with your IDOC (you can use the browser search CTRL+F and search for your IDocNumber, MessageType or anything else)
    Client = 001
    CreationDate = 20170615
    CreationTime = 171650
    Direction = 1
    EDIMessage =
    EDIMessageGroup =
    EDIMessageType =
    EDIStandardFlag =
    EDIStandardVersion =
    EDITransmissionFile =
    ExpressFlag =
    IDocNumber = 0000000052812406
    IDocSAPRelease = 750
    IDocCompoundType = null
    IDocType = DELVRY07
    IDocTypeExtension =
    MessageCode =
    MessageFunction =
    MessageType = Z_DELV_IT
    OutputMode = 2
    SenderAddress =
    SenderLogicalAddress =
    SenderPartnerFunction =
    SenderPartnerNumber = A22001
    SenderPartnerType = LS
    SenderPort = SAPA22
    Serialization = 20170615171650
    RecipientAddress =
    RecipientLogicalAddress =
    RecipientPartnerFunction =
    RecipientPartnerNumber = RECPPRN
    RecipientPartnerType = LS
    RecipientPort = A000000003
    Status = 30
    TestFlag =
    ROOT (Type: ROOT)
    !
    +-- E2EDL20004 (Type: E1EDL20)
    !
    +-- E2EDL22001 (Type: E1EDL22)
    !
    +-- E2EDL21 (Type: E1EDL21)
    ! !
    ! +-- E2EDL23 (Type: E1EDL23)
  9. Some lines below you should find a line with a red or yellow background with your error
    Warning in XPI Inspector
    Warning in XPI Inspector
    [EXCEPTION]
    com.sap.aii.af.service.cpa.CPAObjectNotFoundException: Couldn't retrieve inbound binding for the given P/S/A values: FP=;TP=;FS=A22_001;TS=;AN=Z_DELV_IT.DELVRY07;ANS=urn:sap-com:document:sap:idoc:messages;
    at com.sap.aii.af.service.cpa.impl.lookup.CommonLookup.getInboundBinding(CommonLookup.java:211)
    at com.sap.aii.af.service.cpa.impl.lookup.CommonLookup.getInboundBinding(CommonLookup.java:175)
    at com.sap.aii.af.service.cpa.InboundRuntimeLookup.(InboundRuntimeLookup.java:88)
    at com.sap.aii.af.service.cpa.impl.lookup.AbstractLookupManager.getBinding(AbstractLookupManager.java:597)
    at com.sap.aii.af.idoc.inbound.IDocInboundProcessor.findBindingAndChannel(IDocInboundProcessor.java:792)
    at com.sap.aii.af.idoc.inbound.IDocInboundProcessor.initForIDocListProcessing(IDocInboundProcessor.java:998)
    at com.sap.aii.af.idoc.inbound.IDocInboundProcessor.process(IDocInboundProcessor.java:146)
    at com.sap.aii.af.idoc.inbound.IDocReceiverBean.onCommit(IDocReceiverBean.java:127)
    at sun.reflect.GeneratedMethodAccessor1393.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.sap.engine.services.ejb3.runtime.impl.RequestInvocationContext.proceedFinal(RequestInvocationContext.java:47)
    at com.sap.engine.services.ejb3.runtime.impl.AbstractInvocationContext.proceed(AbstractInvocationContext.java:166)
    at com.sap.engine.services.ejb3.runtime.impl.Interceptors_StatesTransition.invoke(Interceptors_StatesTransition.java:19)
    at com.sap.engine.services.ejb3.runtime.impl.AbstractInvocationContext.proceed(AbstractInvocationContext.java:179)
    at com.sap.engine.services.ejb3.runtime.impl.Interceptors_Resource.invoke(Interceptors_Resource.java:50)
    at com.sap.engine.services.ejb3.runtime.impl.AbstractInvocationContext.proceed(AbstractInvocationContext.java:179)
    at com.sap.engine.services.ejb3.runtime.impl.Interceptors_MessageListenerType.invoke(Interceptors_MessageListenerType.java:86)
    at com.sap.engine.services.ejb3.runtime.impl.AbstractInvocationContext.proceed(AbstractInvocationContext.java:179)
    at com.sap.engine.services.ejb3.runtime.impl.AbstractInvocationContext.proceed(AbstractInvocationContext.java:191)
    at com.sap.engine.services.ejb3.runtime.impl.Interceptors_StatelessInstanceGetter.invoke(Interceptors_StatelessInstanceGetter.java:23)
    at com.sap.engine.services.ejb3.runtime.impl.AbstractInvocationContext.proceed(AbstractInvocationContext.java:179)
    at com.sap.engine.services.ejb3.runtime.impl.Interceptors_SecurityCheck.invoke(Interceptors_SecurityCheck.java:25)
    at com.sap.engine.services.ejb3.runtime.impl.AbstractInvocationContext.proceed(AbstractInvocationContext.java:179)
    at com.sap.engine.services.ejb3.runtime.impl.Interceptors_ExceptionTracer.invoke(Interceptors_ExceptionTracer.java:17)
    at com.sap.engine.services.ejb3.runtime.impl.AbstractInvocationContext.proceed(AbstractInvocationContext.java:179)
    at com.sap.engine.services.ejb3.runtime.impl.Interceptors_Lock.invoke(Interceptors_Lock.java:21)
    at com.sap.engine.services.ejb3.runtime.impl.AbstractInvocationContext.proceed(AbstractInvocationContext.java:179)
    at com.sap.engine.services.ejb3.runtime.impl.DefaultInvocationChainsManager.startChain(DefaultInvocationChainsManager.java:138)
    at com.sap.engine.services.ejb3.runtime.impl.DefaultEJBProxyInvocationHandler.invoke(DefaultEJBProxyInvocationHandler.java:172)
    at com.sap.engine.services.ejb3.runtime.impl.MDBProxyInvocationHandler.invoke(MDBProxyInvocationHandler.java:142)
    at com.sun.proxy.$Proxy3278.onCommit(Unknown Source)
    at com.sap.mw.jco.jra.JRA$ReaderThread.commit(JRA.java:8639)
    at com.sap.conn.jco.rt.DefaultServerWorker.onCommit(DefaultServerWorker.java:209)
    at com.sap.conn.jco.rt.MiddlewareJavaRfc$JavaRfcServer.playbackTRfc(MiddlewareJavaRfc.java:3008)
    at com.sap.conn.jco.rt.MiddlewareJavaRfc$JavaRfcServer.handletRfcRequest(MiddlewareJavaRfc.java:2875)
    at com.sap.conn.jco.rt.MiddlewareJavaRfc$JavaRfcServer.listen(MiddlewareJavaRfc.java:2674)
    at com.sap.conn.jco.rt.DefaultServerWorker.dispatch(DefaultServerWorker.java:275)
    at com.sap.conn.jco.rt.DefaultServerWorker.loop(DefaultServerWorker.java:356)
    at com.sap.conn.jco.rt.DefaultServerWorker.run(DefaultServerWorker.java:232)
    at com.sap.mw.jco.jra.JRA$ReaderThread.run(JRA.java:8947)
    at com.sap.engine.services.connector.jca15.work.TaskImpl.run(TaskImpl.java:245)
    at com.sap.engine.core.thread.execution.Executable.run(Executable.java:122)
    at com.sap.engine.core.thread.execution.Executable.run(Executable.java:101)
    at com.sap.engine.core.thread.execution.CentralExecutor$SingleThread.run(CentralExecutor.java:328)

The error message

Couldn’t retrieve inbound binding for the given P/S/A values:

probably means that your ICO is not configured correctly. Check that you selected the right IDOC and sending system. Maybe you forgot to transport the configuration? Also, it could be a cache refresh problem. You can edit the description, save the configuration and activate it again to refresh the cache.

Reset CAE Status for Argentina Invoices (AFIP)

Reset CAE Status for Argentina Invoices (AFIP)

Scenario

During the integration of the synchronous AFIP webservice for Argentina invoices via  SAP PI / PO, I did some End-to-End tests and struggled with multiple errors on PI side. Unfortunately, sometimes it was impossible to do a new test because one invoice was no longer in a send able state.

These are the possible states:

CAE Status Description
I Sent to AFIP
A Approved
P Approved with Reservations
R Rejected
N New Document
C Contingency
E Validation Error
O Observations

Error

The following error message is shown when clicking on “Send to AFIP” button in SAP ERP transaction “J1AEXPMONITOR”:

Another document is already in process

Solution

  1. Goto transaction SE16
  2. Insert table name “J_1ACAE” and click on the “Table contents” button
  3. Insert some filters into the mask (optional) and click on the “Execute” button

    Data Browser: J_1ACAE Selection Screen
    Enter filter values and execute
  4. Select line where you would like to change the CAE status and click on the “Change” button

    Data Browser: Table J_1ACAE
    Select one table entry of table “J_1ACAE” to edit
  5. Remove the “X” in field “RFC SENT LOCK” and click on “Save” button

    Change CAE STATUS for table entry
    Change CAE STATUS for table entry
  6. Leave the data browser to unlock the table
  7. Try to resend the message in transaction “J1AEXPMONITOR”
Reset RFC Sent Lock for Argentina Invoices (AFIP)

Reset RFC Sent Lock for Argentina Invoices (AFIP)

Scenario

During the integration of the synchronous AFIP webservice for Argentina invoices via  SAP PI / PO, I did some End-to-End tests and struggled with multiple errors on PI side. Unfortunately, after every test I had to create a new invoice in ERP system, because the invoice was marked as already sent.

As creating a new invoice for every test takes time, I looked for a way to reset the send status of existing invoices.

Error

The following error message was shown when clicking on “Send to AFIP” button in SAP ERP transaction “J1AEXPMONITOR”:

Document is in process

Solution

  1. Goto transaction SE16
  2. Insert table name “J_1ACAE” and click on the “Table contents” button
  3. Insert some filters into the mask (optional) and click on the “Execute” button

    Data Browser: J_1ACAE Selection Screen
    Enter filter values and execute
  4. Select one line and click on the “Change” button

    Data Browser: Table J_1ACAE
    Select one table entry of table “J_1ACAE” to edit
  5. Remove the “X” in field “RFC SENT LOCK” and click on “Save” button

    Remove RFC SENT LOCK for table entry
    Remove RFC SENT LOCK for table entry
  6. Leave the data browser to unlock the table
  7. Try to resend the message in transaction “J1AEXPMONITOR”
Generate WSDLs and decoded URLs for webservices

Generate WSDLs and decoded URLs for webservices

When creating an Interface with SAP Process Integration or SAP Process Orchestration which provides a webservice, you need the WSDL file or at least the URL of your webservice. Otherwise, your partner doesn’t know how to connect to your webservice.

Generate WSDL file

SAP PI and PO has a great feature do generate Web Service Description Language (WSDL) files for configurations with HTTP, XI, SOAP or WS Sender Communication Channels.

To generate a WSDL file:

  1. Open an Integrated Configuration (ICO) (or a Sender Agreement) in the Integration Builder, which is in status “Active”
  2. Click on “Integrated Configuration” in the top menu
  3. Click on “Display WSDL”
Detail View of Integrated Configuration

Detail view of Integrated Configuration (ICO) in Integration Directory (DIR)

A popup should open which displays the WSDL file and an URL to the WSDL file. Now, you can either download the file, use the URL to the WSDL file or directly get the information you need.

Get webservice URL

You can provide the whole WSDL file to your partner or just the URL. If you need the URL only, scroll to the end of the WSDL file . There you can find the HTTP and the HTTPS ports with the webservice URL in the location attribute of the address element. It looks like:

https://pisystem:50001/XISOAPAdapter/MessageServlet?senderParty=&senderService=service&receiverParty=&receiverService=&interface=SI_out&interfaceNamespace=urn%3Anamepspace

Shows Display WSDL window with address section highlighted in Integration Directory (DIR)
Display WSDL window – address section highlighted

Depending on you system configuration and your network structure, you maybe have to change domain and port of your URL before you can provide it to your partner. In case there is a Web Application Firewall, a Web Dispatcher, a Reverse Proxy or something similar in place, you should ask your system administrator for the correct domain and port. If you are communicating over an unprotected network, like the internet, you should always use SSL encryption.

Decode webservice URL

Due to different implementations of URL processing it is sometimes necessary to decode the URL, provided in the WSDL file. For example for the Chrome browser extension Boomerang you need to decode the URL before you can successfully connect to your webservice. If you do not know how your application handles URLs you can test the normal and the decoded URL. For one URL you will get an error like this:

com.sap.aii.af.service.cpa.CPAObjectNotFoundException: Couldn’t retrieve inbound binding for the given P/S/A values: FP=;TP=;FS=null;TS=;AN=null;ANS=null;

To get the decoded URL, just paste your URL in the textbox below and click on the “Decode URL” button.


If you are trying to reach the webservice in a browser you should see something like this:

Message Servlet is in Status OK

Status information:

Servlet com.sap.aii.adapter.soap.web.MessageServlet (Version $Id: //tc/xpi.adapters/NW731EXT_15_REL/src/_soap_application_web_module/webm/api/com/sap/aii/adapter/soap/web/MessageServlet.java#1 $) bound to /MessageServlet
Classname ModuleProcessor: null
Lookupname for localModuleProcessorLookupName: localejbs/ModuleProcessorBean
Lookupname for remoteModuleProcessorLookupName: null
ModuleProcessorClass not instantiated
ModuleProcessorLocal is Instance of com.sun.proxy.$Proxy523
ModuleProcessorRemote not instantiated

 

Error during MDN signature validation – email addresses do not match

Error during MDN signature validation – email addresses do not match

Scenario

PI AS2 Receiver channel to Mendelson AS2 Server with synchronous Message Delivery Notification (MDN) back to PI with signature validation.

Error

In the message protocol of the PI message monitor (PIMON) as well as in B2B Integration Cockpit (B2BIC) the following error is thrown:

MDN message signature cannot be validated. Error is “Email address in singer certificate does not match the sender address. Signer email: [email1@email.com]. Sender email: [email2@email.com]..

Solution

The email address provided in Mendelson AS2 is not equal with the email address which was provided during creation of the certificate. During the validation of the MDN signature PI compares both email address and throws the error. Either a new certificate has to be created or the email address in the Mendelson AS2 Partner configuration has to be adjusted.

Screenshot of Windows Certificate View - Details Tab
Windows Certificate View
Mendelson AS2 Partner Profile Configuration window
Mendelson AS2 Partner Profile Configuration