Decoupling and service-orientation at Amazon

Great article about Amazon´s transformation about a decade ago from an online book-seller into a billion-dollar, IaaS/cloud computing leader at API Evangelist

It is a clear and direct mandate, issued by Jeff Bezos (CEO and founder) to make sure all teams interact through well-defined service interfaces and do not interact on a point-to-point level.

My favorite sentence: “Anyone who doesn’t do this will be fired.  Thank you; have a nice day!

ABAP Inbound Proxy: Extended XML handling

If you can not differentiate between existing XML tags or empty contents or if you use the CDT (Data Type/GDT based on the Core Data Type) Indicator (with values true/false), you might find this useful:

  • Each generated ABAP Proxy structure comes with a CONTROLLER section (internal table).
  • For each field, there is an entry providing information
  • The possible values are:
    • sai_ctrl_initial  => field exists in message with initial value
    • sai_ctrl_nil  => the value xsi:nil is sent
    • sai_ctrl_none => field does not occur in message

See also: SAP Help

 

ABAP Outbound Proxy: Request Acknowledgements

To request System- or Application-Acknowledgements, you have to request them before calling the Outbound Proxy in your ABAP Program:

DATA: l_proxy TYPE REF TO z…,
acknowledgment_request_details TYPE PRX_ACK_REQUEST_DETAILS,
async_messaging TYPE REF TO if_wsprotocol_async_messaging.

CREATE OBJECT l_proxy.

async_messaging ?= l_proxy->get_protocol( if_wsprotocol=>async_messaging ).

acknowledgment_request_details-application_ok = abap_true.
acknowledgment_request_details-application_error = abap_true.

acknowledgment_request_details-system_ok = abap_true.
acknowledgment_request_details-system_error = abap_true.

async_messaging->set_acknowledgment_requested( details = acknowledgment_request_details ).

XSLT Mapping with DynamicConfiguration

…without using SAP XML Toolkit:  SAP Note 1731772

  1. All access to complex objects used as parameters or an object on which methods are called should be casted to the proper type using the XSLTC cast function (xsltc:cast). The xsltc namespace must be present in the namespaces used: xmlns:xsltc=”http://xml.apache.org/xalan/xsltc”
  2. All namespaces pointing to java classes should be defined without java: prefix to be compatible with the JDK toolkit.

Example XSLT mapping:

<?xml version=”1.0″ encoding=”UTF-8″ ?>
<xsl:stylesheet version=”1.0″
xmlns:xsl=”http://www.w3.org/1999/XSL/Transform”
xmlns:xsltc=”http://xml.apache.org/xalan/xsltc”
xmlns:map=”java.util.Map”
xmlns:dyn=”com.sap.aii.mapping.api.DynamicConfiguration”
xmlns:key=”com.sap.aii.mapping.api.DynamicConfigurationKey”>

<xsl:output indent=”no” />
<xsl:param name=”inputparam”/>

<xsl:template match=”/”>

<!– change dynamic configuration –>
<xsl:variable name=”dynamic-conf”
select=”map:get(xsltc:cast(‘java.util.Map’,$inputparam), ‘DynamicConfiguration’)” />
<xsl:variable name=”dynamic-key”
select=”key:create(‘http://sap.com/xi/XI/System/File’, ‘Directory’)” />
<xsl:variable name=”dynamic-value”
select=”dyn:get(xsltc:cast(‘com.sap.aii.mapping.api.DynamicConfiguration’,$dynamic-conf), $dynamic-key)” />
<xsl:variable name=”new-value”
select=”concat($dynamic-value, ‘subfolder’)” />
<xsl:variable name=”dummy”
select=”dyn:put(xsltc:cast(‘com.sap.aii.mapping.api.DynamicConfiguration’,$dynamic-conf), $dynamic-key, $new-value)” />

<!– copy payload –>
<xsl:copy-of select=”.” />
</xsl:template>

</xsl:stylesheet>

IDoc Monitoring in SAP ERP

There is a new transaction to monitor IDocs: WLF_IDOC

2015-02-04_12h17_13

Available since ECC 6 EHP 7 and via SP also:

  • EHP5: SP10
  • EHP6: SP07

It provides rich selection criteria as well as an ALV grid that allows you to e.g.

  • filter
  • reprocess messages in error
  • change IDoc header of messages in error
  • change status

SAP note 1724644 “IDOC Monitor”

SCN Blog

SAP service provisioning alternatives / direct vs. mediated

This article takes a look at what options exist to expose consumable services from an SAP (ABAP) Backend system.

Services can be exposed like this:

  • RFC (RFC-enabled function modules / BAPIs are using the SAP-propietary protocol which must be known on consumer-side)
  • SOAP (Web-Services based on WSDL and SOAP/http(s) internet standards)
  • REST (Representational State Transfer protocol is a lean http-based protocol and currently state-of-the-art especially when consuming from mobile devices. Big advantages, esp. performance, are achieved when using the JSON format and not the XML-based ATOM format)

The architectural question is wheather the service is consumed directly (point-to-point) or mediated. Mediated means using a middleware between the consumer and the provider. The SAP middleware we look at is mainly

  • SAP NetWeaver Process Integration (PI) / SAP NetWeaver Process Orchestration (PO) or
  • SAP NetWeaver Gateway

Reasons for using a middleware (purely from a runtime perspective, not considering interface modeling):

  • Mapping (conversions/transformation necessary)
  • Protocol-Switch (consumer is using a different protocol than service provider)
  • Routing (dynamic routing is needed, e.g. to select between different systems or services)
  • Stateful Message Processing (allow integration patterns like e.g. async-sync communication or to correlate messages based in their contents)
  • General Rule to NOT allow direct SAP backend connectivity (e.g. for security reasons)

The main reason to implement direct communication is runtime performance (minimizing the infrastructure components at runtime to achieve fast response times and avoid points of failure).

NWDS: Download SAP NetWeaver Developer Studio

NWDS Update Site

…you will need your S-User…

There is no 7.4 version, you have to use the 7.31 version for 7.4 (SP-Level minus 5)

Update: For 7.50 there is still no Eclipse plugin available… It has to be downloaded from the Softwarecenter.