https://raw.githubusercontent.com/ajmaradiaga/feeds/main/scmt/topics/SAP-BTP-ABAP-environment-blog-posts.xmlSAP Community - SAP BTP, ABAP environment2026-07-24T20:00:20.100149+00:00python-feedgenSAP BTP, ABAP environment blog posts in SAP Communityhttps://community.sap.com/t5/technology-blog-posts-by-sap/abap-development-tools-for-visual-studio-code-patch-1-0-1-released/ba-p/14416731ABAP development tools for Visual Studio Code: Patch 1.0.1 released2026-06-12T07:41:59.469000+02:00thomasalexander_ritterhttps://community.sap.com/t5/user/viewprofilepage/user-id/185696<DIV><H1 id="toc-hId-1688269120"><SPAN>What happened since the first release?</SPAN></H1><P><SPAN>First of all, thanks to all the ABAP developers who have already tried out the new <A href="https://marketplace.visualstudio.com/items?itemName=SAPSE.adt-vscode" target="_self" rel="nofollow noopener noreferrer">extension</A>! You provided a lot of positive feedback & constructive criticism over the last two weeks and can be assured that we read every single one. When looking at the overall feedback three things stand out:</SPAN></P><P><SPAN>1.</SPAN><SPAN> <STRONG>Trouble with setting up system connections.</STRONG> Because the extension ships with a new way for configuring system destinations, some of you had trouble configuring ABAP system access. We have already published <A href="https://help.sap.com/docs/abap-cloud/abap-development-tools-for-visual-studio-code/establishing-system-connection-8e91041894104c5b8567274954dbed1a" target="_self" rel="noopener noreferrer">improved documentation</A> and we are also looking into how we can further improve the usability of these user flows in the upcoming releases. </SPAN></P><P><SPAN>2.</SPAN><SPAN><STRONG> Missing support for Windows ARM hardware</STRONG>. We added this to our backlog and already made some progress. However, further testing needs to be done until we can release it to the public.</SPAN></P><P><SPAN>3.</SPAN><SPAN><STRONG> Missing support for RFC + password</STRONG>. We communicated openly and proactively across multiple channels that RFC + password support would arrive in the next major release, and we were aware of its importance. Even so, we were still surprised by how many users are relying on classic passwords. That’s why we reacted quickly. Since the mandatory security review of such a critical change was already done, we are pleased to add support for passwords via a patch.</SPAN></P><P><SPAN>We also received general feedback that the community would appreciate more how-to guides. Here are some links for getting started and learning more about the extension. We are planning to provide more guides in the future. </SPAN></P><UL><LI><SPAN><A href="https://github.com/SAP-samples/abap-platform-rap130" target="_self" rel="nofollow noopener noreferrer">RAP130 tutorial</A>. A tutorial that walks you through using the ADT MCP server together with an AI agent.</SPAN></LI><LI><SPAN><A href="https://software-heroes.com/en/blog/abap-tools-vs-code-agentic-ai-en" target="_self" rel="nofollow noopener noreferrer">Setup guide how to get started with GitHub Copilot</A>. <A href="https://community.sap.com/t5/user/viewprofilepage/user-id/488953" target="_self">Björn Schulz</A> published a nice guide for configuring the initial setup.</SPAN></LI><LI><SPAN><A href="https://www.youtube.com/watch?v=e2LRPHO8A0E" target="_self" rel="nofollow noopener noreferrer">Podcast on the ADT for VS Code extension</A>. Rich Heilman did a podcast with some members of the ADT team. It covers a lot of technical aspects of the extension but also provides some insights into the plan for the next releases. </SPAN></LI></UL><H1 id="toc-hId-1491755615"><SPAN>What gets shipped with this release?</SPAN></H1><H2 id="toc-hId-1424324829"><SPAN>RFC System logon via password</SPAN></H2><P><SPAN>You can create RFC destinations with password access.</SPAN></P><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="rfc_password.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/420917i57E7F4EF2CB206EB/image-size/medium?v=v2&px=400" role="button" title="rfc_password.png" alt="rfc_password.png" /></span></DIV><H2 id="toc-hId-1227811324"><SPAN>AGENTS.md template</SPAN></H2><P><SPAN>The documentation already provides a template for an <A href="https://agents.md/" target="_self" rel="nofollow noopener noreferrer">AGENTS.md</A> file. With the update the same file gets shipped with the VS Code extension. This makes it easier to get started. We still recommend duplicating the template and adding your own company/team/project-specific instructions. The more time you spend on onboarding the agent into your project the better results it will produce.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="copilot_agent.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/420927iB24EC69943519D27/image-size/medium?v=v2&px=400" role="button" title="copilot_agent.png" alt="copilot_agent.png" /></span></SPAN></P><H1 id="toc-hId-902215100"><SPAN>What's next?</SPAN></H1><P><SPAN>The next release is currently planned for next month. The planned features remain unchanged from the previous blog post:</SPAN></P><UL><LI><SPAN>Support of more core development object types: RAP behavior extensions, DDIC tables, DDIC structures, DDIC enqueue objects, DDIC type groups, CDS entity buffers, programs/includes, function groups and modules, ...</SPAN></LI><LI><SPAN>MCP tools: Unified diff tool for transports, ABAP test cockpit tools, …</SPAN></LI></UL><P><SPAN>Follow the <A href="https://help.sap.com/docs/abap-cross-product/roadmap-info/abap-cloud-roadmap-information" target="_self" rel="noopener noreferrer">ABAP Cloud Roadmap</A> if you are interested in knowing what comes next.</SPAN></P><H2 id="toc-hId-834784314">Provide feedback and influence our product backlog!</H2><P><SPAN>We welcome your feedback! Feel free to use the comment section or <A href="https://influence.sap.com/sap/ino/#/campaign/2911" target="_self" rel="noopener noreferrer">create a customer influence request</A> to let us know which features you are missing the most. Your input will help us prioritize the feature backlog for the next releases.</SPAN></P></DIV>2026-06-12T07:41:59.469000+02:00https://community.sap.com/t5/artificial-intelligence-blogs-posts/sap-joule-for-developers-abap-ai-capabilities-including-agentic/ba-p/14417633SAP Joule for Developers, ABAP AI capabilities including agentic capabilities is now available!2026-06-12T17:18:40.414000+02:00Swathy_Shttps://community.sap.com/t5/user/viewprofilepage/user-id/1972836<P><STRONG><SPAN>The re-invented SAP Joule for Developers, ABAP AI capabilities including agentic capabilities is now offered as a service across SAP BTP ABAP Environment, SAP S/4HANA Cloud Public Edition, and SAP S/4HANA Cloud Private Edition for releases 2021 and higher.</SPAN></STRONG></P><P><SPAN><A href="https://community.sap.com/t5/technology-blog-posts-by-sap/joule-speaks-abap/ba-p/14018226" target="_blank">Joule speaks ABAP</A>, and now it speaks more than ever before.</SPAN></P><P>SAP Joule for Developers, ABAP AI capabilities have already generated strong interest across the SAP ecosystem, enabling customers to achieve remarkable results, as demonstrated by the success story from <SPAN><A href="https://dam.sap.com/mac/app/p/pdf/asset/preview/1LJozMc?ltr=a&rc=118&doi=SAP1267278" target="_blank" rel="noopener noreferrer">Bosch</A></SPAN>.</P><P>Following our Sapphire announcements, detailed in Sonja Lienard's blog post <SPAN><A href="https://community.sap.com/t5/technology-blog-posts-by-sap/entering-the-new-era-of-agentic-ai-for-abap-development/ba-p/14394643" target="_blank">Sapphire 2026: GA announcement for agentic ABAP AI</A> </SPAN>and in the blog post <SPAN><A href="https://community.sap.com/t5/technology-blog-posts-by-sap/abap-ai-chapter-3-we-go-agentic/ba-p/14391469" target="_blank">Sapphire 2026: ABAP AI - Chapter 3: We go agentic!</A> </SPAN>by Alexander Rother, we are now entering the agentic era of ABAP development.</P><P>In addition, we have received valuable feedback from many of you on the existing ABAP AI capabilities. Building on this feedback, we are proud to announce that our re-invented ABAP AI capabilities, including new agentic capabilities, are now officially available.</P><P>Beyond these enhancements, we have also expanded support for SAP S/4HANA Cloud Private Edition, extending the supported releases down to 2021.</P><P><SPAN>Please note : For SAP S/4HANA On-Premise 2025, 2023, 2022, and 2021, availability is subject to the special RISE with SAP contract conditions announced at SAP Sapphire. Please verify your entitlement and contract status with your account executive before planning adoption.</SPAN></P><P>In this blog, we will cover the following aspects:</P><OL><LI><STRONG>How to obtain the required commercial license</STRONG> for SAP Joule for Developers, ABAP AI capabilities.</LI><LI><STRONG>How to configure your backend systems and enable SAP Joule for Developers,</STRONG> <STRONG>ABAP AI capabilities</STRONG> in ABAP Development Tools for Eclipse and ABAP Development Tools for Visual Studio Code including an overview of the capabilities supported</LI></OL><H2 id="toc-hId-1817380671"><SPAN>New Commercial model for SAP Joule for Developers, ABAP AI Capabilities</SPAN></H2><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Swathy_S_0-1781275611559.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/421240iC9437C6CCD8C5ECE/image-size/large?v=v2&px=999" role="button" title="Swathy_S_0-1781275611559.png" alt="Swathy_S_0-1781275611559.png" /></span></P><P>The introduction of the new ABAP AI <SPAN>Hub Service </SPAN><SPAN>, which exposes our re-invented ABAP AI capabilities running side by side to your ABAP systems, marks a strategic step toward making AI capabilities more accessible, scalable, and future-ready across diverse SAP landscapes.</SPAN> With a <STRONG>single commercial license</STRONG>, customers can <STRONG>purchase once</STRONG> and leverage these capabilities across supported SAP products, independent of their underlying release versions.</P><P><SPAN>One of the key advantages is simplified adoption. Customers can now enable ABAP AI capabilities through a more streamlined onboarding process using <STRONG>SAP for Me</STRONG> reducing setup effort while ensuring consistent lifecycle management across environments.</SPAN></P><P><SPAN>Another major benefit is <STRONG>release-independent</STRONG> access. Instead of being tightly coupled to specific SAP S/4HANA release cycles, customers can consume ABAP AI services side by side with their existing systems. This enables even customers on lower releases to leverage the latest AI innovations without waiting for a system upgrade.</SPAN></P><P><SPAN>In short, the ABAP AI Hub service is not just an architecture shift, it is an innovation enabler, helping customers adopt ABAP AI faster, more flexibly, and with greater future readiness.</SPAN></P><H2 id="toc-hId-1620867166"><SPAN>Commercial model & AI Units</SPAN></H2><P><SPAN>SAP Joule for Developers, ABAP AI capabilities are embedded in the Joule Premium package and offered with separate licenses for customers and partners. Pricing follows a <STRONG>consumption-based model</STRONG>, meaning you only pay for actual usage. Customers and partners purchase AI Units and activate the required packages via SAP for Me. Authorization for developer access is managed through Cloud Identity Services, while AI requests are executed and metered in the ABAP AI Hub Service on SAP BTP. </SPAN></P><H2 id="toc-hId-1424353661"><SPAN>What is an SAP AI Unit?</SPAN></H2><P><SPAN>SAP AI Units are a form of virtual currency that customers purchase to activate and use premium AI capabilities within SAP Cloud Services. They are consumption-based credits that can be used flexibly across multiple SAP solutions and are not tied to a specific product or line of business. This allows customers to draw from a central pool of AI Units as they use AI-powered features across their SAP landscape. AI Units are purchased annually and expire after 12 months if not used. Customers can track their usage and remaining balance in real time via SAP for Me.</SPAN></P><H2 id="toc-hId-1227840156"><SPAN>How do I know how many units I should purchase?</SPAN></H2><P><SPAN>SAP provides guidance and estimation tools to help determine the right amount of AI Units. Your SAP Account Executive or Partner can support you in defining the appropriate quantity and help model different usage scenarios.<STRONG> </STRONG></SPAN></P><H2 id="toc-hId-1031326651"><SPAN>How to Purchase the License and activate the packages? </SPAN></H2><P><STRONG><SPAN>For Customers<BR /></SPAN></STRONG>Purchase AI Units using <STRONG>SKU 8019164 via </STRONG><A href="https://help.sap.com/docs/link-disclaimer?site=https%3A%2F%2Fme.sap.com%2F" target="_blank" rel="noopener noreferrer"><STRONG>SAP for Me</STRONG></A><SPAN> to begin the Premium AI activation process.<BR /></SPAN>For more Information refer to the SAP Note <A href="https://me.sap.com/notes/3740750" target="_self" rel="noopener noreferrer">3740750</A>.</P><H2 id="toc-hId-834813146"><SPAN>For Administrators: Steps to configure SAP Joule for Developers, ABAP AI Capabilities.</SPAN></H2><P><STRONG><SPAN>Prerequisites</SPAN></STRONG></P><P><SPAN>You are an administrator with <STRONG>full access </STRONG>to <A href="https://help.sap.com/docs/link-disclaimer?site=https%3A%2F%2Fme.sap.com%2F" target="_blank" rel="noopener noreferrer">SAP for Me</A>.</SPAN></P><P><STRONG><SPAN>Procedure</SPAN></STRONG></P><UL><LI><SPAN>Open <A href="https://help.sap.com/docs/link-disclaimer?site=https%3A%2F%2Fme.sap.com%2F" target="_blank" rel="noopener noreferrer">SAP for Me</A> and navigate to <STRONG>Portfolio & Products</STRONG>.</SPAN><SPAN><BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="image (8).png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/421170iBF2C3E7B9AFF8404/image-size/large?v=v2&px=999" role="button" title="image (8).png" alt="image (8).png" /></span><BR /></SPAN></LI><LI><SPAN><SPAN>Select the tab <STRONG>My Product Packages</STRONG> and choose the package <STRONG>Joule</STRONG>.<BR /></SPAN></SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Swathy_S_0-1781270764748.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/421199iC38E5C3A821124D9/image-size/large?v=v2&px=999" role="button" title="Swathy_S_0-1781270764748.png" alt="Swathy_S_0-1781270764748.png" /></span><SPAN><BR /><BR /></SPAN></LI><LI><SPAN>Select the tab <STRONG>Applications</STRONG> and choose the application <STRONG>SAP Joule for Developers, ABAP AI capabilities</STRONG>.</SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Swathy_S_3-1781263632455.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/421142i7FB7F62DE11F482F/image-size/large?v=v2&px=999" role="button" title="Swathy_S_3-1781263632455.png" alt="Swathy_S_3-1781263632455.png" /></span></LI><LI><SPAN>Now you can <STRONG>Start Provisioning</STRONG>.</SPAN><UL><LI><SPAN>Enter the solution details. Provide a <STRONG>display name</STRONG> and select a <STRONG>resource group</STRONG>. If no resource group exists, you will be prompted to create one.<BR /></SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Swathy_S_4-1781263632456.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/421147i7E0E31EEA3C608D6/image-size/large?v=v2&px=999" role="button" title="Swathy_S_4-1781263632456.png" alt="Swathy_S_4-1781263632456.png" /></span></LI><LI><SPAN>Select a Cloud Identity Services system.<BR /></SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Swathy_S_5-1781263632457.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/421146i973F51F6C94849DD/image-size/large?v=v2&px=999" role="button" title="Swathy_S_5-1781263632457.png" alt="Swathy_S_5-1781263632457.png" /></span></LI><LI><SPAN>Select your region.<BR /></SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Swathy_S_6-1781263632457.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/421145iF0790C3CCAC69DC6/image-size/large?v=v2&px=999" role="button" title="Swathy_S_6-1781263632457.png" alt="Swathy_S_6-1781263632457.png" /></span><SPAN><BR /></SPAN></LI><LI><SPAN>Choose a <STRONG>Formation Name</STRONG> (the name is mandatory but has no further technical relevance).<BR /></SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Swathy_S_7-1781263632458.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/421148i6F59CAE3984F46D2/image-size/large?v=v2&px=999" role="button" title="Swathy_S_7-1781263632458.png" alt="Swathy_S_7-1781263632458.png" /></span><SPAN><BR /><BR /></SPAN></LI><LI><SPAN>Review and finish the setup. The provision process might take a few moments to complete. Click on <STRONG>View in Resources</STRONG> to view the status of the generated resources.<BR /></SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Swathy_S_8-1781263632459.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/421150iC6759F31E7812822/image-size/large?v=v2&px=999" role="button" title="Swathy_S_8-1781263632459.png" alt="Swathy_S_8-1781263632459.png" /></span></LI><LI><SPAN>The new solution will achieve the Ready status when all tenants are successfully provisioned, and integrations are fully established.<BR /></SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Swathy_S_9-1781263632460.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/421149i7F878D4211FF1361/image-size/large?v=v2&px=999" role="button" title="Swathy_S_9-1781263632460.png" alt="Swathy_S_9-1781263632460.png" /></span><SPAN><BR /></SPAN></LI></UL></LI><LI><SPAN>To activate the feature in SAP Central Business Configuration.</SPAN> Navigate to <STRONG>SAP for Me></STRONG> Click on<STRONG> Portfolio & Provisioning</STRONG> > <STRONG>Business AI</STRONG>.</LI><LI>Click on<STRONG> <EM><SPAN>Configure</SPAN></EM> </STRONG><SPAN>to launch the Central Business Configuration application<STRONG>.<BR /></STRONG></SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Swathy_S_10-1781263632461.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/421151i65EB6040A396CBC4/image-size/large?v=v2&px=999" role="button" title="Swathy_S_10-1781263632461.png" alt="Swathy_S_10-1781263632461.png" /></span></LI><LI>Ensure user access is available for the Central Business Configuration tenant. <SPAN>To access your SAP Central Business Configuration tenant.You will need to have your user account set up with the <STRONG>readFeatureActivationStatus & writeFeatureActivationStatus policies</STRONG> on your account with the connected SAP Cloud Identity Services tenant.<BR /></SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Swathy_S_11-1781263632462.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/421153iD692080168AF5352/image-size/large?v=v2&px=999" role="button" title="Swathy_S_11-1781263632462.png" alt="Swathy_S_11-1781263632462.png" /></span> </LI><LI> On the dashboard, a list of features is provided and grouped by the product name. <SPAN>Select “<STRONG>SAP Joule for Developers, ABAP AI Capabilities</STRONG>”.</SPAN><STRONG><BR /></STRONG><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Swathy_S_12-1781263632463.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/421152i2D8E39FBA4CFF330/image-size/large?v=v2&px=999" role="button" title="Swathy_S_12-1781263632463.png" alt="Swathy_S_12-1781263632463.png" /></span></LI><LI>Click on <STRONG>Activate</STRONG> to proceed with the activation process. <SPAN>Once the activation is complete, ensure that the status is displayed as <STRONG><EM>Active</EM></STRONG>.</SPAN><BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Swathy_S_13-1781263632464.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/421156i793A0625A285B9A9/image-size/large?v=v2&px=999" role="button" title="Swathy_S_13-1781263632464.png" alt="Swathy_S_13-1781263632464.png" /></span> </LI><LI><SPAN>Assign named users through SAP Cloud Identity Services (IAS) to enable access for authorized users. Navigate to <STRONG>SAP Cloud Identity Services.<BR /></STRONG>Under <STRONG>Users & Authorizations</STRONG> Select the user and assign the group “<STRONG>j4d_abap-enterprise-user”<BR /></STRONG></SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Swathy_S_14-1781263632464.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/421154iB78CBFC5ABE1AECE/image-size/large?v=v2&px=999" role="button" title="Swathy_S_14-1781263632464.png" alt="Swathy_S_14-1781263632464.png" /></span></LI><LI><SPAN>In the tab <STRONG>Resources</STRONG> you will find a new tenant providing its <STRONG>Main URL</STRONG> (which will lead to the UI of the application).</SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Swathy_S_15-1781263632465.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/421155i84DEAF5458E277D4/image-size/large?v=v2&px=999" role="button" title="Swathy_S_15-1781263632465.png" alt="Swathy_S_15-1781263632465.png" /></span></LI></UL><P><SPAN><SPAN>Provide that URL to the developers so they can configure SAP Joule for Developers, ABAP AI capabilities for side-by-side use in ABAP Development tools for Eclipse or in ABAP Development tools for Visual Studio Code.<BR /></SPAN></SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Swathy_S_0-1781267949763.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/421177i7221CA57B40DD663/image-size/large?v=v2&px=999" role="button" title="Swathy_S_0-1781267949763.png" alt="Swathy_S_0-1781267949763.png" /></span></P><H2 id="toc-hId-638299641"><SPAN>For Developers Using ABAP Development Tools (ADT) for Eclipse: Steps to configure SAP Joule for Developers, ABAP AI Capabilities</SPAN><STRONG><SPAN>.</SPAN></STRONG></H2><P><STRONG><SPAN>Prerequisites</SPAN></STRONG></P><P><SPAN>Your SAP administrator provides you with a URL that refers to the SAP BTP.<BR /></SPAN></P><P><SPAN>You have applied the relevant SAP notes below:</SPAN></P><UL><LI><SPAN>To enable ABAP development tools for Eclipse (ADT) for SAP Joule for Developers, ABAP AI capabilities refer to SAP Note </SPAN><A class="" title="https://help.sap.com/docs/link-disclaimer?site=https://me.sap.com/notes/3752299" href="https://help.sap.com/docs/link-disclaimer?site=https://me.sap.com/notes/3752299" target="_blank" rel="noreferrer noopener"><SPAN>3752299 </SPAN></A><SPAN>.</SPAN></LI><LI><SPAN>AI Functionality in SAP S/4HANA Cloud Private Edition - SAP Note <A href="https://me.sap.com/notes/3558794" target="_self" rel="noopener noreferrer">3558794</A></SPAN></LI><LI><SPAN>When working on SAP S/4HANA Cloud Private Edition also follow the instructions in the SAP Note</SPAN><SPAN> </SPAN><A class="" title="https://help.sap.com/docs/link-disclaimer?site=https://me.sap.com/notes/3751297" href="https://help.sap.com/docs/link-disclaimer?site=https://me.sap.com/notes/3751297" target="_blank" rel="noreferrer noopener"><SPAN>3751297 </SPAN></A><SPAN>.</SPAN></LI><LI><SPAN>To enable AI Capabilities for ATC Findings follow the SAP Note <A class="" title="https://me.sap.com/notes/3721223" href="https://me.sap.com/notes/3721223" target="_blank" rel="noreferrer noopener">3721223 - AI Capabilities for ATC findings - SAP for Me</A></SPAN></LI><LI><SPAN>If you are unfamiliar how to implement an SAP note with TCI instructions, please refer to </SPAN><A class="" title="https://me.sap.com/notes/3437407" href="https://me.sap.com/notes/3437407" target="_blank" rel="noreferrer noopener"><SPAN>https://me.sap.com/notes/3437407</SPAN></A></LI></UL><P><STRONG><SPAN>Configure the SAP Joule for Developers, ABAP AI capabilities for Specific ABAP Projects</SPAN></STRONG></P><P><STRONG><SPAN>Note</SPAN></STRONG><STRONG><SPAN>: </SPAN></STRONG>ADT Client version 3.58.3 or higher is required for the new AI setup based on AI Units. Ensure that your Eclipse ADT plug-in is updated accordingly before proceeding with the configuration.</P><P><STRONG>Home page for installation: </STRONG><SPAN><A href="https://tools.hana.ondemand.com/#abap" target="_blank" rel="noopener nofollow noreferrer">https://tools.hana.ondemand.com/#abap</A><BR /></SPAN><STRONG>ADT client URL: </STRONG><SPAN><A href="https://tools.hana.ondemand.com/latest" target="_blank" rel="noopener nofollow noreferrer">https://tools.hana.ondemand.com/latest</A><BR /><BR /></SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Swathy_S_1-1781268025510.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/421179i40763DDD817DD130/image-size/large?v=v2&px=999" role="button" title="Swathy_S_1-1781268025510.png" alt="Swathy_S_1-1781268025510.png" /></span></P><P><SPAN>To use the latest SAP Joule for Developers, ABAP AI capabilities in <STRONG>specific</STRONG> ABAP projects in your ABAP Development Tools for Eclipse.<BR /></SPAN></P><UL><LI><SPAN>In the <STRONG>Project Explorer</STRONG>, select the relevant ABAP project and Choose <STRONG>Properties</STRONG> from the context menu.</SPAN><SPAN><BR /></SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Swathy_S_8-1781268468329.png" style="width: 491px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/421186i24EF9ACD2955F265/image-dimensions/491x285?v=v2" width="491" height="285" role="button" title="Swathy_S_8-1781268468329.png" alt="Swathy_S_8-1781268468329.png" /></span> </LI><LI><SPAN>Select make the input available, select the <STRONG>Enable project-specific settings</STRONG> checkbox.<BR /></SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Swathy_S_10-1781268638908.png" style="width: 479px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/421188i3A7A93AFBA23B52B/image-dimensions/479x424?v=v2" width="479" height="424" role="button" title="Swathy_S_10-1781268638908.png" alt="Swathy_S_10-1781268638908.png" /></span></LI><LI><SPAN>Beneath the <STRONG>Use Joule side-by-side</STRONG> radio button, enter the <STRONG>URL</STRONG> to the subscription of the central BTP service on the SAP BTP.<BR /><STRONG>Optional:</STRONG> Choose the <STRONG>Check Connection</STRONG> button to control if the connection works.<BR /></SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Swathy_S_11-1781268638912.png" style="width: 478px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/421189iF25071427278BBCA/image-dimensions/478x422?v=v2" width="478" height="422" role="button" title="Swathy_S_11-1781268638912.png" alt="Swathy_S_11-1781268638912.png" /></span><SPAN> </SPAN></LI><LI><SPAN>Confirm with <STRONG>Apply</STRONG>.</SPAN></LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Swathy_S_12-1781268638918.png" style="width: 519px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/421190i962F7E6095EF63EE/image-dimensions/519x388?v=v2" width="519" height="388" role="button" title="Swathy_S_12-1781268638918.png" alt="Swathy_S_12-1781268638918.png" /></span></P><UL><LI><SPAN>You can now use the SAP Joule for Developers, ABAP AI capabilities side-by-side in the selected ABAP project.<BR /><A href="https://www.sap.com/documents/2025/02/b4f714de-f57e-0010-bca6-c68f7e60039b.html" target="_blank" rel="noopener noreferrer">Click here to explore what’s in it!</A></SPAN></LI></UL><H2 id="toc-hId-441786136"><SPAN>For Developers Using ABAP Development Tools (ADT) for Visual Studio Code: Steps to configure SAP Joule for Developers, ABAP AI Capabilities</SPAN><STRONG><SPAN>.</SPAN></STRONG></H2><P><STRONG><SPAN>Prerequisites</SPAN></STRONG></P><P><SPAN>Your SAP administrator provides you a URL that refers to the SAP BTP.</SPAN></P><P><STRONG><SPAN>Configure the SAP Joule for Developers, ABAP AI capabilities for all ABAP Projects</SPAN></STRONG></P><P><SPAN>As an ABAP developer, you want to use the latest SAP Joule for Developers, ABAP AI capabilities for all of your ABAP projects in your ADT client.</SPAN></P><OL><LI><SPAN>To enable the SAP Joule for Developers, ABAP AI capabilities side-by-side, open the <STRONG>settings</STRONG>. To do this, use the <STRONG>File</STRONG> > <STRONG>Preferences >Settings</STRONG> menu.</SPAN></LI><LI><SPAN>Navigate to the <STRONG>Extensions</STRONG> ><STRONG>ABAP Development</STRONG> settings group.</SPAN></LI><LI><SPAN>Open the <STRONG>Adt></STRONG> <STRONG>Joule></STRONG> <STRONG>Url</STRONG> setting.</SPAN></LI><LI><SPAN>Enter the <STRONG>URL for SAP Joule for Developers, ABAP AI capabilities</STRONG> to the subscription of the central BTP service on the SAP Business Technology Platform.</SPAN></LI></OL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Swathy_S_13-1781268921964.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/421191i4D7D8A31A94231BD/image-size/large?v=v2&px=999" role="button" title="Swathy_S_13-1781268921964.png" alt="Swathy_S_13-1781268921964.png" /></span></P><P><SPAN>In ADT for Visual Studio Code, you can now use the SAP Joule for Developers, ABAP AI capabilities side-by-side in all of your supported ABAP projects.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Swathy_S_14-1781268921972.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/421192i7A09BA39EC5DF464/image-size/large?v=v2&px=999" role="button" title="Swathy_S_14-1781268921972.png" alt="Swathy_S_14-1781268921972.png" /></span></P><H2 id="toc-hId-245272631"><SPAN>Overview of SAP Joule for Developers, ABAP AI capabilities supported in SAP products including lower releases of SAP S/4HANA Cloud Private Edition</SPAN></H2><P>Currently using ABAP Development Tools for Eclipse, the following ABAP AI capabilities are supported in the different products and releases:</P><TABLE width="100.35020979020975%"><TBODY><TR><TD width="16.94736842105263%"><P><STRONG><SPAN>ABAP AI CAPABILITY</SPAN></STRONG></P></TD><TD width="14.684210526315791%"><P><STRONG><SPAN>SAP BTP ABAP ENVIRONMENT</SPAN></STRONG></P></TD><TD width="13.157894736842106%"><P><STRONG><SPAN>SAP S/4HANA Cloud Public Edition</SPAN></STRONG></P></TD><TD width="12.315789473684209%"><P><STRONG><SPAN>SAP S/4HANA Cloud Private Edition 2025</SPAN></STRONG></P></TD><TD width="12.210526315789474%"><P><STRONG><SPAN>SAP S/4HANA Cloud Private Edition 2023</SPAN></STRONG></P></TD><TD width="11.788810260946484%"><P><STRONG><SPAN>SAP S/4HANA Cloud Private Edition 2022</SPAN></STRONG></P></TD><TD width="12.243589190209308%"><P><STRONG><SPAN>SAP S/4HANA Cloud Private Edition 2021</SPAN></STRONG></P></TD></TR><TR><TD width="16.94736842105263%"><P><SPAN><A href="https://help.sap.com/docs/abap-ai/generative-ai-in-abap-cloud/use-predictive-code-completion" target="_blank" rel="noopener noreferrer"><STRONG>Predictive Code Completion</STRONG></A></SPAN></P></TD><TD width="14.684210526315791%"><P><SPAN>Supported</SPAN></P></TD><TD width="13.157894736842106%"><P><SPAN>Supported</SPAN></P></TD><TD width="12.315789473684209%"><P><SPAN>Supported</SPAN></P></TD><TD width="12.210526315789474%"><P><SPAN>Supported</SPAN></P></TD><TD width="11.788810260946484%"><P><SPAN>Supported</SPAN></P></TD><TD width="12.243589190209308%"><P><SPAN>Supported</SPAN></P></TD></TR><TR><TD width="16.94736842105263%"><P><SPAN><A href="https://help.sap.com/docs/abap-ai/generative-ai-in-abap-cloud/get-ai-based-explanations" target="_blank" rel="noopener noreferrer"><STRONG>ABAP/CDS code explanation</STRONG></A></SPAN></P></TD><TD width="14.684210526315791%"><P><SPAN>Supported</SPAN></P></TD><TD width="13.157894736842106%"><P><SPAN>Supported</SPAN></P></TD><TD width="12.315789473684209%"><P><SPAN>Supported</SPAN></P></TD><TD width="12.210526315789474%"><P><SPAN>Supported</SPAN></P></TD><TD width="11.788810260946484%"><P><SPAN>Supported</SPAN></P></TD><TD width="12.243589190209308%"><P><SPAN>Supported</SPAN></P></TD></TR><TR><TD width="16.94736842105263%"><P><SPAN><A href="https://help.sap.com/docs/abap-ai/generative-ai-in-abap-cloud/use-abap-unit-capabilities" target="_blank" rel="noopener noreferrer"><STRONG>ABAP Unit Test Generation</STRONG></A></SPAN></P></TD><TD width="14.684210526315791%"><P><SPAN>Supported</SPAN></P></TD><TD width="13.157894736842106%"><P><SPAN>Supported</SPAN></P></TD><TD width="12.315789473684209%"><P><SPAN>Supported</SPAN></P></TD><TD width="12.210526315789474%"><P><SPAN>Supported</SPAN></P></TD><TD width="11.788810260946484%"><P><SPAN>Supported</SPAN></P></TD><TD width="12.243589190209308%"><P><SPAN>Supported</SPAN></P></TD></TR><TR><TD width="16.94736842105263%"><P><SPAN><A href="https://help.sap.com/docs/abap-ai/generative-ai-in-abap-cloud/use-cds-test-class-generator" target="_blank" rel="noopener noreferrer"><STRONG>CDS Test Generation</STRONG></A></SPAN></P></TD><TD width="14.684210526315791%"><P><SPAN>Supported</SPAN></P></TD><TD width="13.157894736842106%"><P><SPAN>Supported</SPAN></P></TD><TD width="12.315789473684209%"><P><SPAN>Supported</SPAN></P></TD><TD width="12.210526315789474%"><P><SPAN>Supported</SPAN></P></TD><TD width="11.788810260946484%"><P><SPAN>Supported</SPAN></P></TD><TD width="12.243589190209308%"><P><SPAN>Supported</SPAN></P></TD></TR><TR><TD width="16.94736842105263%"><P><SPAN><A href="https://help.sap.com/docs/abap-ai/generative-ai-in-abap-cloud/using-documentation-chat" target="_blank" rel="noopener noreferrer"><STRONG>Documentation Chat</STRONG></A></SPAN></P></TD><TD width="14.684210526315791%"><P><SPAN>Supported</SPAN></P></TD><TD width="13.157894736842106%"><P><SPAN>Supported</SPAN></P></TD><TD width="12.315789473684209%"><P><SPAN>Supported</SPAN></P></TD><TD width="12.210526315789474%"><P><SPAN>Supported</SPAN></P></TD><TD width="11.788810260946484%"><P><SPAN>Supported</SPAN></P></TD><TD width="12.243589190209308%"><P><SPAN>Supported</SPAN></P></TD></TR><TR><TD width="16.94736842105263%"><P><SPAN><A href="https://help.sap.com/docs/abap-ai/generative-ai-in-abap-cloud/use-odata-ui-service-from-scratch-wizard" target="_blank" rel="noopener noreferrer"><STRONG>OData UI Service from Scratch</STRONG></A></SPAN></P></TD><TD width="14.684210526315791%"><P><SPAN>Supported</SPAN></P></TD><TD width="13.157894736842106%"><P><SPAN>Supported</SPAN></P></TD><TD width="12.315789473684209%"><P><SPAN>Supported</SPAN></P></TD><TD width="12.210526315789474%"><P><SPAN>No</SPAN></P></TD><TD width="11.788810260946484%"><P><SPAN>No</SPAN></P></TD><TD width="12.243589190209308%"><P><SPAN>No</SPAN></P></TD></TR><TR><TD width="16.94736842105263%"><P><SPAN><A href="https://help.sap.com/docs/abap-ai/generative-ai-in-abap-cloud/use-rap-business-logic-prediction" target="_blank" rel="noopener noreferrer"><STRONG>RAP Business Logic Prediction</STRONG></A></SPAN></P></TD><TD width="14.684210526315791%"><P><SPAN>Supported</SPAN></P></TD><TD width="13.157894736842106%"><P><SPAN>Supported</SPAN></P></TD><TD width="12.315789473684209%"><P><SPAN>Supported</SPAN></P></TD><TD width="12.210526315789474%"><P><SPAN>No</SPAN></P></TD><TD width="11.788810260946484%"><P><SPAN>No</SPAN></P></TD><TD width="12.243589190209308%"><P><SPAN>No</SPAN></P></TD></TR><TR><TD width="16.94736842105263%"><P><SPAN><A href="https://help.sap.com/docs/abap-ai/generative-ai-in-abap-cloud/using-custom-code-migration-ai-assistant" target="_blank" rel="noopener noreferrer"><STRONG>Custom Code Migration Assistant</STRONG></A></SPAN></P></TD><TD width="14.684210526315791%"><P><SPAN>NA</SPAN></P></TD><TD width="13.157894736842106%"><P><SPAN>NA</SPAN></P></TD><TD width="12.315789473684209%"><P><SPAN>Supported</SPAN></P></TD><TD width="12.210526315789474%"><P><SPAN>Supported</SPAN></P></TD><TD width="11.788810260946484%"><P><SPAN>Supported</SPAN></P></TD><TD width="12.243589190209308%"><P><SPAN>Supported</SPAN></P></TD></TR></TBODY></TABLE><P><SPAN> </SPAN>In addition, of course, all capabilities offered by your coding agent of choice are supported and driven by our ADT MCP Server.</P><P>With the introduction of the ADT MCP Server, developers can unlock a truly agentic ABAP development experience. The ADT MCP Server makes ABAP development tools easily accessible to AI systems, streamlining development tasks, simplifying workflows, and improving efficiency.</P><P><SPAN>To learn more about the available MCP tools in ADT for eclipse, see: <A href="https://help.sap.com/docs/abap-cloud/abap-development-tools-for-visual-studio-code/mcp-tools" target="_blank" rel="noopener noreferrer"> </A> <A href="https://help.sap.com/docs/abap-ai/generative-ai-in-abap-cloud/mcp-tools?state=DRAFT&version=ADT_SHIP_Previews" target="_blank" rel="noopener noreferrer">Model Context Protocol Tools | SAP Help Portal</A></SPAN></P><P>Furthermore, step by step, we will achieve a similar level of ABAP AI capabilities support in <STRONG>ADT for Visual Studio Code</STRONG>.</P><P><SPAN>To learn more about the available MCP tools in ADT for Visual Studio Code, see: <A href="https://help.sap.com/docs/abap-cloud/abap-development-tools-for-visual-studio-code/mcp-tools" target="_blank" rel="noopener noreferrer">Model Context Protocol Tools | SAP Help Portal</A></SPAN></P><P><SPAN> </SPAN>With that, go and explore the <STRONG>re-invented ABAP AI offering!<BR /><BR /></STRONG><SPAN> </SPAN><SPAN>Coauthors,</SPAN></P><P> <a href="https://community.sap.com/t5/user/viewprofilepage/user-id/533">@karl_kessler</a> <a href="https://community.sap.com/t5/user/viewprofilepage/user-id/590620">@niloofar_naseri</a> <BR /><BR /><STRONG>Troubleshooting Section:<BR /></STRONG><BR /><STRONG>409 Conflict Error</STRONG><BR />This error occurs during Joule logon if Joule tenant activation is not done in CBC.<BR /><BR /><STRONG>403 Conflict Error </STRONG><BR />This error occurs if the j4d_abap - enterprise-user group assignment is not done in the CIS.</P><P><STRONG>For the AI Configuration - SAP Central Business Configuration, AI-Assisted Scoping and Configuration Services</STRONG> <BR />In SAP Central Business Configuration, AI-assisted scoping and configuration services, you can centrally manage business AI features of SAP cloud solutions. SAP Central Business Configuration, AI-assisted scoping and configuration services, is a centralized hub which enables you to manage SAP's AI solution features via SAP Central Business Configuration.</P><P>Please refer -<A href="https://help.sap.com/docs/CENTRAL_BUSINESS_CONFIGURATION/ffae1b25fe4543d08db67dcbab9b288d/47dff1ba0c6240deacfb62781fa7386e.html" target="_blank" rel="noopener noreferrer">User Setup | SAP Help Portal</A>- for the user setup</P><P> </P><DIV class=""><DIV class=""><DIV class=""><DIV class=""><BR /><STRONG>Please Note</STRONG> - The CBC tenant is always mapped to the production CIS. So while provisioning the Joule Solution if the Test CIS is selected, then the J4D Tenant is created in the Test Landscape while the CBC(UMS) Application is by default mapped to the production CIS.<BR /><BR /><STRONG>Joule not supported issue in ADT</STRONG> - for the private cloud customers refer to - <A href="https://me.sap.com/notes/3558794" target="_blank" rel="noopener noreferrer">3558794 - AI Functionality in SAP S/4HANA Cloud Private Edition - SAP for Me</A></DIV></DIV></DIV></DIV>2026-06-12T17:18:40.414000+02:00https://community.sap.com/t5/technology-blog-posts-by-sap/sap-btp-abap-environment-pre-upgrade-option-for-release-2608/ba-p/14417919SAP BTP ABAP Environment – Pre-Upgrade Option for Release 26082026-06-12T22:39:08.716000+02:00FrankJentschhttps://community.sap.com/t5/user/viewprofilepage/user-id/4296<H1 id="toc-hId-1688300779">Overview</H1><P>Providing a significant number of new features is an important goal of release upgrades to deliver innovations to our customers and partners. There are four major release upgrades per year following a predefined schedule as described in this <A href="https://community.sap.com/t5/technology-blog-posts-by-sap/sap-btp-abap-environment-maintenance-windows-and-major-upgrade-windows-in/ba-p/14257326" target="_blank">blog post</A>.<BR /><BR />An upgrade is intended as a “no event” for customers and partners. For example, only compatible changes of released objects (APIs) will be delivered. We recommend performing a test of the custom-built productive apps in a test environment for the new release. The complexity of the technical dependencies between the custom-built apps and the underlying environment cannot be tested isolated, only including the ABAP environment on SAP-side. Therefore, we offer you to pre-upgrade selected systems 29 days in advance to test the applications prior to the planned standard-upgrade. Each ABAP environment release is connected to a fixed UI5 major version. As a consequence, the pre-upgrade tests include the upcoming UI5 version as well. Please refer to this <A href="https://community.sap.com/t5/technology-blog-posts-by-sap/sap-btp-abap-environment-referenced-ui5-versions-and-release-schedule/ba-p/14117966" target="_self">blog post</A> for further details. </P><P> </P><H1 id="toc-hId-1491787274">Purpose</H1><P>This option enables a customer or partner to test the applications they have already developed on top of the new release a couple of days before the standard-upgrade. With SAP BTP ABAP Environment (aka "Steampunk"), we follow the approach of keeping released objects stable and provide all enhancements in a compatible fashion. Early testing is an additional measure to ensure proper software quality and might be used to detect unforeseen regressions. However, this option is not intended to test new features or to consume new features earlier.</P><P> </P><H1 id="toc-hId-1295273769">Approach</H1><P>The standard-upgrade of all systems to release <STRONG>2608</STRONG> is planned for <STRONG>August 15/16</STRONG>.</P><P>A customer or partner can nominate one or more already existing systems for the pre-upgrade. A nominated system will be upgraded on <STRONG>July 17</STRONG> within a planned downtime <STRONG>from 8:00 to 16:00 CET</STRONG>. Depending on the system settings, the actual technical downtime might be only ~20 min within the mentioned timeframe. Please refer to this <A href="https://community.sap.com/t5/technology-blog-posts-by-sap/sap-btp-abap-environment-downtime-optimized-upgrades-and-hotfix-collection/ba-p/13986913" target="_blank">blog post</A> about the downtime-optimized upgrade. </P><P>We recommend nominating a non-development system, such as a test system. The nomination of a development system is technically also possible, but fixes or other changes must not be imported into another system with a lower release. The nomination of a productive system doesn’t make sense because the purpose of the pre-upgrade is the re-test of the existing application before the productive system gets the new release.</P><P>According to the approach explained above, this offer is only relevant for customers or partners having at least two systems.</P><P>There might be situations where a correction of custom objects needs to be deployed. Such corrections are possible if the development / correction system is on the older release and is imported into the pre-upgraded system with the higher release.</P><P>Except potential fixes, the pre-upgrade is based on the same version as the standard-upgrade. It is planned to perform the pre-upgrade based on <STRONG>hotfix collection 2</STRONG>. The pre-upgrade systems will get the import of <STRONG>hotfix collection 3</STRONG> after 2 weeks in the middle of the entire pre-upgrade test phase. It is planned to perform the standard-upgrade based on <STRONG>hotfix collection 3 plus potentially additonal patches </STRONG>and import these <STRONG>potentially additional fixes </STRONG>to the pre-upgrade systems prio to the upgrade weekend on <STRONG>August 14</STRONG>.</P><P> </P><H1 id="toc-hId-1098760264">Costs</H1><P>This offering is optional and free of any additional charges.</P><P> </P><H1 id="toc-hId-902246759">Planned New Features</H1><P data-unlink="true">The planned new features will be published on the <A href="https://help.sap.com/whats-new/7a822d3bcaa74f31b98fa315601e9c96?Version=ABAP+Environment+2608" target="_blank" rel="noopener noreferrer">What's New for SAP BTP ABAP Environment</A> on <STRONG>July 10</STRONG>. This list gives you an overview of potential areas for re-testing. The purpose of the pre-upgrade is not to consume these features before the standard-upgrade, because the documentation on help.sap.com will be delivered later before the standard-upgrade. It would also not be possible to transport code of such an adoption, because subsequent systems are not yet on the new release during the pre-upgrade phase.</P><P>Independent of the upgrades of the SAP BTP ABAP Environment, we recommend developing automated tests for the custom-built apps to detect regressions early on and without manual effort for re-testing. Such automated tests are perfectly suited to be run in the pre-upgrade test phase.</P><P> </P><H1 id="toc-hId-705733254">Time Schedule</H1><P>The following figure summarizes the general approach:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Pre-Upgrade 2608.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/428131iBCFA20805067BF3A/image-size/large?v=v2&px=999" role="button" title="Pre-Upgrade 2608.png" alt="Pre-Upgrade 2608.png" /></span></P><P>Milestones for release <STRONG>2608</STRONG>:</P><UL><LI><STRONG>June 16</STRONG>: Nomination of system(s) is possible in the Landscape Portal</LI><LI><STRONG>July 10</STRONG>: Announcement of the planned new features</LI><LI><STRONG>July 13</STRONG>: Pre-upgrade systems are known</LI><LI><STRONG>July 17: Pre-upgrade (with hotfix collection 2)</STRONG></LI><LI><STRONG>July 31</STRONG>: Import of hotfix collection <STRONG>3</STRONG> into pre-upgrade systems</LI><LI><STRONG>August 12</STRONG>: Potential decision to postpone the upgrade</LI><LI><STRONG>August 14</STRONG>: Import of additional patches for collection <STRONG>3</STRONG> into pre-upgrade systems</LI><LI><STRONG>August 15/16: Standard-upgrade (with hotfix collection 3 and additonal patches)</STRONG></LI></UL><P> </P><H1 id="toc-hId-509219749">System Nomination</H1><P>To nominate a system, please register the system(s) by <STRONG>July 13</STRONG> (EOB) latest by using the <STRONG>Landscape Portal</STRONG>. You can find further information about <A href="https://help.sap.com/docs/sap-btp-abap-environment/landscape-portal/accessing-landscape-portal" target="_blank" rel="noopener noreferrer">Accessing the Landscape Portal</A> and about <A href="https://help.sap.com/docs/sap-btp-abap-environment/landscape-portal/manage-sap-system-upgrade" target="_blank" rel="noopener noreferrer">Manage SAP System Upgrade</A>. Please do <STRONG>not</STRONG> create customer tickets for system nomination like in previous pre-upgrades.</P><P>With such a nomination, the customer agrees to an extraordinary planned maintenance on <STRONG>July </STRONG><STRONG>17</STRONG> for the pre-upgrade and on <STRONG>July 31</STRONG> and <STRONG>August 14</STRONG> for the import of hotfix collections resp. additional patches (see above). You can find information about the required system downtimes in this <A href="https://community.sap.com/t5/technology-blog-posts-by-sap/sap-btp-abap-environment-downtime-optimized-upgrades-and-hotfix-collection/ba-p/13986913" target="_self">blog post</A>.</P><P> </P><H1 id="toc-hId-312706244">Report an Issue</H1><P>Issues should be reported as part of the regression test phase by <STRONG>July</STRONG><STRONG> 31</STRONG> (EOB) to allow for a sufficient time frame for issue analysis and potential corrections on SAP-side.</P><P>Please create a customer ticket by using component <STRONG>BC-CP-ABA</STRONG>.</P><P>If a detected issue is likely to endanger the productive use after the standard-upgrade, you should use ticket priority <STRONG>very high</STRONG> despite the fact that the pre-upgrade system is not a productive system.</P><P> </P><H1 id="toc-hId-116192739">Exceptional Process in Case of Unresolved Priority Very High Issues</H1><P>In case of the aligned decision on Wednesday, <STRONG>August 12</STRONG> (based on unresolved priority very high tickets) to postpone the upgrade, a dedicated mitigation process needs to be started <SPAN>together with the respective customer or partner, with the following boundary conditions:</SPAN></P><UL><LI>Resolving the open priority very high issues remains the highest priority for both, SAP and the customer or partner, as it is also the prerequisite for the upgrade.</LI><LI>According to the estimated issue resolution, catching up the upgrade needs to be planned.</LI><LI>The upgrade leads to a business downtime. Please refer to this <A href="https://community.sap.com/t5/technology-blog-posts-by-sap/sap-btp-abap-environment-downtime-optimized-upgrades-and-hotfix-collection/ba-p/13986913" target="_blank">blog post</A>.</LI><LI>The upgrade must be scheduled within 7 calendar days the latest after fixing all remaining open priority very high issues.</LI><LI>We will not provide any fixes for the old release after the original date of the standard-upgrade to the new release.</LI></UL><P>In case business-critical issues are detected after the upgrade:</P><UL><LI>Issues need to be reported as priority very high issues and will be processed accordingly.</LI><LI>Going back to the release before upgrade is not an option. Therefore, resolving the issues in the new release with the appropriate priority is the required approach.</LI></UL><P> </P><H1 id="toc-hId--80320766">Summary</H1><P>We recommend performing regression tests in pre-upgraded test systems to avoid day-1 impacts of productive custom apps after the standard-upgrade.</P>2026-06-12T22:39:08.716000+02:00https://community.sap.com/t5/abap-blog-posts/unmanaged-rap-application-for-excel-file-upload-and-cds-custom-entity-with/ba-p/14418230Unmanaged RAP application for Excel File Upload and CDS Custom Entity with Unmanaged Query Implement2026-06-14T15:02:55.897000+02:00IgorPrudnecionokhttps://community.sap.com/t5/user/viewprofilepage/user-id/479156<H2 id="toc-hId-1817406615">Intro</H2><P>Nowadays, finding information is easier than ever. Although, the experience still remains the key differentiator. And that’s what I would like to share through this blog – my experience in implementing the Excel File Upload in a RAP application in BTP ABAP environment. RAP application was implemented with an unmanaged behavior, supporting also the editing of multiple items at the same time. Additionally, the data model is based on custom entities with unmanaged queries.</P><P> </P><H2 id="toc-hId-1620893110">Use-case</H2><P>RAP application for maintaining Bonus Plans; allow the editing of multiple records at the same time; allow mass upload from an Excel file.</P><P> </P><H2 id="toc-hId-1424379605">Data Model</H2><P>The data model for my scenario is based on 2 DB tables (ZIP_BONUS_PLAN and ZIP_BP_UPLOAD) and 3 CDS Custom Entities (ZCE_BP_SINGLETON, ZCE_BONUS_PLAN and ZCE_BP_UPLOAD). Refer to <A href="https://help.sap.com/docs/abap-cloud/abap-data-models/cds-custom-entities" target="_blank" rel="noopener noreferrer">Custom Entities | SAP Help Portal</A>.</P><P>The root entity is a singleton entity aiming to implement multi-inline-edit. Refer to <A href="https://help.sap.com/docs/abap-cloud/abap-rap/developing-transactional-apps-with-multi-inline-edit-capabilities" target="_blank" rel="noopener noreferrer">Developing Transactional Apps with Multi-Inline-Edit Capabilities | SAP Help Portal</A>.</P><P>All 3 Custom Entities implement the retrieval logic in the same ABAP class ZCL_BP_UNMNG_QUERY.</P><P>In the attachment you can find the files containing the most interesting parts of coding:</P><UL><LI><EM>2 Database Tables</EM></LI><LI><EM>3 CDS views</EM></LI><LI><EM>Unmanage Query implementation</EM></LI><LI><EM>Processing logic</EM></LI><LI><EM>RAP Behavior Definition</EM></LI><LI><EM>RAP Behavior Implementation</EM></LI></UL><P> </P><H3 id="toc-hId-1356948819">Implementation of Excel Upload</H3><P>The implementation of File Upload is based on large objects (LOBs), providing end users the option to incorporate external files when editing entity instances. To make it work with Excel files you have to implement XCO_CP_XLSX. Refer to <A href="https://help.sap.com/docs/abap-cloud/abap-rap/working-with-large-objects" target="_blank" rel="noopener noreferrer">Working with Large Objects | SAP Help Portal</A> and <A href="https://help.sap.com/docs/btp/sap-business-technology-platform/xlsx" target="_blank" rel="noopener noreferrer">XLSX | SAP Help Portal</A>.</P><P> </P><H2 id="toc-hId-1031352595">Service Binding</H2><P>For Service Binding I’ve chosen “OData V2 – UI” because if I go for “OData V4 – UI” some parts are missing and I get the following notification in the Service Binding itself “oData V4 services with no draft capability will be primarily READ-ONLY”.</P><P> </P><H2 id="toc-hId-834839090">Fiori UI Preview</H2><P>The preview starts with the root entity ZCE_BP_SINGLETON for which the if_rap_query_provider builds a dummy record during runtime:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="IgorPrudnecionok_0-1781376826905.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/421480i272550994B08574D/image-size/medium?v=v2&px=400" role="button" title="IgorPrudnecionok_0-1781376826905.png" alt="IgorPrudnecionok_0-1781376826905.png" /></span></P><P> </P><P>Here I have implemented a custom action “Drop all Data” to be able to clear my demo tables.</P><P>When I select the singleton record, the application navigates to the page with Bonus Plan Grid:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="IgorPrudnecionok_1-1781376826909.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/421482i254941564632BC45/image-size/medium?v=v2&px=400" role="button" title="IgorPrudnecionok_1-1781376826909.png" alt="IgorPrudnecionok_1-1781376826909.png" /></span></P><P> </P><P>Here we start with the “Mass Upload” functionality, by executing the “Create New Upload Template”. As a result, a new record is created in the table ZIP_BP_UPLOAD, containing a template file attachment.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="IgorPrudnecionok_2-1781376826911.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/421481i27F7F3147BC0F991/image-size/medium?v=v2&px=400" role="button" title="IgorPrudnecionok_2-1781376826911.png" alt="IgorPrudnecionok_2-1781376826911.png" /></span></P><P> </P><P>When you enter into the details of this record, you can download the template:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="IgorPrudnecionok_3-1781376826913.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/421483i1EC99E8DE655585C/image-size/medium?v=v2&px=400" role="button" title="IgorPrudnecionok_3-1781376826913.png" alt="IgorPrudnecionok_3-1781376826913.png" /></span></P><P> </P><P>Maintain the Excel file data and upload it back:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="IgorPrudnecionok_4-1781376826916.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/421484iDDAF0D9A5A92764B/image-size/medium?v=v2&px=400" role="button" title="IgorPrudnecionok_4-1781376826916.png" alt="IgorPrudnecionok_4-1781376826916.png" /></span></P><P> </P><P>Now, the file is uploaded and the record is updated:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="IgorPrudnecionok_5-1781376826918.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/421485i7244A01F8085737D/image-size/medium?v=v2&px=400" role="button" title="IgorPrudnecionok_5-1781376826918.png" alt="IgorPrudnecionok_5-1781376826918.png" /></span></P><P> </P><P>Once the file is uploaded, it can be processed:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="IgorPrudnecionok_6-1781376826922.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/421486iD6D8060351905BA2/image-size/medium?v=v2&px=400" role="button" title="IgorPrudnecionok_6-1781376826922.png" alt="IgorPrudnecionok_6-1781376826922.png" /></span></P><P> </P><P>Successfully processed file will create records in the table ZIP_BONUS_PLAN. The UI allows editing multiple records:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="IgorPrudnecionok_7-1781376826924.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/421487i66A255B19B8A0E19/image-size/medium?v=v2&px=400" role="button" title="IgorPrudnecionok_7-1781376826924.png" alt="IgorPrudnecionok_7-1781376826924.png" /></span></P><P> </P><H2 id="toc-hId-638325585">Final words</H2><P><SPAN>In an era where AI helps us find answers faster than ever, the craft still lies in how we turn those answers into working solutions. This Excel upload journey—unmanaged behavior for bulk editing, custom entities with unmanaged queries—was my way of shaping RAP to the problem, not the other way around. If my experience saves you a few hours, a few pitfalls, or inspires a cleaner design, then sharing it was worth it. The rest is practice—and I’m looking forward to hearing about your experience in the comments below.</SPAN></P>2026-06-14T15:02:55.897000+02:00https://community.sap.com/t5/technology-blog-posts-by-members/building-an-inventory-system-with-rap-on-btp-trial-cds-views-explained/ba-p/14420890Building an Inventory System with RAP on BTP Trial — CDS Views Explained2026-06-17T11:55:35.487000+02:00rmz01https://community.sap.com/t5/user/viewprofilepage/user-id/725901<H3 id="toc-hId-1947180479">Introduction</H3><P class="">When people talk about RAP (RESTful ABAP Programming Model), the conversation usually jumps straight to behavior definitions, actions, and determinations. The CDS layer gets a brief mention and everyone moves on.</P><P class="">That's a mistake.</P><P class="">The CDS view architecture is the contract your entire application is built on. Get it right and everything above it — behaviors, OData services, Fiori UIs — falls into place naturally. Get it wrong and you'll spend hours debugging problems that were actually design issues.</P><P class="">In this post I'll walk through the complete CDS layer of a Mini Inventory & Stock Movement System I built on SAP BTP Trial, covering four entities across three business objects. I'll explain the design decisions, not just the code.</P><H3 id="toc-hId-1750666974">The System at a Glance</H3><P class="">The application manages warehouse stock movements. Three business objects cover the full domain:</P><DIV class="">Business Object Interface View Database Table <TABLE><TBODY><TR><TD>Material Master</TD><TD>ZI_MiniMM_Material</TD><TD>ZRMZ_MM_MATERIAL</TD></TR><TR><TD>Storage Location</TD><TD>ZI_MiniMM_Storage</TD><TD>ZRMZ_MM_STORAGE</TD></TR><TR><TD>Stock Document (Header)</TD><TD>ZI_MiniMM_StockDocument</TD><TD>ZRMZ_MM_DOC_HDR</TD></TR><TR><TD>Stock Document (Item)</TD><TD>ZI_MiniMM_StockDocumentItem</TD><TD>ZRMZ_MM_DOC_ITEM</TD></TR><TR><TD>Current Stock (read-only)</TD><TD>ZI_MiniMM_CurrentStock</TD><TD>ZRMZ_MM_STOCK</TD></TR></TBODY></TABLE></DIV><P class="">Each entity has a matching projection view (<CODE>ZC_</CODE> prefix) used to expose the OData service.</P><HR /><H3 id="toc-hId-1554153469">The Two-Layer Architecture</H3><P class="">RAP enforces a clean separation between two CDS view types. Understanding why this separation exists is more important than understanding the syntax.</P><P class=""><STRONG>Interface views (<CODE>ZI_</CODE>)</STRONG> are the authoritative source of truth. They sit directly on the database tables and carry everything the framework needs to understand your data: semantic annotations, associations, compositions, and quantity/currency references. These views should be stable — changing them has downstream impact.</P><P class=""><STRONG>Projection views (<CODE>ZC_</CODE>)</STRONG> consume the interface views and add presentation concerns: the <CODE>provider contract</CODE>, <CODE>@Metadata.allowExtensions</CODE> for metadata extensions, and the redirection of compositions so that OData navigation points to the correct projection layer. Projection views can evolve more freely.</P><P class="">A useful mental model: <CODE>ZI_</CODE> is the API contract, <CODE>ZC_</CODE> is the UI adapter.</P><HR /><H3 id="toc-hId-1357639964">Composition: Stock Document Header and Item</H3><P class="">The most important structural relationship in this model is the header-item composition between <CODE>ZI_MiniMM_StockDocument</CODE> and <CODE>ZI_MiniMM_StockDocumentItem</CODE>.</P><P class="">In the header (root entity):</P><DIV class=""><DIV class=""><DIV class=""><DIV class=""><DIV class=""> </DIV><DIV class=""><DIV class=""> </DIV></DIV></DIV></DIV></DIV><DIV class="">abap</DIV><DIV class=""><PRE><CODE><SPAN>composition [<SPAN class="">0</SPAN><SPAN class="">.</SPAN><SPAN class="">.</SPAN>*] <SPAN class="">of</SPAN> ZI_MiniMM_StockDocumentItem</SPAN><SPAN> <SPAN class="">as</SPAN> _Items</SPAN></CODE></PRE></DIV></DIV><P class="">In the item (child entity):</P><DIV class=""><DIV class=""><DIV class=""><DIV class=""><DIV class=""> </DIV><DIV class=""><DIV class=""> </DIV></DIV></DIV></DIV></DIV><DIV class="">abap</DIV><DIV class=""><PRE><CODE><SPAN><SPAN class="">association</SPAN> <SPAN class="">to</SPAN> parent ZI_MiniMM_StockDocument</SPAN><SPAN> <SPAN class="">as</SPAN> _Header</SPAN><SPAN> <SPAN class="">on</SPAN> $projection<SPAN class="">.</SPAN>DocumentID <SPAN class="">=</SPAN> _Header<SPAN class="">.</SPAN>DocumentID</SPAN></CODE></PRE></DIV></DIV><P class="">The <CODE>[0..*]</CODE> cardinality means a document can have zero or more items — appropriate here since a newly created document starts empty. The parent association on the item side creates the back-navigation link.</P><P class="">Why does this matter? Composition in RAP is not just a modelling convenience. It has runtime implications: the managed runtime treats the composition tree as a single transactional unit. When you delete a header, items are automatically deleted. When you lock a header for editing, the entire tree is locked. This is the correct behaviour for a stock document.</P><HR /><H3 id="toc-hId-1161126459">Associations: Two Aliases, One Target View</H3><P class="">The item view introduces an interesting challenge: a stock movement can have both a source storage location and a target storage location, and both must be validated against the same <CODE>ZI_MiniMM_Storage</CODE> entity.</P><P class="">The solution is two separate associations pointing to the same underlying view:</P><DIV class=""><DIV class=""><DIV class=""><DIV class=""><DIV class=""> </DIV><DIV class=""><DIV class=""> </DIV></DIV></DIV></DIV></DIV><DIV class="">abap</DIV><DIV class=""><PRE><CODE><SPAN><SPAN class="">association</SPAN> [<SPAN class="">1</SPAN><SPAN class="">.</SPAN><SPAN class="">.</SPAN><SPAN class="">1</SPAN>] <SPAN class="">to</SPAN> ZI_MiniMM_Material <SPAN class="">as</SPAN> _Material</SPAN><SPAN> <SPAN class="">on</SPAN> $projection<SPAN class="">.</SPAN>MaterialID <SPAN class="">=</SPAN> _Material<SPAN class="">.</SPAN>MaterialID</SPAN>
<SPAN><SPAN class="">association</SPAN> [<SPAN class="">0</SPAN><SPAN class="">.</SPAN><SPAN class="">.</SPAN><SPAN class="">1</SPAN>] <SPAN class="">to</SPAN> ZI_MiniMM_Storage <SPAN class="">as</SPAN> _SourceStorage</SPAN><SPAN> <SPAN class="">on</SPAN> $projection<SPAN class="">.</SPAN>SourceStorage <SPAN class="">=</SPAN> _SourceStorage<SPAN class="">.</SPAN>StorageID</SPAN>
<SPAN><SPAN class="">association</SPAN> [<SPAN class="">0</SPAN><SPAN class="">.</SPAN><SPAN class="">.</SPAN><SPAN class="">1</SPAN>] <SPAN class="">to</SPAN> ZI_MiniMM_Storage <SPAN class="">as</SPAN> _TargetStorage</SPAN><SPAN> <SPAN class="">on</SPAN> $projection<SPAN class="">.</SPAN>TargetStorage <SPAN class="">=</SPAN> _TargetStorage<SPAN class="">.</SPAN>StorageID</SPAN></CODE></PRE></DIV></DIV><P class="">A few design points worth noting here.</P><P class="">The <CODE>_Material</CODE> association is <CODE>[1..1]</CODE> — every item line must reference a valid material. <CODE>_SourceStorage</CODE> and <CODE>_TargetStorage</CODE> are both <CODE>[0..1]</CODE> because not every movement type uses both. A goods receipt (GR) has no source; a goods issue (GI) has no target. Making both optional at the CDS level correctly reflects the business reality.</P><P class="">The alias names (<CODE>_SourceStorage</CODE>, <CODE>_TargetStorage</CODE>) are different even though both navigate to <CODE>ZI_MiniMM_Storage</CODE>. This is required by the framework — CDS does not allow two associations with identical names on the same view, even if the target differs.</P><HR /><H3 id="toc-hId-964612954">Semantic Annotations: Free Administrative Data</H3><P class="">RAP's managed runtime will auto-populate administrative fields if you annotate them correctly. No custom code required.</P><DIV class=""><DIV class=""><DIV class=""><DIV class=""><DIV class=""> </DIV><DIV class=""><DIV class=""> </DIV></DIV></DIV></DIV></DIV><DIV class="">abap</DIV><DIV class=""><PRE><CODE><SPAN>@Semantics<SPAN class="">.</SPAN><SPAN class="">user</SPAN><SPAN class="">.</SPAN>createdBy<SPAN class="">:</SPAN> true</SPAN><SPAN>created_by <SPAN class="">as</SPAN> CreatedBy<SPAN class="">,</SPAN>
</SPAN>
<SPAN>@Semantics<SPAN class="">.</SPAN>systemDateTime<SPAN class="">.</SPAN>createdAt<SPAN class="">:</SPAN> true</SPAN><SPAN>created_at <SPAN class="">as</SPAN> CreatedAt<SPAN class="">,</SPAN>
</SPAN>
<SPAN>@Semantics<SPAN class="">.</SPAN><SPAN class="">user</SPAN><SPAN class="">.</SPAN>lastChangedBy<SPAN class="">:</SPAN> true</SPAN><SPAN>last_changed_by <SPAN class="">as</SPAN> ChangedBy<SPAN class="">,</SPAN>
</SPAN>
<SPAN>@Semantics<SPAN class="">.</SPAN>systemDateTime<SPAN class="">.</SPAN>lastChangedAt<SPAN class="">:</SPAN> true</SPAN><SPAN>last_changed_at <SPAN class="">as</SPAN> ChangedAt</SPAN></CODE></PRE></DIV></DIV><P class="">These annotations go on the <STRONG>interface view</STRONG>, not the projection. The framework reads them at runtime and fills the mapped database columns on every create and update operation.</P><P class="">The only requirement is that the underlying database table columns have compatible data types (<CODE>SYUNAME</CODE>, <CODE>TIMESTAMPL</CODE> respectively) and that you declare <CODE>with_draft</CODE> or standard managed behaviour in the behavior definition. If those conditions are met, this is genuinely zero-effort audit trail data.</P><HR /><H3 id="toc-hId-768099449">Projection Views: What Most Tutorials Skip</H3><P class="">Every interface view has a corresponding projection view. The projection view adds three things that the interface view cannot provide: the <CODE>provider contract transactional_query</CODE> declaration (required for OData V4 exposure), <CODE>@Metadata.allowExtensions: true</CODE> (required for metadata extensions to attach), and — crucially — the composition redirect.</P><P class="">The composition redirect is the step that most beginner tutorials either skip or explain poorly.</P><P class="">In the projection header:</P><DIV class=""><DIV class=""><DIV class=""><DIV class=""><DIV class=""> </DIV><DIV class=""><DIV class=""> </DIV></DIV></DIV></DIV></DIV><DIV class="">abap</DIV><DIV class=""><PRE><CODE><SPAN>_Items <SPAN class="">:</SPAN> redirected <SPAN class="">to</SPAN> composition child ZC_MiniMM_StockDocumentItem</SPAN></CODE></PRE></DIV></DIV><P class="">In the projection item:</P><DIV class=""><DIV class=""><DIV class=""><DIV class=""><DIV class=""> </DIV><DIV class=""><DIV class=""> </DIV></DIV></DIV></DIV></DIV><DIV class="">abap</DIV><DIV class=""><PRE><CODE><SPAN>_Header <SPAN class="">:</SPAN> redirected <SPAN class="">to</SPAN> parent ZC_MiniMM_StockDocument</SPAN></CODE></PRE></DIV></DIV><P class="">Without this redirect, OData navigation from the header to its items would traverse back to the <STRONG>interface</STRONG> entities (<CODE>ZI_</CODE>), not the projection entities (<CODE>ZC_</CODE>). The service binding would still activate, but navigation in Fiori would either fail silently or return data without the metadata annotations your UI depends on.</P><HR /><H3 id="toc-hId-571585944">Value Help Annotations</H3><P class="">The final piece of the CDS layer is the value help definitions, which live in the <STRONG>metadata extension</STRONG> of the item projection view.</P><DIV class=""><DIV class=""><DIV class=""><DIV class=""><DIV class=""> </DIV><DIV class=""><DIV class=""> </DIV></DIV></DIV></DIV></DIV><DIV class="">abap</DIV><DIV class=""><PRE><CODE><SPAN>@Consumption<SPAN class="">.</SPAN>valueHelpDefinition<SPAN class="">:</SPAN> [<SPAN class="">{</SPAN>
</SPAN><SPAN> entity<SPAN class="">.</SPAN><SPAN class="">name</SPAN><SPAN class="">:</SPAN> <SPAN class="">'ZC_MiniMM_Material'</SPAN><SPAN class="">,</SPAN>
</SPAN><SPAN> entity<SPAN class="">.</SPAN>element<SPAN class="">:</SPAN> <SPAN class="">'MaterialID'</SPAN> <SPAN class="">}</SPAN>]</SPAN><SPAN>MaterialID;</SPAN>
<SPAN>@Consumption<SPAN class="">.</SPAN>valueHelpDefinition<SPAN class="">:</SPAN> [<SPAN class="">{</SPAN>
</SPAN><SPAN> entity<SPAN class="">.</SPAN><SPAN class="">name</SPAN><SPAN class="">:</SPAN> <SPAN class="">'ZC_MiniMM_Storage'</SPAN><SPAN class="">,</SPAN>
</SPAN><SPAN> entity<SPAN class="">.</SPAN>element<SPAN class="">:</SPAN> <SPAN class="">'StorageID'</SPAN> <SPAN class="">}</SPAN>]</SPAN><SPAN>SourceStorage;</SPAN>
<SPAN>@Consumption<SPAN class="">.</SPAN>valueHelpDefinition<SPAN class="">:</SPAN> [<SPAN class="">{</SPAN>
</SPAN><SPAN> entity<SPAN class="">.</SPAN><SPAN class="">name</SPAN><SPAN class="">:</SPAN> <SPAN class="">'ZC_MiniMM_Storage'</SPAN><SPAN class="">,</SPAN>
</SPAN><SPAN> entity<SPAN class="">.</SPAN>element<SPAN class="">:</SPAN> <SPAN class="">'StorageID'</SPAN> <SPAN class="">}</SPAN>]</SPAN><SPAN>TargetStorage;</SPAN></CODE></PRE></DIV></DIV><P class="">The annotation always points to the <STRONG>projection</STRONG> view (<CODE>ZC_</CODE>), not the interface view. This is because the value help dropdown in Fiori is itself an OData call, and OData services are generated from projection views. Pointing at <CODE>ZI_</CODE> would fail at activation or produce no results.</P><P class="">Both <CODE>SourceStorage</CODE> and <CODE>TargetStorage</CODE> reference the same <CODE>ZC_MiniMM_Storage</CODE> projection — same entity, same element, different field. The framework handles this correctly.</P><HR /><H3 id="toc-hId-375072439">Running This on BTP Trial</H3><P class="">Everything described in this post runs on a free SAP BTP Trial account with the ABAP environment service instance. No S/4HANA system required. No license. The ABAP Development Tools (ADT) in Eclipse is the only tool you need locally.</P><P class="">If you've been waiting for the right time to start learning ABAP Cloud and RAP, a BTP trial account is genuinely the right place to start. The constraints of the cloud environment (no classic ABAP, no access to SAP standard tables directly) force you to learn the correct patterns from the beginning.<BR /><BR /><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="Architecture" style="width: 267px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/422691i989C56D06EEEFB8D/image-size/medium?v=v2&px=400" role="button" title="architecture.png" alt="Architecture" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Architecture</span></span><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="Material View Interface" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/422688i312BF10C0BE2A355/image-size/medium?v=v2&px=400" role="button" title="Material Interface.png" alt="Material View Interface" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Material View Interface</span></span><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="Material Create Interface" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/422689i9DADB511AF72396D/image-size/medium?v=v2&px=400" role="button" title="Material Interface2.png" alt="Material Create Interface" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Material Create Interface</span></span><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="Stock Movement Interface" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/422690iE5A475405C6322F0/image-size/medium?v=v2&px=400" role="button" title="movement1.png" alt="Stock Movement Interface" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Stock Movement Interface</span></span></P>2026-06-17T11:55:35.487000+02:00https://community.sap.com/t5/supply-chain-management-blog-posts-by-members/the-missing-layer-in-every-sap-go-live-why-hypercare-should-be-built-before/ba-p/14423680The Missing Layer in Every SAP Go-Live: Why Hypercare Should Be Built Before Go-Live, Not After!2026-06-20T14:52:43.762000+02:00yogesh_agarwal2https://community.sap.com/t5/user/viewprofilepage/user-id/212071<P class="">The fifth time I watched a warehouse operative stand frozen in front of a red error screen at 6 AM on go-live day — waiting for a support consultant who wasn't there — I stopped thinking about the symptom and started thinking about the cause.</P><P class="">I have lived this exact scene across five SAP EWM implementations — frozen food, automotive, pharmaceutical, building products, tires. Different industries, different warehouses, different error messages. The same scene every time. A worker who was trained three weeks ago, on a process that has slightly changed since, hits an error the training never covered. The shift supervisor doesn't know the answer. The consultant who configured that exact process rotated off the project last week, or is asleep in a different time zone, or is on another call. The truck is waiting at the dock. And the person who is supposed to keep goods moving is standing still, holding an RF gun, looking at a screen they don't understand.</P><P class="">This is hypercare. And after living it five times, I've concluded we've been solving it the wrong way.</P><H2 id="toc-hId-1818185180">Why Hypercare Keeps Failing — Structurally</H2><P class="">The standard answer to a rough go-live is "throw more consultants at it." More floor support. Longer hypercare window. Round-the-clock coverage. I no longer believe that's the answer, because the failures aren't random — they're structural. Six causes show up on every project:</P><P class=""><STRONG>Consultant rotation.</STRONG> The person who configured your wave logic, your POSC/LOSC routing, your putaway strategy, your PPF output — they are not on the floor at 6 AM on day one. The knowledge that would resolve the error in thirty seconds has already walked out the door.</P><P class=""><STRONG>The 24/7 coverage gap.</STRONG> Warehouses run three shifts. Hypercare staffing rarely does. The night shift hits the same errors as the day shift, with even less support.</P><P class=""><STRONG>Accent and language barriers.</STRONG> A global implementation means the support consultant and the floor worker often don't share a first language. Under time pressure, on a noisy dock, that gap becomes a wall.</P><P class=""><STRONG>Knowledge walkout.</STRONG> When hypercare ends, the consultants leave — and every hard-won resolution they discovered leaves with them. The next project rediscovers the same errors from scratch.</P><P class=""><STRONG>The same errors, every project.</STRONG> Across five implementations I have watched teams independently rediscover the identical handful of go-live errors — a missing PPF condition, a queue stuck in /SCWM/MON, an exception code nobody assigned. We never built an institutional memory.</P><P class=""><STRONG>The screenshot barrier.</STRONG> When a worker can't describe an error in words, they photograph it. That photo gets forwarded to a consultant, who interprets it, who replies. The whole support loop already runs on screenshots — we just haven't built anything to receive them.</P><H2 id="toc-hId-1621671675">More Consultants Is Not the Answer</H2><P class="">Look at those six causes together and a pattern emerges: this is not a headcount problem. It is a <STRONG>knowledge continuity and availability problem.</STRONG></P><P class="">Adding more junior, rotating consultants doesn't fix continuity — it amplifies the churn. What's actually missing is something that holds the project-specific knowledge, is available on every shift, speaks the worker's language, accepts a screenshot, and never rotates off.</P><P class="">That isn't a person. It's a system — and it should be the floor's <STRONG>first-level support</STRONG>. Not a replacement for the consultant, but the layer that sits in front of them: it answers the 70-80% of go-live questions that are known, repetitive, and project-specific, and escalates only the genuinely new problems to a human. The consultant's scarce time stops being spent re-answering the same wave error twenty times a shift, and starts being spent on the issues that actually need an architect.</P><P class="">Here's the part that I think is genuinely new.</P><H2 id="toc-hId-1425158170">An Embedded AI Agent — Built in Parallel With Testing</H2><P class="">The concept is an AI hypercare agent embedded in the implementation. Plenty of people have proposed an "AI chatbot for SAP support," so let me be precise about the design principles that make this different — because the difference is the whole point.</P><P class=""><STRONG>1. Built in parallel with testing — not after UAT.</STRONG> This is the headline. Every AI support tool I have seen is deployed <EM>after</EM> go-live, then slowly trained on real incidents while real people suffer. This agent is trained <EM>during</EM> the testing phase — every SIT defect, every UAT resolution, every project-specific configuration quirk feeds it as the project happens. It arrives at go-live already 90% ready, not as a blank slate that learns while the warehouse bleeds.</P><P class=""><STRONG>2. Solution-Architect-curated, weekly.</STRONG> A human quality gate sits in the knowledge pipeline. Each week during testing, the SA reviews what the agent has ingested and validates it. This is what stops the noise problem that makes generic chatbots useless — the agent learns <EM>verified</EM> resolutions, not every wrong guess from a test cycle.</P><P class=""><STRONG>3. Multimodal — screenshot first.</STRONG> The primary interface is the photograph of the error screen, because that is already how the floor communicates. The worker shows the agent what they see, exactly as they would show a consultant.</P><P class=""><STRONG>4. A non-negotiable contracted deliverable.</STRONG> This is a commercial reframing, not just a technical one — and I'll come back to it, because it's the part that makes the whole thing actually happen.</P><P class=""><STRONG>5. Self-learning with a validation gate.</STRONG> Resolved tickets feed back into the knowledge base — but only after a Solution Architect signs off, never automatically. This principle matters enough that I give it its own section below, because it is what separates this from a chatbot that confidently repeats wrong answers.</P><P class=""><STRONG>6. Built for the human factors.</STRONG> Accent-independent, anxiety-aware, available to a worker who was rotated onto this line yesterday. These aren't technical features. They're the reason the gap exists, and only someone who has watched it five times would design for them.</P><P class=""><STRONG>7. A controlled, always-current knowledge surface.</STRONG> Beyond resolving errors, the bot is trained on the project's own documentation library — OPLs, work instructions, process guides — and returns only the latest approved version of any document. It becomes the single place the floor can ask, in plain English, "what do I do when X happens?" and trust the answer is current.</P><H2 id="toc-hId-1228644665">The Bot Is a System Object — So It Gets Signed Off Like One</H2><P class="">Here's a principle I'd argue is non-negotiable: <STRONG>on go-live day, this bot cannot be a surprise.</STRONG></P><P class="">In a new SAP S/4HANA embedded EWM deployment, no warehouse process reaches production without passing through the full validation chain — unit test, SIT, UAT, regression, cutover sign-off — approved by the relevant process owners. A wave release strategy is signed off by the outbound lead. A production staging flow is signed off by the manufacturing and warehouse leads. An inbound GR process is signed off by the receiving lead.</P><P class="">The hypercare bot must be treated as exactly that kind of object. It moves through the <STRONG>same gates as every warehouse process</STRONG>:</P><UL class=""><LI><STRONG>SIT</STRONG> — the bot's resolutions are validated against the same test scripts the processes are validated against. If a resolution it gives would fail the SIT script, it doesn't ship.</LI><LI><STRONG>UAT</STRONG> — the actual business users — the shipping clerk, the production supervisor, the receiving specialist — interact with the bot during UAT, not for the first time on go-live morning. They sign off that its answers match how <EM>they</EM> will actually work.</LI><LI><STRONG>Regression and cutover</STRONG> — the bot's knowledge base is version-controlled and frozen at cutover alongside the configuration, with the same change-control discipline.</LI></UL><P class="">And critically: the bot is <STRONG>trained and socialized by the Organizational Change Management (OCM) team</STRONG>, not dropped in by IT. The same OCM workstream that runs the training, builds the work instructions, and manages the floor's readiness is the workstream that introduces the bot. So when the shipping clerk, the production supervisor, or the inbound receiving specialist opens it at 5 AM on day one, it is a <STRONG>familiar tool they were trained on and helped shape during UAT</STRONG> — not a random, fancy, surprise bot that nobody trusts. Trust is the entire game in hypercare. A tool the floor met for the first time on go-live day has zero trust. A tool they helped validate for six weeks has earned it.</P><H2 id="toc-hId-1032131160">What It Actually Looks Like — Four Real Scenarios</H2><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="hypercare_ai_bot_hero_concept.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/424248i810F87EB34BD16BF/image-size/large?v=v2&px=999" role="button" title="hypercare_ai_bot_hero_concept.png" alt="hypercare_ai_bot_hero_concept.png" /></span></P><P class="">Let me make it concrete across the warehouse flows, in an embedded S/4HANA 2025 EWM deployment. These are representative of the exact class of issues that consume hypercare on every project — and each one shows a different capability the bot needs.</P><P class=""><STRONG>Outbound — the shipping coordinator and the "stock is there, but it isn't" problem.</STRONG> The coordinator runs the wave simulator in the shipping cockpit and it fails — the wave won't simulate. They check the warehouse monitor and the stock shows as F2, unrestricted-use in the warehouse, so by every signal on their screen the stock is available. The real cause is upstream: the batch is restricted because the QM team never released it, and the standard simulator doesn't surface that as the reason it failed. This is a genuine product gap — the simulator tells you it failed, not that a QM batch status is the cause. The bot closes that gap. The coordinator describes the failure in plain English; the bot, trained on this project's QM-EWM batch-release interplay, immediately points to the batch's QM status as the thing to check rather than the warehouse stock type — turning a forty-minute "but the stock is right there" investigation into a thirty-second answer. The same finding is also logged as a candidate enhancement to the simulator itself.</P><P class=""><STRONG>Outbound — the one-off scenario and the right version of the right document.</STRONG> A truck comes back to the yard because it was overloaded — a rare exception the coordinator handles maybe twice a year and has no memorized procedure for. There <EM>is</EM> an OPL for it, sitting in a shared drive among hundreds of other documents, and quite possibly in three slightly different versions. The bot was trained to reference that document library and tested to return only the <EM>latest approved version</EM> of any requested procedure. The coordinator simply asks, in plain English, what to do when a loaded truck returns — and gets the current OPL, not a superseded one, without hunting through folders or pinging a consultant to find out which version is live. This is the bot as a controlled, always-current knowledge surface over documentation that already exists but nobody can find under pressure.</P><P class=""><STRONG>Inbound — the receiving specialist who packed it wrong and needs to start over.</STRONG> The specialist realizes they packed an inbound delivery incorrectly on the first pass and needs to repack. The bot walks them through the recovery step by step: delete the existing handling units, use the <EM>Change Inbound Deliveries</EM> Fiori app to repack cleanly, then collect the new HU labels that print automatically from the assigned printer. This is the bot as a patient, step-by-step floor guide for a correction the specialist was never specifically trained on. And here is the important part — the bot knows the boundary of its own competence. If the new label does <EM>not</EM> come out of the Zebra printer automatically, and the bot was not designed or tested to troubleshoot printer output, it does not guess. It raises a ticket at the appropriate priority, assigns it to the right team, and tells the specialist it has done so. The specialist isn't left re-framing the same question to a hypercare consultant three times — the escalation happens cleanly and the resolution pace improves.</P><P class=""><STRONG>Production — the supervisor whose stock won't appear in MES.</STRONG> The production supervisor cannot see stock in their MES that should have synced from the EWM monitor. This is one of the most common and most painful go-live issues in a manufacturing landscape — an integration failure across the ERP–MES–EWM chain, where a posting in one system doesn't propagate to the next. The bot is trained to do exactly what a consultant would do to triage it: it takes a screenshot and/or the relevant data, optionally a line or two of context, and works through the integration checkpoints — did the material document post, did the EWM stock update, did the message reach MES — to isolate where the chain broke. If it can resolve it, it does. If it can't fully resolve it, the request routes to a real person already engaged on the project, with the triage already done.</P><H2 id="toc-hId-835617655">The Bot Learns Only When a Trusted Human Signs Off</H2><P class="">Those last two scenarios carry the most important design principle in the whole concept, so I want to state it plainly.</P><P class="">When a consultant resolves an escalated ticket, they <STRONG>cannot simply comment "issue fixed" and close it.</STRONG> That is how knowledge gets lost today. For the bot, a resolution only enters its knowledge base when a Solution Architect — or a peer of equivalent standing and trajectory — signs off that the resolution is correct, complete, and safe for the bot to repeat. Then the bot is retested against it, exactly as a configuration change would be retested.</P><P class="">This is the validation gate that separates this concept from a chatbot that confidently amplifies wrong answers. The bot relearns continuously — but only verified, signed-off knowledge, never an unreviewed "fixed" comment. A wrong resolution learned at machine speed and repeated to every shift is far more dangerous than no resolution at all. The human sign-off is not bureaucracy. It is the safety mechanism that makes self-learning trustworthy.</P><P class="">In all four scenarios: the error never had to be described in a second language, the consultant who built the config didn't have to be awake, the boundary of the bot's competence was respected, and every genuinely new resolution was captured — under human sign-off — for the next worker who hits it.</P><H2 id="toc-hId-639104150">On the Architecture — Briefly</H2><P class="">I'm keeping the stack high-level on purpose, because the originality here is <EM>when</EM> you build the agent and <EM>who</EM> curates it, not the technology. At a glance: a vision-capable LLM layer for the screenshot interpretation; a vector knowledge store trained on the project's own SIT/UAT defects, resolutions, and configuration documentation; integration into the implementation's ticketing system (the standard enterprise ITSM tool) so resolved incidents feed back through the SA validation gate; and a floor-friendly channel the workers already use. In an embedded EWM landscape it reads the same error and application-log surfaces the consultants already read — the difference is that it reads them at 5 AM, in every language, for every shift, and never forgets a resolution. The architecture is the easy part. The discipline of building and validating it alongside the warehouse processes is the hard part — and the valuable one.</P><H2 id="toc-hId-442590645">Make It Non-Negotiable</H2><P class="">Here's why this stays a concept unless the commercial model changes: as long as an AI hypercare agent is an optional add-on, it gets value-engineered out of the SOW on every budget-constrained project — which is all of them.</P><P class="">So don't make it optional. Price it into the implementation as a <STRONG>contracted hypercare deliverable</STRONG>, the same way you'd price the cutover plan or the training material. The economics are not subtle: the build cost of the agent is less than two weeks of a single floor consultant's hypercare time. One avoided week of go-live chaos pays for it. The argument to the client isn't "buy our AI" — it's "your hypercare will cost less and work better, and here's the line item."</P><P class="">That single reframing — from add-on to contracted deliverable — is what turns this from a nice idea into something that ships.</P><H2 id="toc-hId-246077140">The Tool Does Not Yet Exist. That Is the Point.</H2><P class="">I want to be clear and honest: I have not built this. What I have is five go-lives of watching the same preventable failure, a design that addresses each of its structural causes, and the conviction that the field is about to need it.</P><P class="">Every meaningful innovation in SAP consulting started as a named concept before it became a product. So I'm naming this one. An AI hypercare agent — built in parallel with testing, SA-curated, signed off through SIT and UAT like any warehouse process, socialized by OCM so the floor already trusts it, screenshot-first, and contracted as a deliverable — is, as far as I can find across SAP Community, SAP's roadmap, and the major SI tooling, not something anyone has yet put together this way.</P><P class="">I'd genuinely like to be challenged on that. If you've seen this built, tell me where — I want to learn from it. If you've lived the 6 AM frozen-screen scene too, tell me what <EM>you</EM> would add to the design. And if you're a Solution Architect or a delivery lead reading this before your next go-live: ask whether your hypercare plan is a stack of rotating consultants and hope, or something that actually holds the knowledge and stands in front of your floor as first-level support from hour one.</P><P class="">The scene I described plays out on warehouse floors every single week. We have the tools to end it. We've just been building them at the wrong time.</P><HR /><P class=""><EM>Yogesh Agarwal is an Enterprise Logistics Execution Specialist with 15+ years across SAP EWM and TM implementations in food, automotive, pharmaceutical, building products, and industrial sectors. He writes about SAP supply chain execution on SAP Community and LinkedIn.</EM></P>2026-06-20T14:52:43.762000+02:00https://community.sap.com/t5/technology-blog-posts-by-sap/sap-btp-abap-environment-build-partner-products-and-bring-them-to-sap-store/ba-p/14430510SAP BTP ABAP Environment - Build Partner Products and Bring Them to SAP Store2026-06-30T14:19:53.788000+02:00Burcu_Karlidaghttps://community.sap.com/t5/user/viewprofilepage/user-id/151005<DIV class=""><DIV><DIV class=""><DIV class=""><DIV class=""><DIV class=""><DIV class=""><P class="">Do you want to offer your ABAP Cloud solution to your customers as a cloud product?</P><P class="">SAP BTP ABAP Environment enables partners to build cloud products and side-by-side extensions with ABAP Cloud on SAP BTP and bring them to market via SAP Store. These products run on SAP BTP and can integrate with SAP S/4HANA, other SAP solutions and non-SAP solutions.</P><P class="">To support this journey, SAP BTP ABAP Environment Product Management offers a <STRONG>free-of-charge engagement for partners who want to build and commercialize products on SAP BTP ABAP Environment</STRONG>.</P><P class=""><STRONG>Who is this for?</STRONG></P><P class="">This engagement is intended for SAP partners who:</P><UL class=""><LI>want to offer a product to multiple customers</LI><LI>are planning a side-by-side solution on SAP BTP instead of an on-stack SAP S/4HANA extension</LI><LI>are considering SAP BTP ABAP Environment as their product platform</LI><LI>want to publish their solution via SAP Store</LI></UL><P class="">To commercialize and publish a partner product via SAP Store, an SAP PartnerEdge Build agreement is required. If you are not yet part of SAP PartnerEdge Build, we can discuss the required next steps in the initial conversation.</P><P class=""><STRONG>Supported delivery options</STRONG></P><P class="">We currently support two delivery options for partner products on SAP BTP ABAP Environment:</P><P class=""><STRONG>Multitenant SaaS</STRONG>: The partner offers and operates the solution as a cloud service. Customers subscribe to the service and receive their own tenant in the partner's provider system.</P><P class=""><STRONG>Add-On Product</STRONG>: The partner offers the solution as software. Customers run their own SAP BTP ABAP Environment instance and consume the partner product in their own landscape, with the option to extend it according to their needs.</P><P class="">Both options enable partners to productize cloud solutions depending on their target customers, operating model and business model. Partners can also offer both delivery options in parallel, as most of the underlying steps are identical.</P><P class=""><STRONG>How we support you</STRONG></P><P class="">As part of the engagement, SAP BTP ABAP Environment Product Management can support you with:</P><UL class=""><LI>choosing the right delivery option</LI><LI>validating your product scenario and architecture</LI><LI>answering technical questions during implementation</LI><LI>sharing reference materials and tutorials</LI><LI>preparing your solution for SAP Store publication</LI><LI>moving towards go-live</LI></UL><P class="">The goal is to help partners bring their products live on SAP BTP ABAP Environment faster.</P><P class=""><STRONG>Interested?</STRONG></P><P class="">If your company is planning to build a partner product on SAP BTP ABAP Environment, we would be happy to hear from you.</P><P class="">Please contact us: <A href="mailto:sap_btp_abap_environment@sap.com" target="_blank" rel="noopener nofollow noreferrer">sap_btp_abap_environment@sap.com</A></P><P class="">To help us prepare the first discussion, please include a short description of your product idea or existing solution, your target customer segment, current development stage, and preferred delivery option if already known.</P><P class="">We will then set up a remote session to better understand your scenario and discuss how we can support your journey.</P><P class=""> </P><H2 id="toc-hId-1819018150">Helpful resources</H2><P>To get started, you may find the following resources useful: </P><UL><LI><A href="https://community.sap.com/t5/devtoberfest/building-partner-products-on-sap-btp-abap-environment/ev-p/13804921" target="_self">Building partner products on SAP BTP ABAP Environment</A></LI><LI><A class="" href="https://community.sap.com/t5/technology-blog-posts-by-sap/sap-btp-abap-environment-new-software-delivery-option-add-on-product/ba-p/14094161" target="_self">Overview of delivery options: Multitenant SaaS and Add-On Product</A></LI><LI><A title="Tutorial: MT SaaS Partner Reference Application" href="https://github.com/SAP-samples/abap-partner-reference-application" target="_self" rel="nofollow noopener noreferrer">Tutorial: MT SaaS Partner Reference Application</A></LI><LI><A href="https://partneredge.sap.com/en/partnership/manage/onboard-get-started/build.html" target="_self" rel="noopener noreferrer">PE Build onboarding</A></LI></UL><P> </P></DIV></DIV></DIV></DIV></DIV></DIV></DIV>2026-06-30T14:19:53.788000+02:00https://community.sap.com/t5/technology-blog-posts-by-members/bypassing-the-list-report-in-sap-fiori-apps-bcmo-static-keys-and-dynamic/ba-p/14432559Bypassing the List Report in SAP Fiori Apps: BCMO, Static Keys, and Dynamic Keys2026-07-03T09:09:19.145000+02:00SachinArtanihttps://community.sap.com/t5/user/viewprofilepage/user-id/168423<P>If you've ever generated a Business Configuration Maintenance Object (BCMO) app or built a standard List Report Fiori app for a table with just one relevant record, you've probably run into the same annoyance: the app insists on showing you a list page first, even when there's really only one record, or one record per user, that anyone should ever land on.</P><P>In this post, I'll walk through the complete flow: generating a BCMO app for a custom table, getting rid of the pointless singleton list report, and then bypassing the list page in a regular List Report app using both a static key and a dynamic key, such as the logged-in username.</P><HR /><H2 id="toc-hId-1819077865">What is a BCMO App, and How Does It Relate to Table Maintenance Generator (TMG)?</H2><P>Before we jump into the how, a quick primer for anyone new to this.</P><P>A Table Maintenance Generator (TMG) is the classic SAP GUI way of generating a maintenance screen for a customizing table, using transaction SE11/SE54. You get a generated SM30 style screen where users can create, edit, and delete entries in a table.</P><P>BCMO, Business Configuration Maintenance Object, is essentially the RAP and Fiori based evolution of the same idea. Instead of generating an SM30 style dynpro, ADT generates a full RAP based application stack, behavior definition, behavior implementation, service definition, and service binding, for your custom table, and exposes it as a modern Fiori app. You get the same core purpose as TMG, maintaining configuration or master data in a table, but with a UI5 based List Report and Object Page instead of a classic table control screen.</P><P>So think of BCMO as: you want the SM30/TMG experience, but as a proper Fiori Elements app, generated automatically from your table.</P><P>You can access a BCMO app in two ways:</P><UL><LI>Through the Custom Business Configurations (CBC) app, where all the configuration and settings are automatically applied.</LI><LI>As a standalone app, published separately to your Fiori Launchpad or SAP Build Work Zone. In this case, the actual table maintenance appears on the object page, but you also get a singleton list report page in front of it, which is usually unnecessary.</LI></UL><P>That useless singleton list report is exactly what we're going to eliminate below.</P><HR /><H2 id="toc-hId-1622564360">Part 1: Creating a BCMO App</H2><H3 id="toc-hId-1555133574">Prerequisites on the Database Table</H3><P>Before ADT will let you generate a BCMO app, your custom table needs to satisfy a few conditions. If you skip these, generation will fail, and you'll typically see errors pointing you toward three things:</P><UL><LI>The table's delivery class needs to be set to C, since BCMO is meant for customizing tables, not regular application data.</LI><LI>Data maintenance needs to be explicitly allowed on the table, via the AbapCatalog.dataMaintenance annotation.</LI><LI>Character-like key fields need to be based on a domain, rather than a plain built-in type, so the generator can derive proper value help and type information.</LI></UL><P>Once these three conditions are met, ADT will happily generate the BCMO stack for you. Here's an example table definition that satisfies all of them:</P><PRE><CODE>@EndUserText.label : 'Product Industry Mapping'
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #C
@AbapCatalog.dataMaintenance : #ALLOWED
define table zsac_t_prod_ind {
key client : abap.clnt not null;
key industry_sector : mbrsh not null;
unit_of_measure : meins;
currency_code : abap.cuky;
}</CODE></PRE><H3 id="toc-hId-1358620069">Generating the BCMO Objects</H3><P>Right-click on the table in ADT, click Generate ABAP Repository Objects, select Business Configuration Maintenance Object, and click Next.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="1.png" style="width: 700px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/428694iACC7E3B5CC189D70/image-size/large?v=v2&px=999" role="button" title="1.png" alt="1.png" /></span></P><P>Enter the package.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="2.png" style="width: 832px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/428695i4416A5937F671E9E/image-size/large?v=v2&px=999" role="button" title="2.png" alt="2.png" /></span></P><P>In the Configure Generator step, you decide the naming of the generated objects and which features to enable. For this example, we'll set Transport Selection to No Transport and uncheck "Enable Transport Selection Strip" to keep things simple. Depending on your landscape, you may want this enabled instead.</P><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/428696iF9850A54BE31DE02/image-size/large?v=v2&px=999" role="button" title="3.png" alt="3.png" /></span></P><P>Here's the full list of objects that get generated for us:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="4.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/428697i478250E461C87C27/image-size/large?v=v2&px=999" role="button" title="4.png" alt="4.png" /></span></P><P>After selecting your transport request, or choosing No Transport, click Finish, and sip a cup of tea while ADT does its thing.</P><P>Once generation completes, this is what you get in ADT:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="5.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/428698iF0953DAFEA2E3601/image-size/large?v=v2&px=999" role="button" title="5.png" alt="5.png" /></span></P><H3 id="toc-hId-1162106564">Accessing the BCMO App</H3><P>You can access your BCMO app in two ways:</P><OL><LI>Through the Custom Business Configurations (CBC) app, where all the standard settings are already applied for you.</LI><LI>As a standalone app, published separately to your SAP Fiori Launchpad or SAP Build Work Zone.</LI></OL><P>If you go the standalone route, the actual table maintenance will appear correctly on the object page, but you'll also get an unnecessary singleton list report page in front of it, which is exactly the problem we're solving in the next section.</P><P>Now open the service binding, publish it, and test it.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="6.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/428699iEB670150E9C044EE/image-size/large?v=v2&px=999" role="button" title="6.png" alt="6.png" /></span></P><H3 id="toc-hId-965593059">A Note on Authorizations</H3><P>You may notice that an access control object gets automatically generated as part of BCMO. If the authorization object S_TABU_NAM is not assigned to your user role, you may see no data in the output, or the Edit button may be disabled.</P><P>In that case, you have two options:</P><UL><LI>Delete the access control on your root entity, or</LI><LI>Assign the required authorizations to your user ID.</LI></UL><P>While testing this, I also had to comment out the global authorization check in the generated behavior implementation just to see data, due to missing authorizations in my BTP trial account. Obviously, don't do this in a real system, it's purely a local testing workaround.</P><HR /><H2 id="toc-hId-639996835">Part 2: Getting Rid of the Singleton List Report for a BCMO App</H2><P>Now that our BCMO app is ready, let's get rid of the singleton list report. It doesn't add any value, there's only ever one relevant "list," so why make the user click through it every time?</P><H3 id="toc-hId-572566049">Step 1: Create a New Project in BAS</H3><P>Go to SAP Business Application Studio and create a new project from the available templates.</P><P>Select SAP Fiori Generator.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="7.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/428701iED4BA2F5765ED0C9/image-size/large?v=v2&px=999" role="button" title="7.png" alt="7.png" /></span></P><P>Select List Report Page and click Next.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="8.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/428702iE5902211E072B416/image-size/large?v=v2&px=999" role="button" title="8.png" alt="8.png" /></span></P><P>Select the Data Source and Service.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="9.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/428703iBB6F398408BD1751/image-size/large?v=v2&px=999" role="button" title="9.png" alt="9.png" /></span></P><P>Note: If your system isn't logged in yet, log in first. If you're on an SAP BTP trial account, you'll need to connect BAS to Cloud Foundry before you can see the available Service Bindings.</P><P>To do that, open the top search bar and type:<BR /><BR /></P><PRE><CODE>>CF: Login to Cloud Foundry</CODE></PRE><P>Log in with your credentials or SSO, then reopen the Data Source and Service Selection step.</P><P>Once logged in, you should now be able to see the service. Look for your Service Binding for the BCMO app and select it.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="10.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/428704i52E6FACCEE61A22D/image-size/large?v=v2&px=999" role="button" title="10.png" alt="10.png" /></span></P><P>Select the entity.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="11.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/428705iB1972C4CDFA694B1/image-size/large?v=v2&px=999" role="button" title="11.png" alt="11.png" /></span></P><P>If you're planning to deploy the app immediately, make sure to check "Add Deployment Configuration" and "Add SAP Fiori Launchpad Configuration." For this demo, I'm keeping both unchecked since we're only focused on getting rid of the list report page, not deployment.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="12.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/428706iB0792DD831DCCF8E/image-size/large?v=v2&px=999" role="button" title="12.png" alt="12.png" /></span></P><P>Click Finish, and go have another cup of tea while the project scaffolds.</P><H3 id="toc-hId-376052544">Step 2: Remove the List Report Route from the Manifest</H3><P>With the project created in BAS, let's get to the main task.</P><P>Open manifest.json under the webapp folder and remove the list report route and its corresponding target.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="13.png" style="width: 817px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/428707iCA741D36DA52D998/image-size/large?v=v2&px=999" role="button" title="13.png" alt="13.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="14.png" style="width: 827px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/428708iC1C2D12C5CA77B6C/image-size/large?v=v2&px=999" role="button" title="14.png" alt="14.png" /></span></P><P>We do this because the default routing configuration always points the app to the list report as the landing page first. By removing this route and target pair, we prevent the router from ever resolving to the list report on initial load, which sets us up to redirect straight to the object page instead.</P><H3 id="toc-hId-179539039">Step 3: Auto-Navigate to the Object Page in Component.js</H3><P>Now go to Component.js under the webapp folder and add the following code so the app routes directly to the object page of our singleton record whenever it loads:<BR /><BR /></P><PRE><CODE>init: function () {
Component.prototype.init.apply(this, arguments);
this.getRouter().navTo("ProductIndSingletonObjectPage", { key: "(1)" }, true);
}</CODE></PRE><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="15.png" style="width: 980px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/428709i93B07EE3597010E0/image-size/large?v=v2&px=999" role="button" title="15.png" alt="15.png" /></span></P><H3 id="toc-hId--92205835">Step 4: Test It</H3><P>Run the following command in the terminal to preview the app:</P><PRE><CODE>npm run start</CODE></PRE><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="16.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/428710i9D745DC7BA7F99C1/image-size/large?v=v2&px=999" role="button" title="16.png" alt="16.png" /></span></P><P>And voilà, the first page that opens is no longer the singleton list report, but the actual object page we wanted users to land on directly.</P><P>From here, you can continue with deployment as per your requirement, including Fiori Launchpad configuration and transport.</P><HR /><H2 id="toc-hId-4683667">Part 3: Bypassing the List Report for a Standard List Report App</H2><P>The technique above works great for a true singleton, a table with essentially one record. But what if you're working with a regular List Report app on a table with multiple records, and you want to skip the list page in favor of a specific object page, based on a static key or a dynamic key like the logged-in user? Let's look at both.</P><H3 id="toc-hId--485232845">Deploying the Base List Report App</H3><P>As before, start by creating a new project in SAP BAS or VS Code, selecting SAP Fiori Application, then List Report as the template.</P><P>In the template wizard, select your Data Source, System, and Service, then click Next. Select the correct main entity and navigation entity, and choose Yes to automatically add table columns and a section to the object page.</P><P>Enter your project attribute details, choose Yes for deployment configuration, click Finish, and wait for the dependencies to install. Don't refresh the page while you see "Installing Dependencies" at the bottom right of VS Code.</P><P>Once deployed, remove the singleton list report the same way described above: strip the route and target from the manifest, and add the navTo call in Component.js.</P><P>The difference this time is what key you pass into that navTo call.</P><H3 id="toc-hId--681746350">Option A: Bypassing with a Static Key</H3><P>If you always want the app to open a specific, known record, hardcode the key directly:</P><PRE><CODE>init: function () {
Component.prototype.init.apply(this, arguments);
this.getRouter().navTo("TableGroupAllObjectPage", { key: "(1)" }, true);
}</CODE></PRE><P>This is the simplest approach and works well when there's genuinely one record everyone should see, similar to the BCMO singleton pattern above, but applied manually to a regular List Report app.</P><H3 id="toc-hId--878259855">Option B: Bypassing with a Dynamic Key (Logged-in Username)</H3><P>Often, though, you don't want everyone landing on the same record. You want each user routed to their own record, based on who's logged in. For this, we fetch the current username first, then use it to construct the key dynamically before navigating.</P><PRE><CODE>init: function () {
Component.prototype.init.apply(this, arguments);
var sUser = sap.ushell.Container
? sap.ushell.Container.getUser().getId()
: "DEFAULT_USER";
this.getRouter().navTo("TableGroupAllObjectPage", { key: "('" + sUser + "')" }, true);
}</CODE></PRE><P>A few things to keep in mind with the dynamic key approach:</P><UL><LI>Make sure the key field in your entity actually corresponds to something like a username, or a field you can reliably derive from the logged-in user, for example, mapped via a custom table or CDS view.</LI><LI>If no record exists for that user yet, decide upfront how your app should behave: show an empty object page in create mode, show a "no data" message, or fall back to a default record.</LI><LI>Test this thoroughly with multiple user IDs before deploying, since the whole point is that different users see different landing records.</LI></UL><H3 id="toc-hId--1074773360">For Multi-Level Apps</H3><P>If your app has more than two navigation levels, for example, a list report page, then an object page showing a related sub-entity's list, then a further object page for that sub-entity's own details, you'll need to add another navigation node to the page map.</P><P>To do this, right-click on the app's folder in BAS and select Show Page Map. You'll see the existing levels, with a plus icon enabled on the deepest Object Page. Click it, select the correct navigation property, and add the new page.</P><P>Once your routing is set up correctly, deploy using:</P><PRE><CODE>npm run deploy</CODE></PRE><HR /><H2 id="toc-hId--977883858">Wrapping Up</H2><P>Whether you're working with a BCMO app generated straight from ADT, or a hand-built List Report Fiori app, the pattern for bypassing the list page is fundamentally the same:</P><OL><LI>Remove the list report's route and target from the manifest.</LI><LI>Add a navTo call in Component.js's init function that routes straight to the object page.</LI><LI>Decide whether that route needs a static key, same record for everyone, or a dynamic key, per-user record, typically derived from the logged-in username.</LI><LI>If you have deeper navigation levels, extend the page map accordingly before deploying.</LI></OL><P>This small change removes a genuinely pointless click for your end users, and it's one of those RAP and Fiori details that separates a generated-and-shipped app from a genuinely polished one.</P><P>If deployment configuration for RAP apps to SAP BTP is something you'd like a refresher on before trying this end to end, it's worth <A href="https://sachinartani.com/blog/how-to-deploy-sap-rap-app-to-sap-btp" target="_blank" rel="noopener nofollow noreferrer">reading up</A> on that step separately once you're ready to move beyond local testing.</P>2026-07-03T09:09:19.145000+02:00https://community.sap.com/t5/technology-blog-posts-by-sap/chat-based-rap-business-object-generation-in-vs-code/ba-p/14432950Chat-based RAP Business Object Generation in VS Code2026-07-03T14:28:10.192000+02:00berin_https://community.sap.com/t5/user/viewprofilepage/user-id/2148756<P class="lia-align-justify" style="text-align : justify;">With ABAP Development Tools (ADT) for VS Code, you can now generate complete RAP Business Objects directly from chat prompts. Describe your business scenario in natural language, and GitHub Copilot generates the corresponding RAP artifacts in your ABAP system.</P><P class="lia-align-justify" style="text-align : justify;">The generated artifacts include:</P><UL class="lia-align-justify" style="text-align : justify;"><LI>Database tables</LI><LI>CDS views</LI><LI>Behavior definitions</LI><LI>Service definitions</LI><LI>Service bindings</LI></UL><P class="lia-align-justify" style="text-align : justify;">This feature is enabled by the extension’s built-in MCP (Model Context Protocol) server, which exposes ABAP backend APIs as tools that AI agents can invoke directly. This lets them create and connect the necessary RAP artifacts on your behalf.</P><P class="lia-align-justify" style="text-align : justify;"> </P><H1 id="toc-hId-1689998981">Getting Started</H1><P class="lia-align-justify" style="text-align : justify;"><SPAN>For more information about setting up ADT for VS Code, configuring GitHub Copilot Agent Mode, using the ADT MCP server, and troubleshooting common issues, refer to the <A href="https://github.com/SAP-samples/abap-platform-rap130/blob/main/README.md" target="_blank" rel="noopener nofollow noreferrer">guide</A>.</SPAN></P><H2 id="toc-hId-1622568195">Prerequisites:</H2><P class="lia-align-justify" style="text-align : justify;"><SPAN>Before you begin, ensure that you have the following:</SPAN></P><UL class="lia-align-justify" style="text-align : justify;"><LI><STRONG><EM><SPAN>ABAP Development Tools for VS Code</SPAN></EM></STRONG> installed from the VS Code Marketplace</LI><LI>An ABAP system connection configured in the extension (steps shown below)</LI></UL><P class="lia-align-justify" style="text-align : justify;"><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Figure 1. Adding an ABAP system to the workspace" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/428814iA26D12D1C775F1E2/image-size/medium?v=v2&px=400" role="button" title="berin__0-1783076596034.png" alt="Figure 1. Adding an ABAP system to the workspace" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Figure 1. Adding an ABAP system to the workspace</span></span><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Figure 2. Selecting a destination" style="width: 399px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/428817i2D57F53B3DB2C8D7/image-size/medium?v=v2&px=400" role="button" title="berin__1-1783076608986.png" alt="Figure 2. Selecting a destination" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Figure 2. Selecting a destination</span></span><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Figure 3. Log on with your credentials" style="width: 398px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/428852i0916ED32C9877D69/image-size/medium?v=v2&px=400" role="button" title="berin__16-1783077408364.png" alt="Figure 3. Log on with your credentials" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Figure 3. Log on with your credentials</span></span></P><P class="lia-align-justify" style="text-align : justify;"> </P><UL class="lia-align-justify" style="text-align : justify;"><LI>GitHub Copilot with Agent Mode enabled</LI></UL><P class="lia-align-justify" style="text-align : justify;"><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Figure 4. GitHub Copilot in agent mode" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/428823i75C7A3D92B21B241/image-size/medium?v=v2&px=400" role="button" title="berin__3-1783076688817.png" alt="Figure 4. GitHub Copilot in agent mode" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Figure 4. GitHub Copilot in agent mode</span></span></P><P class="lia-align-justify" style="text-align : justify;"> </P><H2 id="toc-hId-1426054690">Enable the ADT MCP Server</H2><P class="lia-align-justify" style="text-align : justify;"><SPAN>First, verify that the ADT MCP server is enabled. To do so:</SPAN></P><OL class="lia-align-justify" style="text-align : justify;"><LI>Open the Settings and Search for <EM>ADT MCP Server </EM>in the search bar</LI><LI>Check the box <EM>Enable ADT MCP Server</EM></LI></OL><P class="lia-align-justify" style="text-align : justify;"><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Figure 5. Enabling ADT MCP Server in settings" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/428853iCE2B20E9556B7F70/image-size/medium?v=v2&px=400" role="button" title="berin__17-1783077561214.png" alt="Figure 5. Enabling ADT MCP Server in settings" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Figure 5. Enabling ADT MCP Server in settings</span></span></P><P class="lia-align-justify" style="text-align : justify;"> </P><H2 id="toc-hId-1229541185">Configuring ADT MCP Server</H2><P class="lia-align-justify" style="text-align : justify;"><SPAN>The ADT MCP server is not automatically configured for GitHub Copilot</SPAN>. To configure the ADT MCP Server, open the Command Palette and run <STRONG>MCP: List Servers</STRONG>, then start the <EM>ADT MCP server</EM>.</P><P class="lia-align-justify" style="text-align : justify;"><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Figure 6. Listing the available MCP servers" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/428854i5E07C43C59720096/image-size/medium?v=v2&px=400" role="button" title="berin__18-1783077623409.png" alt="Figure 6. Listing the available MCP servers" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Figure 6. Listing the available MCP servers</span></span></P><P class="lia-align-justify" style="text-align : justify;"><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Figure 7. Starting the ADT MCP Server (part 1)" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/428855i366AA1430A6BF97F/image-size/medium?v=v2&px=400" role="button" title="berin__19-1783077648174.png" alt="Figure 7. Starting the ADT MCP Server (part 1)" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Figure 7. Starting the ADT MCP Server (part 1)</span></span><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Figure 8. Starting the ADT MCP Server (part 2)" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/428858iF16051BC6453BC4D/image-size/medium?v=v2&px=400" role="button" title="berin__21-1783077674662.png" alt="Figure 8. Starting the ADT MCP Server (part 2)" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Figure 8. Starting the ADT MCP Server (part 2)</span></span></P><P class="lia-align-justify" style="text-align : justify;"> </P><P class="lia-align-justify" style="text-align : justify;">When the ADT MCP server is running and successfully connected, the following notification appears in the lower-right corner:</P><P class="lia-align-justify" style="text-align : justify;"><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Figure 9. Success message" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/428859i25290912DD11AD68/image-size/medium?v=v2&px=400" role="button" title="berin__22-1783077716163.png" alt="Figure 9. Success message" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Figure 9. Success message</span></span></P><P class="lia-align-justify" style="text-align : justify;"> </P><P class="lia-align-justify" style="text-align : justify;">Once connected, the available ABAP MCP tools appear in GitHub Copilot. You can verify this by opening Configure Tools in the GitHub Copilot chat, where you can view and select the tools that are active for your session.</P><P class="lia-align-justify" style="text-align : justify;"><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Figure 10. Verifying the connection to the ABAP MCP Server (part 1)" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/428860i06C3B90E749ADA1D/image-size/medium?v=v2&px=400" role="button" title="berin__23-1783077743606.png" alt="Figure 10. Verifying the connection to the ABAP MCP Server (part 1)" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Figure 10. Verifying the connection to the ABAP MCP Server (part 1)</span></span><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Figure 11. Verifying the connection to the ADT MCP Server (part 2)" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/428861iE6D1B620F54484ED/image-size/medium?v=v2&px=400" role="button" title="berin__24-1783077755057.png" alt="Figure 11. Verifying the connection to the ADT MCP Server (part 2)" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Figure 11. Verifying the connection to the ADT MCP Server (part 2)</span></span></P><P class="lia-align-justify" style="text-align : justify;"> </P><H4 id="toc-hId-1291193118"><SPAN>If MCP tools don't appear after setup please refer to </SPAN><SPAN><A href="https://github.com/SAP-samples/abap-platform-rap130/blob/main/exercises/ex01/README.md#troubleshooting" target="_blank" rel="noopener nofollow noreferrer">troubleshooting</A></SPAN></H4><P class="lia-align-justify" style="text-align : justify;"> </P><H2 id="toc-hId-836514175">Generating a RAP Business Object</H2><P class="lia-align-justify" style="text-align : justify;">Note: Before running the generation, ensure that your target package already exists. Currently, new packages must be created in ADT for Eclipse. Creating packages directly from ADT for VS Code will be supported in a future release.</P><P class="lia-align-justify" style="text-align : justify;">With the ADT MCP server running, open GitHub Copilot Chat in Agent Mode and describe the RAP Business Object you want to generate. For best results you can take a look at <SPAN><A href="https://help.sap.com/docs/abap-cloud/abap-development-tools-for-visual-studio-code/best-practices-for-agent-prompts" target="_blank" rel="noopener noreferrer">agent prompt best practices</A></SPAN>.</P><P class="lia-align-justify" style="text-align : justify;">An example prompt would be:</P><P class="lia-align-justify" style="text-align : justify;">“ Generate a RAP Business Object for conference and tech event management, including a database table, CDS views,</P><P class="lia-align-justify" style="text-align : justify;"> behavior definition, and an OData V4 UI service.</P><UL class="lia-align-justify" style="text-align : justify;"><LI>Use the Package TEST_BB_CONFERENCE_MGT</LI><LI>Use the following specification:<UL><LI>Entity 1: Event (root entity)</LI><LI>Entity 2: Session, child of Event</LI><LI>Entity 3: Speaker, child of Event</LI><LI>Entity 4: Registration, child of Session“</LI></UL></LI></UL><P class="lia-align-justify" style="text-align : justify;"><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Figure 12. Entering a prompt in the chat" style="width: 184px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/428862i5851A702DA19A540/image-size/medium?v=v2&px=400" role="button" title="berin__25-1783077880579.png" alt="Figure 12. Entering a prompt in the chat" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Figure 12. Entering a prompt in the chat</span></span><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Figure 13. GitHub Copilot response to the prompt" style="width: 185px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/428870iE26A060FD99ABA9B/image-size/medium?v=v2&px=400" role="button" title="berin__28-1783078038157.png" alt="Figure 13. GitHub Copilot response to the prompt" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Figure 13. GitHub Copilot response to the prompt</span></span></P><P class="lia-align-justify" style="text-align : justify;">After your prompt, Copilot will:</P><UL class="lia-align-justify" style="text-align : justify;"><LI>List available destinations (abap_list_destinations)</LI><LI>Retrieve the schema (abap_generators-get_schema)</LI><LI>Validate (abap_creation-run_validation)</LI><LI>Create a transport request (abap_transport-create)</LI><LI>Generate all objects (abap_generators-generate_objects)</LI><LI>Activate objects (abap_activate_objects)</LI></UL><P class="lia-align-justify" style="text-align : justify;">After the generation completes, refresh your ABAP project by opening the Command Palette (Ctrl+Shift+P) and running ABAP: Refresh. The generated RAP artifacts will then appear in your workspace under the target package.</P><P class="lia-align-justify" style="text-align : justify;"><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Figure 14. RAP artifacts displayed under the defined package" style="width: 341px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/428871i07256B5EE3C8398B/image-size/medium?v=v2&px=400" role="button" title="berin__29-1783078129722.png" alt="Figure 14. RAP artifacts displayed under the defined package" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Figure 14. RAP artifacts displayed under the defined package</span></span></P><P class="lia-align-justify" style="text-align : justify;"> </P><P class="lia-align-justify" style="text-align : justify;"><SPAN>Once the service binding appears in your workspace, use the <STRONG>Publish</STRONG> CodeLens action to publish the service directly from VS Code. After publishing, the OData service is available for consumption.</SPAN></P><P class="lia-align-justify" style="text-align : justify;"><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Figure 15. Publishing the service binding" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/428872i31C59B443B0200BD/image-size/medium?v=v2&px=400" role="button" title="berin__30-1783078231073.png" alt="Figure 15. Publishing the service binding" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Figure 15. Publishing the service binding</span></span><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Figure 16. Success message" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/428873iCD77E4458E6F9849/image-size/medium?v=v2&px=400" role="button" title="berin__31-1783078249284.png" alt="Figure 16. Success message" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Figure 16. Success message</span></span></P><P class="lia-align-justify" style="text-align : justify;"> </P><P class="lia-align-justify" style="text-align : justify;">Then, use the Preview CodeLens to launch a live preview of your Fiori elements application directly in your browser:</P><P class="lia-align-justify" style="text-align : justify;"><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Figure 17. Launching the application preview" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/428874i9D37E0B80E49CE0E/image-size/medium?v=v2&px=400" role="button" title="berin__32-1783078289398.png" alt="Figure 17. Launching the application preview" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Figure 17. Launching the application preview</span></span><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Figure 18. Selecting the entity for preview" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/428875i44D1E574149C7766/image-size/medium?v=v2&px=400" role="button" title="berin__33-1783078324219.png" alt="Figure 18. Selecting the entity for preview" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Figure 18. Selecting the entity for preview</span></span></P><P class="lia-align-justify" style="text-align : justify;"><SPAN> </SPAN></P><P class="lia-align-justify" style="text-align : justify;">Your generated application is then displayed in the browser:</P><P class="lia-align-justify" style="text-align : justify;"><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Figure 19. Application preview" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/428876i9F2D82B4254ADA33/image-size/medium?v=v2&px=400" role="button" title="berin__34-1783078343105.png" alt="Figure 19. Application preview" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Figure 19. Application preview</span></span></P><P class="lia-align-justify" style="text-align : justify;"> </P><P class="lia-align-justify" style="text-align : justify;">All generated artifacts are created directly in your ABAP system as standard repository objects. They are identical to the RAP artifacts you would create manually, fully editable in ADT for VS Code, and can be extended using the standard RAP development workflow.</P><P class="lia-align-justify" style="text-align : justify;"> </P><H2 id="toc-hId-640000670">Summary</H2><P class="lia-align-justify" style="text-align : justify;"><SPAN>Chat-based RAP Business Object generation enables you to create complete RAP Business Objects directly from natural language prompts in ADT for VS Code. Combined with GitHub Copilot Agent Mode and the ADT MCP server, it automates the creation of the required RAP artifacts while keeping them fully editable as standard ABAP repository objects.</SPAN></P><P class="lia-align-justify" style="text-align : justify;">For more information, including setup instructions and configuration details, see the <SPAN><A href="https://help.sap.com/docs/abap-cloud/abap-development-tools-for-visual-studio-code/abap-development-tools-for-visual-studio-code" target="_blank" rel="noopener noreferrer">ABAP Development Tools for Visual Studio Code | SAP Help Portal</A></SPAN></P>2026-07-03T14:28:10.192000+02:00https://community.sap.com/t5/artificial-intelligence-blogs-posts/how-to-connect-claude-code-to-abap-with-zero-config-mcp/ba-p/14426854How to Connect Claude Code to ABAP with Zero-Config MCP2026-07-05T13:39:48.252000+02:00Nibeditahttps://community.sap.com/t5/user/viewprofilepage/user-id/42141<DIV><SPAN>Before We Start - What This Post Deliberately Skips</SPAN></DIV>
<DIV><SPAN>-</SPAN><SPAN> What is Claude Code, and what are the available models?</SPAN></DIV>
<DIV><SPAN>-</SPAN><SPAN> What is MCP (Model Context Protocol) and how it works conceptually?</SPAN></DIV>
<DIV><SPAN>-</SPAN><SPAN> What is vibe coding and why AI-assisted development matters?</SPAN></DIV>
<DIV><SPAN>-</SPAN><SPAN> What are the benefits of using AI in SAP development?</SPAN></DIV>
<DIV><SPAN>-</SPAN><SPAN> What development platforms are available (Web, Desktop, CLI)?</SPAN></DIV>
<DIV><SPAN>If you need more details, you can find these topics in sap community portal. Read that, then come back here.</SPAN></DIV>
<DIV>
<H3 id="toc-hId-1947359105"><FONT size="4">What This Post Covers - and Why It Matters?</FONT></H3>
<P class="">This post walks you through connecting Claude Code to a live SAP system using the ABAP Remote Filesystem extension's native MCP server - no external Node.js setup, no manual JSON editing, just a single toggle. </P>
<P class=""><STRONG>What this changes for SAP development:</STRONG></P>
<UL class="">
<LI><STRONG>No more hand-typed routine code.</STRONG> TYPE declarations, SELECT statements, ALV setup - written directly into the SAP object from a single prompt.</LI>
<LI><STRONG>No more AI guesswork.</STRONG> Without a live connection, AI tools hallucinate tables and function modules that don't exist. With MCP, every suggestion is grounded in your actual system.</LI>
<LI><STRONG>No more setup overhead.</STRONG> What used to require a custom Node.js project now takes one checkbox and one command - open to any developer with VS Code.</LI>
<LI><STRONG>Clean Core by default.</STRONG> Claude works through the same ADT API and released objects that Eclipse uses, so generated code fits your governance model instead of fighting it.</LI>
</UL>
<P class="">This is the point where AI-assisted ABAP stops being a chat-window experiment and starts being a real part of your IDE.</P>
</DIV>
<DIV> </DIV>
<DIV><STRONG>Goal: I will cover the entire topic in 4 parts:</STRONG></DIV>
<DIV><SPAN>|</SPAN><SPAN>Part 1</SPAN><SPAN>| Installing Claude Code on Windows and setting up the VS Code extension |</SPAN></DIV>
<DIV><SPAN>|</SPAN><SPAN>Part 2</SPAN><SPAN>| Connecting VS Code to your live SAP system via the ABAP FS extension |</SPAN></DIV>
<DIV><SPAN>|</SPAN><SPAN>Part 3</SPAN><SPAN>| Enabling the native MCP server with a single toggle - no Node.js setup, no JSON editing |</SPAN></DIV>
<DIV><SPAN>|</SPAN><SPAN>Part 4</SPAN><SPAN>| A live demo: one plain-English prompt creates a real, running ABAP report on SAP |</SPAN></DIV>
<DIV><SPAN>If you're here, you already know why this matters. Let's get to the actual steps.</SPAN></DIV>
<DIV> </DIV>
<DIV><STRONG>Pre-requisite:</STRONG> This guide assumes you already have an active Claude subscription (Pro, Max, Team, or Enterprise). If not, sign up at <A class="" href="https://claude.ai" target="_blank" rel="noopener nofollow noreferrer">claude.ai</A> before proceeding</DIV>
<DIV> </DIV>
<DIV><STRONG>Part 1 - The Setup: Getting Claude Code Running on Windows</STRONG></DIV>
<DIV><U>Step 1.1 - Install Claude Code CLI</U></DIV>
<DIV><SPAN>Open </SPAN><SPAN>PowerShell</SPAN><SPAN> (the built-in Windows command-line shell) and run:</SPAN></DIV>
<DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Nibedita_0-1782403645482.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/426129i7BB852B951EAE47D/image-size/medium?v=v2&px=400" role="button" title="Nibedita_0-1782403645482.png" alt="Nibedita_0-1782403645482.png" /></span>
<P> </P>
</DIV>
<DIV><SPAN>This downloads Anthropic's official installer and executes it in one step. '</SPAN><SPAN>irm'</SPAN><SPAN> fetches the script, '</SPAN><SPAN>iex'</SPAN><SPAN> runs it.</SPAN></DIV>
<DIV><SPAN>></SPAN><SPAN> <span class="lia-unicode-emoji" title=":warning:">⚠️</span> </SPAN><SPAN>Common Error - Git Bash Not Found</SPAN></DIV>
<DIV><SPAN>></SPAN><SPAN> Claude Code needs a bash shell to run on Windows. If you see this error, install </SPAN><SPAN><STRONG>Git for Windows</STRONG></SPAN><SPAN> from [</SPAN><SPAN>git-scm.com/downloads/win</SPAN><SPAN>](</SPAN><SPAN><A href="https://git-scm.com/downloads/win" target="_blank" rel="noopener nofollow noreferrer">https://git-scm.com/downloads/win</A></SPAN><SPAN>). During setup, select: </SPAN><SPAN>Git from the command line and also from 3rd-party software</SPAN><SPAN>. Then re-run the install command above.</SPAN></DIV>
<DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Nibedita_1-1782403737130.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/426130i0A321240F9C2F45B/image-size/medium?v=v2&px=400" role="button" title="Nibedita_1-1782403737130.png" alt="Nibedita_1-1782403737130.png" /></span></DIV>
<DIV><U><SPAN>Step 1.2 — Verify the Installation</SPAN></U>
<P> </P>
</DIV>
<DIV><SPAN>Close PowerShell and open a fresh window. Run:</SPAN></DIV>
<DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Nibedita_2-1782403839582.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/426131i7F58BA2D89AD974E/image-size/medium?v=v2&px=400" role="button" title="Nibedita_2-1782403839582.png" alt="Nibedita_2-1782403839582.png" /></span></DIV>
<DIV><SPAN>You should see a version number like '</SPAN><SPAN>claude 1.x.x'</SPAN><SPAN>. If PowerShell says </SPAN><SPAN>claude is not recognized</SPAN><SPAN>, the PATH wasn't set automatically. Fix it manually:</SPAN>
<P> </P>
</DIV>
<DIV><SPAN>1.</SPAN><SPAN> Start → search </SPAN><SPAN>Environment Variables in system settings</SPAN></DIV>
<DIV><SPAN>2.</SPAN><SPAN> Edit the environment variables for your account</SPAN></DIV>
<DIV><SPAN>3.</SPAN><SPAN> Select </SPAN><SPAN>Path</SPAN><SPAN><SPAN> → Edit → New → paste ( in this case path can be taken from powershell commnad prompt)</SPAN></SPAN></DIV>
<DIV><SPAN><SPAN> for eg: </SPAN></SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Nibedita_3-1782403944264.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/426132i1C30F8ADF7812B7F/image-size/medium?v=v2&px=400" role="button" title="Nibedita_3-1782403944264.png" alt="Nibedita_3-1782403944264.png" /></span>
<P> </P>
</DIV>
<DIV><SPAN>4.</SPAN><SPAN> Close and reopen PowerShell, then re-run </SPAN><SPAN>claude --version</SPAN><SPAN>.</SPAN></DIV>
<P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Nibedita_5-1782404089631.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/426134i3AE56F1C88B91B5F/image-size/medium?v=v2&px=400" role="button" title="Nibedita_5-1782404089631.png" alt="Nibedita_5-1782404089631.png" /></span></P>
<P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Nibedita_6-1782404105391.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/426135iDA769D6378034E9A/image-size/medium?v=v2&px=400" role="button" title="Nibedita_6-1782404105391.png" alt="Nibedita_6-1782404105391.png" /></span></P>
<P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Nibedita_7-1782404136711.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/426136iCFD7B02CB11A40B3/image-size/medium?v=v2&px=400" role="button" title="Nibedita_7-1782404136711.png" alt="Nibedita_7-1782404136711.png" /></span></P>
<DIV><SPAN>></SPAN> <SPAN>Run </SPAN><SPAN>claude doctor</SPAN><SPAN> - this command checks your PATH, authentication, Node.js version, and config in one shot. Always the first step when something isn't working.</SPAN></DIV>
<DIV><U>Step 1.3 - Launch Claude Code and the VS Code Extension</U></DIV>
<DIV><SPAN>Navigate to your project folder and launch Claude Code.</SPAN></DIV>
<DIV><SPAN>The first launch opens your browser to authenticate with your </SPAN><SPAN>Anthropic account</SPAN><SPAN> (Pro, Max, Team, or Enterprise all work). </SPAN></DIV>
<DIV><SPAN>For everyday ABAP work, the <STRONG>VS Code extension</STRONG> is where you'll spend most of your time.</SPAN></DIV>
<DIV><SPAN>Download and Install VS code from <A href="http://code.visualstudio.com" target="_self" rel="nofollow noopener noreferrer">code.visualstudio.com</A> for windows if you don't already have it. Once it is installed.</SPAN><SPAN>Open VS Code, press '</SPAN><SPAN>Ctrl+Shift+X'</SPAN><SPAN>, search for </SPAN><SPAN>Claude Code</SPAN><SPAN> (published by Anthropic), and install it. Once installed, the Claude icon appears in the Activity Bar and connects automatically to your account.</SPAN></DIV>
<P> </P>
<P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Nibedita_1-1782404981935.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/426140iA94712F10DC28E49/image-size/medium?v=v2&px=400" role="button" title="Nibedita_1-1782404981935.png" alt="Nibedita_1-1782404981935.png" /></span></P>
<DIV><SPAN>The extension gives you a persistent chat panel inside VS Code - ask Claude about the file you have open, highlight any ABAP block and ask it to explain or refactor, and switch between ABAP and CAP projects in the same session. No terminal switching required.</SPAN></DIV>
<DIV><SPAN>></SPAN> <SPAN>Note on Software Center installs:</SPAN><SPAN> If your organization restricts installations, Claude Code for VS Code is typically available via your company Software Center / Company Portal.</SPAN></DIV>
<DIV> </DIV>
<DIV><SPAN><STRONG>Part 2 - Connecting VS Code to Your SAP System via ABAP FS</STRONG></SPAN></DIV>
<DIV><SPAN>This is where the magic begins. The </SPAN><SPAN><STRONG>ABAP Remote Filesystem</STRONG> (ABAP FS)</SPAN><SPAN>extension - built by <STRONG>Marcello Urbani</STRONG> - connects VS Code to your SAP system using the same ADT REST API that Eclipse uses. Once connected, your ABAP objects (programs, classes, CDS views, behavior definitions) appear as files in VS Code. Claude Code can then read, write, and review them like any local code file.</SPAN></DIV>
<DIV><STRONG>Pre-requisites Before You Connect</STRONG></DIV>
<DIV><SPAN>You'll need these four things from your SAP system before starting:</SPAN></DIV>
<DIV><SPAN>| </SPAN><SPAN>Hostname or IP</SPAN><SPAN> | The address of your SAP server (hostname preferred - IP causes SSL issues explained below) |</SPAN></DIV>
<DIV><SPAN>| </SPAN><SPAN>ADT Service active</SPAN><SPAN> | Go to transaction SICF → '</SPAN><SPAN>/sap/bc/adt'</SPAN><SPAN> must be activated |</SPAN></DIV>
<DIV><SPAN>| </SPAN><SPAN>Client number</SPAN><SPAN>| e.g. '</SPAN><SPAN>100'</SPAN><SPAN> - visible in the SAP logon screen |</SPAN></DIV>
<DIV><SPAN>|</SPAN><SPAN>Username & Password</SPAN><SPAN>| Your regular SAP development user |</SPAN></DIV>
<DIV><SPAN>| </SPAN><SPAN>Port</SPAN><SPAN> | HTTPS: '</SPAN><SPAN>44300'</SPAN><SPAN> (typical) | HTTP: '</SPAN><SPAN>8000'</SPAN><SPAN> for instance 00, '</SPAN><SPAN>8001'</SPAN><SPAN> for instance 01 |</SPAN></DIV>
<DIV> </DIV>
<DIV><U>Step 2.1 - Install and Configure ABAP FS</U></DIV>
<DIV><SPAN>1.</SPAN><SPAN> In VS Code Extensions ('</SPAN><SPAN>Ctrl+Shift+X'</SPAN><SPAN>), search </SPAN><SPAN>ABAP remote filesystem</SPAN><SPAN> by Marcello Urbani → Install.</SPAN></DIV>
<DIV><SPAN>2.</SPAN><SPAN> Press '</SPAN><SPAN>Ctrl+Shift+P'</SPAN><SPAN> → type </SPAN><SPAN>ABAP FS: Connection Manager</SPAN><SPAN> → open it.</SPAN></DIV>
<DIV><SPAN>3.</SPAN><SPAN> Add a new connection and fill in the fields:</SPAN></DIV>
<DIV><SPAN> </SPAN><SPAN>-</SPAN> <SPAN>Name:</SPAN><SPAN> anything you like (e.g. </SPAN><SPAN>DEV</SPAN><SPAN> or </SPAN><SPAN>SANDBOX</SPAN><SPAN>)</SPAN></DIV>
<DIV><SPAN> </SPAN><SPAN>-</SPAN> <SPAN>Server URL:'</SPAN><SPAN>https://<hostname>:44300'</SPAN></DIV>
<DIV><SPAN> </SPAN><SPAN>-</SPAN><SPAN> <span class="lia-unicode-emoji" title=":warning:">⚠️</span> </SPAN><SPAN>Do NOT add '</SPAN><SPAN>/sap/bc/adt'</SPAN><SPAN> to the URL</SPAN><SPAN> - the extension adds this automatically. If you include it, the path doubles and the connection fails.</SPAN></DIV>
<DIV><SPAN> </SPAN><SPAN>-</SPAN> <SPAN>Client, Username, Language:</SPAN> '<SPAN>EN'</SPAN></DIV>
<DIV><SPAN>4.</SPAN><SPAN> Save.</SPAN></DIV>
<DIV><SPAN>5.</SPAN><SPAN> Press '</SPAN><SPAN>Ctrl+Shift+P'</SPAN><SPAN> → </SPAN><SPAN>ABAP FS: Connect to an SAP system</SPAN><SPAN>→ select your connection → enter password.</SPAN></DIV>
<DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Nibedita_2-1782405670643.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/426149i8AF50AE6ACE63C2C/image-size/medium?v=v2&px=400" role="button" title="Nibedita_2-1782405670643.png" alt="Nibedita_2-1782405670643.png" /></span></DIV>
<DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Nibedita_3-1782405784275.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/426150i4B79820C05FB228E/image-size/medium?v=v2&px=400" role="button" title="Nibedita_3-1782405784275.png" alt="Nibedita_3-1782405784275.png" /></span> <span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Nibedita_4-1782405864816.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/426151i6AB93286C9C60C5F/image-size/medium?v=v2&px=400" role="button" title="Nibedita_4-1782405864816.png" alt="Nibedita_4-1782405864816.png" /></span>
<P> </P>
</DIV>
<DIV><SPAN>></SPAN><SPAN> <span class="lia-unicode-emoji" title=":warning:">⚠️</span> </SPAN><SPAN>SSL Certificate Error (very common on internal systems)</SPAN></DIV>
<DIV><SPAN>></SPAN><SPAN> If you see </SPAN><SPAN>IP does not match certificate's altnames</SPAN><SPAN> - this is because your SAP system's SSL certificate was issued with a hostname, not the IP. The fix: Get the hostname (e.g. '</SPAN><SPAN><A href="https://sapdev.company.com:44300" target="_blank" rel="noopener nofollow noreferrer">https://sapdev.company.com:44300'</A></SPAN><SPAN>) and use that instead of the IP. </SPAN></DIV>
<DIV><SPAN>></SPAN><SPAN> <span class="lia-unicode-emoji" title=":warning:">⚠️</span></SPAN><SPAN>ADT Service Not Found</SPAN></DIV>
<DIV><SPAN>></SPAN><SPAN> If you see </SPAN><SPAN>Resource /sap/bc/adt does not exist</SPAN><SPAN> - the ADT service isn't activated. Run tcode SICF → navigate to </SPAN><SPAN>default_host → 'sap/bc/adt' </SPAN><SPAN>→ right-click → Activate Service.</SPAN></DIV>
<DIV> </DIV>
<DIV><U>Step 2.2 - Navigating ABAP Objects</U></DIV>
<DIV>ABAP FS gives you two ways to find objects. <STRONG>Object Search</STRONG> lets you find anything by name instantly. If you prefer a tree view like Eclipse ADT, enable <STRONG>SAP GUI Integration</STRONG> in your connection settings - this gives you a full package tree (Dictionary, Source Code Library, Transactions) and even embeds SAP GUI for HTML directly inside VS Code, so you can run transactions without leaving the editor.</DIV>
<DIV><SPAN>1.</SPAN><SPAN> Click </SPAN><SPAN>OBJECT SEARCH </SPAN><SPAN>in the left sidebar</SPAN></DIV>
<DIV><SPAN>2.</SPAN><SPAN> Type the object or package name (e.g. '</SPAN><SPAN>ZCL_MY_CLASS'</SPAN><SPAN> or '</SPAN><SPAN>Z_MY_PACKAGE'</SPAN><SPAN>)</SPAN></DIV>
<DIV><SPAN>3.</SPAN><SPAN> Double-click any result to open it as a text file in VS Code</SPAN></DIV>
<DIV><SPAN>4.</SPAN><SPAN> To edit: right-click </SPAN><SPAN> → edit → save (changes push back to SAP automatically)</SPAN></DIV>
<DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Nibedita_5-1782406842709.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/426154iFCC48857AA2801D1/image-size/medium?v=v2&px=400" role="button" title="Nibedita_5-1782406842709.png" alt="Nibedita_5-1782406842709.png" /></span></DIV>
<DIV><SPAN>Once an object is open in VS Code, open the integrated terminal (</SPAN><SPAN>Ctrl+) and run </SPAN><SPAN>claude. Some prompts that immediately pay off:</SPAN>
<P> </P>
</DIV>
<DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Nibedita_6-1782406930523.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/426155iF35ED8070217C462/image-size/medium?v=v2&px=400" role="button" title="Nibedita_6-1782406930523.png" alt="Nibedita_6-1782406930523.png" /></span></DIV>
<DIV><STRONG><SPAN>Part 3 -The Game Changer: Enabling the Native MCP Server</SPAN></STRONG>
<P> </P>
</DIV>
<DIV><SPAN>This is the step that changes everything - and the reason this post exists.</SPAN></DIV>
<DIV><STRONG>Why ABAP FS Alone Isn't Enough?</STRONG></DIV>
<DIV><SPAN>With only ABAP FS connected, Claude can see only the one file you currently have open. Ask it to create a new class and it might invent table names, function modules, or BAdI definitions that don't exist on your system. It's helpful, but it's guessing.</SPAN></DIV>
<DIV><STRONG> ABAP FS Only </STRONG> <STRONG>ABAP FS + MCP</STRONG>
<TABLE>
<TBODY>
<TR>
<TD>Claude sees what we search Manually</TD>
<TD>Claude <STRONG>autonomously searches</STRONG> any object on the system</TD>
</TR>
<TR>
<TD>Hallucinates objects it hasn't seen</TD>
<TD>Grounded in live SAP system data</TD>
</TR>
<TR>
<TD>You copy-paste code manually</TD>
<TD>Claude reads, writes, activates autonomously</TD>
</TR>
<TR>
<TD>No transport awareness</TD>
<TD>Creates & assigns transports via ADT</TD>
</TR>
</TBODY>
</TABLE>
<P> </P>
</DIV>
<DIV><SPAN>The </SPAN><SPAN>MCP (Model Context Protocol) server </SPAN><SPAN>gives Claude Code a live connection to your SAP system's ADT API - the same backend Eclipse uses. Claude stops guessing and starts knowing.</SPAN></DIV>
<DIV><U>Step 3.1 - Enable the MCP Server (One Toggle)</U></DIV>
<DIV><SPAN>This is where the zero-config part comes in. You don't need to install anything extra, clone a Node.js repo, or edit JSON files manually.</SPAN></DIV>
<DIV><SPAN>Press '</SPAN><SPAN>Ctrl+Shift+P'</SPAN><SPAN> → search </SPAN><SPAN>ABAP FS MCP</SPAN><SPAN> → select it → </SPAN><SPAN>enable Autostart</SPAN><SPAN>.</SPAN></DIV>
<DIV><SPAN>That's it. The ABAP FS extension spins up a local MCP server on your machine (default port </SPAN><SPAN>4847</SPAN><SPAN>). You'll see a VS Code notification confirming it's running:</SPAN></DIV>
<DIV><SPAN>></SPAN> <SPAN>ABAP MCP Server running on port 4847. External AI clients can connect to <A href="http://localhost:4847/mcp" target="_blank" rel="noopener nofollow noreferrer">http://localhost:4847/mcp</A></SPAN></DIV>
<P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Nibedita_1-1782407943013.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/426157i77F6CF90695CAE23/image-size/medium?v=v2&px=400" role="button" title="Nibedita_1-1782407943013.png" alt="Nibedita_1-1782407943013.png" /></span></P>
<P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Nibedita_3-1782408012661.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/426159i6ACAF21EEF81B20B/image-size/large?v=v2&px=999" role="button" title="Nibedita_3-1782408012661.png" alt="Nibedita_3-1782408012661.png" /></span></P>
<DIV><U>Step 3.2 - Register the MCP Server with Claude Code</U></DIV>
<DIV><SPAN>Now tell Claude Code where to find the ABAP tools. Run this in the VS Code integrated terminal:</SPAN></DIV>
<DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Nibedita_4-1782408077760.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/426160i344FEAB84125DB56/image-size/medium?v=v2&px=400" role="button" title="Nibedita_4-1782408077760.png" alt="Nibedita_4-1782408077760.png" /></span></DIV>
<DIV><SPAN>This registers the local MCP server with Claude Code. The configuration is saved to your '</SPAN><SPAN>.claude.json'</SPAN><SPAN> file and persists across sessions - you only need to do this once.</SPAN></DIV>
<DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Nibedita_5-1782408144482.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/426161iAAA2FF48C822A39A/image-size/large?v=v2&px=999" role="button" title="Nibedita_5-1782408144482.png" alt="Nibedita_5-1782408144482.png" /></span><U><SPAN>Step 3.3 - Verify the Connection</SPAN></U>
<P> </P>
</DIV>
<DIV>open the terminal and run this command once the MCP server is added </DIV>
<DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Nibedita_6-1782408296420.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/426162i6D1260B1466BD8FB/image-size/medium?v=v2&px=400" role="button" title="Nibedita_6-1782408296420.png" alt="Nibedita_6-1782408296420.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Nibedita_7-1782408317004.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/426163iA1AF4313EE379DC9/image-size/medium?v=v2&px=400" role="button" title="Nibedita_7-1782408317004.png" alt="Nibedita_7-1782408317004.png" /></span></DIV>
<DIV><SPAN>You should see:</SPAN></DIV>
<DIV><SPAN>Claude Code will confirm when the server is registered:</SPAN></DIV>
<DIV><SPAN>></SPAN> <SPAN>abap-remote-fs has been added with HTTP transport at <A href="http://localhost:4847/mcp" target="_blank" rel="noopener nofollow noreferrer">http://localhost:4847/mcp</A>"*</SPAN></DIV>
<DIV><SPAN>The Complete Architecture</SPAN></DIV>
<DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Nibedita_8-1782408719813.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/426164i55C1D75023E52737/image-size/medium?v=v2&px=400" role="button" title="Nibedita_8-1782408719813.png" alt="Nibedita_8-1782408719813.png" /></span></DIV>
<DIV><SPAN>Claude Code can now autonomously:</SPAN></DIV>
<DIV><SPAN>-</SPAN><SPAN> Search and read any ABAP object on the live SAP system</SPAN></DIV>
<DIV><SPAN>-</SPAN><SPAN> write → syntax check → activate → unlock objects</SPAN></DIV>
<DIV><SPAN>-</SPAN><SPAN> Create transport requests and assign objects</SPAN></DIV>
<DIV><SPAN>-</SPAN><SPAN> Run ATC checks and read short dumps - all from a plain-English prompt</SPAN></DIV>
<DIV><SPAN>></SPAN> <SPAN>Golden - In <STRONG>Auto mode</STRONG>, Claude will write, syntax check, and activate without pausing - that's the power of the agentic workflow. If you want to review before anything is activated, switch to <STRONG>Plan mode</STRONG> <STRONG> shift+tab </STRONG>to cycle modes) Claude will show you the full plan and wait for your approval. For production-adjacent systems, always run in Plan or Step mode.</SPAN></DIV>
<DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Nibedita_0-1782409842588.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/426167iCC621FF9DB99E99C/image-size/medium?v=v2&px=400" role="button" title="Nibedita_0-1782409842588.png" alt="Nibedita_0-1782409842588.png" /></span></DIV>
<DIV><STRONG><SPAN>Part 4 - Live Demo: One Prompt, One Real ABAP Program on SAP</SPAN></STRONG></DIV>
<DIV><SPAN><EM>Disclaimer: This is my first time setting up all this and explore, so i just started with a very simple scenario. Going forward will create RAP objects and other complex artifacts and see the efficiency.</EM></SPAN><STRONG><SPAN><BR /></SPAN></STRONG></DIV>
<DIV><SPAN>Let me show you what all of this enables. Here's the exact prompt I used:</SPAN></DIV>
<DIV><SPAN>></SPAN> <SPAN>Create a new ABAP executable program ZCL_DEMO_REPORT_01 in my ZVS_DEMO package. Fetch data from MARA for a user-specified Material Number (select-option) and display Material Number, Type, and Created By in an ALV grid. Write in ABAP 7.5 syntax.</SPAN></DIV>
<DIV><SPAN>One prompt. No templates. No copy-paste. Here's what Claude did.</SPAN></DIV>
<DIV><STRONG>Act 1 - Claude Plans Before It Codes</STRONG></DIV>
<DIV><SPAN>Claude didn't immediately start writing code. It:</SPAN></DIV>
<DIV><SPAN>1.</SPAN><SPAN> Confirmed the target package ('</SPAN><SPAN>ZVS_DEMO'</SPAN><SPAN>) exists on the system</SPAN></DIV>
<DIV><SPAN>2.</SPAN><SPAN> Detected that the program creation triggered a </SPAN><SPAN>**transport request dialog**</SPAN><SPAN> — and recognised it was the likely source of a cancellation</SPAN></DIV>
<DIV><SPAN>3.</SPAN><SPAN> Called the SAP ADT API via Bash to </SPAN><SPAN>**list existing open transports**</SPAN></DIV>
<DIV><SPAN>4.</SPAN><SPAN> Selected the correct transport and retried the creation</SPAN></DIV>
<DIV><SPAN>There was a little bit delay on my end to confirm the transport. and it gave me this message.</SPAN></DIV>
<DIV><FONT color="#FFCC00"><SPAN>></SPAN> <SPAN>Package confirmed. The cancellation is likely a transport request dialog. Let me check for existing transports, then retry.</SPAN></FONT></DIV>
<DIV><SPAN>This is the part that impresses ABAP developers most. Claude handled a real SAP workflow quirk .</SPAN></DIV>
<DIV><STRONG>Act 2 - The Program Appears on SAP</STRONG></DIV>
<DIV><SPAN>Claude then created the program on the live system. You can watch its autonomous todo list mid-execution:</SPAN></DIV>
<DIV><SPAN>-</SPAN> <SPAN>Create ABAP program ZCL_DEMO_REPORT_01 in ZVS_DEMO package via MCP</SPAN></DIV>
<DIV><SPAN>-</SPAN><SPAN> Get workspace URI for the new program</SPAN></DIV>
<DIV><SPAN>-</SPAN><SPAN> Write ABAP source code into the program</SPAN></DIV>
<DIV><SPAN>-</SPAN><SPAN> Activate the program and check diagnostics</SPAN></DIV>
<DIV><SPAN>'ZCL_DEMO_REPORT_01'</SPAN><SPAN> appeared in the VS Code Explorer sidebar - a real, registered ABAP program on the SAP system, not a local file.</SPAN></DIV>
<DIV><SPAN>You can see initially there was no program created in my package </SPAN></DIV>
<DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Nibedita_1-1782413574177.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/426191iA0F27FED74F8F588/image-size/medium?v=v2&px=400" role="button" title="Nibedita_1-1782413574177.png" alt="Nibedita_1-1782413574177.png" /></span></DIV>
<DIV>After few seconds, the program is created </DIV>
<DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Nibedita_2-1782413600566.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/426194i035E9269F5F4C109/image-size/large?v=v2&px=999" role="button" title="Nibedita_2-1782413600566.png" alt="Nibedita_2-1782413600566.png" /></span>
<P> </P>
</DIV>
<DIV><U>Act 3 - Full ABAP 7.5 Source Code Written</U></DIV>
<DIV><SPAN>With the object created, Claude fetched the workspace URI and wrote the complete source code directly into the SAP program. What it generated:</SPAN></DIV>
<DIV><SPAN>No placeholder code. Real, working ABAP in the correct syntax release, referencing actual MARA field types from the live system.</SPAN></DIV>
<DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Nibedita_0-1782414225801.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/426211i3C44D98AAB8220CA/image-size/medium?v=v2&px=400" role="button" title="Nibedita_0-1782414225801.png" alt="Nibedita_0-1782414225801.png" /></span></DIV>
<DIV><U>Act 4 - Running the Program</U></DIV>
<DIV><SPAN>After activation, there are two ways to run it:</SPAN></DIV>
<DIV><SPAN>Option A - Classic SAP GUI:</SPAN><SPAN>Log in to SAP GUI →run the program → Execute</SPAN></DIV>
<DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Nibedita_1-1782414368796.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/426214i3DE9B385C56A9072/image-size/medium?v=v2&px=400" role="button" title="Nibedita_1-1782414368796.png" alt="Nibedita_1-1782414368796.png" /></span></DIV>
<DIV><SPAN>Option B - Embedded SAP Web GUI</SPAN><SPAN>(what I used): VS Code can open the SAP Web GUI directly in a browser tab, embedded inside the IDE. No separate login or window switching required.</SPAN></DIV>
<DIV><SPAN>Enter selection criteria:</SPAN></DIV>
<DIV><SPAN>The selection screen appeared with the Matnr </SPAN><SPAN> field exactly as specified. I entered a range of </SPAN><SPAN>11</SPAN><SPAN>to </SPAN><SPAN>21</SPAN><SPAN>. The value help (F4) shows the available materials in the system</SPAN></DIV>
<DIV><SPAN>Material Number, Material Type, and Created By - exactly what was asked for. Live data from MARA. Report running.</SPAN></DIV>
<DIV> </DIV>
<DIV><U>Summary:</U></DIV>
<DIV><STRONG>|Claude understands SAP context|</STRONG><SPAN><STRONG> </STRONG>It identified the transport dialog, queried existing transports via ADT, and handled a real SAP workflow quirk autonomously </SPAN></DIV>
<DIV><STRONG>| It created a real SAP object|</STRONG><SPAN> '</SPAN><SPAN>ZCL_DEMO_REPORT_01'</SPAN><SPAN> exists on the live system, created via ADT REST API through MCP - not a file on disk </SPAN></DIV>
<DIV><STRONG>| Production-quality ABAP 7.5</STRONG><SPAN><STRONG> |</STRONG> TYPE declarations referencing actual MARA field types, correct naming conventions, modern SQL syntax </SPAN></DIV>
<DIV><STRONG>| Minutes, not hours</STRONG><SPAN><STRONG>|</STRONG> The developer's job shifts to reviewing - not writing skeletons, hunting transport dialogs, or looking up field types </SPAN></DIV>
<DIV><STRONG>| Fully iterative</STRONG><SPAN><STRONG>|</STRONG> Once created, you can ask Claude to add authority checks, error handling, ALV field catalogues, or additional filters - each iteration in seconds </SPAN></DIV>
<DIV><STRONG>| You stay in control</STRONG><SPAN><STRONG> |</STRONG> Claude's todo list is transparent - you see every step it plans. You review the code. You decide what activates </SPAN></DIV>
<DIV> </DIV>
<DIV><STRONG>Where to Go from Here?</STRONG></DIV>
<DIV><SPAN>Here are five things to try once you have the setup working:</SPAN></DIV>
<DIV><SPAN>1.</SPAN> <SPAN>Understand inherited code - </SPAN><SPAN>Explain the purpose and flow of report Z_*_REPORT. Include tables accessed, authority checks, deprecated patterns like SELECT .</SPAN></DIV>
<DIV><SPAN>2.</SPAN> <SPAN>Generate a CDS view -</SPAN><SPAN> </SPAN><SPAN>Create a CDS view hierarchy for Sales Order analysis: interface view joining VBAK+VBAP, projection view with Fiori Elements. UI annotations for a List Report.</SPAN></DIV>
<DIV><SPAN>3.</SPAN> <SPAN>Build a Travel Request POC</SPAN><SPAN> - RAP Business Object with CRUD, approve/reject action, draft handling, OData V4 binding, Fiori Elements UI.</SPAN></DIV>
<DIV><SPAN>4.</SPAN> <SPAN>Write ABAP Unit tests -</SPAN><SPAN> </SPAN><SPAN>Generate a unit test class </SPAN></DIV>
<DIV><SPAN>5.</SPAN> <SPAN>Code review and modernization - </SPAN><SPAN>Review this class for Clean ABAP violations, missing authority checks, SELECT * usage, and SELECT inside LOOP. Propose S/4-equivalent replacements.</SPAN></DIV>
<DIV> </DIV>
<DIV><SPAN><STRONG>The bottom line</STRONG>: <STRONG>The integration that used to require manual Node.js setup, JSON editing, and external package management now takes a single Ctrl+Shift+P toggle and one terminal command.</STRONG> </SPAN></DIV>
<DIV> </DIV>
<DIV><SPAN>The ABAP Remote Filesystem team has done the hard work. Claude Code does the coding. You do the review.</SPAN></DIV>
<DIV><SPAN>Give it a try - and let me know in the comments what use case you tackle first.</SPAN></DIV>
<DIV> </DIV>
<DIV><EM>A personal note : This is my first time diving deeper into vibe coding and MCP concepts. I come from a classic ABAP background, and everything covered here - from the VS Code setup to the MCP server to the live demo - I explored and built from scratch over the past few weeks. The scenario is intentionally simple. The goal was to get the fundamentals right, document them honestly, and share what works. There is a lot more ground to cover - RAP generation at scale, Clean Core extensibility patterns, ATC pre-checks via Claude Code, and deeper agentic workflows. I'll be going further in the posts ahead. If you're also just getting started with this, I hope this gives you a solid, working foundation to build on. And if you're already further ahead - I'd love to hear what you've learnt in the comments.</EM></DIV>
<DIV> </DIV>
<DIV><EM>Note: All screenshots in this post are taken from a live S/4HANA development system. Code generated by Claude Code should always be reviewed and tested in a sandbox environment before activation in any productive system.</EM></DIV>2026-07-05T13:39:48.252000+02:00https://community.sap.com/t5/technology-blog-posts-by-sap/join-us-tomorrow-sap-btp-abap-environment-customer-amp-partner-roundtable/ba-p/14434260Join Us Tomorrow: SAP BTP ABAP Environment Customer & Partner Roundtable – July 20262026-07-06T11:59:12.566000+02:00Burcu_Karlidaghttps://community.sap.com/t5/user/viewprofilepage/user-id/151005<P class=""><SPAN>Dear customers and partners, </SPAN></P><P class=""><SPAN>Join us tomorrow for the next session of our </SPAN><STRONG><SPAN>SAP BTP ABAP Environment Customer & Partner Roundtable</SPAN></STRONG><SPAN>, taking place on </SPAN><STRONG><SPAN>July 07, 2026, from 10:00–11:00 CET</SPAN></STRONG><SPAN>.</SPAN></P><P class=""><SPAN>Our roundtable is a monthly virtual meeting where we share the latest updates from the product team and showcase selected topics from our experts. It is a great opportunity to stay up to date with the latest capabilities of the SAP BTP ABAP Environment, ask questions, and engage with the community.</SPAN></P><H2 id="toc-hId-1819134586"><SPAN>Join the session</SPAN></H2><P class=""><SPAN><span class="lia-unicode-emoji" title=":calendar:">📅</span> </SPAN><STRONG><SPAN>Date:</SPAN></STRONG><SPAN> July 07, 2026</SPAN><BR /><SPAN><span class="lia-unicode-emoji" title=":alarm_clock:">⏰</span> </SPAN><STRONG><SPAN>Time:</SPAN></STRONG><SPAN> 10:00–11:00 CET</SPAN></P><H2 id="toc-hId-1622621081"><SPAN>Agenda</SPAN></H2><P class=""><SPAN><span class="lia-unicode-emoji" title=":small_blue_diamond:">🔹</span> </SPAN><STRONG><SPAN>Product Updates</SPAN></STRONG><SPAN> – Frank Jentsch</SPAN></P><P><SPAN><span class="lia-unicode-emoji" title=":small_blue_diamond:">🔹</span> </SPAN><STRONG><SPAN>New ABAP Language Features </SPAN></STRONG><SPAN>- Cedric Becker, Rolf Hammer</SPAN><BR /><SPAN> </SPAN></P><P>The roundtable is a<SPAN> </SPAN><STRONG>monthly series</STRONG><SPAN> </SPAN>taking place on the<SPAN> </SPAN><STRONG>first Tuesday of every month (10:00–11:00 CET)</STRONG>.</P><P><SPAN class="lia-unicode-emoji"><SPAN class="lia-unicode-emoji"><span class="lia-unicode-emoji" title=":backhand_index_pointing_right:">👉</span></SPAN> </SPAN><STRONG>Download the</STRONG><SPAN> </SPAN><STRONG><A href="https://github.com/iwonahahn/SAP-BTP-ABAP-Environment-Roundtable/releases/download/v26/SAP.BTP.ABAP.Environment.Customer.und.Partner.Roundtable.ics" target="_blank" rel="nofollow noopener noreferrer">.ics calendar file</A><SPAN> </SPAN>for the full 2026 series</STRONG><SPAN> and import it directly into your calendar.</SPAN><BR /><SPAN>Each calendar entry already includes the Microsoft Teams meeting link.</SPAN></P><P><SPAN>Microsoft Teams meeting link (valid for the entire 2026 series): <A href="https://teams.microsoft.com/l/meetup-join/19%3ameeting_YTE0YzFlNGMtMDA2NC00NThlLWEzYWQtNWExNzU3MmRmNGE1%40thread.v2/0?context=%7b%22Tid%22%3a%2242f7676c-f455-423c-82f6-dc2d99791af7%22%2c%22Oid%22%3a%223d2a93aa-8f6e-4294-826f-80727ddf8588%22%7d" target="_blank" rel="nofollow noopener noreferrer">Microsoft Teams meeting link</A> </SPAN></P><P><SPAN>All agendas, slides, recordings, and updates from past and current sessions are published centrally via the</SPAN><BR /><A href="https://pages.community.sap.com/topics/btp-abap-environment/customer-partner-roundtable" target="_blank" rel="noopener noreferrer"><STRONG>SAP Community – SAP BTP ABAP Environment Customer & Partner Roundtable.</STRONG></A></P><P><SPAN>We’re looking forward to seeing you there!</SPAN></P><P><STRONG>SAP BTP ABAP Environment Team</STRONG></P>2026-07-06T11:59:12.566000+02:00https://community.sap.com/t5/technology-platform-learning-group-blog-posts/lernen-verbindet-entdecke-unsere-deutschsprachigen-live-sessions-in-q3/ba-p/14434778Lernen verbindet – Entdecke unsere 🇩🇪 deutschsprachigen 🇩🇪 Live Sessions in Q32026-07-06T18:19:45.569000+02:00Isabella_Lhttps://community.sap.com/t5/user/viewprofilepage/user-id/1550401<P><STRONG>Q3 ist in vollem Gange. Welche Themen möchtest du dieses Quartal noch entdecken?</STRONG></P><P>Vielleicht gibt es ein Thema, das schon länger auf deiner Lernliste steht. Vielleicht möchtest du dein Wissen vertiefen oder einfach neue Impulse mitnehmen.</P><P>Unsere deutschsprachigen SAP BTP Live Sessions bieten die Gelegenheit dazu. Von Grundlagen über Integration und Entwicklung bis hin zu Architektur- und Automatisierungsthemen wartet ein vielfältiges Lernangebot auf dich.</P><DIV><DIV>Vielleicht ist genau die Session, die dich weiterbringt, bereits Teil des aktuellen Programms:</DIV></DIV><P><A href="https://community.sap.com/t5/technology-platform-learning-group-blog-posts/new-sap-btp-live-sessions-auf-deutsch/ba-p/14415241" target="_blank">https://community.sap.com/t5/technology-platform-learning-group-blog-posts/new-sap-btp-live-sessions-auf-deutsch/ba-p/14415241</A></P><P>Also welches Thema möchtest du in Q3 noch entdecken?</P><P>Wir sehen uns in den Live Sessions! </P><P> </P>2026-07-06T18:19:45.569000+02:00https://community.sap.com/t5/abap-blog-posts/how-to-implement-sap-change-document/ba-p/14423026How to Implement SAP Change Document2026-07-09T17:19:07.404000+02:00Subhasree1https://community.sap.com/t5/user/viewprofilepage/user-id/1872388<H2 id="toc-hId-1818179234">Introduction:</H2><P class="">If you have ever been asked the question — who changed that field, and when — you will immediately appreciate why change documents matter. In any serious SAP implementation, traceability is not a nice-to-have. It is a business requirement, often driven by audit, compliance, or simply the need to investigate data quality issues after the fact.</P><P class=""><SPAN>SAP provides a standard, reliable framework for exactly this purpose: Change Documents. Once set up, every create, update, and delete operation on your custom tables produces a detailed, timestamped record of exactly what changed, written automatically to two standard SAP tables — </SPAN><CODE>CDHDR</CODE><SPAN> and </SPAN><CODE>CDPOS</CODE><SPAN>. No custom logging table, no triggers, no background jobs. The framework handles it all.</SPAN></P><P class="">In this blog series, we will walk through a complete implementation from scratch. We will use a realistic example — a customer master with header information and associated bank accounts — to show how change documents work in practice, and how to build a clean, reusable ABAP class that wraps both the database operations and the change document recording in a single, easy-to-call interface.</P><H2 id="toc-hId-1621665729">What are Change Documents?</H2><P class="">Change Documents are SAP’s built-in audit trail mechanism for custom business objects. When correctly implemented, every time a record in your custom table is created, modified, or deleted, SAP automatically captures:</P><UL class=""><LI>Who made the change — the SAP user name</LI><LI>When the change was made — date and time</LI><LI>Which transaction or program triggered the change</LI><LI>Which fields changed — at field level</LI><LI>What the old value was</LI><LI>What the new value is</LI></UL><P><SPAN>This information is stored across two standard SAP tables that you never need to create or manage yourself.</SPAN></P><H2 id="toc-hId-1425152224">How does the Framework Work?</H2><P class="">The change document framework does not intercept your database calls automatically. You have to call it explicitly. The framework works as follows:<BR />Everything starts with the creation of the Change Document Object. This can be done in ADT or in transaction<SPAN> </SPAN><STRONG>SCDO</STRONG>. Here, you define a named Change Document Object and assign your custom tables to it. Whether the field change will be tracked or not depends on the flag set in the Data Element. In ADT, as soon as you activate the object, it generates a class with a method<SPAN> </SPAN><CODE>WRITE</CODE>. If you are using SAP GUI transaction(<STRONG>SCDO</STRONG>), you have the option to generate either a class or a function module.</P><H2 id="toc-hId-1228638719">Your Responsibility</H2><P class="">The generated class method (<CODE>WRITE</CODE>) does one thing only — it compares the old and new versions of your data that you pass to it, and writes the differences to<SPAN> </SPAN><CODE>CDHDR</CODE><SPAN> </SPAN>and<SPAN> </SPAN><CODE>CDPOS</CODE>.<SPAN> </SPAN><STRONG>It does not touch your Z tables at all.<SPAN> </SPAN></STRONG>That means your code is responsible for two things in the correct order:</P><OL class=""><LI>Write to your Z tables using<SPAN> </SPAN><CODE>INSERT</CODE>,<SPAN> </SPAN><CODE>MODIFY</CODE>, or<SPAN> </SPAN><CODE>DELETE</CODE></LI><LI>Call the generated class method/FM, passing it both the old and new versions of the data</LI></OL><P class=""><SPAN>In the case of a Managed RAP application, the call is handled automatically by the framework. We do have to specify the Change Document Object in the Behaviour Definition.</SPAN></P><P class="">Both operations must happen within the same Logical Unit of Work, so they commit together. If the database update succeeds but the FM call fails, you want a rollback – not a situation where your data changed, but no change document was recorded.</P><P class="">This is the most important point to understand. The method cannot read old values from the database itself — by the time you call it, your<SPAN> </SPAN><CODE>MODIFY</CODE><SPAN> </SPAN>statement may have already overwritten the old data. You must read the old values from the database before making any changes, hold them in memory, and pass them to the FM alongside the new values.</P><P class="">In the case of a Managed RAP application, the call is handled automatically by the framework. We do have to specify the Change Document Object in the Behaviour Definition.</P><H2 id="tables" id="toc-hId-1032125214">Tables</H2><P class="">We are going to work with two tables<SPAN> </SPAN><CODE>ZZCUSTOMER</CODE><SPAN> </SPAN>and<SPAN> </SPAN><CODE>ZZCUSTOMER_BANK</CODE>. This is a typical header item table. I am going to work with UUID as key as I will extend these to the RAP application later. I have used SAP Data Elements for fields. These Data Elements for fields NAME, STREET, CITY, POSTAL_CODE, COUNTRY etc. have ‘Change Document Logging’ checked.</P><pre class="lia-code-sample language-abap"><code>@EndUserText.label : 'Customer'
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #A
@AbapCatalog.dataMaintenance : #RESTRICTED
define table zzcustomer {
key client : abap.clnt not null;
key customer_id : sysuuid_x16 not null;
name : ad_name1;
street : ad_street;
city : ad_city1;
postal_code : ad_pstcd1;
country : land1;
local_created_by : abp_creation_user;
local_created_at : abp_creation_tstmpl;
local_last_changed_by : abp_locinst_lastchange_user;
local_last_changed_at : abp_lastchange_tstmpl;
last_changed_at : abp_lastchange_tstmpl;
}</code></pre><pre class="lia-code-sample language-abap"><code>@EndUserText.label : 'Customer Bank Details'
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #A
@AbapCatalog.dataMaintenance : #RESTRICTED
define table zzcustomer_bank {
key client : abap.clnt not null;
key bankid : sysuuid_x16 not null;
customer_id : sysuuid_x16;
bank_country : banks not null;
bank_key : bankk not null;
bank_account : bankn;
currency : waers;
local_created_by : abp_creation_user;
local_created_at : abp_creation_tstmpl;
local_last_changed_by : abp_locinst_lastchange_user;
local_last_changed_at : abp_lastchange_tstmpl;
last_changed_at : abp_lastchange_tstmpl;
}</code></pre><H2 id="scdo" id="toc-hId-835611709">Change Document Object</H2><P class="">Create Change Document Object in ADT or in transaction SCDO (I’ve used ADT). Add tables<SPAN> </SPAN><CODE>ZZCUSTOMER</CODE><SPAN> </SPAN>and<SPAN> </SPAN><CODE>ZZCUSTOMER_BANK</CODE>. Check ‘Log Multiple Changes’ in both tables. Activate. You will notice it will create a class (<CODE>ZCL_ZZCUSTOMER_CHDO</CODE>) and show it just under the Change Document.</P><H2 id="wrapper" id="toc-hId-639098204">Wrapper Class</H2><P class="">This class acts as a combined repository and audit layer — all database INSERT, MODIFY, DELETE operations on ZZCUSTOMER and ZZCUSTOMER_BANK go through this class, which also records the change document automatically. The caller simply calls the method and then COMMIT WORK.</P><H3 id="toc-hId-571667418">Definition</H3><pre class="lia-code-sample language-abap"><code>CLASS zcl_customer_change_wrapper DEFINITION
PUBLIC
FINAL
CREATE PUBLIC .
PUBLIC SECTION.
METHODS create
IMPORTING
is_hdr TYPE zzcustomer
it_dtl TYPE zzcustomerbank_t
RAISING
cx_sy_open_sql_error.
METHODS update
IMPORTING
is_hdr TYPE zzcustomer
it_dtl TYPE zzcustomerbank_t
RAISING
cx_sy_open_sql_error.
METHODS delete
IMPORTING
iv_customer_id TYPE zzcustomer-customer_id
RAISING
cx_sy_open_sql_error.
PROTECTED SECTION.
PRIVATE SECTION.
METHODS call_write_document
IMPORTING
iv_customer_id TYPE zzcustomer-customer_id
object_change_indicator TYPE if_chdo_object_tools_rel=>ty_cdchngindh
it_hdr_new TYPE zcl_zzcustomer_chdo=>tt_zzcustomer
it_hdr_old TYPE zcl_zzcustomer_chdo=>tt_zzcustomer OPTIONAL
it_dtl_new TYPE zcl_zzcustomer_chdo=>tt_zzcustomer_bank
it_dtl_old TYPE zcl_zzcustomer_chdo=>tt_zzcustomer_bank OPTIONAL.
METHODS read_current_customer
IMPORTING
iv_customer_id TYPE zzcustomer-customer_id
RETURNING
VALUE(rs_hdr) TYPE zzcustomer.
METHODS read_current_customer_bank
IMPORTING
iv_customer_id TYPE zzcustomer-customer_id
RETURNING
VALUE(rt_dtl) TYPE zzcustomerbank_t.
ENDCLASS.</code></pre><H3 id="toc-hId-375153913">Class Implementation</H3><H4 id="toc-hId-307723127">Method<SPAN> </SPAN><CODE>CREATE</CODE></H4><pre class="lia-code-sample language-abap"><code>METHOD create.
SELECT SINGLE customer_id FROM zzcustomer
WHERE customer_id = <a href="https://community.sap.com/t5/user/viewprofilepage/user-id/166162">@IS</a>_hdr-customer_id
INTO <a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1407137">@DATA</a>(lv_exists).
IF sy-subrc = 0.
RAISE EXCEPTION TYPE cx_sy_open_sql_error.
ENDIF.
DATA it_hdr_new TYPE zcl_zzcustomer_chdo=>tt_zzcustomer .
DATA it_dtl_new TYPE zcl_zzcustomer_chdo=>tt_zzcustomer_bank .
APPEND INITIAL LINE TO it_hdr_new ASSIGNING FIELD-SYMBOL(<chgdoc_hdr>).
MOVE-CORRESPONDING is_hdr TO <chgdoc_hdr> .
<chgdoc_hdr>-kz = 'I' .
LOOP AT it_dtl ASSIGNING FIELD-SYMBOL(<new_record>) .
APPEND INITIAL LINE TO it_dtl_new ASSIGNING FIELD-SYMBOL(<chgdoc_dtl>) .
MOVE-CORRESPONDING <new_record> TO <chgdoc_dtl> .
<chgdoc_dtl>-kz = 'I' .
ENDLOOP.
INSERT zzcustomer FROM <a href="https://community.sap.com/t5/user/viewprofilepage/user-id/166162">@IS</a>_hdr.
INSERT zzcustomer_bank FROM TABLE <a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1442952">@IT</a>_dtl.
" Change doc
call_write_document(
object_change_indicator = 'U'
iv_customer_id = is_hdr-customer_id
it_hdr_new = it_hdr_new
it_dtl_new = it_dtl_new ).
ENDMETHOD.</code></pre><P class="">The<SPAN> </SPAN><CODE>object_change_indicator</CODE><SPAN> </SPAN>was passed value ‘U’ instead of ‘I’ to align with how the change document works in RAP.</P><H4 id="toc-hId--386507473">Method<SPAN> </SPAN><CODE>UPDATE</CODE></H4><pre class="lia-code-sample language-abap"><code>METHOD update.
" Read old state from DB before modifying
DATA(ls_hdr_old) = read_current_customer( is_hdr-customer_id ).
DATA(lt_dtl_old) = read_current_customer_bank( is_hdr-customer_id ).
DATA it_hdr_old TYPE zcl_zzcustomer_chdo=>tt_zzcustomer .
DATA it_dtl_old TYPE zcl_zzcustomer_chdo=>tt_zzcustomer_bank .
DATA it_hdr_new TYPE zcl_zzcustomer_chdo=>tt_zzcustomer .
DATA it_dtl_new TYPE zcl_zzcustomer_chdo=>tt_zzcustomer_bank .
APPEND ls_hdr_old TO it_hdr_old .
APPEND LINES OF lt_dtl_old TO it_dtl_old .
APPEND INITIAL LINE TO it_hdr_new ASSIGNING FIELD-SYMBOL(<chgdoc_hdr>).
MOVE-CORRESPONDING is_hdr TO <chgdoc_hdr> .
<chgdoc_hdr>-kz = 'U' .
<chgdoc_hdr>-client = sy-mandt .
LOOP AT it_dtl ASSIGNING FIELD-SYMBOL(<new_record>) .
APPEND INITIAL LINE TO it_dtl_new ASSIGNING FIELD-SYMBOL(<chgdoc_dtl>) .
MOVE-CORRESPONDING <new_record> TO <chgdoc_dtl> .
<chgdoc_dtl>-kz = 'U' .
<chgdoc_dtl>-client = sy-mandt .
ENDLOOP.
MODIFY zzcustomer FROM <a href="https://community.sap.com/t5/user/viewprofilepage/user-id/166162">@IS</a>_hdr.
MODIFY zzcustomer_bank FROM TABLE <a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1442952">@IT</a>_dtl.
" Change doc
call_write_document(
object_change_indicator = 'U'
iv_customer_id = is_hdr-customer_id
it_hdr_new = it_hdr_new
it_hdr_old = it_hdr_old
it_dtl_new = it_dtl_new
it_dtl_old = it_dtl_old ).
ENDMETHOD.</code></pre><H4 id="toc-hId--583020978">Method<SPAN> </SPAN><CODE>DELETE</CODE></H4><pre class="lia-code-sample language-abap"><code>METHOD delete.
"Read old state from DB before modifying
DATA(ls_hdr_old) = read_current_customer( iv_customer_id ).
DATA(lt_dtl_old) = read_current_customer_bank( iv_customer_id ).
DATA it_hdr_old TYPE zcl_zzcustomer_chdo=>tt_zzcustomer .
DATA it_dtl_old TYPE zcl_zzcustomer_chdo=>tt_zzcustomer_bank .
DATA it_hdr_new TYPE zcl_zzcustomer_chdo=>tt_zzcustomer .
DATA it_dtl_new TYPE zcl_zzcustomer_chdo=>tt_zzcustomer_bank .
APPEND ls_hdr_old TO it_hdr_old .
APPEND LINES OF lt_dtl_old TO it_dtl_old .
"Delete detail first, then header (referential integrity)
DELETE FROM zzcustomer WHERE customer_id = <a href="https://community.sap.com/t5/user/viewprofilepage/user-id/591350">@iv</a>_customer_id.
DELETE FROM zzcustomer_bank WHERE customer_id = <a href="https://community.sap.com/t5/user/viewprofilepage/user-id/591350">@iv</a>_customer_id.
" Change doc
call_write_document(
object_change_indicator = 'D'
iv_customer_id = iv_customer_id
it_hdr_new = it_hdr_new
it_hdr_old = it_hdr_old
it_dtl_new = it_dtl_new
it_dtl_old = it_dtl_old ).
ENDMETHOD.</code></pre><H4 id="toc-hId--779534483">Private helpera methods<SPAN> </SPAN><CODE>CALL_WRITE_DOCUMENT</CODE>,<SPAN> </SPAN><CODE>READ_CURRENT_CUSTOMER</CODE>,<SPAN> </SPAN><CODE>READ_CURRENT_CUSTOMER_BANK</CODE></H4><pre class="lia-code-sample language-abap"><code>METHOD call_write_document.
TRY .
zcl_zzcustomer_chdo=>write(
EXPORTING
objectid = CONV cdobjectv( iv_customer_id )
tcode = sy-tcode
utime = sy-uzeit
udate = sy-datum
username = sy-uname
object_change_indicator = object_change_indicator
xzzcustomer = it_hdr_new
yzzcustomer = it_hdr_old
upd_zzcustomer = 'U'
xzzcustomer_bank = it_dtl_new
yzzcustomer_bank = it_dtl_old
upd_zzcustomer_bank = 'U'
IMPORTING
changenumber = DATA(change_number)
).
CATCH cx_chdo_write_error.
ENDTRY.
ENDMETHOD.
METHOD read_current_customer_bank.
SELECT * FROM zzcustomer_bank
WHERE customer_id = <a href="https://community.sap.com/t5/user/viewprofilepage/user-id/591350">@iv</a>_customer_id
INTO TABLE <a href="https://community.sap.com/t5/user/viewprofilepage/user-id/30203">@RT</a>_dtl.
ENDMETHOD.
METHOD read_current_customer.
SELECT SINGLE * FROM zzcustomer
WHERE customer_id = <a href="https://community.sap.com/t5/user/viewprofilepage/user-id/591350">@iv</a>_customer_id
INTO <a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1384862">@RS</a>_hdr.
ENDMETHOD.</code></pre><H2 id="toc-hId--389241974">Usage Example</H2><H3 id="toc-hId--879158486">Testing: Create a New Customer</H3><pre class="lia-code-sample language-abap"><code>DATA: current_time TYPE timestampl,
customer_id TYPE zzcustomer-customer_id,
bank_id TYPE zzcustomer_bank-bankid.
GET TIME STAMP FIELD current_time.
"Get UUIDs for keys
customer_id = cl_system_uuid=>create_uuid_x16_static( ).
bank_id = cl_system_uuid=>create_uuid_x16_static( ).
DATA(lo_cust) = NEW zcl_customer_change_wrapper( ).
lo_cust->create(
is_hdr = VALUE zzcustomer(
customer_id = customer_id
name = 'ABC Company'
street = 'Long Street'
city = 'London'
postal_code = 'EC10 5GH'
country = 'GB'
local_created_by = sy-uname
local_created_at = current_time
local_last_changed_by = sy-uname
local_last_changed_at = current_time
last_changed_at = current_time
)
it_dtl = VALUE zzcustomerbank_t(
( bankid = bank_id
customer_id = customer_id
bank_country = 'GB'
bank_key = '123456'
bank_account = '123456789'
currency = 'GBP'
local_created_by = sy-uname
local_created_at = current_time
local_last_changed_by = sy-uname
local_last_changed_at = current_time
last_changed_at = current_time
)
)
).
COMMIT WORK.</code></pre><P><SPAN>Check table </SPAN><CODE>ZZCUSTOMER</CODE><SPAN>, </SPAN><CODE>ZZCUSTOMER_BANK</CODE><SPAN>, </SPAN><CODE>CDHDR</CODE><SPAN> and </SPAN><CODE>CDPOS</CODE><SPAN>.</SPAN></P><H3 id="toc-hId--1075671991">Testing: Update Customer</H3><pre class="lia-code-sample language-abap"><code>DATA: current_time TYPE timestampl.
GET TIME STAMP FIELD current_time.
DATA(lo_cust) = NEW zcl_customer_change_wrapper( ).
"Get customer_id and bank_id UUIDs from table ZZCUSTOMER and ZZCUSTOMER_BANK
lo_cust->update(
is_hdr = VALUE zzcustomer(
customer_id = '005056A3C6531FD18AECAF7C7E10D978'
name = 'XYZ Company' "<< Change
street = 'New Long Street' "<< Change
city = 'London'
postal_code = 'EC10 5GH'
country = 'GB'
local_created_by = sy-uname
local_created_at = current_time
local_last_changed_by = sy-uname
local_last_changed_at = current_time
last_changed_at = current_time
)
it_dtl = VALUE #(
( bankid = '005056A3C6531FD18AECAF7C7E10F978'
customer_id = '005056A3C6531FD18AECAF7C7E10D978'
bank_country = 'GB'
bank_key = '30-40-50' "<< Change
bank_account = '123456789'
currency = 'GBP'
local_created_by = sy-uname
local_created_at = current_time
local_last_changed_by = sy-uname
local_last_changed_at = current_time
last_changed_at = current_time
)
)
).
COMMIT WORK.</code></pre><P><SPAN>Check table </SPAN><CODE>ZZCUSTOMER</CODE><SPAN>, </SPAN><CODE>ZZCUSTOMER_BANK</CODE><SPAN>, </SPAN><CODE>CDHDR</CODE><SPAN> and </SPAN><CODE>CDPOS</CODE><SPAN>.</SPAN></P><H3 id="toc-hId--1272185496">Testing: Delete Customer</H3><pre class="lia-code-sample language-abap"><code>DATA(lo_cust) = NEW zcl_customer_change_wrapper( ).
"Get customer_id UUID from table ZZCUSTOMER
lo_cust->delete( iv_customer_id = '005056A3C6531FD18AECAF7C7E10D978' ) .
COMMIT WORK.</code></pre><P><SPAN>Check table </SPAN><CODE>ZZCUSTOMER</CODE><SPAN>, </SPAN><CODE>ZZCUSTOMER_BANK</CODE><SPAN>, </SPAN><CODE>CDHDR</CODE><SPAN> and </SPAN><CODE>CDPOS</CODE><SPAN>.</SPAN></P><H2 id="toc-hId--1175295994">Conclusion</H2><P>Implementing a reliable audit trail doesn't require complex custom logging logic or performance-heavy database triggers. As shown in this guide, leveraging SAP’s standard <STRONG>Change Document Framework (<CODE>SCDO</CODE>)</STRONG> gives you a robust, compliant, and optimized solution right out of the box.</P><P>By wrapping both the database persistence layers (<CODE>INSERT</CODE>, <CODE>MODIFY</CODE>, <CODE>DELETE</CODE>) and the tracking mechanisms inside a single <STRONG>ABAP wrapper class</STRONG>, we successfully encapsulate the business logic. This pattern ensures that:</P><UL><LI><P><STRONG>Data consistency</STRONG> is maintained via atomic operations (both the Z-tables and the CD tables update within the same Logical Unit of Work).</P></LI><LI><P><STRONG>Code reusability</STRONG> is enhanced, hiding the boilerplate logic of tracking old vs. new memory states from caller programs.</P></LI><LI><P><STRONG>Future readiness</STRONG> is built-in, paving a clean path if you decide to extend these custom tables into a Managed RAP (RESTful Application Programming) architecture down the line.</P></LI></UL><P>With <CODE>CDHDR</CODE> and <CODE>CDPOS</CODE> tracking your field-level changes seamlessly behind the scenes, answering "who changed what, and when" becomes a trivial task rather than a development headache.</P>2026-07-09T17:19:07.404000+02:00https://community.sap.com/t5/technology-blog-posts-by-sap/start-remote-process-actions-in-btp-abap-via-task-chains-from-sap/ba-p/14440248Start remote Process/Actions in BTP ABAP via Task Chains from SAP Datasphere2026-07-14T16:00:19.634000+02:00stefan_geiselhart2https://community.sap.com/t5/user/viewprofilepage/user-id/200897<P>Modern cloud architectures allow for versatile and open interoperability. So does SAP Datasphere and SAP BTP ABAP, too. This example outlines some essentials how Datasphere can kick-off actions defined on the ABAP Cloud side, beyond system boundaries.</P><P>Starting a Task/Process in BTP ABAP remotely from SAP Datasphere using Task Chains opens up new scenarios for interoperability and integration. The goal is to orchestrate remote tasks initiated by SAP Datasphere — securely, programmatically, and fully automated.</P><P><U>We will cover the below points:</U></P><UL><LI>Creating a Task Chain in Datasphere including an API Call to ABAP Cloud</LI><LI>Connection in Datasphere to ABAP Cloud (for direct API call)</LI><LI>Setting up Communication System & Arrangement in ABAP Cloud</LI><LI>Executing the Task Chain in Datasphere: Trigger actions in ABAP Cloud</LI></UL><P> </P><H1 id="toc-hId-1690856170">1 Architecture Overview</H1><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Architecture" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/432878i8F8239641A83E39B/image-size/large?v=v2&px=999" role="button" title="abap_dsp_integration.png" alt="Architecture" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Architecture</span></span></P><P>The SAP Datasphere Task Chain API Task: Datasphere acts as the caller. ABAP Cloud exposes an endpoint (inbound Web Api) to trigger an action.</P><P>Option (2) and (3) complete the picture of possible solution approaches. Main differences as well as pros & cons are outlined further down in one of the last sections.</P><P><I>The Solution Architecture displays 3 different options:</I></P><UL><LI><STRONG>(1) Use Direct API Integration</STRONG> </LI><UL><LI>Straightforward</LI><LI>Minimal cost and complexity</LI><LI>Perfect for nightly batch orchestration, event-driven data loads, or simple API-driven analytical data refresh</LI></UL><LI><STRONG>(2) Integration Suite</STRONG></LI><UL><LI>Integration involves complex message transformations, protocol mediation, multiple target systems, or when centralized API governance and monitoring across the enterprise are required.</LI><LI>Especially appropriate where iFlow reusability justifies the additional cost and setup effort or when integration suite is already in place and a common tool.</LI></UL><LI><STRONG>(3) CAP Application </STRONG></LI><UL><LI>Custom application logic is needed beyond what a direct API call/iFlow can provide</LI><LI>E.g. multi-source data aggregation, advanced parsing, enrichments</LI><LI>Additional persistence required</LI><LI>Well-suited for reusable microservice-style integrations on BTP</LI></UL></UL><P> </P><H1 id="toc-hId-1494342665">2 Prerequisites</H1><P>You need</P><OL><LI>SAP Datasphere tenant with developer + admin access</LI><LI>Task Chain to design the flow of events</LI><LI>SAP BTP ABAP Environment (ABAP Cloud) with developer access</LI><LI>BTP ABAP: Authorization for OAuth clients, Communication Arrangements, ABAP development of Web APIs</LI></OL><P> </P><H1 id="toc-hId-1297829160"> 3 Creating Communication Artifacts in ABAP Cloud</H1><P><I>Navigation: </I>ABAP Environment Web Access → Communication Management → Communication Systems/Arrangements</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="AC01.png" style="width: 671px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/432907iB6C9E9BC32BA5CD0/image-size/large?v=v2&px=999" role="button" title="AC01.png" alt="AC01.png" /></span></P><P>Communication Arrangement</P><P> </P><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Communication Arrangement" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/432919iAEFA982FB72455BD/image-size/large?v=v2&px=999" role="button" title="AC_arr_02.png" alt="Communication Arrangement" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Communication Arrangement</span></span></DIV><P>Communication System</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="comm_system2.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/433139i221029C9DC96B65D/image-size/large?v=v2&px=999" role="button" title="comm_system2.png" alt="comm_system2.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Communication System 1" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/432920i37EA414883B4DF96/image-size/large?v=v2&px=999" role="button" title="AC_cs_03.png" alt="Communication System 1" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Communication System 1</span></span></P><P><STRONG>Communication/Connection User:</STRONG></P><P>Create a User for Inbound Communication and use the same in the subsequent step on Datasphere level for the creation of a generic HTTP connection.</P><P> </P><H1 id="toc-hId-1101315655">4 ABAP Cloud Artifacts</H1><P>For the sake of simplicity I won't go into the details of all of the development artifacts and configuration settings.</P><P>For sure, you will create:</P><UL><LI>Inbound Service</LI><LI>Service Binding</LI><LI>Communication Scenario BTP ABAP</LI><LI>Service Definition</LI><LI>Entity</LI><LI>Class implementation</LI></UL><P>An example of an action definition processData (ZI_DEMO_SERVICE):</P><pre class="lia-code-sample language-abap"><code>managed implementation in class zbp_i_demo_service unique;
define behavior for ZI_DEMO_SERVICE alias DemoService
persistent table zdemoservice
lock master
{
field ( readonly ) Id;
field ( numbering : managed ) Id;
create;
update;
delete;
action processData result [1] zdemoservice;
mapping for zdemoservice
{
Id = id;
Name = name;
Description = description;
Status = status;
CreatedBy = created_by;
CreatedAt = created_at;
LastChangedBy = last_changed_by;
LastChangedAt = last_changed_at;
LocalLastChanged = local_last_changed;
}
}</code></pre><P>An example of an ABAP Class with an action implementation:</P><pre class="lia-code-sample language-abap"><code>CLASS lhc_DemoService DEFINITION INHERITING FROM cl_abap_behavior_handler.
PUBLIC SECTION.
PRIVATE SECTION.
METHODS processData FOR MODIFY
IMPORTING keys FOR ACTION DemoService~processData result result.
ENDCLASS.
CLASS lhc_DemoService IMPLEMENTATION.
METHOD processData.
" Your business logic implementation her
ENDMETHOD.
ENDCLASS.</code></pre><P>Service Definition:</P><pre class="lia-code-sample language-abap"><code>@EndUserText.label: 'Demo Service Definition'
define service ZUI_DEMO_SERVICE {
expose ZC_DEMO_SERVICE as DemoService;
}</code></pre><P>Inbound Service:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="inbound_serv.png" style="width: 464px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/432934i5E0A8AD179502CAF/image-size/large?v=v2&px=999" role="button" title="inbound_serv.png" alt="inbound_serv.png" /></span></P><P>Communication Scenario:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="comm_scen.png" style="width: 856px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/432932i4BA90F026F4EDA33/image-size/large?v=v2&px=999" role="button" title="comm_scen.png" alt="comm_scen.png" /></span></P><P> </P><H1 id="toc-hId-904802150">5 Create a Connection</H1><P>The first step is creating a generic HTTP connection to the endpoint exposed by ABAP Cloud. In order to do so, consider the following details. Take the connection host from the BTP ABAP instance key. The credentials must be taken from the connection user as defined in the communication arrangement.</P><P> </P><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="connection_dsp.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/432911iDB1F955E4271E5E1/image-size/medium?v=v2&px=400" role="button" title="connection_dsp.png" alt="connection_dsp.png" /></span></DIV><P>An alternative to Username/Password is an OAuth based authentication mechanism. </P><P> </P><H1 id="toc-hId-708288645">6 Creating a Task Chain in SAP Datasphere</H1><P>The first step is defining a Task Chain that encapsulates the processing logic you want to execute .</P><P>In the given example:</P><UL><LI>The Task Chain starts with a API Task</LI><LI>Sends an email in case of success</LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Task Chain" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/432899i09D40BB9BF22D881/image-size/medium?v=v2&px=400" role="button" title="TC01.png" alt="Task Chain" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Task Chain</span></span></P><P><I>In the API Task details, define the following:</I></P><UL><LI><I>Method POST</I></LI><LI><I>API Path - the path to the service endpoint of your ABAP Web API that you want to trigger</I></LI><LI><I>Mode Synchronous</I></LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="API Task Details 1" style="width: 440px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/432900iFF0930533C259D5F/image-size/large?v=v2&px=999" role="button" title="TC02.png" alt="API Task Details 1" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">API Task Details 1</span></span></P><DIV class=""> </DIV><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="TC03.png" style="width: 460px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/432937iF3BCF25B02797E5E/image-size/large?v=v2&px=999" role="button" title="TC03.png" alt="TC03.png" /></span></P><P>Make sure to fetch the CSRF Token. The URL which I've used is simply the $metadata path of the service endpoint:</P><P><A href="https://%3cABAP_HOST%3e.abap.eu10.hana.ondemand.com/sap/opu/odata/sap/ZUI_DEMO_SERVICE_O4/$metadata" target="_blank" rel="noopener nofollow noreferrer">https://<ABAP_HOST>.abap.eu10.hana.ondemand.com/sap/opu/odata/sap/ZUI_DEMO_SERVICE_O4/$metadata</A></P><P> </P><H1 id="toc-hId-511775140">7 Execution Results</H1><P>The Task Chain in Datasphere successfully executed the ABAP Web API call:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Task Chain API successfully executed" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/432916i7B2C20887B641D53/image-size/large?v=v2&px=999" role="button" title="TC_EXEC.png" alt="Task Chain API successfully executed" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Task Chain API successfully executed</span></span></P><P>For monitoring and troubleshooting purpose, individual API calls can be traced from BTP ABAP side. The HTTP trace can be turned on for granular levels.</P><P> </P><H1 id="toc-hId-315261635">8 Solution Options - Comparisons</H1><P>The following comparison outlines the key aspects per solution/architecture option as depicted in the initial architecture diagram. I have prototyped all of the below and all options are working flawlessly. Especially w.r.t. to the CAP based solution, there is a wide open room to play with.</P><P> </P><TABLE><TBODY><TR><TD><P>Option</P></TD><TD><P>Pros (+)</P></TD><TD><P>Cons (-)</P></TD></TR><TR><TD><P><STRONG>(1) Direct API</STRONG></P></TD><TD><UL><LI>Simplest setup & fewest components & lowest cost</LI><LI>No middleware latency</LI><LI>Lightweight and developer-friendly</LI></UL></TD><TD><UL><LI>Limited transformation capability</LI><LI>Less suitable for multi-step or conditional routing logic</LI></UL></TD></TR><TR><TD><P><STRONG>(2) Integration Suite</STRONG></P></TD><TD><UL><LI>Supports complex transformations, multiple protocols and error handling in iFlows</LI><LI>Centralized API governance via API Management</LI><LI>Recommended for complex mediated flows</LI></UL></TD><TD><UL><LI>Two-step connectivity required (Integration Suite + Datasphere)</LI><LI>Additional licensing cost</LI><LI>Higher setup and maintenance effort</LI></UL></TD></TR><TR><TD><P><STRONG>(3) CAP CF App</STRONG></P></TD><TD><UL><LI>Maximum flexibility for custom logic (parsing, filtering, enrichment, retry)</LI><LI>CAP integrates natively with HANA Cloud/Datasphere HDI</LI><LI>Supports secure credential management</LI><LI>Reusable microservice pattern</LI></UL></TD><TD><UL><LI>Requires application development and BTP CF deployment skills</LI><LI>Higher operational overhead</LI><LI>More BTP resource consumption</LI><LI>CAP app lifecycle must be managed independently</LI></UL></TD></TR></TBODY></TABLE><P> </P><H1 id="toc-hId-118748130">9 Conclusion/Outlook & Further aspects:</H1><P>Overview of the major building blocks:</P><TABLE><TBODY><TR><TD><P>Capability</P></TD><TD><P>Result</P></TD></TR><TR><TD><P>No hardcoded secrets</P></TD><TD><P>via Communication Arrangements/System</P></TD></TR><TR><TD><P>Remote orchestration</P></TD><TD><P>Creating an end-to-end orchestrated chain of tasks, bidirectional if required</P></TD></TR><TR><TD><P>Cloud-native ABAP</P></TD><TD><P>Using appropriate ABAP Class APIs</P></TD></TR><TR><TD><P>Datasphere automation</P></TD><TD><P>Using Task Chain API</P></TD></TR></TBODY></TABLE><P> </P><P><STRONG>Use Cases that the implementation enables:</STRONG></P><UL><LI>Nightly batch orchestration</LI><LI>Event-driven data loads</LI><LI>Cross-system workflows (this was our ultimate focus)</LI><LI>API-driven (transactional/analytical) data refresh</LI></UL><P><STRONG>Limitations:</STRONG></P><UL><LI>The Task Chain/API Task can't be parameterized dynamically with runtime parameters to e.g. initiate calls that have a variable payload in header or body</LI><LI>Moreover, the write-back/storing of HTTP responses is limited too</LI></UL><P><STRONG>References:</STRONG></P><UL><LI>SAP Datasphere Task Chain API Documentation: <A href="https://api.sap.com/api/DatasphereTasks/overview" target="_blank" rel="noopener noreferrer">https://api.sap.com/api/DatasphereTasks/overview</A></LI><LI>SAP Datasphere Task Chain Help Page: <A href="https://help.sap.com/docs/SAP_DATASPHERE/c8a54ee704e94e15926551293243fd1d/274f2736465c4c48a091c675880502a2.html?locale=en-US" target="_blank" rel="noopener noreferrer">https://help.sap.com/docs/SAP_DATASPHERE/c8a54ee704e94e15926551293243fd1d/274f2736465c4c48a091c67588...</A></LI></UL><P>This blog entry complements my other blog on <A href="https://community.sap.com/t5/technology-blog-posts-by-sap/triggering-sap-datasphere-bdc-task-chains-from-sap-btp-abap-cloud-using-the/ba-p/14325528" target="_blank">Triggering SAP Datasphere/BDC Task Chains from SAP BTP ABAP Cloud using the Task Chain REST API</A>.</P><P>In case of questions feel free to raise them and please leave a comment if you found something incorrect - thanks for any help on that. I'm hoping this blog can support somebody out there and may facilitate some problem solving.</P>2026-07-14T16:00:19.634000+02:00https://community.sap.com/t5/abap-blog-posts/the-paging-catastrophe/ba-p/14442948The paging catastrophe2026-07-20T05:50:04.703000+02:00josealbahttps://community.sap.com/t5/user/viewprofilepage/user-id/885577<P><ul =""><li style="list-style-type:disc; margin-left:15px; margin-bottom:1px;"><a href="https://community.sap.com/t5/abap-blog-posts/the-paging-catastrophe/ba-p/14442948#toc-hId-1820005198">Introduction</a></li><li style="list-style-type:disc; margin-left:15px; margin-bottom:1px;"><a href="https://community.sap.com/t5/abap-blog-posts/the-paging-catastrophe/ba-p/14442948#toc-hId-1623491693">Context</a></li><li style="list-style-type:disc; margin-left:15px; margin-bottom:1px;"><a href="https://community.sap.com/t5/abap-blog-posts/the-paging-catastrophe/ba-p/14442948#toc-hId-1426978188">Case 1: No BTP pre-filtering or post-filtering</a></li><li style="list-style-type:disc; margin-left:15px; margin-bottom:1px;"><a href="https://community.sap.com/t5/abap-blog-posts/the-paging-catastrophe/ba-p/14442948#toc-hId-837437673">Case 2: BTP post-filtering</a></li><li style="list-style-type:disc; margin-left:15px; margin-bottom:1px;"><a href="https://community.sap.com/t5/abap-blog-posts/the-paging-catastrophe/ba-p/14442948#toc-hId-247897158">Case 3: BTP pre-filtering</a></li><li style="list-style-type:disc; margin-left:15px; margin-bottom:1px;"><a href="https://community.sap.com/t5/abap-blog-posts/the-paging-catastrophe/ba-p/14442948#toc-hId-5611000">Case 4: Split BTP pre-filtering</a></li><li style="list-style-type:disc; margin-left:15px; margin-bottom:1px;"><a href="https://community.sap.com/t5/abap-blog-posts/the-paging-catastrophe/ba-p/14442948#toc-hId--583929515">Conclusions</a></li></ul></P><H2 id="Introduction" id="toc-hId-1820005198">Introduction</H2><P>In the late 19th century, the scientific community started to face unexpected issues, some of them quite serious, upon proven experiments for which no accepted formula was able to produce reasonable prediction or explanation. This originated the entire collapse of the current physics, now called ‘classic physics’, into a new frame ignited by the quantum mechanics. The game-changing problem was named ‘the ultraviolet catastrophe’.</P><P>Similarly to what happened back then –hopefully less ontologically problematic–, the SAP transition from classic to Fiori-oriented development brings about some anomalies not especially easy to overcome without a systemic revolution of the technology itself. One of the problems we have experienced regards the paging mechanism when rendering a Fiori list report via back-end OData service.</P><H2 id="toc-hId-1623491693">Context</H2><P>Let’s assume the following scenario:</P><OL class=""><LI><P>On-premise OData service.</P></LI><LI><P>BTP Fiori list report application consuming the back-end service via custom entity.</P><OL class=""><LI><P>Respecting the Clean Core principles, the report combines information from the back-end –only read–, and local BTP tables. To ensure integrity, the key fields are the same on both sides.</P></LI><LI><P>Consequently, the selection filters can refer to both back-end and BTP fields.</P></LI></OL></LI><LI><P>The BTP application, fields and tables underneath dominate the entire execution engine. This is to say, BTP-located filtering, if any, must lead the back-end selection.</P></LI></OL><H2 id="Case-1:-No-BTP-pre-filtering-or-post-filtering" id="toc-hId-1426978188">Case 1: No BTP pre-filtering or post-filtering</H2><H3 id="Scenario" id="toc-hId-1359547402">Scenario</H3><P>No BTP-located filter fields are set, so there is no need to implement BTP filtering before or after the service call. In real executions, this is not very likely to happen, but anyway interesting to start exposing the problem.</P><H3 id="Behaviour" id="toc-hId-1163033897">Behaviour</H3><P><SPAN class="">All pages are correctly delivered through scrolling. Considering </SPAN><EM><SPAN class="">n</SPAN></EM><SPAN class=""> items are hit in the back-end, when reaching the last page, all of them are rendered.</SPAN></P><P class="lia-align-center" style="text-align: center;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="josealba_5-1784278865631.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434211iFDF9E2619F66EA26/image-size/large?v=v2&px=999" role="button" title="josealba_5-1784278865631.png" alt="josealba_5-1784278865631.png" /></span></P><H2 id="Case-2:-BTP-post-filtering" id="toc-hId-837437673">Case 2: BTP post-filtering</H2><H3 id="Scenario.1" id="toc-hId-770006887">Scenario</H3><P>Here, BTP-located filter fields are set. The idea is to retrieve matching information from the back-end and, next, filter by the BTP conditions.</P><H3 id="Behaviour.1" id="toc-hId-573493382">Behaviour</H3><P>If the page is not reduced during the post filtering, i.e., no line is impacted by the BTP filtering, then it is correctly shown and the scroll for the next one continues to be enabled.</P><P><SPAN class="">Else, if the page size is reduced, the system considers it is the last so no more scrolling is enabled; even trying to scroll down no more service calls are run. The page cropping leads then to missing information.</SPAN></P><P><SPAN class=""><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="josealba_6-1784278941276.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434214i37D72D2BEA2A5266/image-size/large?v=v2&px=999" role="button" title="josealba_6-1784278941276.png" alt="josealba_6-1784278941276.png" /></span></SPAN></P><H2 id="Case-3:-BTP-pre-filtering" id="toc-hId-247897158">Case 3: BTP pre-filtering</H2><H3 id="Scenario.2" id="toc-hId-180466372">Scenario</H3><P>If the post-filtering does not work, why not first filter in BTP and then use the key fields to retrieve from the back-end only exactly what is needed?</P><H3 id="Behaviour.2" id="toc-hId--91278502">Behaviour</H3><P>Here, <EM>x </EM>items are pre-filtered in BTP. If, additionally, back-end filtering is set, the final number of retrieved items, say <EM>n</EM>, can potentially be less than <EM>x</EM>.</P><P><SPAN class="">Anyway, the strategy seems finely focused but the problem arises when too many items are pre-filtered so the URL to call the service is too long to be accepted and leads to an exception.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="josealba_7-1784279009939.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434249i2BA5B20A471CF36A/image-size/large?v=v2&px=999" role="button" title="josealba_7-1784279009939.png" alt="josealba_7-1784279009939.png" /></span></P><H2 id="Case-4:-Split-BTP-pre-filtering" id="toc-hId-5611000">Case 4: Split BTP pre-filtering</H2><H3 id="Scenario.3" id="toc-hId--484305512">Scenario</H3><P>Considering some trust was put in the previous step, maybe we could split the filtering and manually call the service in small packages to avoid problems with the URL.</P><H3 id="Behaviour.3" id="toc-hId--680819017">Behaviour</H3><P>To avoid the cropped page problem, the main purpose is to always build complete pages to keep the execution alive; otherwise, it stops. The challenge is to seamlessly advance through packages as if no additional calls were executed.</P><P>In BTP, <EM>x </EM>items are filtered and supposed to be sent to the back-end. The URL length is first checked:</P><UL class=""><LI><P><SPAN class="">If it is short enough to be accepted, then no split is needed and the call can be executed as conventionally.</SPAN></P></LI><LI><P>In other case, the logic will split the <EM>x </EM>items into small packages of <EM>s</EM>; the package size must be greater than the page size so as to avoid the scroll disabling.</P></LI></UL><P><SPAN class="">For the first call, the </SPAN><EM><SPAN class="">s</SPAN></EM><SPAN class=""> items hit </SPAN><EM><SPAN class="">n</SPAN></EM><SPAN class=""> back-end items, so the report counter shows </SPAN><EM><SPAN class="">n </SPAN></EM><SPAN class="">as the total number of items, but this value is not correct, as there are more items waiting to be sent.</SPAN></P><P>By scrolling down, the complete list of <EM>n </EM>items related to the first package is delivered correctly, so for now no need to process other packages.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="josealba_8-1784279068283.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434251iDE0BA053E8F420A2/image-size/large?v=v2&px=999" role="button" title="josealba_8-1784279068283.png" alt="josealba_8-1784279068283.png" /></span></P><P>If the current page size is less than the determined size, i.e., if the page is cropped, this means we have reached the end of the package, so the next one can be processed.</P><P>The next package is then processed making sure the <EM>skip </EM>is reset to retrieve all back-end hits from the beginning. The cropped page is then completed with <EM>p - q</EM> items from the new package.</P><P><SPAN class="">For next page the </SPAN><EM><SPAN class="">skip</SPAN></EM><SPAN class=""> is automatically set to the page size and because there is no option to keep track of the actual index we are in –stateless processing–, a gap of missing information can occur.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="josealba_9-1784279104507.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434268i12DD7D483E4B3B5E/image-size/large?v=v2&px=999" role="button" title="josealba_9-1784279104507.png" alt="josealba_9-1784279104507.png" /></span></P><H2 id="Conclusions" id="toc-hId--583929515"><STRONG>Conclusions</STRONG></H2><P>The development of BTP reports via custom entities where local filtering is supposed to restrain the information coming from the back-end introduces a series of problems not easy to overcome. Business may claim classic development where all the data and logic was set on-premise did not carry this type of problems.</P><P>As it happened to physics, the transition to modern SAP development presents by comparison some obstacles for which quick adaptation is needed. The answer to this problem, something like quantum mechanics in our recurrent reference, goes through using a more powerful technology; for the time being, <U>external entities based on HANA virtual tables are the best alternative to avoid the paging catastrophe</U>.</P>2026-07-20T05:50:04.703000+02:00https://community.sap.com/t5/abap-blog-posts/parallel-processing-in-abap-using-spta-framework/ba-p/14422007Parallel Processing in ABAP using SPTA Framework2026-07-20T05:53:27.534000+02:00Bikash_Rhttps://community.sap.com/t5/user/viewprofilepage/user-id/1527809<P><STRONG><SPAN>Introduction:</SPAN></STRONG></P><P class=""><SPAN>During my SAP ABAP development experience, I have worked on reports and interfaces that process large volumes of business data. One challenge I frequently noticed is that even well-written ABAP programs can become slow when they process thousands of records sequentially. As data volume grows, runtime increases significantly, affecting overall system performance and the user experience.</SPAN></P><P class=""><SPAN>While exploring different performance optimization techniques, I came across the </SPAN><STRONG><SPAN>SPTA (SAP Parallel Task Administration)</SPAN></STRONG><SPAN> framework. What interested me most was that SAP already provides a standard mechanism to execute workloads in parallel instead of requiring developers to build a custom parallel processing solution from scratch. The framework takes care of distributing work packets, managing parallel tasks, utilizing available work processes, and collecting the results after processing is complete.</SPAN></P><P class=""><SPAN>To better understand how SPTA works internally, I built a simple prototype instead of directly using a business scenario. The example generates random data, splits it into multiple work packets, processes each packet in parallel, and finally combines the results. This hands-on exercise helped me understand the complete flow of parallel processing and how the framework manages task execution behind the scenes.</SPAN></P><P><SPAN>In this blog, I will walk through the same example step by step, explain the key components involved, and share the learnings I gained while implementing the SPTA framework. I hope this practical approach helps anyone who is getting started with parallel processing in SAP ABAP.</SPAN></P><P><STRONG><SPAN>What is SPTA Framework?</SPAN></STRONG></P><P><SPAN>SPTA is a standard SAP framework designed to execute independent units of work in parallel. It internally manages:</SPAN><SPAN> </SPAN></P><UL><LI><SPAN>Allocation of available work processes</SPAN><SPAN> </SPAN></LI></UL><UL><LI><SPAN>Load balancing across application servers</SPAN><SPAN> </SPAN></LI></UL><UL><LI><SPAN>Asynchronous RFC execution</SPAN><SPAN> </SPAN></LI></UL><UL><LI><SPAN>Work packet management</SPAN><SPAN> </SPAN></LI></UL><UL><LI><SPAN>Error handling and task synchronization</SPAN><SPAN> </SPAN></LI></UL><UL><LI><SPAN>Collection of results after task completion</SPAN><SPAN> </SPAN></LI></UL><P><SPAN>Instead of manually creating asynchronous RFC tasks using </SPAN><SPAN>STARTING NEW TASK</SPAN><SPAN>, developers can leverage the SPTA framework to simplify implementation and improve maintainability.</SPAN></P><P><STRONG><SPAN>Solution Overview-</SPAN></STRONG><SPAN> </SPAN></P><P><STRONG><SPAN>The program follows the below execution flow:</SPAN></STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Bikash_R_0-1782990587165.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/428494i10DA583186CD69F3/image-size/large?v=v2&px=999" role="button" title="Bikash_R_0-1782990587165.png" alt="Bikash_R_0-1782990587165.png" /></span></P><P><SPAN><SPAN class=""><SPAN class="">The framework repeatedly executes </SPAN><SPAN class="">these callback</SPAN><SPAN class=""> routines until all records are processed.</SPAN></SPAN><SPAN class=""><BR /></SPAN></SPAN></P><pre class="lia-code-sample language-abap"><code>TYPE-POOLS: spta.
TYPES: BEGIN OF ty_final,
number TYPE char3,
index TYPE char3,
END OF ty_final.
TYPES: BEGIN OF ztest_random_data,
number TYPE char3,
index TYPE char3,
END OF ztest_random_data.
TYPES ztest_random_data_t TYPE STANDARD TABLE OF ztest_random_data
WITH EMPTY KEY.
DATA:
it_random TYPE ztest_random_data_t,
it_final TYPE STANDARD TABLE OF ty_final,
v_max_no_of_tasks TYPE syindex.
* Create random numbers
PERFORM f_create_random_no.
* Write random numbers before calling parallel processing
PERFORM f_write_random_rec.
"Fetch the server group
SELECT SINGLE classname
INTO <a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1407137">@DATA</a>(lv_server_grp)
FROM rzllitab
WHERE grouptype = 'S'.
IF sy-subrc NE 0.
RETURN.
ENDIF.
* Calling the function module to invoke parallel processing
* framwork
CALL FUNCTION 'SPTA_PARA_PROCESS_START_2'
EXPORTING
server_group = lv_server_grp
before_rfc_callback_form = 'BEFORE_RFC'
in_rfc_callback_form = 'IN_RFC'
after_rfc_callback_form = 'AFTER_RFC'
callback_prog = 'ZTEST_SPTA_FRAME_WORK'
CHANGING
user_param = it_random
EXCEPTIONS
invalid_server_group = 1
no_resources_available = 2
OTHERS = 3.
*&---------------------------------------------------------------------*
*& Form BEFORE_RFC
*&---------------------------------------------------------------------*
* In this routine work packets are prepared for parallel processing *
* also check the variable for downstream processing *
*----------------------------------------------------------------------*
FORM before_rfc
USING is_before_rfc_imp TYPE spta_t_before_rfc_imp
CHANGING es_before_rfc_exp TYPE spta_t_before_rfc_exp
it_rfcdata TYPE spta_t_indxtab
ct_failed_objects TYPE spta_t_failed_objects
et_objects_in_process TYPE spta_t_objects_in_process
it_data TYPE ztest_random_data_t.
DATA: l_counter TYPE i,
l_no_of_items TYPE i,
it_final TYPE ztest_random_data_t,
wa_data TYPE ztest_random_data.
* Create small work packets for parallel processing
* This is custom logic
l_no_of_items = 10. " One work packet will contain 10 records
LOOP AT it_data INTO wa_data.
* Read and move specified number of records
IF ( l_counter < l_no_of_items
AND wa_data IS NOT INITIAL ).
APPEND wa_data TO it_final.
DELETE it_data INDEX 1.
l_counter = l_counter + 1.
ELSE.
EXIT.
ENDIF.
ENDLOOP.
* Convert the input data into the INDX structure that is needed for the RFC
CALL FUNCTION 'SPTA_INDX_PACKAGE_ENCODE'
EXPORTING
data = it_final
IMPORTING
indxtab = it_rfcdata.
* This is mandatory step
* inform task manager that an rfc can be started from the data compiled
IF it_final IS NOT INITIAL.
es_before_rfc_exp-start_rfc = 'X'.
ELSE.
CLEAR es_before_rfc_exp-start_rfc.
RETURN.
ENDIF.
ENDFORM. " BEFORE_RFC_CALLBACK_FORM
*&---------------------------------------------------------------------*
*& Form IN_RFC
*&---------------------------------------------------------------------*
* In this routine create own RFC enabled FM or write logic in this *
* routine *
*----------------------------------------------------------------------*
FORM in_rfc
USING is_in_rfc_imp TYPE spta_t_in_rfc_imp "#EC NEEDED
CHANGING es_in_rfc_exp TYPE spta_t_in_rfc_exp
it_rfcdata TYPE spta_t_indxtab.
DATA: it_final TYPE ztest_random_data_t.
* Decode the data from the INDX Structure into the process work list
CALL FUNCTION 'SPTA_INDX_PACKAGE_DECODE'
EXPORTING
indxtab = it_rfcdata
IMPORTING
data = it_final.
* Simple logic to sort data
SORT it_final BY number.
* Again Encode output data for AFTER_RFC form
CALL FUNCTION 'SPTA_INDX_PACKAGE_ENCODE'
EXPORTING
data = it_final
IMPORTING
indxtab = it_rfcdata.
ENDFORM. "in_rfc
*&---------------------------------------------------------------------*
*& Form AFTER_RFC
*&---------------------------------------------------------------------*
* In this routine we have to collect date after parallel processing *
*----------------------------------------------------------------------*
FORM after_rfc
USING it_rfcdata TYPE spta_t_indxtab
if_rfcsubrc TYPE sy-subrc
if_rfcmsg TYPE spta_t_rfcmsg
it_objects_in_process TYPE spta_t_objects_in_process "#EC NEEDED
is_after_rfc_imp TYPE spta_t_after_rfc_imp "#EC NEEDED
CHANGING es_after_rfc_exp TYPE spta_t_after_rfc_exp "#EC NEEDED
cs_user_param TYPE ztest_random_data_t.
DATA: wa_final TYPE ztest_random_data.
* Decode RFC output data and add RFC-results to global data
CALL FUNCTION 'SPTA_INDX_PACKAGE_DECODE'
EXPORTING
indxtab = it_rfcdata
IMPORTING
data = it_final.
* After parallel processing write all the records
LOOP AT it_final INTO wa_final.
WRITE:/ wa_final-number, 10 wa_final-index.
CLEAR wa_final.
ENDLOOP.
WRITE: sy-uline.
ENDFORM. "after_rfc
*&---------------------------------------------------------------------*
*& Form F_CREATE_RANDOM_NO
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM f_create_random_no.
DATA: lcl_random TYPE REF TO cl_abap_random_int,
l_index TYPE sytabix,
lwa_data TYPE ztest_random_data,
l_min TYPE i,
l_max TYPE i.
l_min = 10.
l_max = 90.
TRY.
lcl_random = cl_abap_random_int=>create( min = l_min
max = l_max ).
CATCH cx_abap_random.
ENDTRY.
DO 100 TIMES.
* Get the Random Number:
lwa_data-number = lcl_random->get_next( ).
l_index = l_index + 1.
lwa_data-index = l_index.
APPEND lwa_data TO it_random.
ENDDO.
ENDFORM. " F_CREATE_RANDOM_NO
*&---------------------------------------------------------------------*
*& Form F_WRITE_RANDOM_REC
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM f_write_random_rec.
DATA: wa_final TYPE ztest_random_data.
WRITE:/ 'Before parallel processing start'.
LOOP AT it_random INTO wa_final.
WRITE:/ wa_final-number, 10 wa_final-index.
CLEAR wa_final.
ENDLOOP.
WRITE:/ 'After end parallel processing'.
ENDFORM. " F_WRITE_RANDOM_REC*&---------------------------------------------------------------------*</code></pre><P><SPAN class=""><SPAN class="">Generate Sample Data-</SPAN></SPAN></P><pre class="lia-code-sample language-abap"><code>FORM f_create_random_no.
DATA: lcl_random TYPE REF TO cl_abap_random_int,
l_index TYPE sytabix,
lwa_data TYPE ztest_random_data,
l_min TYPE i,
l_max TYPE i.
l_min = 10.
l_max = 90.
TRY.
lcl_random = cl_abap_random_int=>create( min = l_min
max = l_max ).
CATCH cx_abap_random.
ENDTRY.
DO 100 TIMES.
* Get the Random Number:
lwa_data-number = lcl_random->get_next( ).
l_index = l_index + 1.
lwa_data-index = l_index.
APPEND lwa_data TO it_random.
ENDDO.
ENDFORM. " F_CREATE_RANDOM_NO</code></pre><P><SPAN>This routine generates 100 random records and stores them in </SPAN><SPAN>IT_RANDOM</SPAN><SPAN>.</SPAN><SPAN> </SPAN></P><P><STRONG>Example: </STRONG></P><P><SPAN>NUMBER INDEX</SPAN><SPAN> <BR /></SPAN><SPAN>------------------------</SPAN><SPAN><BR /></SPAN><SPAN>45 1</SPAN><SPAN> <BR /></SPAN><SPAN>72 2</SPAN><SPAN> <BR /></SPAN><SPAN>18 3</SPAN><SPAN> <BR /></SPAN><SPAN>63 4</SPAN></P><P><SPAN class=""><SPAN class="">At this point, all records are available for processing.</SPAN></SPAN></P><P><SPAN class=""><SPAN class="">Determine</SPAN><SPAN class=""><SPAN> </SPAN>Server Group-</SPAN></SPAN><SPAN class=""> </SPAN></P><pre class="lia-code-sample language-abap"><code> "Fetch the server group
SELECT SINGLE classname
INTO <a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1407137">@DATA</a>(lv_server_grp)
FROM rzllitab
WHERE grouptype = 'S'.
IF sy-subrc NE 0.
RETURN.
ENDIF.</code></pre><P><SPAN>The SPTA framework requires an RFC Server Group.</SPAN><SPAN> </SPAN></P><P><SPAN>Server groups are configured in transaction:</SPAN><SPAN> </SPAN><STRONG><SPAN>RZ12</SPAN></STRONG><SPAN> </SPAN></P><P><SPAN>The framework uses this server group to determine where parallel tasks can run.</SPAN></P><P><STRONG><SPAN class=""><SPAN class="">Start the SPTA Framework-</SPAN></SPAN></STRONG></P><pre class="lia-code-sample language-abap"><code>* Calling the function module to invoke parallel processing
* framwork
CALL FUNCTION 'SPTA_PARA_PROCESS_START_2'
EXPORTING
server_group = lv_server_grp
before_rfc_callback_form = 'BEFORE_RFC'
in_rfc_callback_form = 'IN_RFC'
after_rfc_callback_form = 'AFTER_RFC'
callback_prog = 'ZTEST_SPTA_FRAME_WORK'
CHANGING
user_param = it_random
EXCEPTIONS
invalid_server_group = 1
no_resources_available = 2
OTHERS = 3.</code></pre><P><SPAN>This is the entry point of the framework.</SPAN><SPAN> </SPAN></P><P><SPAN>The entire table </SPAN><SPAN>IT_RANDOM</SPAN><SPAN> is passed through:</SPAN><SPAN> </SPAN></P><P><STRONG>user_param = it_random</STRONG><SPAN> </SPAN></P><P><SPAN>Internally, SPTA passes this table to </SPAN><SPAN>BEFORE_RFC</SPAN><SPAN>, where work packets are created.</SPAN><SPAN> </SPAN></P><P><SPAN>The framework then repeatedly executes:</SPAN><SPAN> </SPAN></P><OL><LI><SPAN>BEFORE_RFC</SPAN><SPAN> </SPAN></LI></OL><OL><LI><SPAN>IN_RFC</SPAN><SPAN> </SPAN></LI></OL><OL><LI><SPAN>AFTER_RFC</SPAN><SPAN> </SPAN></LI></OL><P><SPAN>Until all records have been processed.</SPAN></P><P> <STRONG><SPAN class=""><SPAN class="">BEFORE_RFC: Create Work Packets-</SPAN></SPAN></STRONG></P><P><STRONG><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class="">This callback prepares the data packets that will be processed in parallel.</SPAN></SPAN></SPAN></SPAN></STRONG></P><pre class="lia-code-sample language-abap"><code>*&---------------------------------------------------------------------*
*& Form BEFORE_RFC
*&---------------------------------------------------------------------*
* In this routine work packets are prepared for parallel processing *
* also check the variable for downstream processing *
*----------------------------------------------------------------------*
FORM before_rfc
USING is_before_rfc_imp TYPE spta_t_before_rfc_imp
CHANGING es_before_rfc_exp TYPE spta_t_before_rfc_exp
it_rfcdata TYPE spta_t_indxtab
ct_failed_objects TYPE spta_t_failed_objects
et_objects_in_process TYPE spta_t_objects_in_process
it_data TYPE ztest_random_data_t.
DATA: l_counter TYPE i,
l_no_of_items TYPE i,
it_final TYPE ztest_random_data_t,
wa_data TYPE ztest_random_data.
* Create small work packets for parallel processing
* This is custom logic
l_no_of_items = 10. " One work packet will contain 10 records
LOOP AT it_data INTO wa_data.
* Read and move specified number of records
IF ( l_counter < l_no_of_items
AND wa_data IS NOT INITIAL ).
APPEND wa_data TO it_final.
DELETE it_data INDEX 1.
l_counter = l_counter + 1.
ELSE.
EXIT.
ENDIF.
ENDLOOP.
* Convert the input data into the INDX structure that is needed for the RFC
CALL FUNCTION 'SPTA_INDX_PACKAGE_ENCODE'
EXPORTING
data = it_final
IMPORTING
indxtab = it_rfcdata.
* This is mandatory step
* inform task manager that an rfc can be started from the data compiled
IF it_final IS NOT INITIAL.
es_before_rfc_exp-start_rfc = 'X'.
ELSE.
CLEAR es_before_rfc_exp-start_rfc.
RETURN.
ENDIF.
ENDFORM. " BEFORE_RFC_CALLBACK_FORM </code></pre><P><SPAN>Each work packet contains 10 records.</SPAN><SPAN> </SPAN></P><P><SPAN>For 100 records:</SPAN><SPAN> </SPAN></P><P><STRONG>Packet 1 -> Records 1 to 10 <BR />Packet 2 -> Records 11 to 20 <BR />Packet 3 -> Records 21 to 30 <BR />... <BR />Packet 10 -> Records 91 to 100</STRONG></P><P><SPAN>The framework passes the remaining data in IT_DATA.</SPAN><SPAN> </SPAN></P><P><STRONG>This logic: </STRONG></P><UL><LI><SPAN>Copies 10 records into IT_FINAL</SPAN><SPAN> </SPAN></LI></UL><UL><LI><SPAN>Removes them from IT_DATA</SPAN><SPAN> </SPAN></LI></UL><UL><LI><SPAN>Leaves the remaining records for the next callback execution</SPAN><SPAN> </SPAN></LI></UL><P><STRONG>Example:</STRONG><SPAN> </SPAN></P><P><SPAN><STRONG>Before</STRONG>:</SPAN><SPAN> </SPAN></P><P><SPAN>IT_DATA = 100 records</SPAN><SPAN> </SPAN></P><P><STRONG>After first packet:</STRONG><SPAN> </SPAN></P><P><SPAN>IT_FINAL = 10 records</SPAN><SPAN> <BR /></SPAN><SPAN>IT_DATA = 90 records</SPAN></P><P><STRONG><SPAN class=""><SPAN class="">Convert Packet into RFC Format</SPAN></SPAN><SPAN class=""><SPAN class="">-</SPAN></SPAN></STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Bikash_R_0-1781759737806.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/423417i74B3239C2686E3F5/image-size/large?v=v2&px=999" role="button" title="Bikash_R_0-1781759737806.png" alt="Bikash_R_0-1781759737806.png" /></span></P><P><SPAN>SPTA transfers data between work processes using INDX structures.</SPAN><SPAN> </SPAN></P><P><SPAN>This function serializes the packet into a format suitable for RFC communication.</SPAN><SPAN><BR /></SPAN></P><P><STRONG><SPAN>Signal Framework to Start Processing-</SPAN></STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Bikash_R_1-1781759772102.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/423418i06C0E5ADBD89EB7C/image-size/large?v=v2&px=999" role="button" title="Bikash_R_1-1781759772102.png" alt="Bikash_R_1-1781759772102.png" /></span></P><P><SPAN class="">This informs the framework that a work packet is<SPAN> </SPAN></SPAN><SPAN class="">ready,</SPAN><SPAN class=""><SPAN> </SPAN>and a new RFC task can be started.</SPAN></P><P><STRONG><SPAN>IN_RFC: Execute Business Logic-</SPAN></STRONG><SPAN> <BR /></SPAN></P><P><STRONG><SPAN>This routine runs in a separate work process.</SPAN></STRONG></P><pre class="lia-code-sample language-abap"><code>*&---------------------------------------------------------------------*
*& Form IN_RFC
*&---------------------------------------------------------------------*
* In this routine create own RFC enabled FM or write logic in this *
* routine *
*----------------------------------------------------------------------*
FORM in_rfc
USING is_in_rfc_imp TYPE spta_t_in_rfc_imp "#EC NEEDED
CHANGING es_in_rfc_exp TYPE spta_t_in_rfc_exp
it_rfcdata TYPE spta_t_indxtab.
DATA: it_final TYPE ztest_random_data_t.
* Decode the data from the INDX Structure into the process work list
CALL FUNCTION 'SPTA_INDX_PACKAGE_DECODE'
EXPORTING
indxtab = it_rfcdata
IMPORTING
data = it_final.
* Simple logic to sort data
SORT it_final BY number.
* Again Encode output data for AFTER_RFC form
CALL FUNCTION 'SPTA_INDX_PACKAGE_ENCODE'
EXPORTING
data = it_final
IMPORTING
indxtab = it_rfcdata.
ENDFORM. "in_rfc</code></pre><P><STRONG><SPAN class=""><SPAN class="">Decode Packet-</SPAN></SPAN></STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Bikash_R_2-1781760037006.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/423419i1FFE332CCB75A90A/image-size/large?v=v2&px=999" role="button" title="Bikash_R_2-1781760037006.png" alt="Bikash_R_2-1781760037006.png" /></span></P><P><SPAN>The encoded packet is converted back into an internal table -> process data -> then packet is sorted by the random number.</SPAN><SPAN> </SPAN></P><P><STRONG><SPAN>Encode Results-</SPAN></STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Bikash_R_3-1781760058335.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/423420iBDCAF9CAEBEB8024/image-size/large?v=v2&px=999" role="button" title="Bikash_R_3-1781760058335.png" alt="Bikash_R_3-1781760058335.png" /></span></P><P><SPAN>The processed data is encoded again so that it can be returned to the caller.</SPAN><SPAN> </SPAN></P><P><STRONG><SPAN>AFTER_RFC: Collect Results-</SPAN></STRONG><SPAN> </SPAN></P><P><SPAN>Once a parallel task is complete, the framework invokes </SPAN><SPAN>AFTER_RFC</SPAN><SPAN>.</SPAN></P><pre class="lia-code-sample language-abap"><code>*&---------------------------------------------------------------------*
*& Form AFTER_RFC
*&---------------------------------------------------------------------*
* In this routine we have to collect date after parallel processing *
*----------------------------------------------------------------------*
FORM after_rfc
USING it_rfcdata TYPE spta_t_indxtab
if_rfcsubrc TYPE sy-subrc
if_rfcmsg TYPE spta_t_rfcmsg
it_objects_in_process TYPE spta_t_objects_in_process "#EC NEEDED
is_after_rfc_imp TYPE spta_t_after_rfc_imp "#EC NEEDED
CHANGING es_after_rfc_exp TYPE spta_t_after_rfc_exp "#EC NEEDED
cs_user_param TYPE ztest_random_data_t.
DATA: wa_final TYPE ztest_random_data.
* Decode RFC output data and add RFC-results to global data
CALL FUNCTION 'SPTA_INDX_PACKAGE_DECODE'
EXPORTING
indxtab = it_rfcdata
IMPORTING
data = it_final.
* After parallel processing write all the records
LOOP AT it_final INTO wa_final.
WRITE:/ wa_final-number, 10 wa_final-index.
CLEAR wa_final.
ENDLOOP.
WRITE: sy-uline.
ENDFORM. "after_rfc </code></pre><P><STRONG><SPAN class=""><SPAN class="">Decode Returned Data-</SPAN></SPAN></STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Bikash_R_4-1781760146918.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/423421i390F6DA5B3DB623C/image-size/large?v=v2&px=999" role="button" title="Bikash_R_4-1781760146918.png" alt="Bikash_R_4-1781760146918.png" /></span></P><P><SPAN class=""><SPAN class="">The processed packet is reconstructed -> The processed records are displayed.</SPAN></SPAN></P><P><STRONG><SPAN>Example-</SPAN></STRONG></P><P><SPAN>Suppose the program generates:</SPAN></P><TABLE border="1" width="20.607992063628135%"><TBODY><TR><TD width="100%"><SPAN class=""><SPAN class="">45 1<SPAN> </SPAN></SPAN></SPAN><SPAN class=""><SPAN class=""> </SPAN><BR /></SPAN><SPAN class=""><SPAN class="">81 2<SPAN> </SPAN></SPAN></SPAN><SPAN class=""><SPAN class=""> </SPAN><BR /></SPAN><SPAN class=""><SPAN class="">23 3<SPAN> </SPAN></SPAN></SPAN><SPAN class=""><SPAN class=""> </SPAN><BR /></SPAN><SPAN class=""><SPAN class="">67 4<SPAN> </SPAN></SPAN></SPAN><SPAN class=""><SPAN class=""> </SPAN><BR /></SPAN><SPAN class=""><SPAN class="">...</SPAN></SPAN><SPAN class=""> </SPAN></TD></TR></TBODY></TABLE><TABLE border="1" width="57.509802856732385%"><TBODY><TR><TD width="100%"><P><SPAN>The framework creates:</SPAN><SPAN><BR /></SPAN></P><P><SPAN>Packet 1 -> 10 Records</SPAN><SPAN> <BR /></SPAN><SPAN>Packet 2 -> 10 Records</SPAN><SPAN> <BR /></SPAN><SPAN>Packet 3 -> 10 Records</SPAN><SPAN> <BR /></SPAN><SPAN>...</SPAN><SPAN> <BR /></SPAN><SPAN>Packet10 -> 10 Records</SPAN><SPAN><BR /></SPAN></P><P><SPAN>These packets are distributed among available work processes:</SPAN><SPAN><BR /></SPAN></P><P><SPAN>WP1 -> Packet 1</SPAN><SPAN> <BR /></SPAN><SPAN>WP2 -> Packet 2</SPAN><SPAN> <BR /></SPAN><SPAN>WP3 -> Packet 3</SPAN><SPAN> <BR /></SPAN><SPAN>WP4 -> Packet 4</SPAN><SPAN> </SPAN></P></TD></TR></TBODY></TABLE><P><SPAN class=""><SPAN class="">Each work process executes the logic inside<SPAN> </SPAN></SPAN></SPAN><SPAN class=""><SPAN class="">IN_RFC</SPAN></SPAN><SPAN class=""><SPAN class=""><SPAN> </SPAN>independently and returns the results through<SPAN> </SPAN></SPAN></SPAN><SPAN class=""><SPAN class="">AFTER_RFC</SPAN></SPAN><SPAN class=""><SPAN class="">.</SPAN></SPAN></P><P><SPAN class=""><SPAN class=""><SPAN class="">Let’s</SPAN><SPAN class=""><SPAN> </SPAN>execute and see--</SPAN></SPAN></SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Bikash_R_5-1781760342856.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/423422i18C1CB72C8525660/image-size/large?v=v2&px=999" role="button" title="Bikash_R_5-1781760342856.png" alt="Bikash_R_5-1781760342856.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Bikash_R_6-1781760366731.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/423423iBBEF91CC75876303/image-size/large?v=v2&px=999" role="button" title="Bikash_R_6-1781760366731.png" alt="Bikash_R_6-1781760366731.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Bikash_R_7-1781760395137.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/423424i01D4A7F623C86571/image-size/large?v=v2&px=999" role="button" title="Bikash_R_7-1781760395137.png" alt="Bikash_R_7-1781760395137.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Bikash_R_8-1781760413954.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/423425iC67AF9F8C25B6537/image-size/large?v=v2&px=999" role="button" title="Bikash_R_8-1781760413954.png" alt="Bikash_R_8-1781760413954.png" /></span></P><P><STRONG><SPAN>Advantages of SPTA Framework-</SPAN></STRONG><SPAN> </SPAN></P><UL><LI><SPAN>Standard SAP framework for parallel processing</SPAN><SPAN> </SPAN></LI></UL><UL><LI><SPAN>Automatic workload distribution</SPAN><SPAN> </SPAN></LI></UL><UL><LI><SPAN>Better utilization of available work processes</SPAN><SPAN> </SPAN></LI></UL><UL><LI><SPAN>Reduced execution time</SPAN><SPAN> </SPAN></LI></UL><UL><LI><SPAN>Simplified task management</SPAN><SPAN> </SPAN></LI></UL><UL><LI><SPAN>Improved scalability</SPAN><SPAN> </SPAN></LI></UL><UL><LI><SPAN>Centralized result collection</SPAN><SPAN> </SPAN></LI></UL><P><STRONG><SPAN>Conclusion-</SPAN></STRONG><SPAN> </SPAN></P><P><SPAN>The SPTA framework provides a robust and SAP-standard approach for implementing parallel processing in ABAP. By splitting large datasets into smaller work packets and distributing them across multiple work processes, developers can significantly improve application performance while keeping the implementation manageable.</SPAN><SPAN> </SPAN></P><P><SPAN>In this example, we generated random data, divided it into packets of 10 records, processed those packets in parallel, and collected the results using the three core callback routines:</SPAN><SPAN> </SPAN></P><UL><LI><SPAN>BEFORE_RFC – Creates work packets</SPAN><SPAN> </SPAN></LI></UL><UL><LI><SPAN>IN_RFC – Executes business logic in parallel</SPAN><SPAN> </SPAN></LI></UL><UL><LI><SPAN>AFTER_RFC – Collects and consolidates results</SPAN><SPAN> </SPAN></LI></UL><P><SPAN>For real-world scenarios involving mass data processing, SPTA offers a scalable and efficient solution that aligns with SAP development best practices.</SPAN></P>2026-07-20T05:53:27.534000+02:00https://community.sap.com/t5/enterprise-resource-planning-blog-posts-by-sap/the-refreshed-sap-integration-certification-framework-is-now-available/ba-p/14444154The refreshed SAP Integration Certification Framework is now available2026-07-20T10:36:00.052000+02:00ShmilaMhttps://community.sap.com/t5/user/viewprofilepage/user-id/1666920<P>After months of close collaboration with our partner ecosystem, the SAP Integration and Certification Center (ICC) is proud to announce that the<SPAN> </SPAN><STRONG>refreshed SAP Integration Certification Framework is officially live now</STRONG>.</P><P>This is a significant milestone — not just for SAP ICC, but for every partner building solutions on the SAP platform. The refreshed framework is the result of real conversations, real feedback, and a shared commitment to making integration certification more accessible, more relevant, and more aligned with where SAP and its partners are heading.</P><H3 id="toc-hId-1949019622" id="toc-hId-1949139838"><FONT color="#3366FF"><STRONG>Why We Refreshed the Framework</STRONG></FONT></H3><P>The integration landscape has changed fundamentally. The rise of Business AI, the shift to Clean Core, the evolution of SAP Business AI Platform, and the introduction of new API policy all demanded a certification framework that could keep pace.</P><P>The previous framework served us well — but it was built for a different era. We set out to build something that reflects today's partner reality: diverse solution types, varied maturity levels, diverse system landscapes and an ecosystem that spans from established global partners to innovative niche specialists entering the market.</P><P>The result is a framework that is<SPAN> </SPAN><STRONG>structured yet flexible, rigorous yet accessible</STRONG>.</P><H3 id="toc-hId-1752506117" id="toc-hId-1752626333"><FONT color="#3366FF"><STRONG>Two Paths. One Goal.</STRONG></FONT></H3><P>At the heart of the refreshed framework is a<SPAN> </SPAN><STRONG>dual-path model</STRONG><SPAN> </SPAN>— two transparent paths designed to meet partners where they are.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="ShmilaM_0-1784540055051.jpeg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434977i284A7EB7215C73E3/image-size/large?v=v2&px=999" role="button" title="ShmilaM_0-1784540055051.jpeg" alt="ShmilaM_0-1784540055051.jpeg" /></span></P><P class="lia-align-center" style="text-align: center;"><EM>SAP Partner Solution Certification Framework 2026 — Two transparent paths</EM></P><P>Of the two pathways,<FONT color="#0000FF"><STRONG><SPAN> </SPAN>Integration Certification</STRONG></FONT> is more closely aligned with SAP product architecture strategy. It is designed for applications built on <STRONG>SAP Business AI Platform</STRONG> that meet a defined set of technical standards: use of published APIs, adherence to Clean Core principles, connectivity to <STRONG>SAP Business Data Cloud</STRONG>, and — where applicable — built with <STRONG>SAP Business AI</STRONG>.</P><P>Integration Certification is based on endorsed use-cases and technical criteria by SAP. SAP ICC certifies against a defined portfolio of scenarios available at<SPAN> </SPAN><SPAN><A href="https://partneredge.sap.com/en/partnership/development/certify_software.html" target="_blank" rel="noopener noreferrer">SAP Partner Portal</A></SPAN>, meaning the partner application shall map to one of those scenarios to be eligible.</P><P>The updated framework is aligned with<SPAN> </SPAN><SPAN><A href="https://help.sap.com/doc/sap-api-policy/latest/en-US/API_Policy_latest.pdf" target="_blank" rel="noopener noreferrer"><STRONG>SAP API policy</STRONG></A></SPAN>. A certified solution is not just technically validated — it is a direct confirmation that the solution adheres to the design time guidelines of the new SAP API policy, giving customers and partners a clear and trusted signal of compliance.</P><P>Successfully certified solutions receive the SAP Certified logo and a certificate, are listed in the<SPAN> </SPAN><SPAN><A href="http://www.sap.com/icc" target="_blank" rel="noopener noreferrer">SAP Certified Solutions Directory</A></SPAN>, and gain access to go-to-market support through<SPAN> </SPAN><A href="https://www.sap.com/store.html" target="_blank" rel="noopener noreferrer">SAP Store</A><SPAN> </SPAN>— making certification not just a quality mark, but a tangible business advantage. Integration Certification continues to be a mandatory requirement for higher solution progression levels in SAP PartnerEdge (Spotlight+, Endorsed App).</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="ShmilaM_1-1784536320671.png" style="width: 363px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434878i0977C949AADC1920/image-dimensions/363x130?v=v2" width="363" height="130" role="button" title="ShmilaM_1-1784536320671.png" alt="ShmilaM_1-1784536320671.png" /></span></P><P><FONT color="#0000FF"><STRONG>Interoperability Review</STRONG></FONT><SPAN> </SPAN>is a new, purposeful entry point into the integration certification framework — and one of the most requested suggestion from our partner and the broader community. Certain partner solutions are not able to qualify for Integration Certification and fit a predefined certification scenario. That's not a dead end – it's what the Interoperability Review is built for.</P><P>Interoperability Review is SAP ICC's open and inclusive validation path, available to partners and non-partners (ISVs) alike, regardless of where you sit in the SAP ecosystem. It is designed for applications that use published APIs correctly but integrate via methods or platforms that fall outside the SAP Integration Certification Framework – and it's open to standard, market-ready products.</P><P>SAP ICC assesses your application against interoperability standards: correct use of published APIs as documented, successful authentication and connectivity, correct data exchange, and appropriate error handling. The review confirms technical compatibility – without requiring deep platform alignment.</P><P>If the partner solution passes the Interoperability Review, the solution is listed as interoperable on SAP Notes, and receive a Review Summary documenting the outcome of the technical assessment. With these outcomes, partners can demonstrate to joint customers that the solution is compatible with SAP suite of solutions.</P><P>These two paths are not competing options. They are complementary instruments that together ensure<SPAN> </SPAN><STRONG>every partner has a supported route to market<SPAN> </SPAN></STRONG>for their solution through a technical validation by SAP.</P><H3 id="toc-hId-1555992612" id="toc-hId-1556112828"><FONT color="#3366FF"><STRONG>What Happens Next</STRONG></FONT></H3><P>The framework is now live. Here is how to get started:</P><OL><LI><STRONG>Explore the two paths</STRONG><SPAN> </SPAN>— review the full documentation ICC pages at SAP.com and<SPAN> </SPAN><SPAN><A href="https://partneredge.sap.com/en/partnership/development/certify_software.html" target="_blank" rel="noopener noreferrer">SAP Partner Portal</A></SPAN></LI><LI>Understand the Certification<SPAN> </SPAN><SPAN><A href="https://www.sap.com/documents/2026/01/4006a747-377f-0010-bca6-c68f7e60039b.html" target="_blank" rel="noopener noreferrer">Framework Reference Guide</A></SPAN><SPAN> </SPAN>and<SPAN> </SPAN><SPAN><A href="https://www.sap.com/documents/2026/06/8c44963d-597f-0010-bca6-c68f7e60039b.html" target="_blank" rel="noopener noreferrer">FAQ</A></SPAN></LI><LI><STRONG>Talk to us</STRONG><SPAN> </SPAN>— contact the ICC team (<SPAN><A href="mailto:icc@sap.com" target="_blank" rel="noopener nofollow noreferrer">icc@sap.com</A></SPAN>) to <SPAN>discuss which path is the right fit for your solution or </SPAN><A href="https://forms.office.com/pages/responsepage.aspx?id=bGf3QlX0PEKC9twtmXka98xKiWsHeVJDmM1WiDIyPM5UOVlaUEhBMUNOQTQ0OVA0TkZTWjgwRDE3Ny4u&route=shorturl" target="_blank" rel="noopener nofollow noreferrer">apply for our service</A></LI><LI><STRONG>Start your journey</STRONG><SPAN> </SPAN>— the process begins with a short discovery conversation with the ICC team.</LI></OL><H3 id="toc-hId-1359479107" id="toc-hId-1359599323"><FONT color="#3366FF"><STRONG>A Thank You to Our Partner Community</STRONG></FONT></H3><P>This framework did not emerge from a room at SAP. It emerged from the conversations we have had with many partners — at partner events, in certification reviews, in feedback sessions, and from the direct input you have shared with us over the years.</P><P>To everyone who participated in shaping this: thank you. You will see your contribution reflected in what we have built with the refreshed framework.</P><P>We are proud of this framework. We are more proud of what it makes possible for you and your customers. We at SAP ICC are eager to see it go live and really making a change for our partner community.</P><P><STRONG><FONT color="#3366FF">The SAP ICC Team</FONT><BR /></STRONG><EM>SAP Integration and Certification Center</EM></P><P><EM>Have questions? Reach out to the ICC team at<SPAN> </SPAN></EM><SPAN><A href="mailto:icc@sap.com" target="_blank" rel="noopener nofollow noreferrer"><EM>icc@sap.com</EM></A></SPAN></P>2026-07-20T10:36:00.052000+02:00https://community.sap.com/t5/sap-cap-blog-posts/building-cpi-explorer-my-journey-to-simplify-searching-sap-integration/ba-p/14439630Building CPI Explorer – My Journey to Simplify Searching SAP Integration Suite iFlows2026-07-20T12:12:08.365000+02:00lokesh_bhukyahttps://community.sap.com/t5/user/viewprofilepage/user-id/1585211<H1 id="toc-hId-1690204573">Building CPI Explorer – My Journey to Simplify Searching SAP Integration Suite iFlows</H1><H2 id="toc-hId-1622773787">Introduction</H2><P>As an SAP Integration Suite consultant, a large part of my day involves supporting existing integrations, troubleshooting production issues, and understanding how different systems are connected. One challenge kept coming up repeatedly: finding where a particular SFTP directory, HTTP endpoint, ProcessDirect endpoint, or credential was configured across dozens (sometimes hundreds) of Integration Flows.</P><P>SAP's Design-Time APIs let you retrieve Integration Packages and Integration Flows, but there's no built-in way to search adapter configurations across an entire tenant. In practice, that meant opening package after package and manually inspecting each iFlow — slow, repetitive, and easy to get wrong in a large landscape.</P><P>Instead of continuing to do this by hand, I decided to build a tool to solve it for myself, and hopefully for other developers too.</P><H2 id="toc-hId-1426260282">Where It All Started</H2><P>I started my career as an ABAP developer, and one feature I relied on constantly was the "Where Used" list. If I needed to know where a table, function module, or field was being used, I could just look it up. It was simple, fast, and always available.</P><P>When I moved into PI/PO and later CPI, that convenience disappeared. There's no equivalent way to instantly search where something is used across your integration landscape.</P><P>This became a real problem in day-to-day support. An FICO or SD colleague would come to me and say "my file isn't moving, can you check?" Half the time, they weren't even sure whether their interface was flowing through PI/CPI at all — they just knew something was stuck and assumed I'd know where to look. Other times, someone from the infra team would ask "are we using this host anywhere? We need to update it" or "can you find every flow using this username, we're rotating credentials." Each of these meant manually opening iFlow after iFlow, hoping I didn't miss one.</P><P>That's where the idea for CPI Explorer actually came from — not as a big architectural vision, but as a way to get back something as basic as the ABAP "Where Used" list, just for CPI.</P><P>One real example was during an infrastructure change where we had to update an SFTP host. Before CPI Explorer, the only option was to manually open multiple Integration Flows and inspect every SFTP adapter. With CPI Explorer, I can simply search for the hostname and immediately see every Integration Flow that references it.</P><H2 id="toc-hId-1229746777">The Idea</H2><P>The question I started with was simple:</P><P> </P><DIV><DIV><STRONG> Can I build a "Where Used" list for CPI?</STRONG></DIV></DIV><P class="">I spent quite some time exploring the SAP Business Accelerator Hub and Design-Time APIs to see whether this functionality already existed. The Design-Time APIs gave me metadata, but not the adapter-level detail I needed. So I went a level deeper: download each Integration Flow artifact, extract the <CODE>.iflw</CODE> file, parse the XML, and build a local searchable index from it.</P><P class="">Once that was working, I wrapped it in a Chrome Extension so I could search directly from the browser instead of running scripts every time.</P><H2 id="toc-hId-1033233272">How CPI Explorer Works</H2><P>At a high level, the tool:</P><UL><LI>Authenticates with SAP Integration Suite using OAuth</LI><LI>Retrieves Integration Packages and Integration Flows via the Design-Time APIs</LI><LI>Downloads Integration Flow artifacts</LI><LI>Extracts and parses the <CODE>.iflw</CODE> XML files</LI><LI>Builds a searchable metadata index</LI><LI>Lets you search adapter properties from the Chrome Extension</LI></UL><P>It currently supports searching for:</P><UL><LI>SFTP directories</LI><LI>Host names</LI><LI>HTTP endpoints</LI><LI>ProcessDirect endpoints</LI><LI>JMS queues</LI><LI>Credentials</LI><LI>Externalized parameters</LI><LI>Other adapter properties</LI></UL><H2 id="toc-hId-836719767">What I Learned</H2><P>Building this taught me more than I expected about:</P><UL><LI>SAP Integration Suite Design-Time APIs</LI><LI>The structure of Integration Flow artifacts</LI><LI>Parsing <CODE>.iflw</CODE> XML files</LI><LI>Chrome Extension development</LI><LI>Organizing a Node.js application into reusable modules</LI></UL><P>The trickiest part was making sure every downloaded artifact mapped back correctly to its source Integration Flow while the index was being built. Getting that mapping right was what made the search results trustworthy across a whole tenant.</P><H2 id="toc-hId-640206262">Why I'm Sharing This</H2><P>I built CPI Explorer to solve my own problem, but I believe many SAP Integration Suite developers face the same challenge. That's why I decided to make it open source, so others can use it, contribute ideas, and help improve it over time.</P><H2 id="toc-hId-443692757">GitHub</H2><P>The project is available here: <STRONG><A href="https://github.com/lokeshbhukya2019-netizen/cpi-explorer" target="_blank" rel="noopener nofollow noreferrer">https://github.com/lokeshbhukya2019-netizen/cpi-explorer</A></STRONG></P><P>Feedback, suggestions, and contributions are welcome.</P><H2 id="toc-hId-247179252">What's Next</H2><P>A few things I'm planning to add:</P><UL><LI>Search by adapter type</LI><LI>Multi-tenant support</LI><LI>Export to Excel/CSV</LI><LI>Dependency visualization</LI><LI>Support for additional adapter types</LI></UL><P>If you have ideas for other useful features, I'd like to hear them.</P><H2 id="toc-hId-50665747">Closing Thoughts</H2><P>CPI Explorer started as an attempt to fix a problem I ran into constantly in day-to-day SAP Integration Suite work. Along the way it turned into a good excuse to learn more about SAP's APIs, artifact structures, and browser extension development.</P><P>I hope it saves other SAP Integration Suite developers some time during troubleshooting and impact analysis. If you try it, I'd genuinely like to hear how it goes.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-07-10 031749.png" style="width: 721px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/432614i4A9B3462B2B87055/image-size/large?v=v2&px=999" role="button" title="Screenshot 2026-07-10 031749.png" alt="Screenshot 2026-07-10 031749.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-07-10 024832.png" style="width: 557px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/432612i2B1DD0E9BD52910B/image-size/large?v=v2&px=999" role="button" title="Screenshot 2026-07-10 024832.png" alt="Screenshot 2026-07-10 024832.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-07-10 031943.png" style="width: 559px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/432613iE4BF543F79FB6D8B/image-size/large?v=v2&px=999" role="button" title="Screenshot 2026-07-10 031943.png" alt="Screenshot 2026-07-10 031943.png" /></span></P><P>Thank you for taking the time to read about CPI Explorer. If you try it out, I'd love to hear your feedback, suggestions, or ideas for new features. I hope it helps make troubleshooting and impact analysis in SAP Integration Suite a little easier for the community.</P><P><STRONG>Happy integrating!</STRONG></P>2026-07-20T12:12:08.365000+02:00https://community.sap.com/t5/technology-blog-posts-by-sap/abap-development-tools-for-visual-studio-code-version-1-1-released/ba-p/14421143ABAP development tools for Visual Studio Code: Version 1.1 released2026-07-21T13:53:34.813000+02:00thomasalexander_ritterhttps://community.sap.com/t5/user/viewprofilepage/user-id/185696<H1 id="toc-hId-1688269120" id="toc-hId-1689037953"><SPAN>What happened since the last release?</SPAN></H1><P><A href="https://marketplace.visualstudio.com/items?itemName=SAPSE.adt-vscode" target="_self" rel="nofollow noopener noreferrer"><SPAN>Link to the extension.</SPAN></A></P><P><SPAN>First of all, thanks for the positive feedback regarding the 1.0.1 patch which added the much requested RFC + password support! Please keep providing feedback as it helps us to plan the next releases. A lot of users are asking us how they can provide feedback. We have recently added a <A href="https://influence.sap.com/sap/ino/#campaign/2911" target="_self" rel="noopener noreferrer">new customer influence channel</A> just for the VS Code extension. We recommend using that one.</SPAN></P><P><SPAN>Last month, <A href="https://abapconf.org/abapconf2026/" target="_self" rel="nofollow noopener noreferrer">ABAPConf 2026</A> took place in Mannheim. We want to highlight two talks:</SPAN></P><OL><LI><SPAN>Tobias Hofmann provided public feedback regarding the extension and compiled a nice to-do list. I can report that a lot of these to-do items are already part of our internal to-do list. The talk can be found <A href="https://www.youtube.com/watch?v=hzRQuEzMLhY" target="_self" rel="nofollow noopener noreferrer">here</A>.</SPAN></LI><LI><SPAN>Anne Keller and I gave a talk on the overall ABAP IDE strategy. Of course, it touches the VS Code extension but also aims to provide a broader picture on how we want to support ABAP IDEs via a single technology stack in the future and shares some insights on how the ADT MCP server will evolve in the future. The talk can be found <A href="https://www.youtube.com/watch?v=2a7hzuw3woM" target="_self" rel="nofollow noopener noreferrer">here</A>.</SPAN></LI></OL><P> </P><H1 id="toc-hId-1491755615" id="toc-hId-1492524448"><SPAN>What gets shipped with this release?</SPAN></H1><H3 id="toc-hId-1554176381"><SPAN>Usability improvements for system connection handling</SPAN></H3><P><SPAN>After creating a new destination there was no visual feedback that the destination was created successfully. We added a notification pop-up with a button which directly adds it as a folder to your workspace.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="destination_add_as_folder.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434898i10292816BFAD1A46/image-size/medium?v=v2&px=400" role="button" title="destination_add_as_folder.png" alt="destination_add_as_folder.png" /></span></SPAN></P><P><SPAN>We added a "Log on to Destination..." command. While it was possible to log on to a destination via a right-click menu in the explorer view there was no command available for it. </SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="logon_menu_item.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434931iB7F9BF5A47889FC6/image-size/medium?v=v2&px=400" role="button" title="logon_menu_item.png" alt="logon_menu_item.png" /></span></SPAN></P><P><SPAN>Now, you can easily log on to a destination using the keyboard via the new command.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="logon1.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434910i9D9212B5A0BB6C21/image-size/medium?v=v2&px=400" role="button" title="logon1.png" alt="logon1.png" /></span></SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="logon2.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434914i14577214BB68CBEE/image-size/medium?v=v2&px=400" role="button" title="logon2.png" alt="logon2.png" /></span></SPAN></P><H3 id="toc-hId-1357662876">A significant improvement of object type support</H3><P>A lot of requested object types get enabled by this release. Here is the list of added object types:</P><H5 id="toc-hId-1419314809">Classic ABAP source code</H5><UL><LI><SPAN>Create and Manage Function Groups and Modules</SPAN></LI><LI><SPAN>Create and Manage ABAP Programs and Includes</SPAN></LI><LI><SPAN>Create and Manage Lock Objects</SPAN></LI></UL><H5 id="toc-hId-1222801304"><SPAN>Data Dictionary</SPAN></H5><UL><LI><SPAN>Create and Manage Database Tables</SPAN></LI><LI><SPAN>Create and Manage Structures</SPAN></LI><LI><SPAN>Create and Manage Type Groups</SPAN></LI></UL><H5 id="toc-hId-1026287799">RESTful Application Programming Model</H5><UL><LI><SPAN>Creating Behavior Definition Extensions</SPAN></LI><LI><SPAN>Enabling more OData Binding Types in Service Binding</SPAN></LI><LI><SPAN>Create and Manage CDS Entity Buffers</SPAN></LI></UL><H3 id="toc-hId-571608856">New MCP tools</H3><H5 id="toc-hId-633260789">Unified diff tool for transports</H5><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="thomasalexander_ritter_0-1784628047832.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/435436iB59B911CF866B6C9/image-size/medium?v=v2&px=400" role="button" title="thomasalexander_ritter_0-1784628047832.png" alt="thomasalexander_ritter_0-1784628047832.png" /></span></P><P>The unified diff tool generates a <A href="https://git-scm.com/docs/diff-format" target="_self" rel="nofollow noopener noreferrer">git like diff</A> for a given transport request. The tool enables token efficient analysis of the changes contained in a transport request. This enables AI agents to fulfill requests such as:</P><UL><LI>"Explain transport XYZ"</LI><LI>"Generate a description for transport XYZ documenting what got changed and why"</LI><LI>"How much impact does transport XYZ has on the system? How dangerous is this transport?"</LI></UL><H5 id="toc-hId-436747284">Tools for ABAP Test Cockpit (ATC)</H5><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="thomasalexander_ritter_0-1784633951380.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/435557iD397E3BC3A126A06/image-size/medium?v=v2&px=400" role="button" title="thomasalexander_ritter_0-1784633951380.png" alt="thomasalexander_ritter_0-1784633951380.png" /></span></P><P>The ATC MCP tools give AI agents access to running the ATC checks for a given change. This enables AI agents to fulfill requests such as:</P><UL><LI>"Implement [XYZ]. Afterwards, run the ATC checks and fix the reported findings."</LI><LI>"Run ATC checks for object XYZ"</LI></UL><H3 id="toc-hId--93163028">Additional UX improvements</H3><P>We added a command which allows you to quickly open the SAP Help documentation.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="abap_vscode_documentation.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434927iD70EE3151616CDD8/image-size/medium?v=v2&px=400" role="button" title="abap_vscode_documentation.png" alt="abap_vscode_documentation.png" /></span></P><P>From each occurrence of a CDS annotation in a CDS data definition or CDS metadata extension, you can now navigate to its CDS annotation definition. To navigate, press F3 on the relevant CDS annotation. This helps you to investigate and to understand the use of a CDS annotation.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="thomasalexander_ritter_0-1784557648564.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/435160iC57E82F6E5DBC314/image-size/medium?v=v2&px=400" role="button" title="thomasalexander_ritter_0-1784557648564.png" alt="thomasalexander_ritter_0-1784557648564.png" /></span></P><P>For more information see the new <A href="https://help.sap.com/docs/abap-cloud/abap-development-tools-for-visual-studio-code/what-s-new" target="_self" rel="noopener noreferrer">"What's New"</A> page.</P><P> </P><H1 id="toc-hId-297129481">Sidenote: first version of ABAP cleaner VS Code extension available</H1><P>Lots of community members asked for ABAP cleaner support in VS Code. We are happy to announce that the first version of the <A href="https://marketplace.visualstudio.com/items?itemName=SAPOSS.abap-cleaner" target="_self" rel="nofollow noopener noreferrer">ABAP cleaner extension</A> is available, now!</P><P> </P><H1 id="toc-hId-902215100" id="toc-hId-100615976"><SPAN>What's next?</SPAN></H1><P data-unlink="true"><SPAN>From now on, we will stop listing upcoming features directly in the release blogs. Instead we have cleaned up and refreshed our <A href="https://help.sap.com/docs/abap-cross-product/roadmap-info/tools" target="_self" rel="noopener noreferrer">ABAP Cloud Roadmap page</A>. The planned features are listed there</SPAN><SPAN>.</SPAN></P><H2 id="toc-hId-834784314" id="toc-hId--389300536">Provide feedback and influence our product backlog!</H2><P><SPAN>We welcome your feedback! Feel free to use the comment section or <A href="https://influence.sap.com/sap/ino/#/campaign/2911" target="_blank" rel="noopener noreferrer">create a customer influence request</A> to let us know which features you are missing the most. Your input will help us prioritize the feature backlog for the next releases.</SPAN></P>2026-07-21T13:53:34.813000+02:00https://community.sap.com/t5/technology-blog-posts-by-members/uploading-multi-sheet-excel-files-to-create-bank-master-records-in-sap/ba-p/14441067Uploading Multi-Sheet Excel Files to Create Bank Master Records in SAP2026-07-23T13:17:51.638000+02:00reddysekharapathipatihttps://community.sap.com/t5/user/viewprofilepage/user-id/2189357<P><STRONG>INTRODUCTION</STRONG></P><P>The opening A while back change to your real project type and rough timing (e.g., "During a recent S/4HANA migration project for a client..." or "As part of a support ticket raised by the finance team...").</P><P>The bolded sentence about ALSM_EXCEL_TO_INTERNAL_TABLE — delete it if you'd never actually used that older method before If that wasn't your real reaction, replace it with whatever actually confused you about Step 2 — maybe it was the worksheet name lookup, or the ASSIGN COMPONENT syntax itself, or something else entirely Only keep this if you genuinely forgot the commit If your real bug was something else — e.g., a wrong bank key format, a BAPI return error you didn't handle, duplicate records, etc. — delete this sentence and write 1-2 lines describing what actually went wrong for you</P><P><STRONG>Solution Review</STRONG></P><P>The report ZPRG_EXCELSHEET2_CRBAPIREC_RS lets a user upload an Excel file containing Sheet1 and Sheet2, reads both into internal tables, matches records across the two sheets, and creates Bank Master records using the standard BAPI BAPI_BANK_CREATE.<STRONG><BR /></STRONG></P><P><STRONG>Step 1: Selecting and uploading the Excel file.</STRONG></P><P>This part was straightforward — standard file dialog using cl_gui_frontend_services=>file_open_dialog, then uploading the binary content with GUI_UPLOAD, and converting it to XSTRING with SCMS_BINARY_TO_XSTRING since that's the format CL_FDT_XL_SPREADSHEET expects.</P><pre class="lia-code-sample language-abap"><code>CALL METHOD cl_gui_frontend_services=>gui_upload
EXPORTING
filename = lv_file
filetype = 'BIN'
IMPORTING
filelength = lv_size
CHANGING
data_tab = lt_binary.
CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
EXPORTING
input_length = lv_size
IMPORTING
buffer = lv_xstring
TABLES
binary_tab = lt_binary.</code></pre><P><STRONG>Step 2: Reading both worksheets.</STRONG></P><P>The program uses the SAP standard class CL_FDT_XL_SPREADSHEET to open the Excel file. It first retrieves the worksheet names and then reads Sheet1 and Sheet2 separately. The data from each worksheet is stored in separate internal tables by mapping the Excel columns to the corresponding ABAP structures.</P><pre class="lia-code-sample language-abap"><code>CALL METHOD lo_excel->if_fdt_doc_spreadsheet~get_itab_from_worksheet
EXPORTING
worksheet_name = 'Sheet1'
RECEIVING
itab = lo_ref1.
ASSIGN lo_ref1->* TO <lt_generic1>.
LOOP AT <lt_generic1> ASSIGNING <ls_generic1>.
ASSIGN COMPONENT 1 OF STRUCTURE <ls_generic1> TO <lv_field>.
IF sy-subrc = 0. ls_sheet1-bank_ctry = <lv_field>. ENDIF.
...
ENDLOOP.</code></pre><P>I'll be honest — the first time I saw this "generic table + field-symbol + component index" pattern, it felt like more ceremony than I expected for something as simple as "read column 1, 2, 3." But once I understood why — the class has no way of knowing your target structure in advance, since Excel columns aren't typed — it made a lot more sense.</P><P>The one thing that tripped me up initially was column order: CL_FDT_XL_SPREADSHEET maps by column position, not header name, so if someone reorders columns in the Excel file (which, let's be honest, business users do all the time), the mapping silently breaks. That's worth calling out clearly to whoever maintains the Excel template.</P><P>Sheet2 follows the exact same pattern, just with four columns instead of three (adding city and SWIFT code).</P><P><STRONG>Step 3: Matching records and creating Bank Master entries.</STRONG></P><P>Once both sheets were in internal tables, I looped through Sheet1 and used READ TABLE ... WITH KEY to find the matching row in Sheet2 based on bank country and bank key:</P><pre class="lia-code-sample language-abap"><code>READ TABLE lt_sheet2 INTO ls_sheet2
WITH KEY bank_ctry = ls_sheet1-bank_ctry
bank_key = ls_sheet1-bank_key.
IF sy-subrc = 0.
gs_address-city = ls_sheet2-city.
gs_address-swift_code = ls_sheet2-swift.
ENDIF.</code></pre><P>Then calling BAPI_BANK_CREATE, and — this part I added after an early test run — explicitly committing or rolling back based on the return message:</P><pre class="lia-code-sample language-abap"><code>IF ls_return-type CA 'AE'.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ENDIF.</code></pre><P>I actually forgot the commit in my very first version and spent a few confused minutes wondering why none of the banks were showing up in FI01/FI03 afterward — small reminder that BAPIs in SAP generally don't auto-commit, and it's easy to overlook when you're focused on getting the Excel-reading logic right.</P><P><STRONG>Complete ABAP Source Code</STRONG></P><P> </P><pre class="lia-code-sample language-abap"><code>REPORT zprg_excelsheet2_crbapirec_rs.
TABLES: bnka.
TYPES: BEGIN OF ty_sheet1,
bank_ctry TYPE bnka-banks,
bank_key TYPE bnka-bankl,
bank_name TYPE bnka-banka,
END OF ty_sheet1.
TYPES: BEGIN OF ty_sheet2,
bank_ctry TYPE bnka-banks,
bank_key TYPE bnka-bankl,
city TYPE bnka-ort01,
swift TYPE bnka-swift,
END OF ty_sheet2.
DATA:
lt_sheet1 TYPE TABLE OF ty_sheet1,
ls_sheet1 TYPE ty_sheet1,
lt_sheet2 TYPE TABLE OF ty_sheet2,
ls_sheet2 TYPE ty_sheet2,
lt_binary TYPE solix_tab,
lv_xstring TYPE xstring,
lv_size TYPE i,
lo_excel TYPE REF TO cl_fdt_xl_spreadsheet,
lt_names TYPE if_fdt_doc_spreadsheet=>t_worksheet_names,
ls_return TYPE bapiret2,
gs_address TYPE bapi1011_address,
lv_file TYPE string,
lt_files TYPE filetable,
lv_rc TYPE i.
PARAMETERS: p_file TYPE rlgrap-filename.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
PERFORM f4_file_selection.
START-OF-SELECTION.
PERFORM upload_file.
PERFORM parse_excel.
PERFORM create_banks.
FORM f4_file_selection.
CALL METHOD cl_gui_frontend_services=>file_open_dialog
EXPORTING
window_title = 'Select Excel File'
default_extension = 'XLSX'
file_filter = 'Excel Files (*.xlsx)|*.xlsx|All Files (*.*)|*.*'
CHANGING
file_table = lt_files
rc = lv_rc
EXCEPTIONS
OTHERS = 1.
IF sy-subrc = 0 AND lines( lt_files ) > 0.
READ TABLE lt_files INTO DATA(ls_file) INDEX 1.
p_file = ls_file-filename.
ENDIF.
ENDFORM.
FORM upload_file.
lv_file = p_file.
CALL METHOD cl_gui_frontend_services=>gui_upload
EXPORTING
filename = lv_file
filetype = 'BIN'
IMPORTING
filelength = lv_size
CHANGING
data_tab = lt_binary
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0.
MESSAGE 'File upload failed' TYPE 'E'.
ENDIF.
CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
EXPORTING
input_length = lv_size
IMPORTING
buffer = lv_xstring
TABLES
binary_tab = lt_binary.
ENDFORM.
FORM parse_excel.
DATA: lo_ref1 TYPE REF TO data,
lo_ref2 TYPE REF TO data.
FIELD-SYMBOLS: <lt_generic1> TYPE STANDARD TABLE,
<ls_generic1> TYPE any,
<lt_generic2> TYPE STANDARD TABLE,
<ls_generic2> TYPE any,
<lv_field> TYPE any.
TRY.
CREATE OBJECT lo_excel
EXPORTING
document_name = lv_file
xdocument = lv_xstring.
CALL METHOD lo_excel->if_fdt_doc_spreadsheet~get_worksheet_names
IMPORTING
worksheet_names = lt_names.
CALL METHOD lo_excel->if_fdt_doc_spreadsheet~get_itab_from_worksheet
EXPORTING
worksheet_name = 'Sheet1'
RECEIVING
itab = lo_ref1.
ASSIGN lo_ref1->* TO <lt_generic1>.
LOOP AT <lt_generic1> ASSIGNING <ls_generic1>.
CLEAR ls_sheet1.
ASSIGN COMPONENT 1 OF STRUCTURE <ls_generic1> TO <lv_field>.
IF sy-subrc = 0. ls_sheet1-bank_ctry = <lv_field>. ENDIF.
ASSIGN COMPONENT 2 OF STRUCTURE <ls_generic1> TO <lv_field>.
IF sy-subrc = 0. ls_sheet1-bank_key = <lv_field>. ENDIF.
ASSIGN COMPONENT 3 OF STRUCTURE <ls_generic1> TO <lv_field>.
IF sy-subrc = 0. ls_sheet1-bank_name = <lv_field>. ENDIF.
APPEND ls_sheet1 TO lt_sheet1.
ENDLOOP.
CALL METHOD lo_excel->if_fdt_doc_spreadsheet~get_itab_from_worksheet
EXPORTING
worksheet_name = 'Sheet2'
RECEIVING
itab = lo_ref2.
ASSIGN lo_ref2->* TO <lt_generic2>.
LOOP AT <lt_generic2> ASSIGNING <ls_generic2>.
CLEAR ls_sheet2.
ASSIGN COMPONENT 1 OF STRUCTURE <ls_generic2> TO <lv_field>.
IF sy-subrc = 0. ls_sheet2-bank_ctry = <lv_field>. ENDIF.
ASSIGN COMPONENT 2 OF STRUCTURE <ls_generic2> TO <lv_field>.
IF sy-subrc = 0. ls_sheet2-bank_key = <lv_field>. ENDIF.
ASSIGN COMPONENT 3 OF STRUCTURE <ls_generic2> TO <lv_field>.
IF sy-subrc = 0. ls_sheet2-city = <lv_field>. ENDIF.
ASSIGN COMPONENT 4 OF STRUCTURE <ls_generic2> TO <lv_field>.
IF sy-subrc = 0. ls_sheet2-swift = <lv_field>. ENDIF.
APPEND ls_sheet2 TO lt_sheet2.
ENDLOOP.
CATCH cx_fdt_excel_core INTO DATA(lx_excel).
MESSAGE lx_excel->get_text( ) TYPE 'E'.
ENDTRY.
IF lt_sheet1 IS INITIAL.
MESSAGE 'No data found in Sheet1' TYPE 'E'.
ENDIF.
ENDFORM.
FORM create_banks.
LOOP AT lt_sheet1 INTO ls_sheet1.
IF ls_sheet1-bank_ctry IS INITIAL OR ls_sheet1-bank_key IS INITIAL.
WRITE: / 'Skipped row - missing country/key'.
CONTINUE.
ENDIF.
CLEAR: ls_return, gs_address.
gs_address-bank_name = ls_sheet1-bank_name.
READ TABLE lt_sheet2 INTO ls_sheet2
WITH KEY bank_ctry = ls_sheet1-bank_ctry
bank_key = ls_sheet1-bank_key.
IF sy-subrc = 0.
gs_address-city = ls_sheet2-city.
gs_address-swift_code = ls_sheet2-swift.
ENDIF.
CALL FUNCTION 'BAPI_BANK_CREATE'
EXPORTING
bank_ctry = ls_sheet1-bank_ctry
bank_key = ls_sheet1-bank_key
bank_address = gs_address
IMPORTING
return = ls_return.
IF ls_return-type CA 'AE'.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
WRITE: / ls_sheet1-bank_key, ls_return-message.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
WRITE: / 'Bank Created Successfully:', ls_sheet1-bank_key.
ENDIF.
ENDLOOP.
ENDFORM.</code></pre><P><STRONG>CONCLUSION</STRONG></P><P>What I liked about this approach is that it replaces two separate old-style problems — reading Excel data (previously OLE Automation or ALSM_EXCEL_TO_INTERNAL_TABLE) and matching data across sheets — with one clean, modern, generic-table-based method. It's a solid pattern if you ever need to pull structured data from multi-sheet Excel files into any custom or standard BAPI, not just Bank Master creation.</P><P>If you've worked with CL_FDT_XL_SPREADSHEET yourself, I'd be curious to hear if you ran into the same column-position mapping issue I did, or if you handled worksheet validation differently. Feel free to share your thoughts, questions, or improvements in the comments below.</P><P><STRONG>SAMPLE INPUT<BR /></STRONG>Sheet1 (Bank Country, Bank Key, Bank Name)</P><P>Bank Ctry Bank Key Bank Name</P><TABLE width="362px"><TBODY><TR><TD width="58.7188px">US</TD><TD width="107.938px">021000021</TD><TD width="194.344px">JPMorgan Chase Bank</TD></TR><TR><TD width="58.7188px">US</TD><TD width="107.938px">026009593</TD><TD width="194.344px">Bank of America</TD></TR><TR><TD width="58.7188px">IN</TD><TD width="107.938px">SBIN0001234</TD><TD width="194.344px">State Bank of India</TD></TR><TR><TD width="58.7188px">DE</TD><TD width="107.938px">10070000</TD><TD width="194.344px">Deutsche Bank AG</TD></TR></TBODY></TABLE><P><STRONG>Sheet2</STRONG> (<STRONG>Bank Country, Bank Key, City, SWIFT</STRONG>)</P><P>Bank Ctry Bank Key City SWIFT</P><TABLE><TBODY><TR><TD>US</TD><TD>021000021</TD><TD>New York</TD><TD>CHASUS33</TD></TR><TR><TD>US</TD><TD>026009593</TD><TD>Charlotte</TD><TD>BOFAUS3N</TD></TR><TR><TD>IN</TD><TD>SBIN0001234</TD><TD>Mumbai</TD><TD>SBININBB</TD></TR><TR><TD>DE</TD><TD>10070000</TD><TD>Berlin</TD><TD>DEUTDEBB</TD></TR></TBODY></TABLE><P><BR /><STRONG>SAMPLE OUTPUT</STRONG></P><P>Bank Created: 021000021<BR />Bank Created: 026009593<BR />Bank Created: SBIN0001234<BR />Bank Created: 10070000.</P><P><a href="https://community.sap.com/t5/c-khhcw49343/ABAP+Development/pd-p/833755570260738661924709785639136" class="lia-product-mention" data-product="314-1">ABAP Development</a> </P>2026-07-23T13:17:51.638000+02:00