https://raw.githubusercontent.com/ajmaradiaga/feeds/main/scmt/topics/Cloud-Integration-blog-posts.xmlSAP Community - Cloud Integration2025-01-20T09:00:09.238604+00:00python-feedgenCloud Integration blog posts in SAP Communityhttps://community.sap.com/t5/crm-and-cx-blogs-by-sap/updated-lj-discover-the-foundations-of-sap-commerce-cloud-and-sap-s-4hana/ba-p/13946141Updated LJ - Discover the foundations of SAP Commerce Cloud and SAP S/4HANA Cloud Integrations2024-11-28T08:25:41.256000+01:00FernandoRedondohttps://community.sap.com/t5/user/viewprofilepage/user-id/7571<P><SPAN class=""><SPAN class="">Hola SAP Community! Fernando at the wheel!</SPAN></SPAN><BR /><BR /><SPAN class="">In Abril 2022 we created from scratch a new learning journey:<SPAN> </SPAN><A href="https://learning.sap.com/learning-journey/discover-the-foundations-of-sap-commerce-cloud-and-sap-s-4hana-cloud-integration?url_id=text-blogs-LSCPLCoE-CommerceBasics" target="_blank" rel="noopener noreferrer"><STRONG>Discover the foundations of SAP Commerce Cloud and SAP S/4HANA Cloud integration</STRONG></A>, read about the original announcement<SPAN> </SPAN><A title="Original Announcement" href="https://community.sap.com/t5/crm-and-cx-blogs-by-sap/new-learning-journey-discover-the-foundations-of-sap-commerce-cloud-and-sap/ba-p/13547668" target="_blank">here</A>.</SPAN></P><P>In April 2023 we updated with major improvements to enhance the learners experience, <SPAN class="">read about the original announcement<SPAN> </SPAN><A title="Update Announcement" href="https://community.sap.com/t5/crm-and-cx-blogs-by-sap/updated-learning-journey-discover-the-foundations-of-sap-commerce-cloud-and/ba-p/13563538" target="_blank">here</A>.</SPAN><BR /><BR /><SPAN>This summer, after more than 20,000 learners going over it and have issued almost 700 </SPAN><A href="https://www.credly.com/org/sap/badge/discover-the-foundations-of-sap-commerce-cloud-and-sap-s-4hana-cloud-integration-record-of-achievement.1" target="_blank" rel="nofollow noopener noreferrer">record of achievement</A><SPAN> to the learners who have completed the whole course, we've analyzed the feedback given to us by them, and started a another update of the whole course content in order to be always improving our content.<BR /></SPAN><BR /><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Learning Journey Screenshot" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/196319i06501D0DC2C10721/image-size/large?v=v2&px=999" role="button" title="Screenshot 2024-11-28 at 08.19.49.png" alt="Learning Journey Screenshot" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Learning Journey Screenshot</span></span><BR /><SPAN>This full course update comes with a long number of changes:</SPAN></P><UL><LI>Replacing all<SPAN> </SPAN><STRONG>graphics interactions with explanation videos</STRONG>.</LI><LI>Optimized the <STRONG>content order</STRONG> for the units and lessons to be more easily understandable.</LI><LI>Providing more fluent <STRONG>text descriptions and narrations for the topics.</STRONG></LI><LI>Updated <STRONG>all resource</STRONG> links, version information and features to the latest SAP Commerce Cloud, S/4HANA Cloud and SAP Cloud Integration sources.</LI><LI>Updated the branding for all the content.</LI></UL><DIV class=""><DIV class=""><DIV class=""><P><SPAN>So, what are you waiting for? go to</SPAN><SPAN> </SPAN><A title="SAP Learning site" href="https://learning.sap.com/" target="_blank" rel="noopener noreferrer"><SPAN>SAP Learning site</SPAN></A><SPAN>, and enroll for the new updated version of <A title="Discovering the Foundations of SAP Commerce Cloud and SAP S/4HANA Cloud Integrations" href="https://learning.sap.com/learning-journeys/discover-the-foundations-of-sap-commerce-cloud-and-sap-s-4hana-cloud-integration" target="_blank" rel="noopener noreferrer">Discovering the Foundations of SAP Commerce Cloud and SAP S/4HANA Cloud Integrations</A>, after completing it... Don't forget to claim your digital badge to show it in your professional social network</SPAN><SPAN> profile!</SPAN></P><P><SPAN>I’ll be back very soon to present you new content and updates for SAP Customer Experience Integration and Extensibility learning area: courses, live sessions, micro learnings and any other educational asset which can be interesting for you!<BR /><BR />In the mean time, I’ll be looking forward to your feedback and questions via comments here in this post.</SPAN></P></DIV></DIV></DIV><DIV class=""> </DIV>2024-11-28T08:25:41.256000+01:00https://community.sap.com/t5/technology-blogs-by-sap/please-share-your-experience-new-api-management-survey/ba-p/13950848Please share your experience - new API Management survey2024-11-28T12:08:40.807000+01:00Chaim_Bendelachttps://community.sap.com/t5/user/viewprofilepage/user-id/194397<P>Dear <a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1862993">@SAP</a> Integration Customers,</P><P>We are always eager to learn more about how our customers interact with SAP Integration Suite.</P><P>In particular, we are interested in hearing how you use the <STRONG>API Management</STRONG> capability of SAP Integration Suite —or why you might <EM>not</EM> use it yet. Whether you’re an experienced API administrator, an integration specialist, or have never used API Management, we’d love to hear from you!</P><P>Your feedback helps shape the future of SAP Integration Suite and meet your needs better. </P><P><STRONG>Who Should Participate?</STRONG></P><P> ✓ Current API Management users: Share how you're implementing and benefiting from the capability<BR /> ✓ Customers not currently using API Management: Help us understand your reasons and challenges</P><P><STRONG>Survey: <A href="https://sapinsights.eu.qualtrics.com/jfe/form/SV_e3wbmDkZ4eGGgd0" target="_blank" rel="noopener nofollow noreferrer">Usage of API Management</A> </STRONG></P><P><EM>Hugely appreciated! <span class="lia-unicode-emoji" title=":slightly_smiling_face:">🙂</span></EM></P><P>--<BR />Chaim Bendelac<BR />Product Manager - SAP Integration Suite</P>2024-11-28T12:08:40.807000+01:00https://community.sap.com/t5/technology-blogs-by-members/sap-trading-partner-management-part-iii-partner-configuration/ba-p/13888572SAP Trading Partner Management - Part III: Partner configuration2024-12-02T12:05:51.028000+01:00jirifridrichhttps://community.sap.com/t5/user/viewprofilepage/user-id/146600<P class="">Now let's focus on the PARTNER part of the EDI message exchange. </P><P class="">At first we need to configure our Parent Company, which is the business entity we are going to integrate with external Trading Partners. We can have only one Parent Company, which means we cannot create a dummy one for testing.</P><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="jirifridrich_0-1728042472071.png" style="width: 432px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/175311i122F3CFBD0261510/image-dimensions/432x177?v=v2" width="432" height="177" role="button" title="jirifridrich_0-1728042472071.png" alt="jirifridrich_0-1728042472071.png" /></span></DIV><DIV class=""><SPAN>We configure Parent Company the same way we configure external Trading Partners. I will describe the configuration of a Trading Partner, but the same applies to Parent Company. </SPAN><SPAN>Trading Partners are those companies we will be communicating with. Before configuring our Partner, we should be clear about 3 levels of communication which we need to establish:</SPAN></DIV><UL class=""><LI><STRONG>System<SPAN> </SPAN></STRONG>— Type of our Partner’s back-end system (SAP, Microsoft etc.). This is not mandatory and we can name it as we want in case we don’t know</LI><LI><STRONG>Type System</STRONG><SPAN> </SPAN>— this is the message format we use in our mutual communication (X12, IDoc, Edifact)</LI><LI><STRONG>Communication<SPAN> </SPAN></STRONG>— the transmission technology or protocol of the exchange, which will define the integration adapter in SAP Cloud Integration (HTTP, IDoc, AS2)</LI></UL><P class="">Let’s say our Partner<SPAN> </SPAN><STRONG>ACME Corp<SPAN> </SPAN></STRONG>uses<SPAN> </SPAN><STRONG>SAP S/4HANA</STRONG><SPAN> </SPAN>as their ERP system,<SPAN> </SPAN><STRONG>IDoc<SPAN> </SPAN></STRONG>format as the exchange message type and<SPAN> </SPAN><STRONG>AS2<SPAN> </SPAN></STRONG>protocol as the technical communication channel.</P><P class="">With this in mind, we can configure our Trading Partner.</P><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="jirifridrich_1-1728042472073.png" style="width: 517px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/175312i18DDEF06BDA6A004/image-dimensions/517x216?v=v2" width="517" height="216" role="button" title="jirifridrich_1-1728042472073.png" alt="jirifridrich_1-1728042472073.png" /></span></DIV><DIV class=""><SPAN>Clicking on the Trading Partner, we enter the Trading Partner Profile. We fill purely descriptive sections Overview and Contacts and let’s jump to Identifiers.</SPAN></DIV><H2 id="toc-hId-1050887194"><SPAN>Identifiers</SPAN></H2><P><SPAN>These are codes, identifying our Parent Company and Trading Partners in the communication.</SPAN></P><DIV class=""><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="jirifridrich_2-1728042472074.png" style="width: 548px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/175313iA411FE5512F83AB3/image-dimensions/548x200?v=v2" width="548" height="200" role="button" title="jirifridrich_2-1728042472074.png" alt="jirifridrich_2-1728042472074.png" /></span></DIV><DIV class=""><SPAN>SAP recognizes two sets of Identifiers:</SPAN></DIV></DIV><UL class=""><LI>codes identifying the Partners (including Parent Company) in the Parent Company’s own back-end system</LI><LI>codes identifying the Partners (including Parent Company) in the EDI message exchange, ie. these IDs will be used in the message itself and will be validated against TPM configuration. Often these Identifiers are assigned by Dun & Bradstreet or other recognized institution.</LI></UL><P class="">We can as well use only one Identifier and if needed, we can map it to whatever value we want in our back-end system. This is the case of our scenario. Let’s say that in our EDI communication with ACME Corp the Identifier 10001_ACME_IDOC will be used in the message exchange.</P><P class="">For our ACME Corp, let’s now create two Identifiers. Identifiers are system-specific, so if our Trading Partner operates IDoc message format, as well as X12 message format, we need to create at least two Identifiers. You can see that for IDoc there is no Scheme available, whereas for X12 EDI format we can choose from various institutions. When using IDs which are not officially assigned by any institution, we can select Mutually Defined, which is also a common choice in the real world.</P><DIV class=""><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="jirifridrich_3-1728042472077.png" style="width: 523px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/175314i751301644E2DD21E/image-dimensions/523x217?v=v2" width="523" height="217" role="button" title="jirifridrich_3-1728042472077.png" alt="jirifridrich_3-1728042472077.png" /></span></DIV><DIV class=""><SPAN>For simplification, from now on we will consider ACME Corp running only IDoc communication.</SPAN></DIV><DIV class=""><SPAN>Systems.<BR /></SPAN><SPAN>We skip Business Context section, which is descriptive and helps with the business classification, and have a look at Systems tab. Each System represents a technological platform, which the partner operates — SAP S/4HANA, Microsoft, Amazon, Adobe etc. This is not related to a communication protocol, rather to an ERP or EDI system.</SPAN><P> </P></DIV></DIV><DIV class=""><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="jirifridrich_4-1728042472078.png" style="width: 491px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/175315i691466E9D7D46933/image-dimensions/491x108?v=v2" width="491" height="108" role="button" title="jirifridrich_4-1728042472078.png" alt="jirifridrich_4-1728042472078.png" /></span></DIV><H2 id="toc-hId-854373689"><SPAN>Type System</SPAN></H2></DIV><P class="">Clicking on the ACME SAP system, another screen opens. These Type Systems are the communication types. If we exchange IDocs with our Partner, the message format will be XML, even though the Communication type can be HTTP or AS2. This can be confusing. Here you specify solely the message format, not the communication protocol.</P><DIV class=""><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="jirifridrich_5-1728042472079.png" style="width: 516px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/175316i6AFEFCF59A8F53B0/image-dimensions/516x151?v=v2" width="516" height="151" role="button" title="jirifridrich_5-1728042472079.png" alt="jirifridrich_5-1728042472079.png" /></span></DIV></DIV><P class="">Creating a new Type System, we have to select from a dropdown list. Apart of ASC X12 and on-prem SAP S/4HANA we have the following choice:</P><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="jirifridrich_6-1728042472079.png" style="width: 495px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/175317iC6C8F74B8A101D6F/image-dimensions/495x296?v=v2" width="495" height="296" role="button" title="jirifridrich_6-1728042472079.png" alt="jirifridrich_6-1728042472079.png" /></span></DIV><H1 id="toc-hId-528777465"><BR />Communications</H1><P class="">Now we get to Communication channel, which represents the technical integration<SPAN> </SPAN><STRONG>adapter in SAP Cloud Integration.</STRONG></P><DIV class=""><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="jirifridrich_7-1728042472079.png" style="width: 647px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/175318i3CAA87BC27BD04D6/image-dimensions/647x157?v=v2" width="647" height="157" role="button" title="jirifridrich_7-1728042472079.png" alt="jirifridrich_7-1728042472079.png" /></span></DIV></DIV><P class="">In our scenario, we communicate over AS2 protocol, so we establish 3 channels — Sender, Receiver and one more Receiver for MDN acknowledgement.</P><P class="">If our preferred communication channel is not listed (for example SFTP at this moment), we select Process_Direct and we have to create a custom separate iflow with SFTP adapter.</P><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="jirifridrich_8-1728042472078.png" style="width: 569px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/175319iA100D773A935DD18/image-dimensions/569x310?v=v2" width="569" height="310" role="button" title="jirifridrich_8-1728042472078.png" alt="jirifridrich_8-1728042472078.png" /></span></DIV><P class="">Now we have to configure the individual channels. This is the same activity as configuring them in the SAP Cloud Integration iflow. For its complexity I will describe the AS2 settings, but in a separate blog.</P><P class="">Now we have configured our Trading Partner. Nevertheless, we are still not able to exchange a message with this Partner. We need to set Agreement to be able to do so. This we will see in the next chapter.</P>2024-12-02T12:05:51.028000+01:00https://community.sap.com/t5/technology-blogs-by-members/sap-pi-migration-to-btp-integration-suite-patterns-and-learning-experiences/ba-p/13954662SAP PI Migration to BTP Integration Suite Patterns and learning experiences2024-12-04T11:45:02.414000+01:00saikrishna_kalivarapu2https://community.sap.com/t5/user/viewprofilepage/user-id/209362<P>In this blog, we share integration patterns used in SAP PI Migration to BTP Integration Suite as well as shared our learning experiences during migration.</P><P> </P><P>Here is high level diagram of integration patterns used:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="saikrishna_kalivarapu2_0-1733261512585.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/198039i5A2BEC13EAF2344E/image-size/medium?v=v2&px=400" role="button" title="saikrishna_kalivarapu2_0-1733261512585.png" alt="saikrishna_kalivarapu2_0-1733261512585.png" /></span></P><P> </P><P>Here are descriptions of each pattern:</P><OL><LI>SAP business systems consuming SAP BTP iflow’s using XI/SOAP adapters<UL><LI>XI is mainly used for async or sync without business faults</LI><LI>SOAP is mainly used for sync with business fault messages</LI><LI>SAP BTP Integration suite has been accessed via SAP webdispatcher and <A href="https://community.sap.com/t5/technology-blogs-by-members/migration-of-api-s-without-consumer-impact-pi-migration-to-btp-integration/ba-p/13916176" target="_blank">blog</A> explains on how to use the same.</LI></UL></LI><LI>APIs exposed follows below patterns:<UL><LI>Pattern 1:<UL><LI> SAP BTP API management proxy -> SAP BTP Cloud integration iFlow -> SAP business systems (via cloud connector using XI/SOAP adapters)</LI><LI> API management proxy is used for JWT validation (non SAP identity provider)/ip filtering and exposing API using specific url naming conventions</LI><LI>SAP CI iflow for request and response transformations</LI></UL></LI><LI>Pattern 2:<UL><LI> SAP BTP API management proxy -> SAP Gateway ODATA API (via cloud connector)</LI><LI> API management proxy is used for JWT validation/ip filtering and exposing API using specific url naming conventions/converting between odata api format and open API specification.</LI><LI>Pattern 3:<UL><LI> SAP Cloud integration iflow -> SAP business systems (via cloud connector using XI/SOAP adapters)</LI><LI> We are using SAP identify provider for oauth 2.0 and iflow used for request, response transformations</LI></UL></LI></UL></LI></UL></LI><LI>APIs or SOAP services consumption:<UL><LI><SPAN>Cloud integration iflow to Internal on premise/privately managed cloud APIs via cloud connector and Oauth 2.0</SPAN></LI><LI>Cloud integration iflow to external using https with oauth 2.0 from external providers</LI></UL></LI><LI>SFTP communication<UL><LI>SFTP adapter using SSH for internal SFTP communication via cloud connector</LI><LI>SFTP adapter using SSH for external SFTP communication</LI></UL></LI><LI>Eventing solution:<UL><LI>Async outbound and inbound integration with Advanced Event Mesh and Event Mesh (AMQP)</LI><LI>Async outbound and inbound integration with Confluent Cloud KAFKA using Advantco kafka adapter<UL><LI> KAFKA adapter in Cloud integration has limited functionalities and Advantco kafka adapter has advanced configurations for Confluent cloud</LI></UL></LI></UL></LI><LI>Datasphere communication:<UL><LI>Not part of PI migration but used https and JDBC communication <UL><LI> Activity logs using https adapter</LI><LI> Audit log or any data related interfaces using JDBC</LI></UL></LI><LI>Splunk<UL><LI>Splunk monitoring integration using MPL – using https or splunk adapter</LI></UL></LI></UL></LI><LI>Mail adapter via cloud connector to send emails securely</LI></OL><P> </P><P>Here are key learnings we had during PI migration:</P><UL><LI>Pattern by pattern migration</LI><LI>Redesign interfaces when needed (like BPM, adapter modules, authentication)</LI><LI>Migration tool is evolving but few changes in PI can be done to migration ICOs when migration tool is not working (like removing of external libraries, removing complex routing)</LI><LI>Identify workarounds if possible- as an example until IBM MQ adapter gets delivered, we could use AMQP</LI><LI>Sizing with SAP</LI><LI>Perform performance test to avoid memory exhaustion, IO exceptions, datastore connection issues, reaching limits of monitoring storage</LI><LI>Request SAP/ Open SAP ticket to increase resources based on your usage/sizing</LI><LI>Reduce usage of datastore (instead use internal JMS queues)</LI><LI>If needed increase JMS internal queues up to 100 (increase further with SAP ticket)</LI><LI>Try not to enable transaction handling (JDBC/JMS)</LI><LI>XI receiver adapter- try to use QoS Exactly once JMS queue instead of Data store</LI><LI>XI sender adapter- try to use QoS At least once JMS instead of Exactly once Datastore</LI><LI>Try to not log payloads or header for high volume interfaces</LI><LI>SOAP vs XI adapter – fault handling vs sxmb_moni logs</LI><LI>Organizing Cloud integration packages and naming conventions/development standards</LI><LI>Implement generic groovy scripts:</LI><LI><A href="https://community.sap.com/t5/technology-blogs-by-members/generic-groovy-script-to-log-multiple-custom-headers-in-btp-cloud/ba-p/13895590" target="_blank">Log multiple customer headers</A></LI><LI><A href="https://community.sap.com/t5/technology-blogs-by-members/generic-groovy-script-to-update-json-data-types-in-json-payload/ba-p/13901992" target="_blank">Update </A><A href="https://community.sap.com/t5/technology-blogs-by-members/generic-groovy-script-to-update-json-data-types-in-json-payload/ba-p/13901992" target="_blank">json</A><A href="https://community.sap.com/t5/technology-blogs-by-members/generic-groovy-script-to-update-json-data-types-in-json-payload/ba-p/13901992" target="_blank"> datatypes in </A><A href="https://community.sap.com/t5/technology-blogs-by-members/generic-groovy-script-to-update-json-data-types-in-json-payload/ba-p/13901992" target="_blank">json</A><A href="https://community.sap.com/t5/technology-blogs-by-members/generic-groovy-script-to-update-json-data-types-in-json-payload/ba-p/13901992" target="_blank"> payload</A></LI><LI>Implement reusable fault message types:</LI><LI>Create generic fault message types mapping</LI><LI>Update message type names using groovy scripts</LI><LI>Develop generic iflow to migrate value maps</LI><LI>Deploy Undeploy Config tool documented in <A href="https://community.sap.com/t5/technology-blogs-by-members/sap-btp-integration-suite-deploy-undeploy-config-tool-part-1/ba-p/13875027" target="_self">blog</A></LI></UL><P>To conclude, we have shared integration patterns and learning experiences which can used by other SAP customers.</P>2024-12-04T11:45:02.414000+01:00https://community.sap.com/t5/technology-blogs-by-sap/new-pipeline-concept-features-more-bypass-options-and-custom-extensions/ba-p/13955138New Pipeline Concept features: more bypass options and custom extensions2024-12-04T12:41:15.645000+01:00alex_bundschuhhttps://community.sap.com/t5/user/viewprofilepage/user-id/45178<P>We have recently shipped a new version 1.0.8 of the <A href="https://community.sap.com/t5/technology-blogs-by-sap/introducing-the-new-pipeline-concept-in-cloud-integration/ba-p/13639651" target="_blank">Pipeline Concept</A> were we introduced the following new features:</P><UL><LI>Option to combine receiver and interface determination in one single XSLT mapping for an improved runtime behavior</LI><LI>Option to bypass interface determination pipeline step in case of Recipient List pattern without interface split</LI><LI>Option to bypass receiver determination pipeline step in case of interface split scenarios with one single receiver only</LI><LI>Supporting header-based XSLT routing conditions if message body is non-XML</LI><LI>Extension for custom receiver determination instead of XSLT from Partner Directory</LI><LI>Extension for custom interface determination instead of XSLT from Partner Directory</LI><LI>New pipeline processing log providing more details if message is stored to the dead letter queue</LI><LI>Fixed standard retry handling for generic integration flows with splitter to avoid message duplicates</LI></UL><P>The package can be accessed from the <A href="https://hub.sap.com/package/PIPipelineGenericIntegrationFlows/integrationflow" target="_blank" rel="noopener noreferrer">SAP Business Accelerator Hub</A>. If you have already copied the package to your workspace in your SAP Integration Suite tenant, you can simply run the update of the package to be able to use the latest features.</P><P>Let me briefly describe some of the new features.</P><H2 id="toc-hId-1076652447">Further bypass options</H2><P>With version 1.0.6, we have already shipped a bypass option for pure Point-to-Point scenarios, see <A class="" href="https://community.sap.com/t5/technology-blogs-by-sap/new-pipeline-concept-features-new-partner-id-definition-alternative-partner/ba-p/13787400" target="_blank">New Pipeline Concept features: new partner id definition, alternative partner, bypass option</A>. With the latest version, you now have the option to either bypass the receiver determination or the interface determination depending on your integration scenario. For an interface split scenario with one single receiver only, you can bypass the receiver determination. For a Recipient List pattern with one interface per receiver, you can bypass the interface determination. In any cases, by applying the different bypass options you can save at least one JMS queue and one pipeline step which leads to an improved runtime behavior.</P><P>Further runtime improvements can be achieved by combining the receiver determination xpaths and the interface determination xpaths in one single XSLT. This use case is actually a special case of the interface determination bypass option. Here, the receiver determination pipeline step has been enhanced supporting a receiver determination XSLT that contains xpaths conditions for both the receiver and the interface determination. The receiver determination pipeline step then splits both the number of receivers and the number of interfaces. This way, you only need to read, decode, and run one single XSLT instead of multiple interface determination XSLTs for each receiver.</P><P>Here's an example of such a combined XSLT:</P><P> </P><pre class="lia-code-sample language-markup"><code><?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="dc_country"/>
<xsl:template match="/">
<ns0:Receivers xmlns:ns0="http://sap.com/xi/XI/System">
<ReceiverNotDetermined>
<Type>Error</Type>
<DefaultReceiver/>
</ReceiverNotDetermined>
<xsl:if test="/*:Item/Category = 'Keyboards'">
<Receiver>
<Service>Receiver_11</Service>
<Interfaces>
<xsl:if test="/*:Item/Quantity = '10'">
<Interface>
<Index>1</Index>
<Service>/PIP/Step07/Samples/Scenario_1/Receiver_11/IfIdx1</Service>
</Interface>
</xsl:if>
<xsl:if test="/*:Item/CurrencyCode = 'EUR'">
<Interface>
<Index>2</Index>
<Service>/PIP/Step07/Samples/Scenario_1/Receiver_11/IfIdx2</Service>
</Interface>
</xsl:if>
<xsl:if test="/*:Item/Quantity != '10'">
<Interface>
<Index>3</Index>
<Service>/PIP/Step07/Samples/Scenario_1/Receiver_11/IfIdx3</Service>
</Interface>
</xsl:if>
</Interfaces>
</Receiver>
</xsl:if>
<xsl:if test="(/*:Item/Category = 'Keyboards') or (/*:Item/Category = 'Software')">
<Receiver>
<Service>Receiver_12</Service>
<Interfaces>
<xsl:if test="$dc_country = 'DE'">
<Interface>
<Index>1</Index>
<Service>/PIP/Step07/Samples/Scenario_1/Receiver_12/IfIdx1</Service>
</Interface>
</xsl:if>
<xsl:if test="$dc_country != 'DE'">
<Interface>
<Index>2</Index>
<Service>/PIP/Step07/Samples/Scenario_1/Receiver_12/IfIdx2</Service>
</Interface>
</xsl:if>
</Interfaces>
</Receiver>
</xsl:if>
</ns0:Receivers>
</xsl:template>
</xsl:stylesheet></code></pre><P> </P><P>As you can see, the XSLT contains the receiver components as well as the receiver interface index and the end points of the scenario-specific outbound processing flows where the mappings and the delivery to the receivers are done. By providing the end point information here, the interface determination pipeline step is bypassed.</P><P>For more details, see <A href="https://help.sap.com/docs/migration-guide-po/migration-guide-for-sap-process-orchestration/special-cases#pipeline-bypass-options" target="_blank" rel="noopener noreferrer">Pipeline Bypass Options</A>.</P><H2 id="toc-hId-880138942">Custom extensions</H2><P>As an alternative to the standard receiver or interface determination based on an XSLT from the Partner Directory, you can implement your own custom receiver or interface determination. The generic integration flows support a kind of custom exit that you can use to run your own custom logic without changing the delivered generic integration flows. To do so, you must implement a separate scenario-specific integration flow that's called instead of the standard XSLT mappings.</P><P>You do not need to create the scenario-specific integration flows from scratch, the updated Pipeline package contains templates that you can copy and adapt to your needs. The templates have the target XSDs as references which eases the implementation effort. So, you can create a message mapping that maps to the target structure or alternatively you can create your own groovy scripts or use any other logic which you prefer. The target XSD for the receiver determination by the way supports the combined receiver and interface determination as described above. So, when using the custom extensions, you can also leverage the bypass options.</P><P>For more details, see <A href="https://help.sap.com/docs/migration-guide-po/migration-guide-for-sap-process-orchestration/customizing-pipeline-concept" target="_blank" rel="noopener noreferrer">Customizing the Pipeline Concept</A>.</P><H2 id="toc-hId-683625437">Non-XML payloads</H2><P><SPAN>When running an XSLT mapping to determine the list of receivers or interfaces for non-XML messages, you usually run into an error even if the conditions are based on headers only because the XSLT expects an XML. To overcome this error, a dummy XML is created right before running the XSLT. With this, you are able to process non-XML messages within the pipeline without the need to convert into XML before.</SPAN></P><H2 id="toc-hId-487111932">Processing log</H2><P><SPAN>At various places during message processing, information is stored in a new header which we pass across the pipeline steps. We decided to add the log information whenever we call groovy scripts to avoid to make too many changes to the integration flow model. Whenever a message is stored in the dead letter queue because the maximum of retries has been exceeded, the log information is attached to the message processing log.</SPAN></P><H2 id="toc-hId-290598427">Retry handling</H2><P><SPAN><SPAN class=""><SPAN class=""><SPAN class="">For the generic </SPAN></SPAN></SPAN><SPAN class=""><SPAN class=""><SPAN class="">receiver </SPAN></SPAN></SPAN><SPAN class=""><SPAN class=""><SPAN class="">and interface determination </SPAN></SPAN></SPAN><SPAN class=""><SPAN class=""><SPAN class="">integration flows </SPAN></SPAN></SPAN><SPAN class=""><SPAN class=""><SPAN class="">where the message is split, </SPAN></SPAN></SPAN><SPAN class=""><SPAN class=""><SPAN class="">t</SPAN></SPAN></SPAN><SPAN class=""><SPAN class=""><SPAN class="">ransaction handling ensures that split messages are rolled back in case of an error</SPAN></SPAN></SPAN><SPAN class=""><SPAN class=""><SPAN class="">. H</SPAN></SPAN></SPAN><SPAN class=""><SPAN class=""><SPAN class="">owever</SPAN></SPAN></SPAN><SPAN class=""><SPAN class=""><SPAN class="">,</SPAN></SPAN></SPAN><SPAN class=""><SPAN class=""><SPAN class=""> if the message is forwarded to the dead letter queue</SPAN></SPAN></SPAN><SPAN class=""><SPAN class=""><SPAN class="">,</SPAN></SPAN></SPAN><SPAN class=""><SPAN class=""><SPAN class=""> the </SPAN></SPAN></SPAN><SPAN class=""><SPAN class=""><SPAN class="">message processing ends with</SPAN></SPAN></SPAN><SPAN class=""><SPAN class=""><SPAN class=""> either </SPAN></SPAN></SPAN><SPAN class=""><SPAN class=""><SPAN class="">a message end event or an escalation end event</SPAN></SPAN></SPAN><SPAN class=""><SPAN class=""><SPAN class=""> so that in rare cases already split messages might be</SPAN></SPAN></SPAN><SPAN class=""><SPAN class=""><SPAN class=""> committed</SPAN></SPAN></SPAN><SPAN class=""><SPAN class=""><SPAN class="">. This may lead to duplicates if the message</SPAN></SPAN></SPAN><SPAN class=""><SPAN class=""><SPAN class=""> is </SPAN></SPAN></SPAN><SPAN class=""><SPAN class=""><SPAN class="">moved from the dead letter queue to the actual queue </SPAN></SPAN></SPAN><SPAN class=""><SPAN class=""><SPAN class="">for reprocessing.</SPAN></SPAN></SPAN> <SPAN class=""><SPAN class=""><SPAN class="">To avoid duplicates, we had to change the standard retry handling within the receiver and the interface determination flows. When the actual maximum number of retries have been exceeded, we need to do an additional retry </SPAN></SPAN></SPAN><SPAN class=""><SPAN class=""><SPAN class="">and then </SPAN></SPAN></SPAN><SPAN class=""><SPAN class=""><SPAN class="">check</SPAN></SPAN></SPAN><SPAN class=""><SPAN class=""><SPAN class=""> right at the beginning of the </SPAN></SPAN></SPAN><SPAN class=""><SPAN class=""><SPAN class="">integration flows</SPAN></SPAN></SPAN><SPAN class=""><SPAN class=""><SPAN class=""> before splitting the message. For the other generic flows that do not carry out a split, the retry handling kept unchanged.</SPAN></SPAN></SPAN></SPAN></P><P> </P><P>If you like to try out the pipeline concept in general and the new features in particular, check out this <A href="https://github.com/peasantsboot/ProcessIntegrationPipelineSampleScenarios" target="_blank" rel="noopener nofollow noreferrer">github repository</A> where I describe how to setup sample scenarios using the pipeline concept. Here, we have added the following new scenarios and scenario variants leveraging the new features:</P><UL><LI><A href="https://github.com/peasantsboot/ProcessIntegrationPipelineSampleScenarios/tree/main/scenarios/scenario1A" target="_blank" rel="noopener nofollow noreferrer">Scenario 1A</A>, <A href="https://github.com/peasantsboot/ProcessIntegrationPipelineSampleScenarios/tree/main/scenarios/scenario2A" target="_blank" rel="noopener nofollow noreferrer">scenario 2A</A> and <A href="https://github.com/peasantsboot/ProcessIntegrationPipelineSampleScenarios/tree/main/scenarios/scenario2B" target="_blank" rel="noopener nofollow noreferrer">scenario 2B</A> cover the bypass options including the combined receiver and interface determination.</LI><LI><A href="https://github.com/peasantsboot/ProcessIntegrationPipelineSampleScenarios/tree/main/scenarios/scenario2C" target="_blank" rel="noopener nofollow noreferrer">Scenario 2C</A> and <A href="https://github.com/peasantsboot/ProcessIntegrationPipelineSampleScenarios/tree/main/scenarios/scenario4A" target="_blank" rel="noopener nofollow noreferrer">scenario 4A</A> cover the custom extensions samples.</LI><LI><A href="https://github.com/peasantsboot/ProcessIntegrationPipelineSampleScenarios/tree/main/scenarios/scenario7" target="_blank" rel="noopener nofollow noreferrer">Scenario 7</A> covers the non-XML payload use case.</LI></UL><P>As usually, in case of feedback, feel free to reach out to me.</P>2024-12-04T12:41:15.645000+01:00https://community.sap.com/t5/technology-blogs-by-sap/how-to-provide-read-only-access-to-integration-advisor/ba-p/13931556How to Provide Read-only Access to Integration Advisor2024-12-09T09:00:00.044000+01:00stefan_bollerhttps://community.sap.com/t5/user/viewprofilepage/user-id/196798<H1 id="toc-hId-945607426">Introduction</H1><P>Recently, we delivered a new role in Integration Advisor, which allows read-only access to the application in addition to the existing content developer and content admin roles. In this blog post, I will show how you can assign this role to a user in Neo as well as in CF.</P><H1 id="toc-hId-749093921">How to?</H1><P>First you must assign yourself to the role of a "Subaccount Administrator" in the subaccount which is subscribed to Integration Suite (in CF) or you must be a member with at least "Application User Admin" role in the subaccount which is subscribed to Cloud Integration (in Neo).</P><H2 id="toc-hId-681663135">Role assignment (CF)</H2><P>Now, you can assign the new role to your users. Open your subaccount in the BTP cokcpit and navigate to Security->Users:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Open user maintenance" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/188353i9D19E50B7C2CFE51/image-size/large?v=v2&px=999" role="button" title="stefan_boller_1-1731060280098.png" alt="Open user maintenance" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Open user maintenance</span></span></P><P> </P><P>Then click on the user, that you want to assign a role to (if the user doesn't yet exist you can create it via the "Create" button), and navigate to "Role Collections" on the right hand side:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Role Assignment" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/188354iF493035E9BE435E3/image-size/large?v=v2&px=999" role="button" title="stefan_boller_2-1731060319833.png" alt="Role Assignment" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Role Assignment</span></span></P><P>There click on the button "Assign Role Collection", select the role collection "iadv-content-read" and press "Assign Role Collection". Check if there are no other "iadv-*" role collections assigned to the user. If there are some, remove the assignment, otherwise the user can still create and modify content in Integration Advisor.</P><P>For more details you can also read <A href="https://help.sap.com/docs/integration-suite/sap-integration-suite/configuring-user-access?locale=en-US" target="_blank" rel="noopener noreferrer">Configuring User Access to SAP Integration Suite</A> and <A href="https://help.sap.com/docs/btp/sap-business-technology-platform/security-administration-managing-authentication-and-authorization?locale=en-US" target="_blank" rel="noopener noreferrer">Security Administration: Managing Authentication and Authorization</A>.</P><H2 id="toc-hId-485149630">Role assignment (Neo)</H2><P>Open your subaccount in the BTP cockpit and navigate to Security->Authorizations:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Maintain Authorizations" style="width: 265px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/188351i9CFF667D933A51AE/image-size/large?v=v2&px=999" role="button" title="stefan_boller_0-1731060225752.png" alt="Maintain Authorizations" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Maintain Authorizations</span></span></P><P> </P><P>There enter the user ID and press the "Show Assignments" button (alternatively, you can also navigate to "Groups" and select a user group from the list of available groups, if you want to assign a whole group to the new role):</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Display of Role Assignments" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/188359iE6204A3850B479CE/image-size/large?v=v2&px=999" role="button" title="stefan_boller_3-1731060475533.png" alt="Display of Role Assignments" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Display of Role Assignments</span></span></P><P>If the role "Guidelines.ReadWrite" is shown, remove it, because otherwise this will take precedence over the read-only role. Then press the "Assign" button of the "Roles" table and select your Integration Advisor subscription in the popup:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Assignment of Roles" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/188364i33E78DE8C778C41E/image-size/large?v=v2&px=999" role="button" title="stefan_boller_4-1731060918626.png" alt="Assignment of Roles" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Assignment of Roles</span></span></P><P>Select the role "Guidelines.Read" and press "Assign", then repeat the same for the role TypeSystem.Read, which is needed additionally for all Integration Advisor users. For more details you can also read <A href="https://help.sap.com/docs/cloud-integration/sap-cloud-integration/assigning-users-for-sap-integration-advisor-neo?locale=en-US" target="_blank" rel="noopener noreferrer">Assigning Users for SAP Integration Advisor</A> and <A href="https://help.sap.com/docs/btp/sap-btp-neo-environment/managing-roles?locale=en-US" target="_blank" rel="noopener noreferrer">Managing Roles</A>.</P><H1 id="toc-hId-159553406">Usage of new role</H1><P>Logout from the cockpit and open the Integration Suite (or Integration Advisor for Neo) URL in your browser. If asked for a user, use the user, that you assigned the new role to. Then Integration Advisor will open in read-only mode, where all modifying activities are not possible:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="stefan_boller_0-1731061635907.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/188367iBC0D4DED5D986036/image-size/large?v=v2&px=999" role="button" title="stefan_boller_0-1731061635907.png" alt="stefan_boller_0-1731061635907.png" /></span></P><P>More specifically, the new role enables you to:</P><UL><LI>View the following artefacts in read mode: Type system library, MIGs, MAGs, Custom Type Systems</LI><LI>Simulate MIGs and MAGs</LI><LI>Export Runtime Artefacts for MIGs and MAGs</LI><LI>Export Documentation (PDF, XLS) for MIGs and MAGs</LI></UL><P>The new role does not allow any modifying actions like</P><UL><LI>Create, Edit, Activate, Copy</LI><LI>Import</LI></UL><P>(see also <A href="https://help.sap.com/docs/cloud-integration/sap-cloud-integration/assigning-users-for-sap-integration-advisor" target="_self" rel="noopener noreferrer">SAP Online Help</A>)</P><H1 id="toc-hId--36960099">Summary</H1><P>You know now how you can assign the new read-only role of Integration Advisor to your users, so that they can only view content but not modify it, which is helpful for productive systems and for support users who shall not change anything in the system, but only check the content.</P><P><SPAN>Please, share your ideas and feedback in a comment. Furthermore, you can follow the </SPAN><A href="https://community.sap.com/topics/integration-suite" target="_blank">SAP Integration Suite topic page</A><SPAN> to get to know more about Integration Suite in general, or read other posts about </SPAN><A href="https://blogs.sap.com/tag/integration-advisor/" target="_blank" rel="noopener noreferrer">Integration Advisor</A><SPAN>. You can also follow my profile if you want to read similar content in the future.</SPAN></P><P> </P>2024-12-09T09:00:00.044000+01:00https://community.sap.com/t5/technology-blogs-by-members/which-s-4hana-extensibility-option-is-the-best-for-thriving-as-an-sap/ba-p/13959090Which S/4HANA extensibility option is the best for thriving as an SAP partner in the cloud space?2024-12-09T14:18:38.623000+01:00Robert_Eijpehttps://community.sap.com/t5/user/viewprofilepage/user-id/1488<H3 id="toc-hId-1205853547">Get more value from S/4HANA with SAP Extensibility options, part 3</H3><P class="" data-unlink="true">In my <A href="https://community.sap.com/t5/technology-blogs-by-members/why-s-4hana-extensibility-options-are-crucial/ba-p/13921038" target="_self">first article</A> of this series, I explained why extensibility options are crucial for S/4HANA customers. In the <A href="https://community.sap.com/t5/technology-blogs-by-members/which-s-4hana-extensibility-options-should-i-use-as-a-sap-customer/ba-p/13931092" target="_self">second article</A> , I explained which option I should choose for the different use cases from a customer's point of view. In this last article, I want to focus on existing and new SAP partners who wish to connect their cloud offerings to S/4HANA customers or migrate their existing SAP ECC add-on to ABAP Cloud.</P><P class="">I have worked for almost 30 years in the SAP ERP space and have seen many innovations in SAP software. I started in 1996 when SAP introduced the client-server ERP and RFC libraries. During the turn of the century, SAP adopted the Internet and launched its new dimension portfolio, and third-party integration products were introduced into the market. SAP has stepped into the cloud in the last decade and fully adopted artificial intelligence.</P><P class="">There are a lot of changes at the core of ERP, but the challenges in my job are almost the same. As a developer, enterprise architect, SAP mentor, speaker, teacher, and advisor, I ask myself, ‘How can I add additional value for my customers out of an ERP system?’ And the answer is always the same. Focus on the missing functionality. SAP always delivers best-practice solutions that never fulfill all customers' requirements. This is still an ample opportunity for me, consultancy companies, SAP add-on solution providers, and all other software vendors.</P><P class="">For the last eight years, I have mostly worked for big cloud companies like Blackline, Booking, and Zuora to advise them to connect their cloud portfolio and systems to SAP S/4HANA. The cloud companies' customers are also big SAP customers. In this article, I will share my experience and tell you which S/4HANA extensibility options fit the best cloud vendors that want to thrive as SAP partners.</P><P class=""><STRONG><EM>Challenges for SAP Solution Partners</EM></STRONG></P><P class="">The question is easy, but the answer is more complex. As I wrote in my previous article, SAP supports several S/4HANA extensibility options, which depend on the S/4HANA releases and versions. So you need to answer the question: Do you want to support the S/4HANA Cloud private version, the S/4HANA Cloud public version, or even support ‘classic’ SAP ECC? But also, do you want to build a standalone add-on that runs on Business Technology Platform Software as a Service (BTP SAAS) or is embedded on S/4HANA? Or do you want to connect your partner cloud solution to S/4HANA?</P><P class="">But there are more answers needed. The data and events must be publicly available in the S/4HANA system. How will we handle the data exchange's latency, performance, size, and security? Who will be responsible when something goes wrong, technical, infra, and business-wise? Will the current SAP license be enough, or will there be additional operational and license costs for my customers? How will user management, authentication, authorization, and security be handled? How will the execution be monitored, and how will alerting and mapping be arranged? How should sensitive data be managed, and what audit trails and data should be archived? How will networking, security, risk, and complaint departments react to the solution? Will the used platform and tooling be future-proof? And so we can ask a lot more questions.</P><P class="">Ultimately, all these questions should be answered to develop the best solution. However, in my experience, not all SAP partners consider these questions.</P><P class="">SAP positions the S/4HANA Cloud public edition as the preferred version to GROW with SAP in the long term. However, SAP also provides the S/4HANA Cloud private edition for existing customers to RISE, with SAP as the golden path to move to the S/4HANA Cloud public edition in the future.</P><P class="">We will first focus on the S/4HANA Cloud public edition because this release is SAP’s long-term solution. Next, we can consider other SAP ERP systems, such as the S/4HANA Cloud private edition, S/4HANA on-premise, and SAP ECC.</P><P class=""><STRONG><EM>S/4HANA extensibility options</EM></STRONG></P><P class="">In my second article, I described the eight extensibility options for S/4HANA. However, if we look at partner solutions, we can skip the classic extensibilities because they are not supported in the public edition and are obsolete from a certification point of view. Also, the low-code extensibilities options S/4HANA Key User Extensibility, SAP Analytics Cloud, and SAP Build Apps could be more suitable because they mainly focus on custom developments for the citizen developer.</P><P class=""><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Figure 1 – Possible Partner Integration Options" style="width: 904px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/199915iC20CC47BC6BEEF68/image-size/large?v=v2&px=999" role="button" title="figure 1.png" alt="Figure 1 – Possible Partner Integration Options" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Figure 1 – Possible Partner Integration Options</span></span></P><P> </P><P class="">This limited the possible extensibility options, and because we can also access the S/4HANA APIs and events directly, we will have five possibilities (See Figure 1) to deliver a partner solution:</P><UL><LI>An add-on application on the S/4HANA embedded ABAP environment</LI><LI>A partner application as a SAAS application running on SAP BTP ABAP environment</LI><LI>A partner application as a SAAS application developed with SAP Build Code on SAP BTP</LI><LI>An integration package on SAP Cloud Integration</LI><LI>Running your application on a non-SAP solution and directly accessing S/4HANA events and APIs.</LI></UL><P class=""><STRONG><EM>Using APIs and events</EM></STRONG></P><P class="">Software vendors that run their solutions on their cloud will primarily consider the last option and try to connect their cloud solution directly to S/4HANA events and APIs. But from my experience, this isn’t the right approach. The S/4HANA Cloud public edition strongly depends on business events, and most cloud vendor solutions aren’t prepared for this. Due to the configuration possibilities in the S/4HANA Cloud and the use of APIs, the responsibility for root cause analysis shifts from the customer to the cloud vendor, which needs to build a big SAP knowledge support center. Also, the cloud vendor should handle all security, risk, and compliance issues, which are initially the customer's responsibility.</P><P class="">Another issue with this approach is that you, as a partner, cannot certify the solution with SAP. SAP is not responsible for the solution's availability and performance, code changes, or deprecation of APIs and events. This approach carries a high risk for customers and the cloud vendor.</P><P class=""><STRONG><EM>SAP Cloud Integration</EM></STRONG></P><P class="">A better approach is an integration package that can be installed on the customer's SAP Cloud Integration system. In this case, SAP will ensure smooth integration between S/4HANA and SAP Cloud Integration. The solution can be certified, and as a cloud vendor, you can mainly focus on integrating your cloud partner solution and SAP Cloud integration. The downside of this approach is that SAP Cloud Integration is separate from any S/4HANA Cloud edition license and should be brought by the customer separately. Only some customers are willing to do so. Most customers already have an existing integration product for more than just their SAP landscape. The need for separate SAP Cloud Integration licenses and setting up a support and knowledge center to maintain SAP Cloud Integration will be a blocker. Providing an integration package as a partner solution will limit the number of SAP customers you can connect to your cloud solution in the market.</P><P class=""><STRONG><EM>ABAP Cloud environments</EM></STRONG></P><P class="">The best approach for cloud vendors is to build the connectivity as an add-on product on S/4HANA, a SAAS solution on BTP, or a combination of these options. Building your partner integration solution on an ABAP Cloud environment is the best extensibility option for applications strongly dependent on S/4HANA. Based on my investigation, cloud vendors will profit the most from this option. They can shift the responsibility of the availability and maintenance of the landscape to SAP; they are highly flexible in a robust and stable environment following SAP’s future path and can directly profit from the innovations SAP is launching. The barriers to developing these extensions are higher, but the barriers for customers will be lower. There will be no additional costs for running the developer extensions on the embedded ABAP cloud environment in S/4HANA Cloud. When cloud vendors run their solution as a SAAS solution on BTP, they can share the costs with multiple customers. The advantage of the SAAS solution above the Addon is that the cloud vendor fully controls the code line, and the customer is still responsible for accessing and connecting to their S/4HANA tenant.</P><P class="">Another significant advantage of building connectivity from S/4HANA to your cloud solution on ABAP Cloud for BTP as a SAAS solution is that you can connect to the S/4HANA cloud public edition, make your future-proof solution with one code line, and downport the connection to other ERP versions, such as the S/4HANA cloud private edition, S/4HANA on-premise, or even SAP ECC.</P><P class=""><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Figure 2 – Codeline options of ABAP Cloud" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/199920iA30A6ADE3291AB95/image-size/large?v=v2&px=999" role="button" title="figure 2.png" alt="Figure 2 – Codeline options of ABAP Cloud" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Figure 2 – Codeline options of ABAP Cloud</span></span></P><P> </P><P class="">Because the ABAP Cloud on the BTP code line follows SAP’s Clean core strategy, it should also run as an add-on on the S/4HANA Cloud editions when these editions support the same underlying ABAP Cloud version.</P><P class="">As mentioned before, in SAP ECC, many SAP solution partners have already provided an add-on to solve the missing functionality of standard SAP. However, this add-on should be rewritten to be S/4HANA Cloud compliant because SAP only accepts code that follows SAP’s Clean core strategy. The SAP solution partner can rewrite the code as S/4HANA Cloud Developer Extensibility, but in this case, the partner always depends on the customers' upgrade strategy. Suppose he wants to control the versioning of his code line and innovations. In that case, the partner can rewrite the addon as a side-by-side extensibility with SAP Build Code in SAP CAP or ABAP, which connects to S/4HANA. Or he can even run the applications in a non-SAP cloud environment of his choice and follow the extensibility options described above. From my experience, all these options are valid, future-proof, and in line with the solution for cloud vendors.</P><P class="">Cloud and SAP Add-on vendors who want to build their solutions with ABAP Cloud can even speed up their development, shorten the time to market, and shift responsibilities back to their customers using an OEM solution like the FEXS API Connect from <A class="" href="http://fexs.com/" target="_self" rel="nofollow noopener noreferrer">fexs.com</A>. These OEM solutions already take care of the most common tasks, resulting in less development needed, smaller SAP support departments, and higher customer satisfaction.</P><P class=""><STRONG><EM>Conclusion</EM></STRONG></P><P class="">Because SAP and its customers are still on the move with S/4HANA to its future Cloud ERP landscape, it isn’t easy for SAP Solution partners to make the right decision for their future-proof solution. The move of SAP to the cloud and the openness and flexibility of its portfolio will give SAP Addon partners and existing cloud solution providers an excellent opportunity to bring added value to the existing SAP community. Suppose your solution strongly depends on S/4HANA processes. In that case, I believe a partner application running as S/4HANA Cloud Developer Extensibility or on a SAP BTP ABAP Environment following SAP Clean Core strategy is the best and most future-proof solution. An article is always too short to explain all the details, but I hope this article triggers your mind. And in my job as a strategic architect and advisor, I’m open to any discussion and available to help push you in the right direction.</P><P class=""><FONT size="2" color="#999999"><SPAN>This article was </SPAN><A href="https://www.linkedin.com/pulse/which-s4hana-extensibility-option-best-thriving-sap-partner-eijpe-s6sbe/" target="_self" rel="nofollow noreferrer noopener">initially posted</A><SPAN> on the linked-in profile of Robert Eijpe </SPAN></FONT></P>2024-12-09T14:18:38.623000+01:00https://community.sap.com/t5/technology-blogs-by-members/sap-trading-partner-management-part-iv-agreement/ba-p/13961055SAP Trading Partner Management - Part IV: Agreement2024-12-11T12:29:54.341000+01:00jirifridrichhttps://community.sap.com/t5/user/viewprofilepage/user-id/146600<H2 id="toc-hId-1077455902">Agreement</H2><P>Agreement is the heart of Trading Partner Management - it is here where all configuration components meet.</P><P>When creating Agreement, we have to create Agreement Template first. This is a generic Agreement, which can be reused and modified for as many Agreements as needed.</P><P>As we have many trading partners, we can create Agreement Template with My Company only and individual Agreements will be partner-specific. As we specify Type System here, we create one Template for IDoc communication and one for X12 communication, depending on what message method we are using.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="jirifridrich_0-1733915351110.png" style="width: 478px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/200658iDC595E24DD0D0D63/image-dimensions/478x234?v=v2" width="478" height="234" role="button" title="jirifridrich_0-1733915351110.png" alt="jirifridrich_0-1733915351110.png" /></span></P><P>Now we create the Agreement based on our Agreement Template. We usually select Copy from Template to have Agreements independent, even though binding the template may be useful in case our trading partners share similar configuration.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="jirifridrich_1-1733915351111.png" style="width: 240px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/200655iA5D726E3560F06F3/image-dimensions/240x118?v=v2" width="240" height="118" role="button" title="jirifridrich_1-1733915351111.png" alt="jirifridrich_1-1733915351111.png" /></span></P><P>This is an example of an Agreement between My Company and our ACME trading partner. Don't worry too much about the Type System Version, as it can be always edited later, based on real message content.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="jirifridrich_2-1733915351112.png" style="width: 660px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/200657iB3C7418D6733A5B5/image-dimensions/660x302?v=v2" width="660" height="302" role="button" title="jirifridrich_2-1733915351112.png" alt="jirifridrich_2-1733915351112.png" /></span></P><H2 id="toc-hId-880942397">B2B Scenarios</H2><P>The detailed message exchange configuration is specified in B2B Scenarios, where we define inbound / outbound flows. Let's demonstrate it on inbound (partner is sending an IDoc to us).</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="jirifridrich_3-1733915351113.png" style="width: 690px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/200660i52EEAAF5B6167D94/image-dimensions/690x195?v=v2" width="690" height="195" role="button" title="jirifridrich_3-1733915351113.png" alt="jirifridrich_3-1733915351113.png" /></span></P><P>We populate individual boxes in alignment with our TPM configuration. It is here, where all the components meet! Here we connect SCI Sender / Receiver adapters with TPM message configuration and apply Mapping, which we built in Integration Advisor. In the inbound scenario we have to read the above diagram from right to left.</P><P>Once we save it and activate, the configuration is moved to TPM Partner Directory, which we can imagine as a database with all the data necessary for successful message exchange.</P><H2 id="toc-hId-684428892">Sending a test AS2 message</H2><P>Only now, we can try to send a message, as we have the whole chain configured. Let's do it.</P><P>Just one thing before that - in order for this to work, we have to have this SAP-built package installed and configured. You can get it on SAP Business Accelerator Hub. This is more of a SAP Cloud Integration topic, so I will skip it here. If there is a demand, I can write another article about it.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="jirifridrich_4-1733915351113.png" style="width: 570px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/200659i5F5A586C9449CCC5/image-dimensions/570x114?v=v2" width="570" height="114" role="button" title="jirifridrich_4-1733915351113.png" alt="jirifridrich_4-1733915351113.png" /></span></P><P>I will simulate a partner's call by Mendelson AS2 client with a sample IDoc message. The IDoc header is what matters to TPM, so let's just focus on that.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="jirifridrich_5-1733915351114.png" style="width: 216px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/200662iB44D537B6046C708/image-dimensions/216x145?v=v2" width="216" height="145" role="button" title="jirifridrich_5-1733915351114.png" alt="jirifridrich_5-1733915351114.png" /></span></P><P>Now we run the transfer and the message was sent to TPM.</P><P>We can see the message in TPM proprietary B2B Monitor.</P><P>The result is an error, which is nothing unusual in the beginning and its resolution will help us further understand the TPM logic.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="jirifridrich_6-1733915351114.png" style="width: 683px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/200663i535B229EF1E440AF/image-dimensions/683x128?v=v2" width="683" height="128" role="button" title="jirifridrich_6-1733915351114.png" alt="jirifridrich_6-1733915351114.png" /></span></P><P>Let's click it and see the Details of the error.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="jirifridrich_7-1733915351114.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/200664i7B0715674DE797DE/image-size/medium?v=v2&px=400" role="button" title="jirifridrich_7-1733915351114.png" alt="jirifridrich_7-1733915351114.png" /></span></P><P>The '<SPAN>Partner Directory lookup failed'</SPAN> error can be really frustrating, if we don't know what to look for.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="jirifridrich_8-1733915351115.png" style="width: 644px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/200665i14CB3E5676E83AE3/image-dimensions/644x116?v=v2" width="644" height="116" role="button" title="jirifridrich_8-1733915351115.png" alt="jirifridrich_8-1733915351115.png" /></span></P><P>What the error is saying is that the IDoc message doesn't correspond to the configuration, which we saved into Partner Directory.</P><P>TPM takes several so called Lookup Keys and if they don't match, it throws this error. Now we have to compare the above Lookup Keys from the message with Lookup Keys from Partner Directory.</P><P>In TPM B2B Scenarios menu, we go on Partner Directory Data tab and look for the record, which represents our Agreement. Here we can see the Lookup Keys combination, which we need to match.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="jirifridrich_9-1733915351116.png" style="width: 651px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/200667iC70D7BFAF8383892/image-dimensions/651x263?v=v2" width="651" height="263" role="button" title="jirifridrich_9-1733915351116.png" alt="jirifridrich_9-1733915351116.png" /></span></P><P>Now we have Lookup Keys string from the message exchange and Lookup Keys string from Partner Directory. Now we have to compare them. Doing so, be careful even about the dashes, upper case, numbers, everything. Those strings need to match 100%.</P><P>We see 5 Keys:</P><UL><LI>'AS2-SAP_IDoc' is derived from out partner Type System</LI><LI>'1809_FPS02' is the version of the Type System we selected. We could change it in the Trading Partner profile, if this was causing a mismatch</LI><LI>'10001_ACME_IDOC' is our partner Identifier (configured in Trading Partner profile) and it needs to be specified in the IDoc as SNDPRN (Sender Partner)</LI><LI>'QS4CLNT300' vs 'DS4CLNT100' - we have mismatch in the SAP client identification. In our TPM Agreement we declared DS4CLNT100, but our partner is sending different value in RCVPRN (Receiver Partner) value. Let's fix it in our IDoc and set value DS4CLNT100</LI><LI>'ORDRSP.ORDERS05' - In Partner Directory this is derived from the MIG in the TPM configuration, whereas in the IDoc it is a combination of <MESTYP>.<IDOCTYP><BR />Mismatch in this is usually the hardest to fix, as we may need to redefine the MIG. I take a shortcut here and rename it in the IDoc</LI></UL><P>This is our new IDoc header</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="jirifridrich_10-1733915351116.png" style="width: 259px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/200666iC20B03E94ED52F85/image-dimensions/259x168?v=v2" width="259" height="168" role="button" title="jirifridrich_10-1733915351116.png" alt="jirifridrich_10-1733915351116.png" /></span></P><P>The IDoc now passes TPM, as the Lookup Keys match and TPM was able to identify the Sender, Receiver, the exchange type, message format and the mapping.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="jirifridrich_11-1733915351116.png" style="width: 687px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/200668i0C330DD233950AA4/image-dimensions/687x115?v=v2" width="687" height="115" role="button" title="jirifridrich_11-1733915351116.png" alt="jirifridrich_11-1733915351116.png" /></span></P><P>As we can see, we can resolve the mismatch either by changing the message content, or the configuration. Changing the configuration is usually a better option, as we may not be able to control what the partner is sending.</P><P> </P>2024-12-11T12:29:54.341000+01:00https://community.sap.com/t5/technology-blogs-by-members/sap-cloud-integration-b2b-restart-retry-messages-b2b-monitor/ba-p/13969611SAP Cloud Integration : B2B - Restart/Retry Messages - B2B Monitor2024-12-21T01:00:55.740000+01:00rasjoshihttps://community.sap.com/t5/user/viewprofilepage/user-id/14767<P>Hello SAPiens,</P><P>With new <SPAN><STRONG>Cloud Integration - Trading Partner Management V2</STRONG> <U>version 2.3.7</U> SAP has released a new B2B monitor feature of <A title="Resend or retry the failed interchanges" href="https://help.sap.com/docs/integration-suite/sap-integration-suite/resend-retry-interchanges" target="_blank" rel="noopener noreferrer">Restart/Retry Interchanges</A></SPAN></P><P><SPAN>Understanding a feature:- </SPAN></P><P><SPAN>The B2B Monitor has a manual restart/retry function exclusively designed for failed interchanges, allowing you to re-process failed messages. The <STRONG><SPAN class="">Actions</SPAN></STRONG> <STRONG>button</STRONG> is enabled when you select the interchanges and it consists of two options: <SPAN class="">Restart</SPAN> and <SPAN class="">Retry</SPAN>. These options appear only for interchanges with the status <SPAN class="">Failed</SPAN>.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="rasjoshi_0-1734738469819.png" style="width: 583px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/204167iB0E349E940BDFB7A/image-dimensions/583x67?v=v2" width="583" height="67" role="button" title="rasjoshi_0-1734738469819.png" alt="rasjoshi_0-1734738469819.png" /></span></P><P class=""><STRONG><SPAN class="">Restart</SPAN></STRONG>: This option resets the sender payload to integration flow<SPAN> </SPAN><STRONG><SPAN class="">Step 1b - Write Message to Message queue</SPAN></STRONG>, thereby re-initiating the messaging process from the beginning. As a result, the message mapping is re-executed, making room for corrections or adjustments to be made. Restart is ideal for addressing errors related to message transformation or formatting.</P><P class=""><STRONG><SPAN class="">Retry</SPAN></STRONG>: Retry resets the receiver payload to<SPAN> </SPAN><STRONG><SPAN class="">Step 3 - Receiver Communication Flow V2</SPAN></STRONG>, bypassing the message mapping step. This option is suited for resolving errors related to receiver-side processing or temporary connectivity issues, where the original message mapping remains valid.</P><P class=""><STRONG>Prerequisites</STRONG></P><P class="">1. Deploy Iflow - <SPAN>Step 1 - Sender Communication Flow V2 - Internal</SPAN></P><P class=""><SPAN>2. Copy deployed endpoint URL from Integrations Content </SPAN></P><P class=""><SPAN>3. Create BTP - Destination </SPAN></P><P class=""><SPAN>Name - B2BTPM_Reprocess_Endpoint</SPAN></P><P class=""><SPAN>URL - <host:port>/http/tpm/internal/repost_endpoint</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="rasjoshi_1-1734738783884.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/204170i53F64FA325B73099/image-size/medium?v=v2&px=400" role="button" title="rasjoshi_1-1734738783884.png" alt="rasjoshi_1-1734738783884.png" /></span></P><P>Ignore HTTP 500 error of test connection check.</P><P><STRONG>Procedure</STRONG></P><P>Login to CPI --> Navigate to B2B Monitor --> Select failed message --> Actions --> Restart / Retry</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="rasjoshi_2-1734739043871.png" style="width: 297px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/204171iE620FA662DB4B46D/image-dimensions/297x231?v=v2" width="297" height="231" role="button" title="rasjoshi_2-1734739043871.png" alt="rasjoshi_2-1734739043871.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="rasjoshi_3-1734739109828.png" style="width: 298px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/204172iA366AF3B86324699/image-dimensions/298x233?v=v2" width="298" height="233" role="button" title="rasjoshi_3-1734739109828.png" alt="rasjoshi_3-1734739109828.png" /></span></P><P>#HappyLearning </P><P>Regards,</P><P>RJ</P><P> </P>2024-12-21T01:00:55.740000+01:00https://community.sap.com/t5/technology-blogs-by-members/how-to-configure-pollenrich-in-cloud-integration/ba-p/13972855How to configure PollEnrich in Cloud Integration2024-12-30T22:20:06.846000+01:00SaiPrudhviRajTaduvahttps://community.sap.com/t5/user/viewprofilepage/user-id/1501949<P><STRONG>Introduction:</STRONG></P><P><STRONG>What is Poll Enrich</STRONG>: It is used to read the messages from external system and add the content to the original message in the middle of message processing sequence. Currently, we can use Poll Enrich step <EM>only to read the data from SFTP server.</EM></P><P class=""><STRONG>There are the following options in Poll Enrich:</STRONG></P><DIV class=""><P class=""><STRONG><SPAN class="">Combine XML:</SPAN></STRONG><SPAN> </SPAN>Combines the message polled from the external component with the original message without any conditions. The messages are combined in multimapping format.</P><UL class=""><LI><P class=""><SPAN class=""><STRONG>Concatenate:</STRONG></SPAN><STRONG> </STRONG>The message polled from the external component is added to the existing message.</P></LI><LI><STRONG><SPAN class="">Replace:</SPAN></STRONG><SPAN> </SPAN>The existing message is replaced with the message polled from the external component.</LI></UL><P><STRONG>Step-1: </STRONG><SPAN>Add i-Flow and name it as PollEnrich and add an artifact take sender as HTTPs and receiver as SFTP</SPAN></P><P><SPAN><STRONG>Step-2: </STRONG>Open the i-Flow and Change the Sender Participant to “HTTP” and Target Participant to “<EM>SFTP</EM>”<BR /></SPAN></P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SaiPrudhviRajTaduva_0-1735370357638.png" style="width: 712px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/205593i48620A6AC78FFCD8/image-dimensions/712x211?v=v2" width="712" height="211" role="button" title="SaiPrudhviRajTaduva_0-1735370357638.png" alt="SaiPrudhviRajTaduva_0-1735370357638.png" /></span><P><STRONG>Step-3: </STRONG><SPAN>Connect the Sender Participant “HTTP</SPAN><SPAN>” to Start and use the HTTPs adapter. Configure the Connection Tab as per below.</SPAN></P><P><SPAN><STRONG>Note:</STRONG> Address can be anything, but for practice purpose here I am using POllEnrich as naming convention. This will be the end point URL for the Interface to trigger.</SPAN></P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SaiPrudhviRajTaduva_1-1735370470966.png" style="width: 721px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/205594iE0B3A7ED75E96E73/image-dimensions/721x229?v=v2" width="721" height="229" role="button" title="SaiPrudhviRajTaduva_1-1735370470966.png" alt="SaiPrudhviRajTaduva_1-1735370470966.png" /></span><P><SPAN><STRONG>Step-4:</STRONG>From the pallet functions, choose Call ---> External call--->Poll Enrich and drop it in-between Start and End Message.</SPAN></P><P><SPAN>Double click on Poll Enrich function and select Combine XML from the Processing tab</SPAN></P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SaiPrudhviRajTaduva_2-1735370824753.png" style="width: 710px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/205595i4A35EFE6A2B2F8C4/image-dimensions/710x268?v=v2" width="710" height="268" role="button" title="SaiPrudhviRajTaduva_2-1735370824753.png" alt="SaiPrudhviRajTaduva_2-1735370824753.png" /></span><P><STRONG>Step-5: </STRONG><SPAN>Connect the End message and Target Participant “</SPAN><EM>SFTP</EM><SPAN>” and use SFTP adapter. In SFTP adapter, enter the following details</SPAN></P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SaiPrudhviRajTaduva_3-1735371260113.png" style="width: 739px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/205597i65BED8F432E300FD/image-dimensions/739x289?v=v2" width="739" height="289" role="button" title="SaiPrudhviRajTaduva_3-1735371260113.png" alt="SaiPrudhviRajTaduva_3-1735371260113.png" /></span><P><SPAN>Make sure that the SFTP credentials are deployed in the below path</SPAN><BR /><BR /><SPAN>Monitoring–>Integrations And APIs–>Overview –> Manage Security –> Security Material –> Create/Upload Credentials</SPAN><BR /><BR /><SPAN>Check the connectivity test of SFTP adapter in Test Connectivity in the below path</SPAN><BR /><BR /><SPAN>Overview –> Manage Security –> Connectivity Tests –> SSH</SPAN><BR /><BR /><SPAN>Copy the Host Key and paste it in notepad & deploy it in Known Hosts(SSH) file in the below path</SPAN><BR /><BR /><SPAN>Overview –> Manage Security –> Security Material –> Upload Known Hosts(SSH)</SPAN></P><P><SPAN><STRONG>Step-6: </STRONG>Now take one more sender from the Participant pallet and Connect the Sender Participant “SFTP1” to Poll Enrich.</SPAN></P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SaiPrudhviRajTaduva_4-1735371805247.png" style="width: 706px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/205598i20C48E05346CB10F/image-dimensions/706x276?v=v2" width="706" height="276" role="button" title="SaiPrudhviRajTaduva_4-1735371805247.png" alt="SaiPrudhviRajTaduva_4-1735371805247.png" /></span></DIV><DIV class=""><SPAN>In SFTP adapter, enter the following details</SPAN></DIV><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SaiPrudhviRajTaduva_5-1735372474776.png" style="width: 753px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/205599iA936ACDDD2635862/image-dimensions/753x288?v=v2" width="753" height="288" role="button" title="SaiPrudhviRajTaduva_5-1735372474776.png" alt="SaiPrudhviRajTaduva_5-1735372474776.png" /></span><P> </P><P><STRONG>Step-7:<SPAN> </SPAN></STRONG><SPAN>Save the Integration Flow & deploy it. Once Deployed, Go to Monitor. The status of the Integration Flow should be started</SPAN></P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SaiPrudhviRajTaduva_6-1735372646481.png" style="width: 605px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/205600iA6D1EDA3EA697FE9/image-dimensions/605x268?v=v2" width="605" height="268" role="button" title="SaiPrudhviRajTaduva_6-1735372646481.png" alt="SaiPrudhviRajTaduva_6-1735372646481.png" /></span><P><STRONG>Step-9:</STRONG><SPAN>Now we are good to test the Integration flow. The next step is configuring the end point in Postman Copy the end point from Monitor tab.</SPAN></P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SaiPrudhviRajTaduva_8-1735373174754.png" style="width: 559px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/205602i338C7C3D657FA750/image-dimensions/559x306?v=v2" width="559" height="306" role="button" title="SaiPrudhviRajTaduva_8-1735373174754.png" alt="SaiPrudhviRajTaduva_8-1735373174754.png" /></span><P> </P><BR /><P><STRONG>Inputdata:</STRONG></P><DIV><DIV><SPAN><</SPAN><SPAN>OrderDetails</SPAN><SPAN>></SPAN></DIV><DIV><SPAN> </SPAN><SPAN><</SPAN><SPAN>Order</SPAN><SPAN>></SPAN></DIV><DIV><SPAN> </SPAN><SPAN><</SPAN><SPAN>OrderNumber</SPAN><SPAN>></SPAN><SPAN>1</SPAN><SPAN></</SPAN><SPAN>OrderNumber</SPAN><SPAN>></SPAN></DIV><DIV><SPAN> </SPAN><SPAN><</SPAN><SPAN>OrderStatus</SPAN><SPAN>></SPAN><SPAN>Shipped</SPAN><SPAN></</SPAN><SPAN>OrderStatus</SPAN><SPAN>></SPAN></DIV><DIV><SPAN> </SPAN><SPAN><</SPAN><SPAN>CustomerEmail</SPAN><SPAN>></SPAN><SPAN>customer@example.com</SPAN><SPAN></</SPAN><SPAN>CustomerEmail</SPAN><SPAN>></SPAN></DIV><DIV><SPAN> </SPAN><SPAN><</SPAN><SPAN>CustomerName</SPAN><SPAN>></SPAN><SPAN>John Doe</SPAN><SPAN></</SPAN><SPAN>CustomerName</SPAN><SPAN>></SPAN></DIV><DIV><SPAN> </SPAN><SPAN><</SPAN><SPAN>EmailNotificationFlag</SPAN><SPAN>></SPAN><SPAN>true</SPAN><SPAN></</SPAN><SPAN>EmailNotificationFlag</SPAN><SPAN>></SPAN></DIV><DIV><SPAN> </SPAN><SPAN><</SPAN><SPAN>OrderTrackingNumber</SPAN><SPAN>></SPAN><SPAN>TN12345678900</SPAN><SPAN></</SPAN><SPAN>OrderTrackingNumber</SPAN><SPAN>></SPAN></DIV><DIV><SPAN> </SPAN><SPAN><</SPAN><SPAN>Order</SPAN><SPAN>></SPAN></DIV><DIV><SPAN></</SPAN><SPAN>OrderDetails</SPAN><SPAN>></SPAN></DIV><DIV><STRONG>Data from external system:</STRONG></DIV><DIV><OrderDetails><BR /> <Order><BR /> <OrderNumber>12345</OrderNumber><BR /> <OrderStatus>delivered</OrderStatus><BR /> <CustomerEmail>customer@example.com</CustomerEmail><BR /> <CustomerName>John Doe</CustomerName><BR /> <EmailNotificationFlag>true</EmailNotificationFlag><BR /> <OrderTrackingNumber>TN12345678900</OrderTrackingNumber><BR /> </Order><BR /></OrderDetails></DIV><DIV><STRONG>Step-8:</STRONG><BR /><BR /><SPAN>Open Postman paste the endpoint that you have copied from the monitor select basic authentication and provide the credentials the you have created.</SPAN></DIV><DIV><STRONG>Inputdata:</STRONG></DIV><DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SaiPrudhviRajTaduva_9-1735373849257.png" style="width: 531px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/205603i18B07E670FBF0FC9/image-dimensions/531x153?v=v2" width="531" height="153" role="button" title="SaiPrudhviRajTaduva_9-1735373849257.png" alt="SaiPrudhviRajTaduva_9-1735373849257.png" /></span></DIV><DIV><STRONG>Output:</STRONG><BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SaiPrudhviRajTaduva_10-1735373885729.png" style="width: 529px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/205605iA9D65E5FD3D2D1D2/image-dimensions/529x246?v=v2" width="529" height="246" role="button" title="SaiPrudhviRajTaduva_10-1735373885729.png" alt="SaiPrudhviRajTaduva_10-1735373885729.png" /></span><P>You can also try the other two functions in the same flow by changing the aggregation algorithm to</P><UL class=""><LI><P class=""><SPAN class="">Concatenate</SPAN></P></LI><LI><SPAN class="">Replace</SPAN></LI></UL><P><STRONG>Thank you & Happy</STRONG><BR /><STRONG><SPAN>Integrating</SPAN></STRONG></P><P> </P></DIV><DIV> </DIV></DIV></DIV><P><STRONG> </STRONG></P>2024-12-30T22:20:06.846000+01:00https://community.sap.com/t5/technology-blogs-by-members/sap-cloud-identity-services-for-beginners/ba-p/13976029SAP Cloud Identity Services for Beginners2025-01-04T18:57:21.208000+01:00PriyankaChakhttps://community.sap.com/t5/user/viewprofilepage/user-id/3763<H1 id="toc-hId-949445570"><STRONG>Introduction:</STRONG></H1><P><SPAN>SAP Cloud Identity services consist of 3 key components.</SPAN></P><P><FONT color="#000000"><STRONG>Identity Authentication (IAS):</STRONG><SPAN> Manages user login and provides single sign-on.</SPAN></FONT></P><P><FONT color="#000000"><STRONG>Identity Provisioning (IPS):</STRONG><SPAN> Syncs user data between systems. It does the transformation/filtering from source to target system. </SPAN></FONT></P><P><FONT color="#000000"><STRONG>Identity Directory:</STRONG></FONT><SPAN> Centralizes user information, acting as a single source of truth for identity management.</SPAN></P><P><SPAN>In this blog post, I will showcase </SPAN><SPAN>the following:</SPAN></P><UL><LI><SPAN>Use IAS as a custom IDP for Integration Suite</SPAN></LI><LI><SPAN>Provision users from FSM to IAS using IPS</SPAN></LI></UL><H1 id="toc-hId-752932065"><SPAN>Configure IAS as custom IDP for BTP Subaccount using</SPAN></H1><H1 id="toc-hId-556418560"><SPAN>OIDC</SPAN></H1><P><SPAN>In this scenario, we have two subaccounts, say <STRONG>trial</STRONG> and <STRONG>cis</STRONG>. Subaccount named - <STRONG>trial</STRONG> has Integration Suite subscribed and Subaccount named - <STRONG>cis</STRONG> has Cloud Identity Services subscribed.</SPAN></P><H2 id="toc-hId-488987774"><SPAN>Step 1:</SPAN></H2><P><SPAN>Go to the Sub Account of Integration Suite for trust configuration.</SPAN></P><P><SPAN>Click on ‘Establish Trust’ Button.</SPAN></P><DIV class=""> </DIV><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img1.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207305i8494FB2E4AFFD141/image-size/large?v=v2&px=999" role="button" title="img1.png" alt="img1.png" /></span></DIV><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img2.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207308i63EF7772CE6B6A7C/image-size/large?v=v2&px=999" role="button" title="img2.png" alt="img2.png" /></span></P><DIV class=""> </DIV><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img3.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207310i5197D2895EEEE1B9/image-size/large?v=v2&px=999" role="button" title="img3.png" alt="img3.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img4.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207311i5B5420F9C13B92CF/image-size/large?v=v2&px=999" role="button" title="img4.png" alt="img4.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img5.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207312i4863C56AB1B7458E/image-size/large?v=v2&px=999" role="button" title="img5.png" alt="img5.png" /></span></P><P><SPAN>The login page of Integration Suite looks like below:</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img6.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207313iE1096BEDD5BEA986/image-size/large?v=v2&px=999" role="button" title="img6.png" alt="img6.png" /></span></SPAN></P><H2 id="toc-hId-292474269"><SPAN>Step 2:</SPAN></H2><P><SPAN>Go to <EM>Cloud Identity Services</EM> -> <EM>Users & Authorizations</EM> -> <EM>User Management</EM> -> <EM>Add New User</EM></SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img7.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207315i7FC2DC8E403FBCBF/image-size/large?v=v2&px=999" role="button" title="img7.png" alt="img7.png" /></span></SPAN></P><P><SPAN>After account activation, the user (in our case Mr. John Doe) still cannot access the Integration Suite. See the screenshot below. This brings to the next step.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img8.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207317i88127A081037D214/image-size/large?v=v2&px=999" role="button" title="img8.png" alt="img8.png" /></span></SPAN></P><H2 id="toc-hId-95960764"><SPAN>Step 3:</SPAN></H2><P><SPAN>Go to Subaccount for Integration Suite.</SPAN></P><P><SPAN>Create a custom role collection containing all the required roles of SAP CPI Consultant.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img9.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207318i3C4B90CD753A49F5/image-size/large?v=v2&px=999" role="button" title="img9.png" alt="img9.png" /></span></SPAN></P><H2 id="toc-hId--100552741"><SPAN>Step 4:</SPAN></H2><P>Go to Cloud Identity Services.</P><P><SPAN>Create a group for CPI consultants and assign the user to that group.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img10.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207320i919657DA3ED9C3F2/image-size/large?v=v2&px=999" role="button" title="img10.png" alt="img10.png" /></span></SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img11.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207322i6BCAD5D0B1E73CE7/image-size/large?v=v2&px=999" role="button" title="img11.png" alt="img11.png" /></span></SPAN></P><H2 id="toc-hId--297066246"><SPAN>Step 5:</SPAN></H2><P><SPAN>After establishing trust (referring to step 1), an application is auto-generated, as shown below.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img12.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207323iAF98284085AE7FB6/image-size/large?v=v2&px=999" role="button" title="img12.png" alt="img12.png" /></span></SPAN></P><P><SPAN>Now there is an attribute related to ‘group’.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img13.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207324i66486406F722C1BB/image-size/large?v=v2&px=999" role="button" title="img13.png" alt="img13.png" /></span></SPAN></P><P><SPAN>Go to subaccount for <EM>Integration Suite</EM> -> <EM>Trust Configuration</EM> -> Click on Custom IDP link </SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img14.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207325iA30952197A8EBD2C/image-size/large?v=v2&px=999" role="button" title="img14.png" alt="img14.png" /></span></SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img15.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207326iC26DE28BA10B50E0/image-size/large?v=v2&px=999" role="button" title="img15.png" alt="img15.png" /></span></SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img16.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207327i3ED1FC7E8B99C2CC/image-size/large?v=v2&px=999" role="button" title="img16.png" alt="img16.png" /></span></SPAN></P><H2 id="toc-hId--493579751"><SPAN>Step 6:</SPAN></H2><P><SPAN>When a user logins, we can </SPAN><SPAN>see the logs from <EM>Troubleshooting log</EM> of <EM>Cloud Identity Service</EM>.</SPAN></P><P><SPAN><EM>Monitoring & Reporting</EM> -> <EM>Troubleshooting Logs</EM> -> search for keyword ‘jwt’.</SPAN></P><P><SPAN>Action type is ‘issueJwtToken’.</SPAN></P><P><SPAN>Click on ‘Log Details’.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img17.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207328i49BC756E14250EAE/image-size/large?v=v2&px=999" role="button" title="img17.png" alt="img17.png" /></span></SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img18.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207329iB7933289FC3C8652/image-size/large?v=v2&px=999" role="button" title="img18.png" alt="img18.png" /></span></SPAN></P><H2 id="toc-hId--690093256"><SPAN>Step 7:</SPAN></H2><P><SPAN>Enable '<EM>Risk-based Authentication</EM>' for email domain.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img19.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207330i1D2E1D56AB6F3100/image-size/large?v=v2&px=999" role="button" title="img19.png" alt="img19.png" /></span></SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img20.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207331iC0A105295FCD8444/image-size/large?v=v2&px=999" role="button" title="img20.png" alt="img20.png" /></span></SPAN></P><P><SPAN>Now if the user's email domain is gmail, it will ask for two-factor authentication.</SPAN></P><P><SPAN>Go to Profile Management UI.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img22.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207334iA7A9EF6CF5D2263E/image-size/large?v=v2&px=999" role="button" title="img22.png" alt="img22.png" /></span></SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img21.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207333i6B0CBAB595EA22F0/image-size/large?v=v2&px=999" role="button" title="img21.png" alt="img21.png" /></span></SPAN></P><H1 id="toc-hId--245949397"><SPAN>Provision users from FSM to IAS using IPS</SPAN></H1><H2 id="toc-hId--735865909"><SPAN>Step 1: </SPAN></H2><P><SPAN>Create source system for FSM (Field Service Management)</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img23.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207335i223D2DE2BCB90A23/image-size/large?v=v2&px=999" role="button" title="img23.png" alt="img23.png" /></span></SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img24.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207336i14ED94E21D4E3F49/image-size/large?v=v2&px=999" role="button" title="img24.png" alt="img24.png" /></span></SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img25.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207339iDDD89BF380573007/image-size/large?v=v2&px=999" role="button" title="img25.png" alt="img25.png" /></span></SPAN></P><P><SPAN>For this case, I will replicate only one dummy user from FSM to IAS. The filter criteria (fsm.user.filter) is used.</SPAN></P><P><STRONG><EM>Please note the data used in executing these scenarios throughout this blog post is test data/ fake data only.</EM></STRONG></P><P><SPAN>Ignore '<EM>Group</EM>' entity (to avoid group sync).</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img26.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207338i9C62D2A3DB399414/image-size/large?v=v2&px=999" role="button" title="img26.png" alt="img26.png" /></span></SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img28.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207344iEB77B92948E877EE/image-size/large?v=v2&px=999" role="button" title="img28.png" alt="img28.png" /></span></SPAN></P><H2 id="toc-hId--932379414"><SPAN>Step 2:</SPAN></H2><P><SPAN>Create target system for IAS (Identity Authentication)</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img29.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207351i71834A57A81F5FBE/image-size/large?v=v2&px=999" role="button" title="img29.png" alt="img29.png" /></span></SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img30.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207352i0AC8AB7FF6654750/image-size/large?v=v2&px=999" role="button" title="img30.png" alt="img30.png" /></span></SPAN></P><P><SPAN>Create a system admin for IAS and use the generated client id as user and secret as password.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img31.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207355i49AE60645D9C7239/image-size/large?v=v2&px=999" role="button" title="img31.png" alt="img31.png" /></span></SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img32.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207358iF71890474F9983D7/image-size/large?v=v2&px=999" role="button" title="img32.png" alt="img32.png" /></span></SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img33.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207359i34428A7E6DCAF619/image-size/large?v=v2&px=999" role="button" title="img33.png" alt="img33.png" /></span></SPAN></P><H2 id="toc-hId--1128892919"><SPAN>Step 3:</SPAN></H2><P><SPAN>Run '<EM>Read Job</EM>'. It is also possible to subscribe for job failure notifications by clicking on '<EM>Subscribe</EM>'.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img34.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207360i01704379B9100E04/image-size/large?v=v2&px=999" role="button" title="img34.png" alt="img34.png" /></span></SPAN></P><H2 id="toc-hId--1325406424"><SPAN>Step 4:</SPAN></H2><P><SPAN>Go to Provisioning log to check the job execution status and details.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img35.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207361iA547BDC1FDCBF073/image-size/large?v=v2&px=999" role="button" title="img35.png" alt="img35.png" /></span></SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img36.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207362i10283660056AEACC/image-size/large?v=v2&px=999" role="button" title="img36.png" alt="img36.png" /></span></SPAN></P><H2 id="toc-hId--1521919929">Reference Links:</H2><OL><LI><A href="https://help.sap.com/docs/cloud-identity-services?locale=en-US" target="_blank" rel="noopener noreferrer">SAP Cloud Identity Services</A></LI><LI><A href="https://help.sap.com/docs/SAP_FIELD_SERVICE_MANAGEMENT/fsm_scim_api/scim-api.html?locale=en-US" target="_self" rel="noopener noreferrer"><SPAN>Field Service Management - SCIM API</SPAN></A></LI><LI><SPAN><A class="" href="https://community.sap.com/t5/technology-blogs-by-sap/sap-ips-list-of-all-properties-available-for-user-sync/ba-p/13571433" target="_blank">SAP IPS - List of All Properties available for User Sync</A></SPAN></LI></OL><P><SPAN>Regards,</SPAN></P><P><SPAN>Priyanka Chakraborti</SPAN></P><P> </P>2025-01-04T18:57:21.208000+01:00https://community.sap.com/t5/technology-blogs-by-members/step-into-the-future-of-integration-using-azure-cosmosdb-receiver-adapter/ba-p/13976756Step into the Future of Integration: Using Azure CosmosDB Receiver Adapter in SAP Integration Suite2025-01-05T22:14:08.054000+01:00PiotrRadzkihttps://community.sap.com/t5/user/viewprofilepage/user-id/120998<H1 id="toc-hId-949452387">Background</H1><P>With its December 27, 2024 release, SAP introduced the Azure CosmosDB receiver adapter, enhancing the SAP Integration Suite's capabilities. Azure CosmosDB, a cloud-native NoSQL and vector database from Microsoft, supports globally distributed applications with high availability and low latency. In this blog, we will explore the features of Azure CosmosDB and the new receiver adapter, walk through the setup process, and demonstrate a sample integration scenario to help you get started.</P><P>The new Azure CosmosDB receiver adapter is generally available, subject to your subscription plan. For more details, refer to SAP Notes <A href="https://me.sap.com/notes/2903776" target="_self" rel="noopener noreferrer">2903776</A> and <A href="https://me.sap.com/notes/3188446" target="_self" rel="noopener noreferrer">3188446</A>. You can find it in SAP Business Accelerator Hub or directly on Discovery page of you Cloud Integration tenant.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="PiotrRadzki_3-1736105579987.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207873iD83774BDC3520545/image-size/large?v=v2&px=999" role="button" title="PiotrRadzki_3-1736105579987.png" alt="PiotrRadzki_3-1736105579987.png" /></span></P><P>Below I gather few links that can help you with starting up: </P><P>Azure CosmosDB documentation: <A href="https://learn.microsoft.com/en-us/azure/cosmos-db/" target="_blank" rel="noopener nofollow noreferrer">Azure Cosmos DB | Microsoft Learn</A></P><DIV class=""><DIV class=""><SPAN class="">AzureCosmosDB Adapter for SAP Integration Suite:</SPAN><SPAN> <A href="https://api.sap.com/package/AzureCosmosDBAdapterforSAPIntegrationSuite/overview" target="_blank" rel="noopener noreferrer">https://api.sap.com/package/AzureCosmosDBAdapterforSAPIntegrationSuite/overview</A> </SPAN></DIV><DIV class=""><SPAN>SAP Help Page: <A href="https://help.sap.com/docs/integration-suite/sap-integration-suite/azure-cosmosdb-receiver-adapter" target="_blank" rel="noopener noreferrer">https://help.sap.com/docs/integration-suite/sap-integration-suite/azure-cosmosdb-receiver-adapter</A></SPAN></DIV><DIV class=""> </DIV></DIV><H1 id="toc-hId-752938882">What is Azure CosmosDB? </H1><P>Azure Cosmos DB, a cloud-native database service from Microsoft, is designed to support globally distributed, modern applications. It offers high availability, exceptional scalability, and low-latency access to data. Unlike traditional relational databases, Cosmos DB is a NoSQL and vector database, making it versatile enough to handle unstructured, semi-structured, structured, and vector data.</P><P>Azure CosmosDB organizes data into 'items,' which are stored in 'containers.' The terminology and structure may vary based on the API used. For example, with the MongoDB-compatible API, data is referred to as 'documents' within 'collections'. These containers are grouped into "databases," functioning as namespaces. One standout feature of Cosmos DB is its schema-agnostic design, allowing the addition of items without requiring a predefined schema.</P><P> </P><H1 id="toc-hId-556425377">Features of Azure CosmosDB Receiver Adapter on SAP Cloud Integration</H1><P>At first glance, the Azure CosmosDB adapter functions similarly to the Azure Storage adapter in SAP Integration Suite. This is because CosmosDB, on the surface, got similar integration capability as Blobs that are kept in containers. This helps a lot in understanding how potential integration scenarios and patterns can be designed. Therefore, if you are familiar with Azure Storage adapter on Integration Suite you will quickly catch how to use also this new adapter.</P><P>What is nice about Azure CosmosDB is that you don’t need to really define the data model before you start playing with DB itself or integrating with it. You just need few steps of preparation and you are ready. Just create new CosmosDB in your workspace, then create the Container in it and assign Partition Key in case it's required (in some specific scenarios it will be needed).</P><P><SPAN>Azure CosmosDB adapter allows for all CRUD operations with option to List, Query and Replace records on objects in scope that are Database, Containers and Documents of CosmosDB account configured on the adapter. </SPAN>Documents are simply records specified by id and optionally by Partition Keys.</P><P>Partition Keys are groupings for Documents in Container, in case of Products it might be CategoryID. Partition Keys do not need to be unique across containers and documents but serve to logically group documents for improved data organization and retrieval. Apart from Single Document processing adapter provides also an option to use Bulk processing option.</P><P>With an understanding of the adapter's capabilities, let's move to the setup process required for this integration. Below show few steps needed on Azure side to start with.</P><P> </P><H1 id="toc-hId-359911872">Prerequisites and Initial Setup</H1><P>1. First create an account on <A href="https://portal.azure.com/" target="_blank" rel="noopener nofollow noreferrer">https://portal.azure.com/</A></P><P>2. Once you are done with it, request creation of CosmosDB resource in your Azure account</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="2025-01-05 10_44_32-Marketplace - Microsoft Azure and 1 more page - Osoba 1 - Microsoft Edge.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207858iF570027E7604C616/image-size/medium?v=v2&px=400" role="button" title="2025-01-05 10_44_32-Marketplace - Microsoft Azure and 1 more page - Osoba 1 - Microsoft Edge.png" alt="2025-01-05 10_44_32-Marketplace - Microsoft Azure and 1 more page - Osoba 1 - Microsoft Edge.png" /></span></P><P> </P><P>3. Creation and deployment of your first CosmosDB should go fast and result with resource available as below</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="2025-01-05 10_49_58-Clipboard.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207862i66B4790393026BEF/image-size/large?v=v2&px=999" role="button" title="2025-01-05 10_49_58-Clipboard.png" alt="2025-01-05 10_49_58-Clipboard.png" /></span></P><P> </P><P>4. Now you are ready to create your first Data Base and Container, in my case I have designed it to keep Products. For now the Items are empty but soon it will be fulfilled with data coming from SAP Cloud Integration. </P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="2025-01-05 10_45_59-Clipboard.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207863i1A0D579D4F70F000/image-size/large?v=v2&px=999" role="button" title="2025-01-05 10_45_59-Clipboard.png" alt="2025-01-05 10_45_59-Clipboard.png" /></span></SPAN></P><P> </P><P><SPAN>I didn't specified additional Partition Key, its important aspect on Azure CosmosDB, for more information about it you can refer to following documentation. </SPAN><A href="https://learn.microsoft.com/en-us/azure/cosmos-db/partitioning-overview" target="_blank" rel="noopener nofollow noreferrer">https://learn.microsoft.com/en-us/azure/cosmos-db/partitioning-overview</A><SPAN> </SPAN></P><P>In general for small databases int is not required to introduce the additional partition key and you can set it to "/id" of your Document. For big data collections in CosmosDB Partition Key is required. For container with products apart of Product ID key you can introduce Partition Key as Product Category ID that will group Products logically. </P><P>5. The final critical step is to obtain the API Key for integration and configure it in SAP Cloud Integration as a Secure Parameter under Security Materials. You have an option to use Master Key Token or Resource Token (Isolated to specific resource on Azure). In this scenario I used Master Key.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="2025-01-05 10_52_51-Clipboard.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207861i74DF9601F5D0644B/image-size/large?v=v2&px=999" role="button" title="2025-01-05 10_52_51-Clipboard.png" alt="2025-01-05 10_52_51-Clipboard.png" /></span></P><P> </P><P>Here you go you can now start using your CosmosDB and Container in your integration scenario!</P><P>In the next section, we will demonstrate a simple integration scenario where data from an external API is transformed and loaded into Azure CosmosDB using the SAP Integration Suite - Cloud Integration.</P><P> </P><H1 id="toc-hId-163398367">Demo Scenario </H1><P>The demo scenario is straightforward yet sufficient to illustrate the basic steps and principles for setting up a connection and integrating with Azure CosmosDB using SAP Cloud Integration. The following section provides an overview of the iFlow built to implement this scenario.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="PiotrRadzki_0-1736105072182.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207864iCD7D7DB5B33DD242/image-size/large?v=v2&px=999" role="button" title="PiotrRadzki_0-1736105072182.png" alt="PiotrRadzki_0-1736105072182.png" /></span></P><P>Data of Products will be pulled from REST API of Northwind JSON Server, that is free of charge demo API with sample data for test scenarios.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="PiotrRadzki_1-1736105315695.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207865i1E77FEA5278D66BC/image-size/large?v=v2&px=999" role="button" title="PiotrRadzki_1-1736105315695.png" alt="PiotrRadzki_1-1736105315695.png" /></span></P><P>Products will be pulled from Northwind API using SAP Cloud Integration iFlow started with timer (run once). Products pulled from Demo API will be transformed slightly to meet expectations of CosmosDB and processed in Bulk mode to my Azure CosmosDB. Below snippet shows part of Northwind Products payload that will be processed by the iFlow. </P><P>Data Source: <A href="https://northwind.vercel.app/api/products" target="_blank" rel="noopener nofollow noreferrer">northwind.vercel.app/api/products</A></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="PiotrRadzki_2-1736105438088.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207872i8D67753C328BA6D9/image-size/large?v=v2&px=999" role="button" title="PiotrRadzki_2-1736105438088.png" alt="PiotrRadzki_2-1736105438088.png" /></span></P><P>Although it's important to mention that apart from requirement of having unique UUID "id" or additional PartitionKey, if expected by CosmosDB, there is no restriction and no special requirement on JSON structure pushed to CosmosDB as no data model creation and modeling is expected upfront. Below is overview of an iFlow build for this scenario. </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="PiotrRadzki_0-1736106312416.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207877iDAA33AE1FCA01143/image-size/large?v=v2&px=999" role="button" title="PiotrRadzki_0-1736106312416.png" alt="PiotrRadzki_0-1736106312416.png" /></span></P><P> </P><H2 id="toc-hId-95967581">Main iFlow steps: </H2><P>1. Data of Products is pulled from Northwind API</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="PiotrRadzki_1-1736105860461.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207876i8B2DAD3B96DBBA13/image-size/large?v=v2&px=999" role="button" title="PiotrRadzki_1-1736105860461.png" alt="PiotrRadzki_1-1736105860461.png" /></span></P><P>2. Transformation of Product payload to fit into CosmosDB container. The Groovy script is used to transform the Product payload to align with CosmosDB's requirements. Here's how the script works:: </P><P>a. Introduce ProductID field and copy "id" of Product into ProductID</P><P>b. Replace id with unique UUID accepted by CosmosDB as a key for Document </P><P>Content before groovy script processing: </P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="PiotrRadzki_4-1736107986033.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207892i8E80192663C9C9AF/image-size/large?v=v2&px=999" role="button" title="PiotrRadzki_4-1736107986033.png" alt="PiotrRadzki_4-1736107986033.png" /></span></P><P>Snippet of groovy code: </P><P> </P><pre class="lia-code-sample language-java"><code>import com.sap.gateway.ip.core.customdev.util.Message;
import groovy.json.JsonSlurper;
import groovy.json.JsonOutput;
import java.util.UUID;
def Message processData(Message message) {
def body = message.getBody(String);
def jsonSlurper = new JsonSlurper();
def productsList = jsonSlurper.parseText(body);
if (productsList instanceof List) {
productsList.each { product ->
if (product != null) {
if (product.id != null) {
product.ProductID = product.id;
}
product.id = UUID.randomUUID().toString();
}
}
} else {
throw new IllegalArgumentException("Invalid JSON structure: Expected a list of products.");
}
def updatedJson = JsonOutput.toJson(productsList);
updatedJson = JsonOutput.prettyPrint(updatedJson);
message.setBody(updatedJson);
return message;
}</code></pre><P> </P><P>The output of this Groovy script ensures that each Product has a unique UUID as the 'id' field and an additional 'ProductID' field. Result of groovy script processing: </P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="PiotrRadzki_3-1736107936500.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207891i9DE09954A3BFF0EE/image-size/large?v=v2&px=999" role="button" title="PiotrRadzki_3-1736107936500.png" alt="PiotrRadzki_3-1736107936500.png" /></span></P><P>Main principle for Products transformation is that CosmosDB expect id of Document in a form of unique UUID and Northwind Product ID cannot be used. This code is just for a purpose of this demo, real life solution will look slightly different but requirement on CosmosDB side need to be addressed in overall design. </P><P>3. Data of Products is pushed to Azure CosmosDB </P><P>Configuration of Azure CosmosDB adapter is setup with Azure CosmosDB account details and Master Key Alias. </P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="PiotrRadzki_0-1736106448081.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207878i57739989A596EE69/image-size/large?v=v2&px=999" role="button" title="PiotrRadzki_0-1736106448081.png" alt="PiotrRadzki_0-1736106448081.png" /></span></P><P>The Processing Tab is configured to use Bulk mode, enabling us to process all products from the Northwind API at once. The Upsert mode is selected to create or update records seamlessly, ensuring that any document with the same UUID already existing in the container is updated instead of duplicated. This helps to do creation and update in one request. </P><P>Database and Container is specified. As we dont have additional PartitionKey we are using our main table key /id as PartitionKey. </P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="PiotrRadzki_1-1736106563003.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207879i55BE2A3AA88DFA58/image-size/large?v=v2&px=999" role="button" title="PiotrRadzki_1-1736106563003.png" alt="PiotrRadzki_1-1736106563003.png" /></span></P><H2 id="toc-hId--100545924"> </H2><H2 id="toc-hId--297059429">Demo execution</H2><P>Next, we will execute the iFlow and observe the results. Our Container in CosmosDB named "Products2" is still empty but we will fulfil it with data using our Demo iFlow. </P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="PiotrRadzki_0-1736106809051.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207880iF05CE16098E18E4C/image-size/large?v=v2&px=999" role="button" title="PiotrRadzki_0-1736106809051.png" alt="PiotrRadzki_0-1736106809051.png" /></span></P><P>Our iFlow runs fine and without errors but you need be careful here as in case of Bulk processing Cloud Integration will not raise exceptions during runtime in case problems with Documents Upsert on CosmosDB side. Exception will be only raise in case of connectivity or adapter configuration issues or in case of processing Single mode set on adapter. As mentioned, I’m using Bulk operation on Documents to Upsert new records into my CosmosDB. </P><P>Proper error handling is crucial. Note that errors on the CosmosDB side are not flagged as failures by the Azure CosmosDB adapter in Bulk mode. The processing status is marked as 'Completed' in SAP Cloud Integration unless there are connectivity or configuration issues. CamelHttpResponseCode is also sent back as 200 with ResponseCode “OK” . Failures are only visible in the response payload if the connection is fine to Azure CosmosDB.</P><P>So you need to check and verify payload after response is received in Bulk scenario.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="PiotrRadzki_1-1736106993529.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207883iB64E11604A4B3CE7/image-size/large?v=v2&px=999" role="button" title="PiotrRadzki_1-1736106993529.png" alt="PiotrRadzki_1-1736106993529.png" /></span></P><P>How to troubleshoot such errors? It's another big topic and there is not place in this blog to discuss it this time but definitely you need to learn little bit on error handling on Azure side. Logs are available on AzureCosmosDB side but you need few steps and some configuration to pull out from Logs what you need. </P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="PiotrRadzki_2-1736106993531.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207881iE12AD6023492A16E/image-size/large?v=v2&px=999" role="button" title="PiotrRadzki_2-1736106993531.png" alt="PiotrRadzki_2-1736106993531.png" /></span></P><P>In our happy scenario and in any case of successful processing the response payload will give you clear information on the results for each Document processed in Bulk mode. It might be needed to analyze the response and handling problems with each Document separately, depending on scenario. </P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="PiotrRadzki_3-1736106993533.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207882iCB740103F74FD23A/image-size/large?v=v2&px=999" role="button" title="PiotrRadzki_3-1736106993533.png" alt="PiotrRadzki_3-1736106993533.png" /></span></P><H2 id="toc-hId--493572934"> </H2><H2 id="toc-hId--690086439">Result</H2><P>Let's check what is the result of our Demo iFlow on Azure CosmosDB side. We can see data injected to our container with id's set using our groovy script. The structure of JSON was accepted and CosmosDB added additional technical attributes during runtime needed to keep data in container properly. All the JSON fields that starts with "_" are CosmosDB technical attributes added during Upsert operation. They are not part of initial payload from Northing API. JSON if field from the payload is used as id key of the record/Document in Container. Using UUID "id" you can perform all CRUD operations on this Document. </P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="PiotrRadzki_0-1736107721276.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207886i695CFE872DF11D12/image-size/large?v=v2&px=999" role="button" title="PiotrRadzki_0-1736107721276.png" alt="PiotrRadzki_0-1736107721276.png" /></span></P><P>Each Document created in Container can have different JSON structures, there is no data model definition that needs to be followed. That's one of the principles of CosmosDB that is so powerful and flexible to work with. </P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="PiotrRadzki_1-1736107832813.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207889i838DC24126FB4FE2/image-size/large?v=v2&px=999" role="button" title="PiotrRadzki_1-1736107832813.png" alt="PiotrRadzki_1-1736107832813.png" /></span></P><P>This demonstrates the successful replication of product data from the Northwind API to Azure CosmosDB, with the JSON structure adapted dynamically during the integration process.</P><P>Our goal is achieved, data from demo Northwind API of Products is replicated to CosmosDB using new adapter. Setup is fairly simple and testing is easy. Lets see on another options and operations available with this adapter. </P><P> </P><H1 id="toc-hId--245942580">Other operations </H1><P>You can perform CRUD (Create, Read, Update and Delete) operation on Databases, Containers and Documents in both Single and Bulk processing mode. There are also other features that you can learn about from very good adapter documentation for example it supports operations among other as List, Query, Update, Patch Delete and Replace on various entities in Azure CosmosDB.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="PiotrRadzki_0-1736109351861.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207893iE4DF423CB5750AA4/image-size/large?v=v2&px=999" role="button" title="PiotrRadzki_0-1736109351861.png" alt="PiotrRadzki_0-1736109351861.png" /></span></P><UL><LI><STRONG>List operation:</STRONG> gives you easy way to get the content of each object and list databases, container and documents in containers.</LI><LI><STRONG>Query operation:</STRONG> is quite interesting as you can inject SQL statements in your JSON request to CosmosDB and perform more advanced queries on your Documents. </LI><LI>Update operation can be used to modify the contents of an existing Document within a<BR />Container in Azure CosmosDB.</LI><LI><STRONG>Delete operation:</STRONG> can be used to delete a Database, Container, or Document in Azure<BR />CosmosDB.</LI><LI><STRONG>Replace operation:</STRONG> in Azure CosmosDB involves replacing/updating multiple documents<BR />in a single batch operation. This is useful when you need to modify existing documents in bulk<BR />rather than inserting new ones.</LI><LI><STRONG>Patch operation:</STRONG> involves path-level updates to specific files/properties to multiple<BR />documents in a single batch. These operations include modifications such as add, increment,<BR />move, remove, replace, and set.</LI><LI><STRONG>Upsert operation:</STRONG> is used to insert or update multiple documents in a single operation. It<BR />updates any existing documents in CosmoDB and insert it if they are not already present.</LI><LI><STRONG>Delete operation:</STRONG> refers to the process of deleting multiple documents in a single operation.</LI></UL><P>Below are samples configurations of adapter showing how you can List databases, Containers or Documents in Container and sample response payload. </P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="PiotrRadzki_1-1736109505224.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207894i99B53251D5AF067E/image-size/large?v=v2&px=999" role="button" title="PiotrRadzki_1-1736109505224.png" alt="PiotrRadzki_1-1736109505224.png" /></span></P><P><STRONG>Sample operation 1:</STRONG> Get List of Databases</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="PiotrRadzki_2-1736109541363.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207895i7C300544D81F978E/image-size/large?v=v2&px=999" role="button" title="PiotrRadzki_2-1736109541363.png" alt="PiotrRadzki_2-1736109541363.png" /></span></P><P>For this REST No-SQL query adapter provides all Databases for the given CosmosDB account. </P><P> </P><pre class="lia-code-sample language-json"><code>{"_rid":"","Databases":[{"id":"SampleDB","_rid":"5tgUAA==","_self":"dbs/5tgUAA==/","_etag":"\"0000c505-0000-0d00-0000-677997ed0000\"","_colls":"colls/","_users":"users/","_ts":1736021997},{"id":"ToDoList","_rid":"YCE6AA==","_self":"dbs/YCE6AA==/","_etag":"\"0000bf05-0000-0d00-0000-677997930000\"","_colls":"colls/","_users":"users/","_ts":1736021907}],"_count":2}\</code></pre><P> </P><P><STRONG>Sample operation 2:</STRONG> Get List of Containers for specific Database</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="PiotrRadzki_3-1736109633385.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207896i5455E107AB52B640/image-size/large?v=v2&px=999" role="button" title="PiotrRadzki_3-1736109633385.png" alt="PiotrRadzki_3-1736109633385.png" /></span></P><P>For this REST No-SQL query adapter provides all Containers for the give CosmosDB (below snippet is reduced for the purpose of the blog). </P><P> </P><pre class="lia-code-sample language-json"><code>{
"_rid": "5tgUAA==",
"DocumentCollections": [
{
"id": "Products2",
"indexingPolicy": {
"indexingMode": "consistent",
"automatic": true,
"includedPaths": [
{
"path": "/*"
}
],
"excludedPaths": [
{
"path": "/\"_etag\"/?"
}
]
},
"partitionKey": {
"paths": [
"/id"
],
"kind": "Hash",
"version": 2
},
"uniqueKeyPolicy": {
"uniqueKeys": []
},
"conflictResolutionPolicy": {
"mode": "LastWriterWins",
"conflictResolutionPath": "/_ts",
"conflictResolutionProcedure": ""
},
"geospatialConfig": {
"type": "Geography"
},
"fullTextPolicy": {
"defaultLanguage": "en-US",
"fullTextPaths": []
},
"_rid": "5tgUAL2JYlI=",
"_ts": 1736025012,
"_self": "dbs/5tgUAA==/colls/5tgUAL2JYlI=/",
"_etag": "\"0000d305-0000-0d00-0000-6779a3b40000\"",
"_docs": "docs/",
"_sprocs": "sprocs/",
"_triggers": "triggers/",
"_udfs": "udfs/",
"_conflicts": "conflicts/",
"computedProperties": []
}
],
"_count": 2
}</code></pre><P> </P><P><STRONG>Sample operation 3:</STRONG> Get List of Documents from specific Container</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="PiotrRadzki_5-1736110750115.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207898i189D6AA222008D7D/image-size/large?v=v2&px=999" role="button" title="PiotrRadzki_5-1736110750115.png" alt="PiotrRadzki_5-1736110750115.png" /></span></P><P>For this REST No-SQL query adapter provides all Documents for the given Container and Database (the snippet is reduced for the blog). </P><P> </P><pre class="lia-code-sample language-json"><code>{
"_rid": "5tgUAPPYRnQ=",
"Documents": [
{
"unitPrice": 13,
"unitsInStock": 32,
"reorderLevel": 15,
"supplierId": 12,
"name": "Original Frankfurter grüne Soße",
"ProductID": 77,
"id": "985cfdf8-43f7-4fe9-a10a-34adbab8b50a",
"quantityPerUnit": "12 boxes",
"discontinued": false,
"categoryId": 2,
"unitsOnOrder": 0,
"_rid": "5tgUAPPYRnTnAAAAAAAAAA==",
"_self": "dbs/5tgUAA==/colls/5tgUAPPYRnQ=/docs/5tgUAPPYRnTnAAAAAAAAAA==/",
"_etag": "\"9a01b953-0000-0d00-0000-677ae3130000\"",
"_attachments": "attachments/",
"_ts": 1736106771
}
],
"_count": 1
}</code></pre><P> </P><P>One limitation I noticed is the inability to externalize certain configuration options in the adapter. These fields must be configured directly in the iFlow, requiring a redeployment whenever changes are made. It would be beneficial to allow these options to be modified through externalized parameters in future releases. </P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="PiotrRadzki_4-1736110190908.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207897i4DB192D448D3604F/image-size/large?v=v2&px=999" role="button" title="PiotrRadzki_4-1736110190908.png" alt="PiotrRadzki_4-1736110190908.png" /></span></P><H1 id="toc-hId--442456085">Summary</H1><P>This blog showcases the integration of SAP Integration Suite's Azure CosmosDB receiver adapter with a practical demo scenario. It demonstrates how to pull product data from the Northwind API, transform it using Groovy scripting, and store it in Azure CosmosDB with Bulk processing. Key features of the adapter, such as CRUD operations and schema-agnostic capabilities, were explored alongside important considerations like error handling and Partition Key usage. Readers will gain insights into setting up seamless integrations for modern, hybrid-cloud applications.</P><P>Thanks for attention! Hope you enjoyed and will have fun with new Azure CosmosDB receiver adapter. </P><P>Piotr </P>2025-01-05T22:14:08.054000+01:00https://community.sap.com/t5/technology-blogs-by-members/migration-checklist-sap-po-to-sap-integration-suite-cloud-integration/ba-p/13977542Migration Checklist: SAP PO to SAP Integration Suite, Cloud Integration2025-01-06T11:16:26.891000+01:00adam_kiwon3https://community.sap.com/t5/user/viewprofilepage/user-id/206865<P>Dear SAP community,</P><P>There is a lot of information available already regarding the move from SAP PO to CPI, please find a collection of links in our blog Integration Excellence: <A href="https://www.integration-excellence.com/migration-checklist-sap-po-to-sap-integration-suite/" target="_blank" rel="nofollow noopener noreferrer">https://www.integration-excellence.com/migration-checklist-sap-po-to-sap-integration-suite/</A></P><P>The following areas are covered:</P><UL><LI>Preparing Questions</LI><LI>SAP Backend (ABAP) Integration </LI><LI>Interface Design</LI><LI>Security</LI><LI>Operations</LI></UL><P>Please leave a comment if I might have missed major aspects!</P>2025-01-06T11:16:26.891000+01:00https://community.sap.com/t5/crm-and-cx-blogs-by-members/accrual-posting-made-simple-with-sap-enterprise-service-management-esm/ba-p/13976582Accrual Posting Made Simple with SAP Enterprise Service Management (ESM)2025-01-06T16:49:02.772000+01:00pvsbprasadhttps://community.sap.com/t5/user/viewprofilepage/user-id/7820<P style=" text-align : justify; ">Efficient employee case management is a cornerstone of modern HR and service operations. By integrating SAP Enterprise Service Management (ESM) with SAP WorkZone, organizations can offer employees a seamless self-service experience, empowering them to address their needs while improving operational efficiency.</P><P style=" text-align : justify; ">This blog outlines the process flow for managing employee cases within the ESM-WorkZone integration, detailing each step from case creation to resolution and closure.</P><H3 id="toc-hId-1207615992"><STRONG>Scenario Overview</STRONG></H3><P style=" text-align : justify; ">In today's dynamic business environment, services often span multiple accounting periods, requiring precise accrual postings to maintain financial accuracy. Consider a scenario where:</P><OL style=" text-align : justify; "><LI>Service cases are created in SAP Service Cloud (V2).</LI><LI>Financial transactions, like accrual postings, are automated and processed in SAP S/4HANA.</LI></OL><P style=" text-align : justify; ">SAP ESM facilitates this seamless flow, automating calculations, postings, and reconciliations to save time and reduce errors.</P><H3 id="toc-hId-1011102487"><STRONG>Technical Architecture</STRONG></H3><P style=" text-align : justify; ">The integration involves:</P><OL style=" text-align : justify; "><LI><STRONG>SAP Service Cloud (V2):</STRONG> Manages service cases and initiates accrual requests.</LI><LI><STRONG>SAP Integration Suite:</STRONG> Facilitates real-time data transfer between systems.</LI><LI><STRONG>SAP S/4HANA:</STRONG> Processes accrual postings and reconciliations.</LI></OL><P style=" text-align : justify; ">Below is a high-level architecture diagram:</P><UL style=" text-align : justify; "><LI>Service Cloud V2 → Integration Suite → S/4HANA</LI></UL><H3 id="toc-hId-814588982"><STRONG>Key Features of the ESM-WorkZone Integration</STRONG></H3><OL style=" text-align : justify; "><LI><P><STRONG>Centralized Access:</STRONG></P><UL><LI>The ESM Self-Service Portal is embedded within SAP WorkZone under the Employee Self-Service (ESS) page.</LI></UL></LI><LI><P><STRONG>Knowledge Base Access:</STRONG></P><UL><LI>Employees can optionally search Knowledge Base (KB) articles for relevant information before creating a case.</LI></UL></LI><LI><P><STRONG>Structured Attachments:</STRONG></P><UL><LI>The system enforces consistent structure for attachments and forms, ensuring all required information is included with the case.</LI></UL></LI><LI><P><STRONG>Streamlined Case Creation:</STRONG></P><UL><LI>Employees can create cases using a pre-configured JE form, making the process intuitive and efficient.</LI></UL></LI></OL><H3 id="toc-hId-618075477">Employee Case Management Process</H3><UL style=" text-align : justify; "><LI>Case Creation: Once employees log into the WorkZone ESS page.The company accountant seamlessly initiates an accrual posting request through the Employee Self-Service widget on the SAP Build Work Zone portal, ensuring all essential details are accurately captured and submitted with ease.</LI></UL><P style=" text-align : justify; "><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="image_2025-01-06_114022479.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207956i6A645F83088F28AA/image-size/large?v=v2&px=999" role="button" title="image_2025-01-06_114022479.png" alt="image_2025-01-06_114022479.png" /></span></P><P style=" text-align : justify; "> </P><P style=" text-align : justify; "> </P><UL style=" text-align : justify; "><LI>Once an Accountant submits an accrual posting request, the Finance Support Agent receives an instant real-time alert about the new case assignment. This streamlined notification system ensures quick access to the case and enables efficient management, allowing finance teams to respond promptly and maintain smooth operational workflows.</LI></UL><P style=" text-align : justify; "><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="image_2025-01-06_114143354.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207957i8BB78180110FC4E4/image-size/large?v=v2&px=999" role="button" title="image_2025-01-06_114143354.png" alt="image_2025-01-06_114143354.png" /></span></P><UL style=" text-align : justify; "><LI>The Finance Support Agent carefully examines the details of each newly created case, reviewing key aspects such as case type, employee information, and categorization. This thorough assessment ensures accurate classification, enabling swift and efficient resolution.</LI></UL><P style=" text-align : justify; "><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="image_2025-01-06_114342657.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207958i45B911348038EF9B/image-size/large?v=v2&px=999" role="button" title="image_2025-01-06_114342657.png" alt="image_2025-01-06_114342657.png" /></span></P><UL style=" text-align : justify; "><LI>Leveraging advanced AI capabilities, Finance Support Agents can now access dynamically generated summaries that consolidate essential case details. These intelligent summaries provide a clear, concise overview of critical information, empowering agents to make faster, more informed decisions and deliver efficient resolutions.</LI></UL><P style=" text-align : justify; "><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="image_2025-01-06_114949412.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207959iDD91928D04EF4603/image-size/large?v=v2&px=999" role="button" title="image_2025-01-06_114949412.png" alt="image_2025-01-06_114949412.png" /></span></P><UL style=" text-align : justify; "><LI>The Finance Support Agent meticulously reviews the Case Form to ensure all details are accurate and complete. Once verified, they seamlessly process and post the data as a journal entry in SAP S/4HANA, maintaining precise and efficient financial records. This streamlined workflow not only upholds data integrity but also enhances overall operational efficiency in financial management.</LI></UL><P style=" text-align : justify; "><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="image_2025-01-06_115148610.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207960i4F8C8571B1D75DAD/image-size/large?v=v2&px=999" role="button" title="image_2025-01-06_115148610.png" alt="image_2025-01-06_115148610.png" /></span></P><UL style=" text-align : justify; "><LI>Once the journal entry is posted, the Finance Support Agent accesses the SAP S/4HANA Journal Entry interface to review and validate the recorded details. This crucial step ensures the accuracy of the data and allows for the swift identification and resolution of any discrepancies.</LI></UL><P style=" text-align : justify; "><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Journal Entry Posting.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/208278i4DBEF6B1F7C00C49/image-size/large?v=v2&px=999" role="button" title="Journal Entry Posting.png" alt="Journal Entry Posting.png" /></span></P><P style=" text-align : justify; "> </P><UL style=" text-align : justify; "><LI>When a Journal Entry is posted, the system seamlessly updates the case status to "Completed." This automation streamlines case management, ensuring efficient workflows and accurate case closures.</LI></UL><P style=" text-align : justify; "><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="image_2025-01-06_211351043.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/208282i477E56904A27C132/image-size/large?v=v2&px=999" role="button" title="image_2025-01-06_211351043.png" alt="image_2025-01-06_211351043.png" /></span></P><P style=" text-align : justify; "> </P><H3 id="toc-hId-421561972"><STRONG>Benefits of ESM-WorkZone Integration</STRONG></H3><OL style=" text-align : justify; "><LI><P><STRONG>Enhanced Employee Experience:</STRONG></P><UL><LI>By centralizing access and enabling self-service capabilities, employees can address their concerns without unnecessary delays.</LI></UL></LI><LI><P><STRONG>Operational Efficiency:</STRONG></P><UL><LI>Automation of accrual postings and structured case management reduces manual errors and administrative overhead.</LI></UL></LI><LI><P><STRONG>Knowledge Empowerment:</STRONG></P><UL><LI>Access to the Knowledge Base empowers employees to find answers independently, reducing case volume.</LI></UL></LI><LI><P><STRONG>Comprehensive Case Visibility:</STRONG></P><UL><LI>Integration with SAP WorkZone ensures that employees and agents can track case status in real time.</LI></UL></LI><LI><P><STRONG>Compliance and Accuracy:</STRONG></P><UL><LI>Seamless posting to SAP S/4HANA ensures financial accuracy and compliance with organizational policies.</LI></UL></LI></OL><H3 id="toc-hId-225048467"><STRONG>Real-World Application</STRONG></H3><P style=" text-align : justify; ">Consider an employee needing reimbursement for an approved expense:</P><OL style=" text-align : justify; "><LI>The employee logs into WorkZone ESS, searches for relevant KB articles, and submits the JE form with supporting documents.</LI><LI>The case is created in ESM, capturing all necessary details.</LI><LI>HR agents review the case, validate the attachments, and post the accrual to SAP S/4HANA.</LI><LI>The case status is updated in WorkZone, and the employee is notified of the resolution.</LI></OL><P style=" text-align : justify; ">This streamlined process ensures transparency, efficiency, and employee satisfaction.</P><H3 id="toc-hId-28534962"><STRONG>Conclusion</STRONG></H3><P style=" text-align : justify; ">Integrating SAP ESM with WorkZone simplifies employee case management by providing a unified platform for case creation, tracking, and resolution. Whether it’s troubleshooting common issues, posting accruals, or closing cases, this integration ensures that both employees and HR teams have the tools they need for efficient service delivery.</P><P style=" text-align : justify; ">Ready to transform your employee service operations? Start leveraging the power of SAP ESM and WorkZone today!</P><P style=" text-align : justify; "> </P>2025-01-06T16:49:02.772000+01:00https://community.sap.com/t5/technology-blogs-by-members/how-to-send-email-notifications-only-on-the-last-retry-attempt-in-sap-ci-is/ba-p/13976986How to send Email Notifications only on the Last Retry Attempt in SAP CI/IS when using AEM2025-01-07T20:29:44.570000+01:00Jayabalaji_Sakthivelhttps://community.sap.com/t5/user/viewprofilepage/user-id/1440301<H3 id="toc-hId-1207619840">Introduction: </H3><P>In SAP Cloud Platform Integration (CPI) or Integration Suite, handling retries effectively is crucial for ensuring smooth and reliable message processing. One common requirement in integration scenarios is sending email notifications only when a certain condition is met- such as after the last retry attempt. This helps in reducing notification overload while ensuring that stakeholders are only alerted when necessary.</P><P>When using the Advanced Event Mesh (AEM) Sender, you can leverage event driven communication to handle retries in a more controlled manner. In this blog, we will explore how to configure SAP CPI to send email notifications only after the final retry attempt, using the AEM Sender adapter. This solution not only streamlines the notification process but also ensures that notifications are sent only when the retry attempts have been exhausted, making the system more efficient and less intrusive.</P><H3 id="toc-hId-1011106335"><STRONG>Use Case Overview:</STRONG></H3><P>In this use case, we will demonstrate how to configure an integration flow using the Advanced Event Mesh (AEM) Sender to consume messages from a queue. The primary goal is to handle retry logic in such a way that an email alert is sent <STRONG>only after the final retry attempt</STRONG> is reached, ensuring notifications are triggered only when necessary.</P><H3 id="toc-hId-814592830">Integration Flow:</H3><P>Below is a sample Integration Flow created to route email alert only on the last retry attempt.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2025-01-05 192825.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207842iB75E6CDA399D3B1F/image-size/large?v=v2&px=999" role="button" title="Screenshot 2025-01-05 192825.png" alt="Screenshot 2025-01-05 192825.png" /></span></P><P> </P><P><STRONG>Important note:</STRONG> Make sure to use * in the Allowed headers as shown, to ensure that the full set of headers is received from the AEM sender.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="Jayabalaji_Sakthivel_0-1736085927962.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207843i2AC66E398CC31376/image-size/medium?v=v2&px=400" role="button" title="Jayabalaji_Sakthivel_0-1736085927962.png" alt="Jayabalaji_Sakthivel_0-1736085927962.png" /></span></P><P> </P><P> </P><P> </P><P> </P><P> </P><P>Now, let's discuss the basic configuration.</P><P>For guidance on configuring the AEM sender channel, refer to SAP help or other relevant blogs. In this example, we have set the Maximum Message Processing Attempts to 3, and our goal is to send an alert only on the third (final) retry attempt.</P><P>This is achieved by using the "LocalProcessingAttempt" header, which is dynamically set during runtime based on the number of attempts. Initially, the AEM sender sets this header to 1 as shown below, and it increments with each subsequent retry.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Jayabalaji_Sakthivel_1-1736086780107.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207844i602ACA238633D6A5/image-size/medium?v=v2&px=400" role="button" title="Jayabalaji_Sakthivel_1-1736086780107.png" alt="Jayabalaji_Sakthivel_1-1736086780107.png" /></span></P><P>In the local sub-process, we use a router to define the routing condition as ${header.LocalProcessingAttempt} > '2'. This means that once the attempt exceeds 2, the flow will follow the path where the email receiver is configured.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Jayabalaji_Sakthivel_3-1736087216595.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207846iA15B06DD717F85EB/image-size/medium?v=v2&px=400" role="button" title="Jayabalaji_Sakthivel_3-1736087216595.png" alt="Jayabalaji_Sakthivel_3-1736087216595.png" /></span></P><P>Note: To make the retry attempt dynamic, you can substitute the value 2 with a property that we can set in a content modifier before router.</P><H3 id="toc-hId-618079325">Conclusion:</H3><P> With the use of the "LocalProcessingAttempt" header and routing conditions, you can tailor the retry logic to suit specific business needs and enhance the overall efficiency of your integration processes.By configuring the integration flow to send email alerts only on the final retry attempt, you can significantly reduce unnecessary notifications and focus attention on the most critical events. This method provides better control over communication in your SAP CPI environment, ensuring that stakeholders are only alerted when all retry options have been exhausted.</P><P> </P><P> </P>2025-01-07T20:29:44.570000+01:00https://community.sap.com/t5/technology-blogs-by-members/xml-to-csv-conversion-in-integration/ba-p/13978887XML to CSV conversion in integration2025-01-08T05:46:53.985000+01:00RaghuVamseedharhttps://community.sap.com/t5/user/viewprofilepage/user-id/191580<P>In SAP Process Orchestration, 'content conversion' processes XML level 3 elements into CSV format. Note, the fieldNames do not influence the output CSV.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="1.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/209025i0AD5B10E4ADF01CD/image-size/large?v=v2&px=999" role="button" title="1.png" alt="1.png" /></span></P><P>Conversely, in SAP Cloud Integration, the 'CSV to XML converter' generates CSV using the element names from the first record of the input XML. If a new element appears in subsequent records, it will be appended at the end of the line.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="2.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/209028iABE5DC8420A65DA1/image-size/large?v=v2&px=999" role="button" title="2.png" alt="2.png" /></span></P><P>This difference in behavior can create challenges in migration projects. For PO interfaces with optional elements, fewer CSV columns are produced, whereas CPI interfaces will append optional fields at the end of the line. To manage these issues, you can use additional message mapping with a one-to-one mapWithDefault, although this will create columns even for optional elements. Another option is to use a Groovy script to create consistent elements (e.g., field1, field2, field3, and so on). Below is an example Groovy script:</P><pre class="lia-code-sample language-java"><code>import com.sap.gateway.ip.core.customdev.util.Message
import groovy.xml.MarkupBuilder
def Message processData(Message message) {
def stringWriter = new StringWriter()
def xmlBuilder = new MarkupBuilder(stringWriter)
def inputXml = new XmlSlurper().parseText(message.getBody(String))
xmlBuilder.Root {
inputXml.Record.each { record ->
Record {
record.children().eachWithIndex { element, index ->
"field${index + 1}"(element.text())
}
}
}
}
message.setBody(stringWriter.toString())
return message
}</code></pre><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="3.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/209030iC6756A56268944F0/image-size/large?v=v2&px=999" role="button" title="3.png" alt="3.png" /></span></P><P>You can use a Content Modifier after the 'XML to CSV Converter' if you want to prefix the header with actual field names instead of generic names like field1, field2, field3.</P><P>SAP Help Links:-</P><P>SAP PO - <A href="https://help.sap.com/doc/saphelp_snc70/7.0/en-US/2c/181077dd7d6b4ea6a8029b20bf7e55/frameset.htm" target="_self" rel="noopener noreferrer">Converting File Content in a Sender Adapter</A></P><P>SAP Cloud Integration - <A href="https://help.sap.com/docs/cloud-integration/sap-cloud-integration/configure-xml-to-csv-converter" target="_self" rel="noopener noreferrer">Configure XML to CSV Converter</A> - "<EM>When optional fields exists in the XML, the ordering is maintained in the order when a tag is encountered.</EM>"</P>2025-01-08T05:46:53.985000+01:00https://community.sap.com/t5/technology-blogs-by-sap/how-to-convert-from-html-to-pdf-in-sap-cpi-part-i/ba-p/13976146How to Convert from HTML to PDF in SAP CPI - Part I2025-01-08T10:07:23.211000+01:00Afonso_JPPhttps://community.sap.com/t5/user/viewprofilepage/user-id/1451891<P><STRONG>Overview</STRONG></P><P>In this guide, I will detail the process of generating a PDF document by converting HTML content on SAP Cloud Platform Integration (CPI). The use case involves the following steps:</P><OL><LI><STRONG>Fetch Terminated Employee Data:</STRONG> Retrieve data for terminated employees from SAP SuccessFactors.</LI><LI><STRONG>Use a Document Template:</STRONG> Leverage an HTML document template built in SuccessFactors.</LI><LI><STRONG>Replace Placeholders:</STRONG> Populate the template with dynamic data specific to each employee.</LI><LI><STRONG>Generate a PDF File:</STRONG> Convert the populated HTML to a PDF document.</LI><LI><STRONG>Send PDF via Email:</STRONG> Attach the generated PDF to an email and send it to the terminated employee.</LI></OL><P><STRONG>Considerations for PDF Generation</STRONG></P><P>After researching available libraries, two primary solutions were identified:</P><OL><LI><STRONG>iText's Html2Pdf:</STRONG></LI><UL><LI>Some licensing limitations.</LI><LI>Preferred for cases requiring advanced formatting and multilingual text (e.g., English and Arabic).</LI><LI>Reference: <A href="https://springhow.com/java-html-to-pdf-conversion-using-itext-pdf/" target="_blank" rel="noopener nofollow noreferrer">SpringHow - iText PDF</A>.</LI></UL><LI><STRONG>OpenHtml2Pdf:</STRONG></LI><UL><LI>Complex implementation.</LI><LI>No apparent licensing limitations.</LI><LI>Reference: <A href="https://github.com/danfickle/openhtmltopdf/wiki/Integration-Guide" target="_blank" rel="noopener nofollow noreferrer">OpenHtml2Pdf Integration Guide</A>.</LI></UL></OL><P>Given the need to support bilingual text (English and Arabic) with specific fonts, <STRONG>iText's Html2Pdf</STRONG> was selected for this implementation. I will present an implementation with OpenHtml2Pdf on a second article.</P><P><STRONG>Data Requirements</STRONG></P><P>The HTML template is populated using the following dynamic fields:</P><UL><LI>Employee Name (English and Arabic)</LI><LI>Nationality (English and Arabic)</LI><LI>Employee ID</LI><LI>Job Title (English and Arabic)</LI><LI>Job Start and End Dates</LI><LI>Company Name (English and Arabic)</LI><LI>Company Logo, Footer, and Stamp</LI><LI>Employee’s Personal Email Address</LI></UL><P><STRONG>Fetching Employee Data</STRONG></P><P>Data is retrieved from the EmpEmploymentTermination entity in SuccessFactors using a GET request. Key paths include:</P><TABLE><TBODY><TR><TD width="96"><P><STRONG>Field</STRONG></P></TD><TD width="516"><P><STRONG>Path</STRONG></P></TD></TR><TR><TD width="96"><P><STRONG>Full Name (English)</STRONG></P></TD><TD width="516"><P>/EmpEmploymentTermination/personNav/PerPerson/personalInfoNav/PerPersonal/firstName</P></TD></TR><TR><TD width="96"><P><STRONG>Full Name (Arabic)</STRONG></P></TD><TD width="516"><P>/EmpEmploymentTermination/personNav/PerPerson/personalInfoNav/PerPersonal/firstNameAlt1</P></TD></TR><TR><TD width="96"><P><STRONG>Nationality</STRONG></P></TD><TD width="516"><P>has a custom path</P></TD></TR><TR><TD width="96"><P><STRONG>Nationality Arabic</STRONG></P></TD><TD width="516"><P>has a custom path</P></TD></TR><TR><TD width="96"><P><STRONG>Employee ID</STRONG></P></TD><TD width="516"><P>/EmpEmploymentTermination/userId</P></TD></TR><TR><TD width="96"><P><STRONG>Job Title (English)</STRONG></P></TD><TD width="516"><P>/EmpEmploymentTermination/jobInfoNav/EmpJob/positionNav/Position/externalName_en_GB</P></TD></TR><TR><TD width="96"><P><STRONG>Job Title (Arabic)</STRONG></P></TD><TD width="516"><P>/EmpEmploymentTermination/jobInfoNav/EmpJob/positionNav/Position/externalName_ar_SA</P></TD></TR><TR><TD width="96"><P><STRONG>Personal Email</STRONG></P></TD><TD width="516"><P>/EmpEmploymentTermination/EmpEmploymentTermination/personNav/PerPerson/emailNav/PerEmail - emailAddress and filter by emailType (check the corresponding optionId to the Personal type on object definition)</P></TD></TR><TR><TD width="96"><P><STRONG>Job Start Date</STRONG></P></TD><TD width="516"><P>/EmpEmploymentTermination/EmpEmploymentTermination/jobInfoNav/EmpJob/hireDate</P></TD></TR><TR><TD width="96"><P><STRONG>Job End Date</STRONG></P></TD><TD width="516"><P>/EmpEmploymentTermination/EmpEmploymentTermination/endDate</P></TD></TR><TR><TD width="96"><P><STRONG>Company Name (English)</STRONG></P></TD><TD width="516"><P>/EmpEmploymentTermination/EmpEmploymentTermination/jobInfoNav/EmpJob/companyNav/FOCompany/name_en_GB </P></TD></TR><TR><TD width="96"><P><STRONG>Company Name (Arabic)</STRONG></P></TD><TD width="516"><P>/EmpEmploymentTermination/EmpEmploymentTermination/jobInfoNav/EmpJob/companyNav/FOCompany/name_ar_SA</P></TD></TR><TR><TD width="96"><P><STRONG>Company Code</STRONG></P></TD><TD width="516"><P>/EmpEmploymentTermination/EmpEmploymentTermination/jobInfoNav/EmpJob/companyNav/FOCompany/externalCode</P></TD></TR></TBODY></TABLE><P><STRONG>Note:</STRONG> Ensure that filters for termination codes and dates are properly defined to fetch relevant records. The query should include parameters such as TerminationCode, CurrentRunDate, and PreviousRunDate.</P><P> </P><H1 id="toc-hId-949446590">Implementation in SAP CPI</H1><P>The process is divided into three main components:</P><H2 id="toc-hId-882015804">1. Main Process</H2><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Main Process" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207342iCD48ABFC634C1E11/image-size/medium?v=v2&px=400" role="button" title="Afonso_JPP_0-1735923764806.png" alt="Main Process" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Main Process</span></span></P><UL><LI><STRONG>Timer Configuration:</STRONG></LI><UL><LI>Scheduled based on client preferences. For manual runs, use the "Run Once" option.</LI></UL><LI><STRONG>Define Parameters:</STRONG></LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Define Initial Parameters" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207341i8F7088AEFF763E63/image-size/medium?v=v2&px=400" role="button" title="Afonso_JPP_1-1735923764810.png" alt="Define Initial Parameters" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Define Initial Parameters</span></span></P><UL><UL><LI>Set external parameters such as personIdExternal, TerminationCode, and PreviousRunDate_Ext for filtering and query building.<STRONG> </STRONG></LI></UL></UL><UL><LI><STRONG>Query Builder:</STRONG></LI><UL><LI>Using script to determine the “PreviousRunDate” value, used for a delta logic.</LI><LI>personIdExternal externalized parameter used for extra optional personIdExternal filter, built in the script.</LI></UL></UL><P> </P><P> </P><P> </P><P> </P><pre class="lia-code-sample language-java"><code>import com.sap.gateway.ip.core.customdev.util.Message
import java.util.HashMap;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
def Message buildQuery(Message message) {
prop = message.getProperties();
head = message.getHeaders();
StringBuffer debugLog = new StringBuffer();
String modDate="";
Date today = new Date();
DateFormat dateFormat= new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
String todayInString = dateFormat.format(today);
String personIdExternal = prop.get('personIdExternal');
// use fixed RunDate as the initial delta timestamp
if(!(prop.get("PreviousRunDate_Ext").trim().isEmpty()))
{
modDate = prop.get("PreviousRunDate_Ext");
message.setProperty("PreviousRunDatePersisted_Value",modDate);
}
// use previously persisted RunDate as the initial delta timestamp
else if(!(prop.get("PreviousRunDate").trim().isEmpty()))
{
modDate = prop.get("PreviousRunDate");
message.setProperty("PreviousRunDatePersisted_Value",modDate);
}
// use the CurrentDate as the initial delta timestamp
else
{
modDate=todayInString;
message.setProperty("PreviousRunDatePersisted_Value",modDate);
}
message.setProperty("PreviousRunDate", modDate);
// create extra query parameter for a fixed employee id
if(!(personIdExternal.trim().isEmpty())){
message.setProperty("personIdExternalQuery", " and personIdExternal eq '"+personIdExternal + "'");
}else{
message.setProperty("personIdExternalQuery", "");
}
return message;}</code></pre><P> </P><P> </P><P> </P><P> </P><UL><LI><STRONG>Get Terminated Employees</STRONG></LI><LI><STRONG>Splitter</STRONG></LI><UL><LI>Split by XPath expression “/EmpEmploymentTermination/ EmpEmploymentTermination/”</LI></UL><LI><STRONG>Process each employee record individually</STRONG></LI></UL><H2 id="toc-hId-685502299">2. Get Terminated Employees</H2><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Get Terminated Employees" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207347iBD6E12E0577E8044/image-size/medium?v=v2&px=400" role="button" title="Afonso_JPP_2-1735923911682.png" alt="Get Terminated Employees" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Get Terminated Employees</span></span></P><UL><LI>Use query builder to choose the needed fields (mentioned previously)</LI><UL><LI>Use "Custom Query Options" to define filters such as:</LI></UL></UL><P><STRONG><FONT color="#000000">$filter=jobInfoNav/eventNav/externalCode eq '${property.TerminationCode}' and lastModifiedOn le datetime'${property.CurrentRunDate}' and lastModifiedOn ge datetime'${property.PreviousRunDate}' ${property.personIdExternalQuery}</FONT></STRONG></P><UL><UL><LI>Ensure proper handling of delta requests to fetch updated records.</LI></UL></UL><H2 id="toc-hId-488988794">3. Handle Each Employee</H2><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Handle Each Employee" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207346i76A3EEAE35CB3909/image-size/medium?v=v2&px=400" role="button" title="Afonso_JPP_3-1735923911685.png" alt="Handle Each Employee" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Handle Each Employee</span></span></P><UL><LI><STRONG>Message Mapping:</STRONG></LI><UL><LI>Transform data into a simple XML structure for debugging and processing.</LI></UL></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Message Mapping to Simple Structure" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207348iE0B60A1DCF22B479/image-size/medium?v=v2&px=400" role="button" title="Afonso_JPP_4-1735923911689.png" alt="Message Mapping to Simple Structure" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Message Mapping to Simple Structure</span></span></P><UL><UL><LI>Assign specific logos, footers, and stamps to each company code using a Value Mapping.</LI></UL></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Value Mapping operation in Message Mapping" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207350iE57ED1214C4E4CF2/image-size/medium?v=v2&px=400" role="button" title="Afonso_JPP_5-1735923911693.png" alt="Value Mapping operation in Message Mapping" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Value Mapping operation in Message Mapping</span></span></P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Value Mapping from Company Code" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/207349iA0346492A27E2FD5/image-size/medium?v=v2&px=400" role="button" title="Afonso_JPP_6-1735923911696.png" alt="Value Mapping from Company Code" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Value Mapping from Company Code</span></span></P><UL><LI><STRONG>Build PDF Text:</STRONG></LI><UL><LI>Populate the HTML template with employee-specific details.</LI><LI>Ensure correct URL paths for logos and stamps.</LI><LI>See the cpi_anonymized.txt attachment for an example of HTML content being used in SAP CPI.</LI></UL></UL><P> <STRONG>PDF Generation</STRONG></P><P> </P><P> </P><P> </P><P> </P><pre class="lia-code-sample language-java"><code>import com.sap.gateway.ip.core.customdev.util.Message
import org.apache.camel.impl.DefaultAttachment
import javax.mail.util.ByteArrayDataSource
import javax.activation.DataHandler
import javax.activation.DataSource
import javax.activation.FileDataSource
import javax.mail.util.ByteArrayDataSource
import java.io.ByteArrayOutputStream
import com.itextpdf.html2pdf.HtmlConverter
import com.itextpdf.html2pdf.ConverterProperties
import com.itextpdf.layout.font.FontProvider
import com.itextpdf.html2pdf.resolver.font.DefaultFontProvider
def Message convertHtmlToPdf(Message message) {
// Get HTML Body
String htmlContent = message.getBody(String.class);
OutputStream pdfOutput = new ByteArrayOutputStream();
FontProvider fontProvider = new DefaultFontProvider(true, true, true);
ConverterProperties properties = new ConverterProperties();
properties.setCharset("UTF-8");
properties.setFontProvider(fontProvider);
// Convert from HTML to pdf (in byte array format)
HtmlConverter.convertToPdf(htmlContent, pdfOutput, properties);
// Close the OutputStream if it's no longer needed
pdfOutput.close()
// Convert OutputStream to byte array
byte[] pdfBytes = pdfOutput.toByteArray()
// Create a DataSource from the byte array
DataSource dataSource = new ByteArrayDataSource(pdfBytes, "application/pdf")
// Create a DataHandler from the DataSource
DataHandler dataHandler = new DataHandler(dataSource)
// Construct a DefaultAttachment object
def attachment = new DefaultAttachment(dataHandler);
// Attach the document
message.addAttachmentObject("Attachment.pdf", attachment);
return message;
}</code></pre><P> </P><P> </P><P> </P><P> </P><UL><LI><STRONG>HTML to PDF Conversion:</STRONG></LI><UL><LI>Use OutputStream to write data to a destination.</LI><LI>Use HTML Converter to convert our HTML content to pdf.</LI><LI>Specify properties such as FontProvider to keep the correct format of the document.</LI><LI>Construct a DefaultAttachment object using the ByteArrayDataSource fed with the pdfOutput’s byte array. This object encapsulates the attachment data and is ready to be added to the email with addAttachmentObject();</LI></UL></UL><P><STRONG>Adding External Libraries</STRONG></P><P>Before executing the iFlow, it is essential to include the required external libraries in the project references. The primary library for HTML-to-PDF conversion, such as html2pdf, has several dependencies that must also be included.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Needed iText Libraries" style="width: 172px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/209748i08E5AEDD7DBA5953/image-size/medium?v=v2&px=400" role="button" title="Afonso_JPP_0-1736347448695.png" alt="Needed iText Libraries" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Needed iText Libraries</span></span></P><P>These libraries can be downloaded from Maven repositories, such as:</P><UL><LI><A href="https://mvnrepository.com/artifact/com.itextpdf" target="_blank" rel="noopener nofollow noreferrer">Maven Repository for iText PDF</A>.</LI></UL><P><STRONG> </STRONG><STRONG>Important Considerations:</STRONG></P><UL><LI>While the html2pdf library is available for free, its usage is subject to specific licensing conditions. Ensure that you review and comply with these terms before implementation.</LI><LI>OpenHtml2Pdf requires a more complex implementation, but it may be a good choice due to no apparent licensing limitations.</LI></UL><P><STRONG> </STRONG><STRONG>Final Notes</STRONG></P><P>While this implementation meets the requirements, it is not an ideal architectural solution. A more robust approach would involve:</P><UL><LI>Using SAP CPI for data retrieval and HTML preparation.</LI><LI>Delegating PDF generation and email dispatch to an API, such as SAP Forms Service by Adobe:<UL><LI><A href="https://help.sap.com/docs/forms-service-by-adobe/sap-forms-service-cf/sap-forms-service-by-adobe-rest-api" target="_blank" rel="noopener noreferrer">SAP Forms Service by Adobe REST API | SAP Help Portal</A></LI></UL></LI></UL><P>We did not go with this approach due to restraints that were placed by the customer itself and some lack of experience with SAP Forms API.</P><P>This approach reduces dependency on external libraries and aligns with best practices in enterprise architecture.</P><P>Ensure compliance with licensing terms for any third-party libraries used.</P><P><STRONG> </STRONG></P><P> </P>2025-01-08T10:07:23.211000+01:00https://community.sap.com/t5/technology-blogs-by-sap/leveraging-sap-integration-suite-for-salesforce-extraction-into-sap-bw/ba-p/13978922Leveraging SAP Integration Suite for Salesforce extraction into SAP BW/4HANA2025-01-10T12:34:21.027000+01:00_Nils_Lorenz_https://community.sap.com/t5/user/viewprofilepage/user-id/43637<P><FONT size="3"><STRONG>*<SPAN>This article has been collaboratively created with</SPAN> <A href="https://community.sap.com/t5/user/viewprofilepage/user-id/40098" target="_blank">Frank Riesner</A></STRONG> .</FONT></P><P>Dear BW enthusiasts!<BR />There have been several contributions covering the ADSO write-interface already, like<BR /><A href="https://community.sap.com/t5/technology-blogs-by-sap/data-integration-with-sap-bw-4hana-2-0/ba-p/13418158" target="_self">Data Integration with SAP BW/4HANA</A><BR /><A class="" href="https://community.sap.com/t5/technology-blogs-by-sap/sap-cloud-integration-into-sap-bw-4hana/ba-p/13504588" target="_blank">SAP Cloud Integration into SAP BW/4HANA</A><BR /><A class="" href="https://community.sap.com/t5/technology-blogs-by-sap/sap-bw-4hana-write-interface-enabled-adso-connected-to-a-3rd-party-tool/ba-p/13482277" target="_blank">SAP BW/4HANA write interface-enabled ADSO connected to a 3rd Party Tool</A><BR /><A class="" href="https://community.sap.com/t5/technology-blogs-by-sap/sap-cloud-platform-integration-cpi-to-push-data-into-sap-bw-4hana/ba-p/13418310" target="_blank">SAP Cloud Platform Integration (CPI) to push data into SAP BW/4HANA</A></P><P><SPAN>There are various approaches to connect <STRONG>Salesfore</STRONG> as a source with the aforementioned write-interface of SAP BW/4HANA:</SPAN></P><OL><LI><SPAN>Via SAP HANA Smart Data Integration and its <A href="https://help.sap.com/docs/HANA_SMART_DATA_INTEGRATION/7952ef28a6914997abc01745fef1b607/d9f0a3b09e0f4b3eb010be8bd36871e5.html" target="_blank" rel="noopener noreferrer">OData Adapter</A>.<BR />(<FONT size="2"><EM>SAP Note: <A href="https://me.sap.com/notes/2776343" target="_self" rel="noopener noreferrer">2776343</A> describes the approach and same Interface for SAP SuccessFactors. However is is a useful source to understand the general approach for 3rd Party Products like Salesforce as well regarding the interface towards BW) </EM></FONT></SPAN></LI><LI><SPAN>Via SAP Data Services and its <A href="https://help.sap.com/docs/SAP_DATA_SERVICES/1bf3d60cfc604c528084ae59e7662156/7789ed120b7d433883ba3439c8031240.html" target="_blank" rel="noopener noreferrer">Salesforce Adapter</A> or the generic <A href="https://help.sap.com/docs/SAP_DATA_SERVICES/1bf3d60cfc604c528084ae59e7662156/789dcf29ad3b497490c51bc785c743da.html" target="_blank" rel="noopener noreferrer">OData Adapter</A>.</SPAN></LI><LI><SPAN>Via SAP BTP Integration Suite and the <A href="https://api.sap.com/package/SalesforceAdapter/overview" target="_blank" rel="noopener noreferrer">Salesforce Adapter</A></SPAN><SPAN><BR /></SPAN><SPAN>(<FONT size="2"><EM><A href="https://help.sap.com/docs/integration-suite/sap-integration-suite/salesforce-receiver-adapter" target="_self" rel="noopener noreferrer">SAP Help</A>, SAP Note: <A href="https://me.sap.com/notes/3001980" target="_self" rel="noopener noreferrer">3001980</A> and this <A href="https://community.sap.com/t5/technology-blogs-by-members/sap-cloud-integration-with-salesforce-part-1/ba-p/13498594" target="_blank">Blog</A> provide a more general overview under the aspect of "Non-SAP Integration - New Version of Adapters and Integration Packs) </EM></FONT> </SPAN></LI></OL><P><SPAN>In this Blog, we dive deep into approach (3) based on the <STRONG>SAP BTP Integration Suite</STRONG>. The intention is to give you a detailed approach for the specific <STRONG>use case to load data from Salesforce to SAP BW/4HANA</STRONG>.</SPAN></P><H4 id="toc-hId-1336761951"><STRONG>Prerequisites:</STRONG></H4><UL><LI>In SAP BW/4HANA system there is an DataStore object (ADSO) available with the special property “Write Interface enabled". <SPAN>After activation of this new ADSO, template URIs (Uniform Resource Identifiers) are generated in the Properties window by default. These provide the target interface for our scenario.</SPAN> For more details refer to the SAP Help <A href="https://help.sap.com/docs/SAP_BW4HANA/107a6e8a38b74ede94c833ca3b7b6f51/1961a9b62f054cc5a4f0d98485b82fa9.html" target="_blank" rel="noopener noreferrer">ADSO modeling properties</A> (note: This feature is not available in BW 7.5).</LI><LI>In SAP Integration Suite the <SPAN><A href="https://api.sap.com/package/SalesforceAdapter/overview" target="_blank" rel="noopener noreferrer">Salesforce Adapter</A> has been activated and is available.</SPAN></LI><LI><SPAN>Credentials and Access Tokens for Salesforce and BW has been generated.</SPAN></LI></UL><H4 id="toc-hId-1140248446"><STRONG><BR />The target interface in SAP BW/4HANA is represented by following URIs:<BR /></STRONG><FONT size="2"><EM>In this table below, the ADSO technical name is represented by term "ZADSO". In the illustrations our template ADSO is called </EM></FONT><FONT size="2"><EM>"zc8sfop01".</EM></FONT></H4><TABLE border="1" width="100%"><TBODY><TR><TD width="25%" height="57px"><STRONG>Description</STRONG></TD><TD width="25%" height="57px"><STRONG>HTTP Method</STRONG></TD><TD width="25.241545893719806%" height="57px"><STRONG>URL</STRONG></TD><TD width="24.758454106280194%" height="57px"><STRONG>Illustration</STRONG></TD></TR><TR><TD width="25%" height="160px"><P>Get all ADSOs and Request XCSRF-Token</P></TD><TD width="25%" height="160px"><STRONG>GET</STRONG></TD><TD width="25.241545893719806%" height="160px"> <FONT size="2"><A title="https://server:8443/sap/bw4/v1/push/dataStores/" href="https://server:8443/sap/bw4/v1/push/dataStores/" target="_blank" rel="noopener nofollow noreferrer"><SPAN class=""><SPAN class="">https://server:8443/</SPAN><SPAN class="">sap/bw4/v1/push/dataStores/</SPAN></SPAN><SPAN class=""> </SPAN></A></FONT></TD><TD width="24.758454106280194%" height="160px"><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="_Nils_Lorenz__0-1736507833673.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/210601i397DA9189A8D2363/image-size/medium?v=v2&px=400" role="button" title="_Nils_Lorenz__0-1736507833673.png" alt="_Nils_Lorenz__0-1736507833673.png" /></span></TD></TR><TR><TD width="25%" height="242px"><P>Get structure and meta data of specific ADSO (here called "ZADSO")</P></TD><TD width="25%" height="242px"><STRONG>GET</STRONG></TD><TD width="25.241545893719806%" height="242px"><FONT size="2"><A href="https://server:8443/sap/bw4/v1/push/dataStores/zadso" target="_blank" rel="noopener nofollow noreferrer">https://server:8443/sap/bw4/v1/push/dataStores/zadso</A></FONT></TD><TD width="24.758454106280194%" height="242px"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="_Nils_Lorenz__0-1736509160104.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/210613i87587279D1BB005D/image-size/medium?v=v2&px=400" role="button" title="_Nils_Lorenz__0-1736509160104.png" alt="_Nils_Lorenz__0-1736509160104.png" /></span></TD></TR><TR><TD width="25%" height="85px"><SPAN class="">Get sample Data</SPAN> <SPAN class="">e.g.</SPAN><SPAN class=""> 10 examples</SPAN></TD><TD width="25%" height="85px"><STRONG>GET</STRONG></TD><TD width="25.241545893719806%" height="85px"><FONT size="2"><A title="https://server:8443/sap/bw4/v1/push/dataStores/zadso" href="https://server:8443/sap/bw4/v1/push/dataStores/zadso" target="_blank" rel="noopener nofollow noreferrer"><SPAN class="">https://server:8443</SPAN><SPAN class="">/sap/bw4/v1/push/dataStores/</SPAN><SPAN class="">zadso</SPAN><SPAN class="">/sampleData</SPAN><SPAN class="">?</SPAN><SPAN class="">records=10&seed=0</SPAN></A></FONT></TD><TD width="24.758454106280194%" height="85px"><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="_Nils_Lorenz__3-1736507775687.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/210600i5F43603B0EEB44F9/image-size/medium?v=v2&px=400" role="button" title="_Nils_Lorenz__3-1736507775687.png" alt="_Nils_Lorenz__3-1736507775687.png" /></span></TD></TR><TR><TD width="25%" height="94px"><SPAN class=""><SPAN class="">Send Data without TSN</SPAN></SPAN><SPAN class=""> </SPAN></TD><TD width="25%" height="94px"><STRONG>POST</STRONG></TD><TD width="25.241545893719806%" height="94px"><FONT size="2"><A title="https://server:8443/sap/bw4/v1/push/dataStores/zadso/dataSend " href="https://server:8443/sap/bw4/v1/push/dataStores/zadso/dataSend " target="_blank" rel="noopener nofollow noreferrer"><SPAN class=""><SPAN class="">https://server:8443</SPAN><SPAN class="">/sap/bw4/v1/push/dataStores/zadso/dataSend</SPAN></SPAN><SPAN class=""> </SPAN></A></FONT></TD><TD width="24.758454106280194%" height="94px"><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="_Nils_Lorenz__1-1736507711545.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/210595i262A4B41E1707AD0/image-size/medium?v=v2&px=400" role="button" title="_Nils_Lorenz__1-1736507711545.png" alt="_Nils_Lorenz__1-1736507711545.png" /></span></TD></TR><TR><TD width="25%" height="167px"><SPAN class=""><SPAN class="">Create New TSN request</SPAN><SPAN class=""> (</SPAN><SPAN class="">Transaction Sequence Number)</SPAN></SPAN><SPAN class=""> </SPAN></TD><TD width="25%" height="167px"><STRONG>POST</STRONG></TD><TD width="25.241545893719806%" height="167px"><FONT size="2"><A title="https://server:8443/sap/bw4/v1/push/dataStores/zadso/requests" href="https://server:8443/sap/bw4/v1/push/dataStores/zadso/requests" target="_blank" rel="noopener nofollow noreferrer"><SPAN class=""><SPAN class="">https://server:8443</SPAN><SPAN class="">/</SPAN><SPAN class="">sap/bw4/v1/push/dataStores/</SPAN><SPAN class="">zadso</SPAN><SPAN class="">/requests</SPAN></SPAN><SPAN class=""> </SPAN></A></FONT></TD><TD width="24.758454106280194%" height="167px"><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="_Nils_Lorenz__2-1736507736839.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/210597i12B02D7EC9B1802D/image-size/medium?v=v2&px=400" role="button" title="_Nils_Lorenz__2-1736507736839.png" alt="_Nils_Lorenz__2-1736507736839.png" /></span></TD></TR><TR><TD width="25%" height="30px"><SPAN class=""><SPAN class="">Send Data with TSN </SPAN></SPAN></TD><TD width="25%" height="30px"><STRONG>POST</STRONG></TD><TD width="25.241545893719806%" height="30px"><P><FONT size="2"><SPAN class=""><SPAN class=""><A title="https://server:8443/sap/bw4/v1/push/dataStores/zadso/dataSend " href="https://server:8443/sap/bw4/v1/push/dataStores/zadso/dataSend " target="_blank" rel="noopener nofollow noreferrer">https://server:8443/sap/bw4/v1/push/dataStores</A></SPAN></SPAN><SPAN class=""><SPAN class=""><A title="https://server:8443/sap/bw4/v1/push/dataStores/zadso/dataSend " href="https://server:8443/sap/bw4/v1/push/dataStores/zadso/dataSend " target="_blank" rel="noopener nofollow noreferrer">/zadso/dataSend?request=[tsn]&datapid=[dynamic starting at 1 + n]</A></SPAN></SPAN></FONT></P></TD><TD width="24.758454106280194%" height="30px"><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="_Nils_Lorenz__0-1736507565962.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/210587iCAADA130D3F3BB0E/image-size/medium?v=v2&px=400" role="button" title="_Nils_Lorenz__0-1736507565962.png" alt="_Nils_Lorenz__0-1736507565962.png" /></span></TD></TR><TR><TD width="25%" height="112px"><SPAN class=""><SPAN class="">Close Request for specific TSN</SPAN></SPAN><SPAN class=""> </SPAN></TD><TD width="25%" height="112px"><STRONG>POST</STRONG></TD><TD width="25.241545893719806%" height="112px"><FONT size="2"><A title="https://server:8443/sap/bw4/v1/push/dataStores/zc8sfop01/requests/[tsn]/close" href="https://server:8443/sap/bw4/v1/push/dataStores/zc8sfop01/requests/[tsn]/close" target="_blank" rel="noopener nofollow noreferrer"><SPAN class=""><SPAN class="">https://server:8443</SPAN><SPAN class="">/</SPAN><SPAN class="">sap/bw4/v1/push/dataStores/zc8sfop01/requests/</SPAN><SPAN class="">[tsn]</SPAN><SPAN class="">/close</SPAN></SPAN></A></FONT><SPAN class=""> </SPAN></TD><TD width="24.758454106280194%" height="112px"><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="_Nils_Lorenz__1-1736507455891.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/210586i73BC5FE0F90BB144/image-size/medium?v=v2&px=400" role="button" title="_Nils_Lorenz__1-1736507455891.png" alt="_Nils_Lorenz__1-1736507455891.png" /></span></TD></TR></TBODY></TABLE><H4 id="toc-hId-943734941"> </H4><H4 id="toc-hId-747221436"><SPAN>High level solution approach in BTP Integration Suite:</SPAN></H4><OL><LI><SPAN>Recover the timestamp of the last run (in our case the data load runs once a day).</SPAN></LI><LI><SPAN>Perform a <A href="https://developer.salesforce.com/docs/atlas.en-us.soql_sosl.meta/soql_sosl/sforce_api_calls_soql.htm" target="_blank" rel="noopener nofollow noreferrer">SOQL</A> (Salesforce Object query language) query to Salesforce, including the timestamp of the last run, to collect all new entries.</SPAN></LI><LI><SPAN>Check for the new entries; otherwise cancel further processing.</SPAN></LI><LI><SPAN>Perform a GET to fetch the X-CSRF-Token. Then save the token and cookies.</SPAN></LI><LI><SPAN>Perform a POST to request a new TSN for data transfer. Save this TSN.</SPAN></LI><LI><SPAN>Perform message mapping with Groovy script from Salesforce result to SAP BW/4HANA target structure.</SPAN></LI><LI><SPAN>Perform a POST with SAP BW/4HANA payload (i.e. the data you sent via BTP), including TSN in the URL.</SPAN></LI><LI><SPAN>Perform a POST to close the related TSN request.</SPAN></LI><LI><SPAN>If successful, save the new timestamp of the last run.<BR /></SPAN></LI><LI><SPAN>The remaining processing is all controlled by SAP BW/4HANA standard means.</SPAN></LI></OL><H4 id="toc-hId-550707931"><STRONG><SPAN class="">Design Time details in BTP Integration Suite</SPAN></STRONG></H4><TABLE border="1" width="100%"><TBODY><TR><TD width="50%" height="30px"><STRONG>Step</STRONG></TD><TD width="50%" height="30px"><STRONG>Illustration</STRONG></TD></TR><TR><TD width="50%" height="282px"><P><STRONG>Main Flow </STRONG></P><P><SPAN>Remember last execution of data load and last TSN ID</SPAN></P><P><SPAN>Get Content from Salesforce</SPAN><SPAN> </SPAN></P><P><SPAN>Get X-CSRF-Token</SPAN><SPAN> </SPAN></P><P><SPAN>Send data to SAP BW/4HANA</SPAN></P></TD><TD width="50%" height="282px"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="FrankRiesner_0-1736426714510.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/210127iBC1F35F535A7A1C5/image-size/medium?v=v2&px=400" role="button" title="FrankRiesner_0-1736426714510.png" alt="FrankRiesner_0-1736426714510.png" /></span><P> </P></TD></TR><TR><TD width="50%" height="234px"><P><STRONG>Get source data from Salesforce </STRONG></P><P><SPAN>Data Load from Salesforce with SOQL Query</SPAN><SPAN> </SPAN></P></TD><TD width="50%" height="234px"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="_Nils_Lorenz__0-1736507418235.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/210585i325236ABA1B84C9A/image-size/medium?v=v2&px=400" role="button" title="_Nils_Lorenz__0-1736507418235.png" alt="_Nils_Lorenz__0-1736507418235.png" /></span></TD></TR><TR><TD width="50%" height="354px"><P><STRONG>Get Token</STRONG></P><P><SPAN>Request X-CSRF-Token with Fetch </SPAN><SPAN> </SPAN></P><P><SPAN>Call: ADSO URL with header details containing X-CSRF-TOKEN</SPAN><SPAN> </SPAN></P><P><SPAN>Get/set cookies from: ${header.set-cookie}</SPAN><SPAN> </SPAN></P></TD><TD width="50%" height="354px"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="FrankRiesner_2-1736426791287.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/210132iC9BFD4B7607EEA04/image-size/medium?v=v2&px=400" role="button" title="FrankRiesner_2-1736426791287.png" alt="FrankRiesner_2-1736426791287.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="FrankRiesner_3-1736426801176.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/210133i302299ABF609C59F/image-size/medium?v=v2&px=400" role="button" title="FrankRiesner_3-1736426801176.png" alt="FrankRiesner_3-1736426801176.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="FrankRiesner_4-1736426809455.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/210134i8121E3DF60535879/image-size/medium?v=v2&px=400" role="button" title="FrankRiesner_4-1736426809455.png" alt="FrankRiesner_4-1736426809455.png" /></span></TD></TR><TR><TD width="50%" height="267px"><P><STRONG>Send Data to BW </STRONG></P><P><SPAN>Request TSN (see first table)</SPAN><SPAN> </SPAN></P><P><SPAN>Prepare data load with Groovy-Script and set content type to JSON</SPAN><SPAN> </SPAN></P><P><SPAN>Send data including TSN (see first table)</SPAN><SPAN> </SPAN></P><P><SPAN>Close TSN request (see first table)</SPAN><SPAN> </SPAN></P></TD><TD width="50%" height="267px"><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="FrankRiesner_5-1736426938107.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/210136iF1BAAC11A6933E0C/image-size/medium?v=v2&px=400" role="button" title="FrankRiesner_5-1736426938107.png" alt="FrankRiesner_5-1736426938107.png" /></span></TD></TR><TR><TD width="50%" height="520px"><P><STRONG>Define Groovy Script </STRONG></P><P><SPAN>Hint: Due to the example payload which contains all content – it was easy to generate the Groovy script and field mapping with support of SAP Joule. </SPAN><SPAN> </SPAN></P></TD><TD width="50%" height="520px"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="FrankRiesner_6-1736426976334.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/210137i17A10E484D13EB46/image-size/medium?v=v2&px=400" role="button" title="FrankRiesner_6-1736426976334.png" alt="FrankRiesner_6-1736426976334.png" /></span><P> </P></TD></TR></TBODY></TABLE><H4 id="toc-hId-354194426"><SPAN class=""><BR />Runtime details in BTP Integration Suite </SPAN></H4><TABLE border="1" width="100%"><TBODY><TR><TD width="50%"><STRONG>Step</STRONG></TD><TD width="50%"><STRONG>Illustration</STRONG></TD></TR><TR><TD width="50%"><SPAN class=""><SPAN class="">Get </SPAN><SPAN class="">Request </SPAN><SPAN class="">TSN</SPAN></SPAN><SPAN class=""> </SPAN></TD><TD width="50%"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="_Nils_Lorenz__0-1736507290465.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/210583iDD4B55A2835EA8FF/image-size/medium?v=v2&px=400" role="button" title="_Nils_Lorenz__0-1736507290465.png" alt="_Nils_Lorenz__0-1736507290465.png" /></span></TD></TR><TR><TD width="50%"><SPAN class=""><SPAN class="">Send Request including TSN</SPAN></SPAN><SPAN class=""> </SPAN></TD><TD width="50%"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="_Nils_Lorenz__1-1736507319462.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/210584iA90ACAC95D5FD081/image-size/medium?v=v2&px=400" role="button" title="_Nils_Lorenz__1-1736507319462.png" alt="_Nils_Lorenz__1-1736507319462.png" /></span></TD></TR><TR><TD width="50%"><SPAN class=""><SPAN class="">Close Request</SPAN></SPAN><SPAN class=""><SPAN class=""> </SPAN></SPAN><SPAN class=""> </SPAN></TD><TD width="50%"> <span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="_Nils_Lorenz__0-1736507234336.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/210580i0DD2E370A47D2E46/image-size/medium?v=v2&px=400" role="button" title="_Nils_Lorenz__0-1736507234336.png" alt="_Nils_Lorenz__0-1736507234336.png" /></span></TD></TR><TR><TD><SPAN class=""><SPAN class="">Result in SAP BW/4HANA</SPAN></SPAN></TD><TD>to be updated later...</TD></TR></TBODY></TABLE><P><FONT size="4"><STRONG>Conclusion:</STRONG></FONT></P><UL><LI><SPAN>When data is posted into SAP BW/4HANA, it can be processed by Streaming Process chains automatically. See details in this <A href="https://community.sap.com/t5/technology-blogs-by-sap/run-modes-of-sap-bw-streaming-process-chains/ba-p/13518437" target="_blank">blog post</A> , and there part D.</SPAN></LI><LI><SPAN>For integration approaches of other cloud sources (mainly SAP) please refer to this <A href="https://community.sap.com/t5/technology-blogs-by-sap/sap-cloud-integration-into-sap-bw-4hana/ba-p/13504588" target="_blank">blog post</A> .</SPAN></LI><LI><SPAN>Use of AI to generate the mapping makes development easier and much faster - not only for this use case but in general!</SPAN></LI><LI><SPAN>A good documentation of API’s allows an improved speed of development. This blog post should provide exactly this.</SPAN></LI><LI><SPAN>This blog post will be updated when we learn more about delta-capability and performance in our dedicated scenario. We are just working on it, and we will keep you updated.</SPAN></LI><LI><SPAN>An Event-driven approach could be an option, if the business requires data in real time.</SPAN></LI></UL><P><FONT size="2"><EM>*Many thanks to Alexandros, Jingjiee and Christopher for their contribution.</EM></FONT></P>2025-01-10T12:34:21.027000+01:00https://community.sap.com/t5/technology-blogs-by-members/optimizing-successfactors-odata-calls-using-looping-process-call/ba-p/13983408Optimizing SuccessFactors OData Calls Using Looping Process Call2025-01-12T12:30:23.271000+01:00RaghuVamseedharhttps://community.sap.com/t5/user/viewprofilepage/user-id/191580<P>Imagine you need to retrieve details for 1600 users from SuccessFactors. If we were to retrieve each user's information one at a time, we will hit SuccessFactors with 1600 requests.<BR /><SPAN>/odata/v2/User?$filter=userId eq '1234'</SPAN></P><P>This approach is inefficient, puts a strain on the SuccessFactors server, and risks exceeding the daily request limit.</P><P>We can make this process more efficient by retrieving multiple users in a single call:<BR />/odata/v2/User?$filter=userId in '1234','1235'</P><P>However, the maximum number of expressions in the "in" clause of the $filter query option is 1000. In my testing, I found that it allows only 500 values. SAP Help <A href="https://help.sap.com/docs/SAP_SUCCESSFACTORS_PLATFORM/d599f15995d348a1b45ba5603e2aba9b/a817474aafd747dda6b55336a2a12069.html" target="_self" rel="noopener noreferrer">Link</A>. By retrieving 500 users at a time, we can significantly reduce the number of calls to SuccessFactors.</P><P>Here's a sample interface:<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="1.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/210955i47E921B7368E7F83/image-size/large?v=v2&px=999" role="button" title="1.png" alt="1.png" /></span></P><P><STRONG>Content Modifier</STRONG>: This step contains the list of Employee IDs. In your case, it can be any step from which you get the filter list.</P><P><STRONG>Looping Process Call</STRONG>: This process continues until the condition ${property.p_StopLoop} != 'Stop' is met.</P><P><STRONG>Call SuccessFactors</STRONG>: This local integration process includes a 'Build Filter Query' Groovy script that generates the filter query. Using CamelLoopIndex and filterSize, it builds queries to fetch details in groups of 500 users. For instance, the first loop retrieves the first 500 users, the second loop fetches the next 500, and so on. You can externalize the filterSize to configure the number of records retrieved in each call.</P><pre class="lia-code-sample language-java"><code>import com.sap.gateway.ip.core.customdev.util.Message
// Build query $filter=userId in '1234','1235' and so on.
def Message processData(Message message) {
int camelLoopIndex = message.getProperty('CamelLoopIndex')
String empIds = message.getProperty('p_EmpIds')
def filterSize = 500
def idsArray = empIds.split(',')
int start = Math.min(camelLoopIndex * filterSize, idsArray.length)
int end = Math.min(start + filterSize, idsArray.length)
def partOfEmpIds = idsArray[start..<end].collect { "'${it}'" }.join(',')
String filter = new StringBuilder("\$filter=userId in ${partOfEmpIds}")
message.setProperty('p_FilterQuery', filter)
if(partOfEmpIds.isEmpty()){
message.setProperty('p_StopLoop', 'Stop')
}
return message
}</code></pre><P><STRONG>SuccessFactors Adapter:</STRONG><BR />Operation Detials: Query (GET)<BR />Resource Path: User<BR />Query Options: ${property.p_FilterQuery}</P><P><STRONG>Router</STRONG>: This component avoids calling SuccessFactors when the end of the list is reached (since 'Looping Process Call' is a do-while loop, it runs until the condition is true).</P><P><STRONG>Remove XML Declaration</STRONG>: This step removes the <?xml version="1.0" encoding="UTF-8"?> declaration from each SuccessFactors response.</P><P><STRONG>Set Lookup Result Property</STRONG>: This step appends the SuccessFactors response to the previous response using ${property.p_LookupResult} ${in.body}.</P><P><STRONG>Get LookupResult Property</STRONG>: In the main integration process, this step builds the combined SuccessFactors response:<BR /><ROOT><BR />${property.p_LookupResult}<BR /></ROOT></P><P><STRONG>Move Records to Root</STRONG>: Using XSLT, we can move all records to single level in XML.</P><pre class="lia-code-sample language-markup"><code><?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<ROOT>
<xsl:for-each select="/ROOT/User/User">
<xsl:copy-of select="."/>
</xsl:for-each>
</ROOT>
</xsl:template>
</xsl:stylesheet></code></pre><P>Please note, while this approach will reduce the number of calls to SuccessFactors, it may introduce complexity in downstream transformations if further work on the XML response is needed.</P>2025-01-12T12:30:23.271000+01:00https://community.sap.com/t5/technology-blogs-by-members/creating-customer-in-sap-s-4-hana-public-cloud-via-odata/ba-p/13953228Creating Customer in SAP S/4 HANA Public Cloud via OData2025-01-17T09:08:38.073000+01:00jirifridrichhttps://community.sap.com/t5/user/viewprofilepage/user-id/146600<P>Let's see how to create Business Partner as Customer in SAP S/4 HANA Public Cloud via HTTP adapter in SAP Cloud Integration.</P><P>SAP provides RESTful API (A2X), which is available at the <A title="https://api.sap.com/api/API_BUSINESS_PARTNER/overview" href="https://api.sap.com/api/API_BUSINESS_PARTNER/overview" target="_blank" rel="noopener noreferrer">Business Accelerator Hub</A>.</P><P>From the environment of SAP Cloud Integration, we have actually two options - we can use OData adapter or HTTP adapter. When in decision about which one to choose, <A title="SAP Cloud Integration: HTTP vs. OData Receiver Adapter" href="https://community.sap.com/t5/technology-blogs-by-members/sap-cloud-integration-http-vs-odata-receiver-adapter/ba-p/13852349" target="_blank">this blog</A> can help you. I wanted to have more flexibility over the entire process and hence I will be describing the use of HTTP adapter. It requires more work, but provides you with higher level of control.</P><P>The structure of SAP S/4 APIs can be sometimes confusing, as it doesn't always follow a consistent logic. Sometimes you are referring to Business partner in the query, sometimes in the payload. Sometimes an object has its own API, sometimes you use an extension of another object's API. No worry, we will clarify this.</P><H2 id="toc-hId-1076593795"><FONT size="6">X-CSRF-TOKEN</FONT></H2><P>The first obstacle you face using HTTP adapter is the handling of authentication against the SAP S/4. As creating a Business Partner is a POST operation, you need higher privileges then when using GET query. And that is why we need to get x-csrf-token first.</P><P>To achieve this, we need to set a request to this service:<BR /><EM>/sap/opu/odata/sap/API_BUSINESS_PARTNER/A_BusinessPartner<BR /></EM>We run this request in Request-Reply component with HTTP adapter:<span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="jirifridrich_1-1733149534121.png" style="width: 761px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/197467i091EBB513450A705/image-dimensions/761x392?v=v2" width="761" height="392" role="button" title="jirifridrich_1-1733149534121.png" alt="jirifridrich_1-1733149534121.png" /></span></P><P>HTTP method I select HEAD, as we are not sending any content, neither we are asking for data. So to minimize the exchange overhead, I think HEAD is the most economic method for this kind of call.</P><P>The asterisks in Request Headers and Response Headers ensure that the headers will be exchanged and that we will receive all the headers we need.</P><P>You may be wondering why we are calling the <EM>/A_BusinessPartner </EM>service, when we want to get the token. The reason is that we should be calling the same service which we will call to actually create the Customer later.</P><P>Right before the Request-Reply component we need to place a Content Modifier with this header: x-csrf-token = Fetch<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="jirifridrich_0-1733147283039.png" style="width: 766px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/197447i586D7D6B92F99EFC/image-dimensions/766x67?v=v2" width="766" height="67" role="button" title="jirifridrich_0-1733147283039.png" alt="jirifridrich_0-1733147283039.png" /></span><BR />And one more thing - click anywhere in the canvas to enter the Integration Flow config, go to Runtime Configuration and set HTTP Session Reuse. This will assure that token is reused for any other subsequent call.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="jirifridrich_2-1733147551792.png" style="width: 769px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/197450iF8F6EFC7EE736D40/image-dimensions/769x325?v=v2" width="769" height="325" role="button" title="jirifridrich_2-1733147551792.png" alt="jirifridrich_2-1733147551792.png" /></span><BR />The iflow section which handles the token can look like this<span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="jirifridrich_3-1733148406352.png" style="width: 748px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/197452iFEA4470D98783A8A/image-dimensions/748x486?v=v2" width="748" height="486" role="button" title="jirifridrich_3-1733148406352.png" alt="jirifridrich_3-1733148406352.png" /></span><BR />After we run the iflow, the service will be called and we will receive the token and cookie in the response header. We don't need to extract them or handle them before calling the service to create Business Partner.</P><P>What we can do is to handle the http response. I chose a router, which routes the '200' response to positive scenario and any other response code to error handling subprocess. </P><H2 id="toc-hId-880080290">CREATE BUSINESS PARTNER</H2><P>Now let's go to create the Business Partner entity, which we will extend later to Customer.</P><P>We will be again calling the service:<BR /><EM>/sap/opu/odata/sap/API_BUSINESS_PARTNER/A_BusinessPartner<BR /></EM>Now we use the POST method, as we are sending data to SAP S/4. <BR />Place a Content Modifier before the Request-Reply with content-type = application/json, as seen at the screenshot above. Like this we are telling the server what format we are sending.<BR />The body has to be in json and have following format and syntax. We can set up a Business Partner with such as simple payload as this:</P><P> </P><pre class="lia-code-sample language-json"><code>{
"BusinessPartnerCategory": "1",
"FirstName": "John",
"LastName": "Smith"
}</code></pre><P> </P><P>BusinessPartnerCategory decides whether the Business Partner will be Person (1), Organization (2) or Group (3).<BR />More sophisticated payload to create an Organization can look like this:</P><P> </P><pre class="lia-code-sample language-json"><code>{
"BusinessPartnerCategory": "2",
"OrganizationBPName1": "ACME CORP",
"CorrespondenceLanguage": "EN",
"SearchTerm1": "ACME",
"to_BusinessPartnerAddress": [
{
"to_MobilePhoneNumber": [
{
"PhoneNumber": "111222111"
}
],
"to_EmailAddress": [
{
"EmailAddress": "acme@email.com"
}
],
"StreetName": "Long Street",
"HouseNumber": "25",
"Country": "GB",
"PostalCode": "11111",
"CityName": "London",
"Language": "EN"
}
]
}</code></pre><P> </P><P>Notice that we are using 'to_' prefixes for object extensions to be able to create Business Partner with address, email and telephone number. When we run the POST query, SAP will provide us with an XML response, which carries information about the newly created Business Partner.<BR />As we will need the Business Partner number further in our iflow, we can extract the number via this XPath statement in Content Modifier:<BR /><EM>//*[local-name()='properties']/*[local-name()='BusinessPartner']</EM><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="jirifridrich_0-1733151209443.png" style="width: 768px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/197483i7FFBCF423B89165E/image-dimensions/768x169?v=v2" width="768" height="169" role="button" title="jirifridrich_0-1733151209443.png" alt="jirifridrich_0-1733151209443.png" /></span></P><P>We extracted the Business Partner number into a Property.</P><H2 id="toc-hId-683566785">ASSIGN CUSTOMER ROLES</H2><P>To extend our Business Partner to Customer, we need to assign it customer roles. We do this via another API.</P><P>URL: /sap/opu/odata/SAP/API_BUSINESS_PARTNER/A_BusinessPartnerRole<BR />Method: POST<BR />Headers: Content-type = application/json<BR />Sample body:</P><P> </P><pre class="lia-code-sample language-json"><code>{
"BusinessPartner": "BP number of newly created Business partner",
"BusinessPartnerRole": "FLCU00"
}</code></pre><P> </P><P>The same call we use to assign any other role (like FLCU01), just modify the value in body.</P><H2 id="toc-hId-487053280">CREATE CUSTOMER IN SALES AREA</H2><P>Now we need to set Sales area data for our Customer. </P><P>URL: /sap/opu/odata/SAP/API_BUSINESS_PARTNER/A_Customer('<I>BP number of newly created Business partner</I>')/to_CustomerSalesArea<BR />Method: POST<BR />Headers: Content-type = application/json<BR />Sample body (we are also setting a fixed Payer for demonstration):</P><P> </P><pre class="lia-code-sample language-json"><code>{
"SalesOrganization": "1000",
"DistributionChannel": "01",
"Division": "01",
"CustomerPaymentTerms": "0001",
"Currency": "USD",
"to_PartnerFunction": {
"results": [
{
"PartnerFunction": "PY",
"BPCustomerNumber": "1000001"
}
]
}
}</code></pre><P> </P><H2 id="toc-hId-290539775">CREATE CUSTOMER IN COMPANY CODE</H2><P>And similarily for Company code data.</P><P>URL: /sap/opu/odata/SAP/API_BUSINESS_PARTNER/A_Customer('<SPAN>BP number of newly created Business partner</SPAN>')/to_CustomerCompany<BR />Method: POST<BR />Headers: Content-type = application/json<BR />Sample body:</P><P> </P><pre class="lia-code-sample language-json"><code>{
"CompanyCode": "1000",
"ReconciliationAccount": "10000000",
"PaymentTerms": "0001"
}</code></pre><P> </P><P>Our Customer should now be all set for basic business operations.</P><P>Notice that SAP responds to our calls in XML format. If for some reason you need to convert it to JSON, use an XML to JSON converter component, or use header Accept = application/json in your query. By that you are telling SAP to provide response in JSON. </P>2025-01-17T09:08:38.073000+01:00