https://raw.githubusercontent.com/ajmaradiaga/feeds/main/scmt/topics/ABAP-Cloud-blog-posts.xmlSAP Community - ABAP Cloud2026-07-24T20:00:00.659893+00:00python-feedgenABAP Cloud blog posts in SAP Communityhttps://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/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/technology-blog-posts-by-sap/custom-field-and-logic-from-scratch/ba-p/14426888Custom Field and Logic from Scratch2026-06-25T06:22:05.149000+02:00PM_iiitshttps://community.sap.com/t5/user/viewprofilepage/user-id/2165681<P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="PM_iiits_2-1782361058052.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/425924i0E1D455DE449B3D2/image-size/medium?v=v2&px=400" role="button" title="PM_iiits_2-1782361058052.png" alt="PM_iiits_2-1782361058052.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="PM_iiits_3-1782361073492.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/425926i94ABD3A33079CBAC/image-size/medium?v=v2&px=400" role="button" title="PM_iiits_3-1782361073492.png" alt="PM_iiits_3-1782361073492.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="PM_iiits_4-1782361083153.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/425927i8D990884D801D293/image-size/medium?v=v2&px=400" role="button" title="PM_iiits_4-1782361083153.png" alt="PM_iiits_4-1782361083153.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="PM_iiits_5-1782361095964.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/425928iEEBCF8ED6A558388/image-size/medium?v=v2&px=400" role="button" title="PM_iiits_5-1782361095964.png" alt="PM_iiits_5-1782361095964.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="PM_iiits_6-1782361130437.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/425930iADF4F9D6AA657C38/image-size/medium?v=v2&px=400" role="button" title="PM_iiits_6-1782361130437.png" alt="PM_iiits_6-1782361130437.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="PM_iiits_7-1782361138380.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/425931iDC277EB86E16F353/image-size/medium?v=v2&px=400" role="button" title="PM_iiits_7-1782361138380.png" alt="PM_iiits_7-1782361138380.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="PM_iiits_8-1782361147005.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/425932i7D6C42D753A0A934/image-size/medium?v=v2&px=400" role="button" title="PM_iiits_8-1782361147005.png" alt="PM_iiits_8-1782361147005.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="PM_iiits_9-1782361165238.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/425933iD92849230E083607/image-size/medium?v=v2&px=400" role="button" title="PM_iiits_9-1782361165238.png" alt="PM_iiits_9-1782361165238.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="PM_iiits_10-1782361172437.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/425934i1B2F01EAD067DC98/image-size/medium?v=v2&px=400" role="button" title="PM_iiits_10-1782361172437.png" alt="PM_iiits_10-1782361172437.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="PM_iiits_11-1782361180106.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/425935i251E1095A89FCFAC/image-size/medium?v=v2&px=400" role="button" title="PM_iiits_11-1782361180106.png" alt="PM_iiits_11-1782361180106.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="PM_iiits_12-1782361186725.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/425936i946E1C375DA5F40D/image-size/medium?v=v2&px=400" role="button" title="PM_iiits_12-1782361186725.png" alt="PM_iiits_12-1782361186725.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="PM_iiits_13-1782361193025.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/425937i3593C816C17D7EF0/image-size/medium?v=v2&px=400" role="button" title="PM_iiits_13-1782361193025.png" alt="PM_iiits_13-1782361193025.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="PM_iiits_14-1782361203077.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/425938i866DD80823848F6C/image-size/medium?v=v2&px=400" role="button" title="PM_iiits_14-1782361203077.png" alt="PM_iiits_14-1782361203077.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="PM_iiits_15-1782361236291.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/425939iDB441480D584171D/image-size/medium?v=v2&px=400" role="button" title="PM_iiits_15-1782361236291.png" alt="PM_iiits_15-1782361236291.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="PM_iiits_16-1782361247393.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/425940iC1246C1C7DB47E1D/image-size/medium?v=v2&px=400" role="button" title="PM_iiits_16-1782361247393.png" alt="PM_iiits_16-1782361247393.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="PM_iiits_17-1782361257139.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/425941i63BFAAF9CDB5AD90/image-size/medium?v=v2&px=400" role="button" title="PM_iiits_17-1782361257139.png" alt="PM_iiits_17-1782361257139.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="PM_iiits_18-1782361263884.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/425942i70C32F999461A07F/image-size/medium?v=v2&px=400" role="button" title="PM_iiits_18-1782361263884.png" alt="PM_iiits_18-1782361263884.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="PM_iiits_19-1782361270093.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/425943iF090A10D1546DB9B/image-size/medium?v=v2&px=400" role="button" title="PM_iiits_19-1782361270093.png" alt="PM_iiits_19-1782361270093.png" /></span></P><P> </P><P> </P>2026-06-25T06:22:05.149000+02:00https://community.sap.com/t5/enterprise-resource-planning-blog-posts-by-sap/recommendations-for-wrapper-interface-design/ba-p/14425678Recommendations for Wrapper Interface Design2026-06-25T15:19:44.883000+02:00kaidehmannhttps://community.sap.com/t5/user/viewprofilepage/user-id/14159<H1 id="toc-hId-1689162020"><SPAN>Introduction</SPAN></H1><P><SPAN>With the shift towards <STRONG>clean core extensibility</STRONG> in SAP S/4HANA, developers are encouraged to build extensions that are upgrade-stable, loosely coupled, and compliant with ABAP Cloud principles. One key design pattern to achieve this is the use of <STRONG>wrappers</STRONG>.</SPAN></P><P><SPAN>As described in <A href="https://www.sap.com/docs/download/2024/09/20aece06-d87e-0010-bca6-c68f7e60039b.pdf" target="_blank" rel="noopener noreferrer">Clean core extensibility for SAP S/4HANA Cloud</A> and, in more detail, in <A href="https://www.sap.com/docs/download/2022/10/52e0cd9b-497e-0010-bca6-c68f7e60039b.pdf" target="_blank" rel="noopener noreferrer">Extend SAP S/4HANA in the cloud and on premise with ABAP based extensions</A>, SAP recommends encapsulating classic APIs and internal objects within a wrapper layer. This wrapper can then be <STRONG>released for use in ABAP Cloud development</STRONG>. </SPAN></P><P><SPAN>In this blog post, we will walk through:</SPAN></P><UL><LI><SPAN>Why wrappers are essential</SPAN></LI><LI><SPAN>How to design them effectively</SPAN></LI><LI><SPAN>Best practices for data types and consistency</SPAN></LI><LI><SPAN>Common pitfalls and how to avoid them</SPAN></LI></UL><P> </P><H1 id="toc-hId-1492648515"><SPAN>Why Use Wrappers?</SPAN></H1><P><SPAN>A wrapper acts as a <STRONG>controlled façade</STRONG> around existing SAP APIs (for example, classic BAPIs). Instead of consuming these APIs directly, your application interacts only with the wrapper.</SPAN></P><H2 id="toc-hId-1425217729"><SPAN>Key Benefits</SPAN></H2><UL><LI><STRONG><SPAN>Encapsulation of internal APIs: </SPAN></STRONG><SPAN>Only the necessary parts of the underlying API are exposed. </SPAN></LI><LI><STRONG><SPAN>Clear contract: </SPAN></STRONG><SPAN>The wrapper defines a stable and explicit interface towards SAP. </SPAN></LI><LI><STRONG><SPAN>Reduced dependencies: </SPAN></STRONG><SPAN>Consumers depend on the wrapper, not the underlying implementation.</SPAN></LI><LI><STRONG><SPAN>Improved flexibility: </SPAN></STRONG><SPAN>The implementation can be replaced or adapted without impacting consumers.</SPAN></LI><LI><STRONG><SPAN>Better testability: </SPAN></STRONG><SPAN>Wrappers make it easier to create test doubles and isolate logic during testing.</SPAN></LI></UL><P> </P><H1 id="toc-hId-1099621505">Example: Wrapper for a BAPI</H1><P><SPAN>A typical case is wrapping a classic BAPI such as BAPI_USER_GET_DETAIL. Instead of calling the BAPI directly,</SPAN></P><UL><LI><SPAN>You define a wrapper interface</SPAN></LI><LI><SPAN>Call the BAPI inside the wrapper implementation</SPAN></LI><LI><SPAN>Expose only the required parameters and results</SPAN></LI></UL><P><SPAN>Let’s assume your task is getting the first name, the last name, and the phone number of a user. The wrapper interface and implementation may look like this:</SPAN></P><P><SPAN>C1-released interface:</SPAN></P><pre class="lia-code-sample language-abap"><code>INTERFACE zkd_if_wrap_bapi_user_get PUBLIC .
TYPES:
ty_username TYPE xubname,
BEGIN OF ts_person,
firstname TYPE ad_namefir,
lastname TYPE ad_namelas,
END OF ts_person,
BEGIN OF ts_telephone,
std_no TYPE ad_flgdfnr,
tel_no TYPE ad_telnrlg,
END OF ts_telephone,
tt_telephone TYPE STANDARD TABLE OF ts_telephone WITH NON-UNIQUE DEFAULT KEY,
tt_bapiret2 TYPE STANDARD TABLE OF bapiret2 WITH NON-UNIQUE DEFAULT KEY.
METHODS:
user_get_details
IMPORTING
iv_username TYPE ty_username
iv_cache_results TYPE abap_boolean DEFAULT abap_false
EXPORTING
es_person TYPE ts_person
et_telephone TYPE tt_telephone
et_return TYPE tt_bapiret2.
ENDINTERFACE.</code></pre><P>Non-released implementation:</P><pre class="lia-code-sample language-abap"><code>CLASS zkd_cl_wrap_bapi_user_get DEFINITION PUBLIC.
PUBLIC SECTION.
INTERFACES zkd_if_wrap_bapi_user_get.
ENDCLASS.
CLASS zkd_cl_wrap_bapi_user_get IMPLEMENTATION.
METHOD zkd_if_wrap_bapi_user_get~user_get_details.
DATA ls_address TYPE bapiaddr3.
DATA lt_addtel TYPE STANDARD TABLE OF bapiadtel.
CALL FUNCTION 'BAPI_USER_GET_DETAIL'
EXPORTING
username = iv_username
cache_results = iv_cache_results
IMPORTING
address = ls_address
TABLES
addtel = lt_addtel
return = et_return.
es_person = CORRESPONDING #( ls_address ).
et_telephone = CORRESPONDING #( lt_addtel ).
ENDMETHOD.
ENDCLASS.</code></pre><P>C1-released factory:</P><pre class="lia-code-sample language-abap"><code>CLASS zkd_cl_wrap_factory DEFINITION PUBLIC CREATE PRIVATE.
PUBLIC SECTION.
CLASS-METHODS:
get_wrap_bapi_user_get RETURNING VALUE(ro_wrapper) TYPE REF TO zkd_if_wrap_bapi_user_get.
ENDCLASS.
CLASS zkd_cl_wrap_factory IMPLEMENTATION.
METHOD get_wrap_bapi_user_get.
ro_wrapper = NEW zkd_cl_wrap_bapi_user_get( ).
ENDMETHOD.
ENDCLASS.</code></pre><P><SPAN>The wrapper may be accessed as indicated in the following console application:</SPAN></P><pre class="lia-code-sample language-abap"><code>CLASS zkd_cl_call_wrap_bapi_user_get DEFINITION PUBLIC.
PUBLIC SECTION.
INTERFACES if_oo_adt_classrun.
ENDCLASS.
CLASS zkd_cl_call_wrap_bapi_user_get IMPLEMENTATION.
METHOD if_oo_adt_classrun~main.
DATA lo_wrapper TYPE REF TO zkd_if_wrap_bapi_user_get.
lo_wrapper = zkd_cl_wrap_factory=>get_wrap_bapi_user_get( ).
lo_wrapper->user_get_details(
EXPORTING
iv_username = 'DEHMANN'
IMPORTING
es_person = DATA(ls_person)
et_telephone = DATA(lt_telephone)
et_return = DATA(lt_return) ).
out->write( |First name: { ls_person-firstname }| ).
out->write( |Last name : { ls_person-lastname }| ).
out->write( |Phone numbers:| ).
LOOP AT lt_telephone INTO DATA(ls_telephone).
out->write( ls_telephone-tel_no ).
ENDLOOP.
ENDMETHOD.
ENDCLASS.</code></pre><P> </P><H1 id="toc-hId-903108000"><SPAN>General Design Best Practices</SPAN></H1><P><SPAN>When designing wrapper interfaces, follow these principles:</SPAN></P><UL><LI><STRONG><SPAN>Keep it lean</SPAN></STRONG><UL><LI><SPAN>The wrapper implementation should stay close to the underlying API</SPAN></LI><LI><SPAN>Avoid adding unnecessary logic inside the wrapper</SPAN></LI></UL></LI><LI><STRONG><SPAN>Expose only what you need</SPAN></STRONG><UL><LI><SPAN>Restrict the interface to required parameters and outputs</SPAN></LI><LI><SPAN>Avoid overexposing SAP structures</SPAN></LI></UL></LI><LI><STRONG><SPAN>Separate concerns</SPAN></STRONG><UL><LI><SPAN>Handle conversions (internal ↔ external formats) outside or in dedicated components</SPAN></LI></UL></LI></UL><P><SPAN>In our example, the wrapper exposes only the parameters that are needed. Moreover, BAPIRET2 is the only SAP structure that is being used. Besides mapping parameters, the wrapper does not contain any additional logic.</SPAN></P><P> </P><H1 id="toc-hId-706594495"><SPAN>Best Practices for Referenced Data Types</SPAN></H1><P><SPAN>Handling data types correctly is essential. Follow these principles when implementing your wrapper interface:</SPAN></P><UL><LI><STRONG><SPAN>Use released types when available: </SPAN></STRONG><SPAN>If SAP provides a suitable, released data type, always use it directly in your interface definition. </SPAN></LI><LI><STRONG><SPAN>Define your own types when needed: </SPAN></STRONG><SPAN>If the required data types are not released, declare them explicitly within your wrapper interface using the TYPES statement. If these types are shared among a set of wrappers, then consider declaring these in a central interface with corresponding TYPES declaration. If technically needed, you may also create such types in ABAP Dictionary and release them for use in Cloud Development.</SPAN></LI><LI><SPAN><STRONG>Reference existing data elements:</STRONG> When declaring your own types, reference SAP data elements — even if not released — to maintain consistency.</SPAN></LI><LI><STRONG><SPAN>Define smaller structures: </SPAN></STRONG><SPAN>Avoid tight coupling to SAP structures. Rather than reusing or copying large SAP structures, declare smaller, dedicated structures with required fields only. This reduces the dependency footprint.</SPAN></LI><LI><STRONG><SPAN>Be careful when declaring table types: </SPAN></STRONG><SPAN>Always declare a corresponding line type explicitly. </SPAN></LI></UL><P><SPAN>Let's check how these recommendations map to our example: </SPAN></P><UL><LI><SPAN>The released data element ABAP_BOOL is being used in the type declaration of the IV_CACHE_RESULTS parameter and the released BAPIRET2 structure is being used for the declaration of the TT_BAPIRET2 table type.</SPAN></LI><LI><SPAN>We define our own types TY_USERNAME, TS_PERSON, and TS_TELEPHONE referencing non-released SAP data elements such as XUBNAME or AD_NAMEFIR.</SPAN></LI><LI><SPAN>Instead of exposing all components of the BAPIADDR3 structure we declare the (small) TS_PERSON structure which contains only the relevant components. We keep the component names to ease the mapping in the implementation.</SPAN></LI><LI><SPAN>For the phone numbers we declare the TT_TELEPHONE table type and TS_TELEPHONE line type.</SPAN></LI></UL><P><SPAN>If you decide to reference non-released SAP structures in the type declarations, keep the following restrictions in mind:</SPAN></P><UL><LI><SPAN>If the SAP structure is complex (that is, it contains nested or non-elementary data types such as structure, table type, data reference, or object reference), you can't access these nested or non-elementary components from ABAP for Cloud Development unless they're released.</SPAN></LI><LI><SPAN>If the SAP structure is flat and contains only elementary data types, you can access the components of the structure from ABAP for Cloud Development. However, rework might be required if SAP enhances the structure with non-elementary data types in the future.</SPAN></LI></UL><P><SPAN>Let’s take a look at a negative example. Assume your task is reading the text of an object. You consider using the READ_MULTIPLE_TEXTS function module, which is a classic API. The wrapper implementation may look like this:</SPAN></P><P><SPAN>C1-released interface:</SPAN></P><pre class="lia-code-sample language-abap"><code>INTERFACE zkd_if_wrap_read_texts PUBLIC .
TYPES:
tt_texttable TYPE text_lh.
METHODS:
read_texts
IMPORTING
iv_name TYPE tdobname
iv_object TYPE tdobject
iv_id TYPE tdid
EXPORTING
et_text_table TYPE tt_texttable.
ENDINTERFACE.</code></pre><P>Non-released implementation:</P><pre class="lia-code-sample language-abap"><code>CLASS zkd_cl_wrap_read_texts DEFINITION PUBLIC.
PUBLIC SECTION.
INTERFACES zkd_if_wrap_read_texts.
ENDCLASS.
CLASS zkd_cl_wrap_read_texts IMPLEMENTATION.
METHOD zkd_if_wrap_read_texts~read_texts.
CALL FUNCTION 'READ_MULTIPLE_TEXTS'
EXPORTING
name = iv_name
object = iv_object
id = iv_id
IMPORTING
text_table = et_text_table.
ENDMETHOD.
ENDCLASS.</code></pre><P>C1-released factory:</P><pre class="lia-code-sample language-abap"><code>CLASS zkd_cl_wrap_factory DEFINITION PUBLIC CREATE PRIVATE.
PUBLIC SECTION.
CLASS-METHODS:
get_wrap_bapi_user_get RETURNING VALUE(ro_wrapper) TYPE REF TO zkd_if_wrap_bapi_user_get,
get_wrap_read_texts RETURNING VALUE(ro_wrapper) TYPE REF TO zkd_if_wrap_read_texts.
ENDCLASS.
CLASS zkd_cl_wrap_factory IMPLEMENTATION.
METHOD get_wrap_bapi_user_get.
ro_wrapper = NEW zkd_cl_wrap_bapi_user_get( ).
ENDMETHOD.
METHOD get_wrap_read_texts.
ro_wrapper = NEW zkd_cl_wrap_read_texts( ).
ENDMETHOD.
ENDCLASS.</code></pre><P><SPAN>It uses the non-released TEXT_LH table type and does not declare a corresponding line type. Because there is no line type declaration, the “The use of element <element_name> of <object_type> <object_name> is not permitted” syntax check message is returned when trying to access a component of the underlying structure from ABAP for Cloud Development.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="syntax_error.png" style="width: 581px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/425800i042BF60CBDC2F218/image-dimensions/581x582?v=v2" width="581" height="582" role="button" title="syntax_error.png" alt="syntax_error.png" /></span></P><P><SPAN>You could fix this by adding a corresponding line type declaration using the non-released ITCLH structure, which is the base structure of the TEXT_LH table type.</SPAN></P><pre class="lia-code-sample language-abap"><code>INTERFACE zkd_if_wrap_read_texts PUBLIC .
TYPES:
ts_texttable TYPE itclh,
tt_texttable TYPE STANDARD TABLE OF ts_texttable.
METHODS:
read_texts
IMPORTING
iv_name TYPE tdobname
iv_object TYPE tdobject
iv_id TYPE tdid
EXPORTING
et_text_table TYPE tt_texttable.
ENDINTERFACE.</code></pre><P><SPAN> </SPAN><SPAN>You can now access the LINES component.</SPAN></P><pre class="lia-code-sample language-abap"><code>CLASS zkd_cl_call_wrap_read_texts DEFINITION PUBLIC.
PUBLIC SECTION.
INTERFACES if_oo_adt_classrun.
ENDCLASS.
CLASS zkd_cl_call_wrap_read_texts IMPLEMENTATION.
METHOD if_oo_adt_classrun~main.
DATA lo_wrapper TYPE REF TO zkd_if_wrap_read_texts.
lo_wrapper = zkd_cl_wrap_factory=>get_wrap_read_texts( ).
lo_wrapper->read_texts(
EXPORTING
iv_name = 'GLOSSAR SAP'
iv_object = 'FORM'
iv_id = 'TXT'
IMPORTING
et_text_table = DATA(lt_text_table) ).
READ TABLE lt_text_table INTO DATA(ls_text_table) INDEX 1.
DATA(lt_lines) = ls_text_table-lines.
ENDMETHOD.
ENDCLASS.</code></pre><P><SPAN>However, the ITCLH structure has the TDFORMAT component, which has a non-elementary type. When you try to access it from ABAP for Cloud Development, you’ll receive the “The use of element <element_name> of <object_type> <object_name> is not permitted” syntax check message.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="syntax_error2.png" style="width: 523px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/425802i852FCB75B354AB32/image-size/large?v=v2&px=999" role="button" title="syntax_error2.png" alt="syntax_error2.png" /></span></P><P><SPAN>This time, you won’t be able to fix it unless you define your own types.</SPAN></P><P> </P><H1 id="toc-hId-510080990"><SPAN>Ensuring Consistency</SPAN></H1><P><SPAN>Run the “API Release: Consistency of Released Objects” (API_CONSISTENCY) ATC check for your wrappers. Among other things, this checks if the components of your wrapper interface are accessible from ABAP for Cloud Development. In case of findings, rework your wrapper interfaces as recommended above.</SPAN></P><P><SPAN>Let’s take a look again at the negative example.</SPAN></P><pre class="lia-code-sample language-abap"><code>INTERFACE zkd_if_wrap_read_texts PUBLIC .
TYPES:
tt_texttable TYPE text_lh.
METHODS:
read_texts
IMPORTING
iv_name TYPE tdobname
iv_object TYPE tdobject
iv_id TYPE tdid
EXPORTING
et_text_table TYPE tt_texttable.
ENDINTERFACE.</code></pre><P><SPAN>If you run the consistency check for this wrapper interface, you’ll receive the following check messages. It’ll report problems with the missing line types:</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="check_messages.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/425806i949321236FE9D87E/image-size/large?v=v2&px=999" role="button" title="check_messages.png" alt="check_messages.png" /></span></P><P><SPAN>Read the <A href="https://help.sap.com/docs/abap-cloud/abap-development-tools-user-guide/checking-consistency-of-released-apis" target="_blank" rel="noopener noreferrer">Checking the Consistency of Released APIs</A> documentation for more information.</SPAN></P><P> </P><H1 id="toc-hId-313567485"><SPAN>Common Pitfalls</SPAN></H1><H2 id="toc-hId-246136699"><SPAN>Usage of Unreleased Objects</SPAN></H2><P><SPAN>A known issue (see SAP note <A href="https://me.sap.com/notes/3450531" target="_blank" rel="noopener noreferrer">3450531</A>) is that earlier syntax checks allowed access to:</SPAN></P><UL><LI><SPAN>Unreleased CDS entities via associations</SPAN></LI><LI><SPAN>Unreleased components of a complex structure</SPAN></LI></UL><P><SPAN>This got fixed and the syntax checks were tightened, and violations result in the “The use of element <element_name> of <object_type> <object_name> is not permitted” check message. The new syntax check message was added as a warning in 2023 and the priority got increased to error in 2025.</SPAN></P><P><SPAN>Hence, if you receive this check message, follow the guidance provided in the note. If the check message is caused by your wrapper being released incompletely as shown above, adjust the wrapper interface as recommended in this blog.</SPAN></P><H2 id="toc-hId-49623194"><SPAN>False Positives in Syntax Checks</SPAN></H2><P><SPAN>Unfortunately, there is another known issue (see SAP note <A href="https://me.sap.com/notes/3362119" target="_blank" rel="noopener noreferrer">3362119</A>) where some of these syntax check messages “The use of element <element_name> of <object_type> <object_name> is not permitted” were incorrect (false positives). Follow the guidance provided in the note and either apply the kernel correction (recommended) or exempt the false positive. In latter case, please make sure to exempt only false positives, since you’ll get real syntax errors when you upgrade the system to the 2025 release. If you’re unsure if it’s a false positive, consider running the API_CONSISTENCY ATC check. If the check reports a finding, then fix it, since it’s not a false positive.</SPAN></P><P> </P><H1 id="toc-hId-493767053"><SPAN>Icing On the Cake: Ensuring Compatibility</SPAN></H1><P><SPAN>In the ABAP Cloud Development model, using released SAP APIs is a core principle. Released SAP APIs are officially supported and have stable interfaces.</SPAN></P><UL><LI>SAP guarantees backward compatibility</LI><LI><SPAN>Your code will continue to work after upgrades or patches</SPAN></LI><LI><SPAN>No risk from using internal or unreleased objects that might change or disappear</SPAN></LI></UL><P><SPAN>A released API is not upgrade-stable just because it’s released. SAP provides tools and checks that can be used to identify incompatible changes for released APIs: To detect and prevent incompatible changes in released APIs, the API_COMPATIBILITY ATC check is provided. Any change that is not allowed according to the compatibility rules of the release contract will be reported by this ATC check. To check compatibility, the ATC check uses so-called API snapshots. You can create API snapshots at any time using the <A href="https://help.sap.com/docs/ABAP_PLATFORM_NEW/b5670aaaa2364a29935f40b16499972d/8dda6b60464540e1afe50d6d03320c99.html?locale=en-US&state=PRODUCTION&version=LATEST" target="_blank" rel="noopener noreferrer">Manage API Snapshots</A> app.</SPAN></P><P><SPAN>Even if you don’t ship the released APIs to third parties but just release APIs for bridging classic APIs to the ABAP Cloud Development model, make use of the compatibility check. For example, if you reference a non-released SAP data element in your wrapper interface and SAP changes the data element in an incompatible way, then the compatibility check will inform you about this change and you can react accordingly.</SPAN></P><P><SPAN>Read the <A href="https://help.sap.com/docs/abap-cloud/abap-development-tools-user-guide/checking-compatibility-of-released-apis" target="_blank" rel="noopener noreferrer">Checking the Compatibility of Released APIs</A> documentation for more information.</SPAN></P><P> </P><H1 id="toc-hId-297253548"><SPAN>Key Takeaways</SPAN></H1><P><SPAN>To sum up, </SPAN></P><UL><LI><SPAN>Wrapper interfaces are a core pattern for clean core extensibility</SPAN></LI><LI><SPAN>They decouple your application from SAP internals</SPAN></LI><LI><SPAN>Proper data type declaration is crucial </SPAN></LI><LI><SPAN>ATC checks help you create consistent wrappers</SPAN></LI><LI><SPAN>Take the “The use of element <element_name> of <object_type> <object_name> is not permitted” syntax check message seriously</SPAN></LI></UL>2026-06-25T15:19:44.883000+02:00https://community.sap.com/t5/abap-blog-posts/understanding-field-suppress-in-sap-rap-and-how-it-differs-from-ui-hidden/ba-p/14409246Understanding field(suppress) in SAP RAP and How It Differs from @UI.hidden and @Consumption.hidden2026-06-25T20:52:31.333000+02:00vidyadharsphttps://community.sap.com/t5/user/viewprofilepage/user-id/1913267<P class="lia-align-justify" style="text-align : justify;"><FONT face="arial,helvetica,sans-serif" color="#000000"><U><FONT size="5"><STRONG>INTRODUCTION</STRONG></FONT></U></FONT></P><P><FONT color="#000000">When working with SAP RAP (RESTful Application Programming Model), the Behavior Definition (BDEF) offers several keywords to control how data is exposed and handled. One of the less-discussed but powerful ones is field(suppress).</FONT></P><P><FONT color="#000000">This blog is not just about syntax — it’s about what actually happens at runtime, the edge cases I hit, and why I chose suppression over <STRONG>readonly</STRONG>.</FONT></P><P class="lia-align-justify" style="text-align : justify;"><FONT color="#000000"><FONT face="arial,helvetica,sans-serif" size="3"><STRONG>Requirement:</STRONG> In had one requirement, customer service reps needed to update Priority, Deadline Date, Cancel Reason, but they should never touch Created Time or Created User. These audit fields must remain intact, even during draft saves or mass updates.</FONT></FONT></P><P><FONT color="#000000"><U><STRONG>What I Tried First</STRONG></U></FONT><BR /><FONT color="#000000"><STRONG>@UI.hidden:</STRONG> Hid the fields in Fiori, but they were still exposed in OData payloads.</FONT></P><P><FONT color="#000000"><STRONG>field(readonly):</STRONG> Made the fields immutable, but they still appeared in EML structures — meaning a payload could attempt to overwrite them.</FONT></P><P><FONT color="#000000">Both approaches failed to fully protect the audit fields.</FONT></P><P><FONT color="#000000"><STRONG>What is field(suppress)?</STRONG></FONT><BR /><FONT color="#000000">field(suppress) is a static feature control in the BDEF that removes a field from RAP's transactional behavior layer. When a field is marked as suppressed, RAP excludes it from:</FONT></P><UL><LI><FONT color="#000000">EML (Entity Manipulation Language) structures — such as TYPE TABLE FOR CREATE, TYPE STRUCTURE FOR UPDATE</FONT></LI><LI><FONT color="#000000">RAP-generated behavior APIs</FONT></LI><LI><FONT color="#000000">Behavior-related metadata</FONT></LI></UL><P><FONT color="#000000"><U><STRONG>Runtime Behavior of Suppressed Fields</STRONG></U></FONT><BR /><FONT color="#000000">When I switched to <STRONG>field(suppress)</STRONG>, here’s what I observed:</FONT></P><P><FONT color="#000000">In EML statements, suppressed fields simply don’t exist. If you try to reference them, RAP silently ignores them, no runtime dump, no short dump.</FONT></P><P><FONT color="#000000">If you mistakenly add them in the mapping section, RAP throws a framework error at activation time.</FONT></P><P><FONT color="#000000">In draft handling, suppressed fields are still maintained internally, but you can’t overwrite them. This was critical for audit consistency.</FONT></P><P><FONT color="#000000">In determinations, you cannot reference suppressed fields — the compiler blocks it. I observed this when trying to auto-populate Created By and Created At.</FONT></P><P class="lia-align-justify" style="text-align : justify;"><FONT color="#000000"><U><FONT face="arial,helvetica,sans-serif"><STRONG>Syntax:</STRONG></FONT></U></FONT></P><pre class="lia-code-sample language-abap"><code>define behavior for ZI_REQHDR {
field ( suppress ) CreatedAt, CreatedBy;
}</code></pre><P class="lia-align-justify" style="text-align : justify;"><FONT color="#000000"><SPAN><STRONG>Attempting to map them in the behavior pool raises:</STRONG><BR />Field "CreatedBy" cannot be suppressed.</SPAN></FONT></P><P class="lia-align-justify" style="text-align : justify;"><FONT color="#000000"><SPAN><STRONG>Key insight:</STRONG> <CODE>field(suppress)</CODE> is a behavior-layer protection tool — it removes a field from RAP-generated transactional types and APIs. It is <STRONG>not</STRONG> a UI visibility control or an OData filter</SPAN></FONT></P><P><U><STRONG>Why Suppress Instead of Readonly</STRONG></U><BR /><FONT color="#000000"><STRONG>Readonly:</STRONG> Field is visible but immutable — still exposed in payloads.</FONT></P><P><FONT color="#000000"><STRONG>Suppress:</STRONG> Field is completely removed from RAP’s transactional model — safest option for audit fields.</FONT></P><P><FONT color="#000000"><STRONG>Note:</STRONG> Key fields (primary key fields) cannot be suppressed.</FONT></P><UL class="lia-align-justify" style="text-align : justify;"><LI><FONT face="arial,helvetica,sans-serif" color="#000000">Suppressed fields must also be excluded from the field mapping. Attempting to include them raises a framework error:</FONT></LI></UL><pre class="lia-code-sample language-abap"><code>mapping for zdt_vd_reqhdr corresponding
{
RequestUuid = request_uuid;
Status = status;
Priority = priority;
ExternalId = external_id;
DeadlineDate = deadline_date;
RequesterId = requester_id;
CancelReason = cancel_reason;
* // If i try to add the below fields error will get raised
* CreatedBy = created_by; // Field "CreatedBy" cannot suppressed
* CreatedAt = created_at; // Field "CreatedAt" cannot suppressed
LastChangedBy = last_changed_by;
LastChangedAt = last_changed_at;
}</code></pre><P class="lia-align-justify" style="text-align : justify;"><FONT face="arial,helvetica,sans-serif" color="#000000"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="vidyadharsp_2-1780378958696.png" style="width: 614px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/417230iFE6675E3B0137B06/image-dimensions/614x217?v=v2" width="614" height="217" role="button" title="vidyadharsp_2-1780378958696.png" alt="vidyadharsp_2-1780378958696.png" /></span></FONT></P><P class="lia-align-justify" style="text-align : justify;"><FONT face="arial,helvetica,sans-serif" color="#000000"><U><STRONG>Behavior Pool: Effect on EML Strutcure</STRONG></U></FONT></P><UL class="lia-align-justify" style="text-align : justify;"><LI><FONT face="arial,helvetica,sans-serif" color="#000000">Once suppressed, the fields are no longer available in EML operations. For example, in a <CODE>MODIFY ENTITIES</CODE> call, suppressed fields do not appear in the <CODE>FIELDS ( )</CODE> selector:</FONT></LI></UL><pre class="lia-code-sample language-abap"><code> MODIFY ENTITIES OF zi_vd_reqhdr IN LOCAL MODE
ENTITY RequestHeader
UPDATE FIELDS ( )
* i try add the fields which i have done suppressed those not visible here
WITH VALUE #( FOR ls_key IN keys
( %key = ls_key-%key
Status = 100 ) )
REPORTED DATA(lt_report).</code></pre><P class="lia-align-justify" style="text-align : justify;"><FONT face="arial,helvetica,sans-serif" color="#000000"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="vidyadharsp_4-1780380402428.png" style="width: 608px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/417278iEE0A7B71282654C4/image-dimensions/608x259?v=v2" width="608" height="259" role="button" title="vidyadharsp_4-1780380402428.png" alt="vidyadharsp_4-1780380402428.png" /></span></FONT></P><UL class="lia-align-justify" style="text-align : justify;"><LI><FONT color="#000000"><FONT face="arial,helvetica,sans-serif">This confirms that suppressed fields are cleanly removed from the generated <CODE>TYPE STRUCTURE FOR UPDATE</CODE> and equivalent EML types.</FONT></FONT></LI></UL><H4 id="toc-hId-2074678360"><FONT color="#000000">How Does It Differ from <CODE><a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1445379">@ui</a>.hidden</CODE> and <CODE>@Consumption.hidden</CODE>?</FONT></H4><P class=""><FONT color="#000000">All three mechanisms can "hide" a field, but they operate at different layers:</FONT></P><DIV class="">Mechanism Layer Effect <TABLE><TBODY><TR><TD><FONT color="#000000"><CODE>field(suppress)</CODE></FONT></TD><TD><FONT color="#000000">RAP behavior / EML</FONT></TD><TD><FONT color="#000000">Removes field from RAP transactional APIs and EML structures</FONT></TD></TR><TR><TD><FONT color="#000000"><CODE><a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1445379">@ui</a>.hidden: true</CODE></FONT></TD><TD><FONT color="#000000">UI rendering</FONT></TD><TD><FONT color="#000000">Hides the field from generated Fiori screens; field may still appear in OData metadata and API payloads</FONT></TD></TR><TR><TD><FONT color="#000000"><CODE>@Consumption.hidden: true</CODE></FONT></TD><TD><FONT color="#000000">OData consumption</FONT></TD><TD><FONT color="#000000">Hides the field from OData consumers and Fiori Elements scenarios</FONT></TD></TR></TBODY></TABLE></DIV><UL><LI><FONT size="3" color="#000000"><FONT face="arial,helvetica,sans-serif">Use <CODE>field(suppress)</CODE> to protect a field from the RAP behavior layer entirely.</FONT></FONT></LI><LI><FONT size="3" color="#000000"><FONT face="arial,helvetica,sans-serif">Use <CODE><a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1445379">@ui</a>.hidden</CODE> to keep a field out of the UI while it remains accessible in APIs.</FONT></FONT></LI><LI><FONT size="3" color="#000000"><FONT face="arial,helvetica,sans-serif">Use <CODE>@Consumption.hidden</CODE> to hide a field from external OData consumers.</FONT></FONT></LI></UL><P class="lia-align-justify" style="text-align : justify;"><FONT face="arial,helvetica,sans-serif" color="#000000"><U><STRONG><FONT size="5">Conclusion</FONT></STRONG></U></FONT></P><P class="lia-align-justify" style="text-align : justify;"><FONT face="arial,helvetica,sans-serif" color="#000000"><CODE>field(suppress)</CODE>, <CODE><a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1445379">@ui</a>.hidden</CODE>, and <CODE>@Consumption.hidden</CODE> serve distinct purposes in the RAP stack and should not be treated as interchangeable. When you have internal technical fields — timestamps, UUIDs, control fields — that RAP should never expose through its transactional model, <CODE>field(suppress)</CODE> is the right tool. Pair it with <CODE>@Consumption.hidden</CODE> to lock down the field at both the behavior and OData layers.</FONT></P>2026-06-25T20:52:31.333000+02:00https://community.sap.com/t5/technology-blog-posts-by-sap/updating-sales-order-header-and-sales-order-item-using-business-object/ba-p/14427750Updating Sales Order Header and Sales Order Item using Business Object Framework(Cleancore Approach)2026-06-26T07:11:15.507000+02:00PM_iiitshttps://community.sap.com/t5/user/viewprofilepage/user-id/2165681<P>In RAP, business processes are encapsulated within <STRONG>Business Objects (BOs)</STRONG>, which define the data model and business logic. Developers interact with these Business Objects using the <STRONG>Entity Manipulation Language (EML)</STRONG>, a modern ABAP syntax that supports operations such as <STRONG>CREATE, UPDATE, DELETE, and EXECUTE</STRONG>. By leveraging RAP and EML, applications become more maintainable, extensible, and upgrade-safe while adhering to SAP's Clean Core strategy and cloud-ready development standards.</P><P>Example : - </P><P> </P><DIV><DIV><P><SPAN>MODIFY ENTITIES OF </SPAN><SPAN>i_salesordertp</SPAN></P><P><SPAN>ENTITY </SPAN><SPAN>salesorder</SPAN></P><P><SPAN>UPDATE FIELDS ( </SPAN><SPAN>zz1_testdata_sdh</SPAN><SPAN> )</SPAN></P><P><SPAN>WITH VALUE #( (</SPAN></P><P><SPAN>%key</SPAN><SPAN>-</SPAN><SPAN>salesorder</SPAN><SPAN> = </SPAN><SPAN>keys</SPAN><SPAN>[ </SPAN><SPAN>1</SPAN><SPAN> ]-</SPAN><SPAN>salesorder</SPAN></P><P><SPAN>zz1_testdata_sdh</SPAN><SPAN> = </SPAN><SPAN>'TestingData'</SPAN></P><P><SPAN>) )</SPAN></P><P><SPAN>ENTITY </SPAN><SPAN>salesorderitem</SPAN></P><P><SPAN>UPDATE FIELDS ( </SPAN><SPAN>zz1_status1_sdi</SPAN><SPAN> )</SPAN></P><P><SPAN>WITH VALUE #(</SPAN></P><P><SPAN>(</SPAN></P><P><SPAN>%key</SPAN><SPAN>-</SPAN><SPAN>salesorder</SPAN><SPAN> = </SPAN><SPAN>keys</SPAN><SPAN>[ </SPAN><SPAN>1</SPAN><SPAN> ]-</SPAN><SPAN>salesorder</SPAN></P><P><SPAN>%key</SPAN><SPAN>-</SPAN><SPAN>salesorderitem</SPAN><SPAN> = </SPAN><SPAN>keys</SPAN><SPAN>[ </SPAN><SPAN>1</SPAN><SPAN> ]-</SPAN><SPAN>itemno</SPAN></P><P><SPAN>zz1_status1_sdi</SPAN><SPAN> = </SPAN><SPAN>keys</SPAN><SPAN>[ </SPAN><SPAN>1</SPAN><SPAN> ]-</SPAN><SPAN>%param</SPAN><SPAN>-</SPAN><SPAN>status</SPAN></P><P><SPAN>)</SPAN></P><P><SPAN>).</SPAN></P><P> </P></DIV></DIV><P class=""><STRONG><SPAN>Note:</SPAN></STRONG><SPAN> The approach described here is </SPAN><STRONG><SPAN>not limited to custom fields</SPAN></STRONG><SPAN>. It applies to </SPAN><STRONG><SPAN>any field</SPAN></STRONG><SPAN> exposed by the </SPAN><STRONG><SPAN>SalesOrder</SPAN></STRONG><SPAN> or </SPAN><STRONG><SPAN>SalesOrderItem</SPAN></STRONG><SPAN> Business Object, regardless of whether the field is standard or custom.</SPAN></P><P class=""><SPAN>If you introduce a custom field by directly appending standard database tables (for example, </SPAN><STRONG><SPAN>VBAK</SPAN></STRONG><SPAN> or </SPAN><STRONG><SPAN>VBAP</SPAN></STRONG><SPAN>), you must manually extend the entire data exposure layer. This typically involves extending CDS views, updating OData services, enhancing APIs, and ensuring the field is propagated across all relevant artifacts, which increases development effort and maintenance complexity.</SPAN></P><P class=""><SPAN>A more Clean Core–compliant approach is to create custom fields using the </SPAN><STRONG><SPAN>Custom Fields and Logic (CFL)</SPAN></STRONG><SPAN> framework. When configured and enabled correctly, CFL automatically extends the relevant CDS views, OData services, and Business Objects, significantly reducing manual development. To ensure end-to-end availability of the custom field, enable the required </SPAN><STRONG><SPAN>UIs</SPAN></STRONG><SPAN>, </SPAN><STRONG><SPAN>SAP GUI</SPAN></STRONG><SPAN>, </SPAN><STRONG><SPAN>CDS Views</SPAN></STRONG><SPAN>, and </SPAN><STRONG><SPAN>APIs</SPAN></STRONG><SPAN> during field creation. For implementing custom business logic, use </SPAN><STRONG><SPAN>Cloud BAdIs</SPAN></STRONG><SPAN> instead of classical enhancement techniques.</SPAN></P><P><SPAN>For a detailed walkthrough on enabling CFL artifacts and implementing Cloud BAdIs, please refer to my previous blog.</SPAN></P><P>- <A href="https://community.sap.com/t5/technology-blog-posts-by-sap/custom-field-and-logic-from-scratch/ba-p/14426888" target="_blank">https://community.sap.com/t5/technology-blog-posts-by-sap/custom-field-and-logic-from-scratch/ba-p/14426888</A></P>2026-06-26T07:11:15.507000+02:00https://community.sap.com/t5/technology-blog-posts-by-members/make-chatgpt-or-claude-generate-correct-abap-syntax-a-free-2-minute-setup/ba-p/14415634Make ChatGPT or Claude generate correct ABAP syntax - a free, 2-minute setup2026-06-30T00:04:37.362000+02:00akshay_palimkarhttps://community.sap.com/t5/user/viewprofilepage/user-id/656082<P>AI assistants write ABAP that looks right and then fails the syntax check — obsolete statements, RAP behavior definitions that don't parse, classic-only syntax in supposedly Cloud-ready code. The fix isn't a better prompt. It's giving the assistant what every other language already gives it: a syntax checker it can call while it works, so errors get caught and fixed before the code ever reaches you.</P><P>I built that missing piece after 15 years of ABAP and open-sourced it (MIT): abap-mcp, which runs abaplint (Lars Hvam's open-source ABAP parser, ~180 rules) as a tool your AI assistant can call — entirely offline, no SAP system, no credentials. Here's the full setup.</P><P>Step 1 — Prerequisite. Node.js 20+ on your machine (nodejs.org). That's it.</P><P>Step 2 — Connect your assistant (Claude Code, Cursor, VS Code agent mode, or any MCP client). One command:</P><pre class="lia-code-sample language-bash"><code>claude mcp add abap-mcp -- npx -y abap-mcp</code></pre><P>claude mcp add abap-mcp -- npx -y abap-mcp</P><P>(For Cursor/VS Code: add { "mcpServers": { "abap-mcp": { "command": "npx", "args": ["-y", "abap-mcp"] } } } to your MCP config.)</P><P>Step 3 — Make the checking automatic. Add one line to your project notes (CLAUDE.md / Cursor rules):</P><P>Before claiming any ABAP change is done, lint it with abap-mcp. For ABAP Cloud targets, run the readiness check too.</P><P>From now on the assistant writes ABAP → lints it → gets exact parser errors with line numbers → fixes → re-lints — and only shows you code that parses clean. You'll see it happen in the tool-call log.</P><P>Step 4 — Using plain ChatGPT (no MCP)? Use the same engine as a command line and check the generated code yourself before it goes near a transport:</P><pre class="lia-code-sample language-bash"><code>npx abap-mcp lint zcl_generated.clas.abap
npx abap-mcp readiness src/ --fail-below 80 # whole abapGit repo: ABAP Cloud readiness score</code></pre><P>Step 5 — Try these prompts once connected:</P><P>"Lint this class against ABAP Cloud and fix every finding."</P><P>"Is this report cloud-ready? Categorize the blockers."</P><P>"Scaffold a draft-enabled RAP BO for entity Booking, table zbooking, key booking_id." (every generated class and CDS view is validated through the parser before you see it)</P><P>"Explain why exit_or_check was flagged, with the Clean ABAP rationale."</P><P>What it honestly can and can't catch: everything the parser sees — syntax, statement validity per ABAP language version (including Cloud), structure, Clean ABAP style. It does not know your DDIC (a wrong field name on a table the assistant wasn't shown still gets through — provide the dependent objects in the same call to close that), and released-API compliance remains ATC's job; the tool says so on every report. It complements ADT-connected MCP servers (including SAP's upcoming one) — they're the hands on a live system, this is the feedback loop where your files live.</P><P>Repo with a cookbook (PR review without a transport, migration triage, CI gates, agent workflows): github.com/palimkarakshay/abap-mcp · npm: abap-mcp</P><P>I'd really value your feedback — try it on your own Z-code and tell me: What does your assistant still get wrong (syntax, obsolete statements, BDEF structure, Cloud restrictions)? Did the readiness categories match how you'd size remediation? What would you want checked offline that today forces a system round-trip? Replies here or GitHub issues both welcome — that's what the next version gets built around.</P><P>(Not affiliated with SAP; SAP, ABAP and RAP are SAP SE trademarks.)</P>2026-06-30T00:04:37.362000+02:00https://community.sap.com/t5/abap-blog-posts/how-to-scan-custom-abap-for-security-issues-in-eclipse-step-by-step/ba-p/14432681How to Scan Custom ABAP for Security Issues in Eclipse (Step-by-Step)2026-07-03T10:20:40.741000+02:00vahagnhttps://community.sap.com/t5/user/viewprofilepage/user-id/760188<P>Disclosure: I work on this tool at RedRays. This post is a straightforward setup guide, not a product pitch.</P><P>This post walks through connecting Eclipse to a static analysis backend that scans custom ABAP for common security issues (SQL injection, missing authorization checks, hard-coded credentials, weak crypto, and similar) and returns findings directly in the IDE.</P><P>Prerequisites</P><P>- Eclipse 2024-09 or newer<BR />- SAP ABAP Development Tools (ADT) installed<BR />- Java 17<BR />- Network access to the backend you plan to scan against (in this walkthrough, a demo instance)</P><P>Step 1: Get an API key</P><P>The plugin needs an API key to authenticate against a scan backend. For testing, there's a self-service demo instance:</P><P>1. Open get.abap-security.com.<BR />2. Enter a name and email address.<BR />3. Click Create my Eclipse API key.<BR />4. Copy the key immediately - it is displayed once.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="vahagn1_0-1783066920118.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/428776i8BB52724E950C78B/image-size/large?v=v2&px=999" role="button" title="vahagn1_0-1783066920118.png" alt="vahagn1_0-1783066920118.png" /></span></P><P> </P><P>Notes on the demo instance:<BR />- Limited to one key per IP address per time window.<BR />- It is a shared instance - do not submit confidential or production code to it. For real use, point the plugin at your own tenant or an on-premise instance instead (see "Beyond the demo" below).</P><P>Step 2: Install the plugin</P><P>In Eclipse:</P><P>1. Help → Install New Software…<BR />2. Click Add… and enter the update site: plugin.abap-security.com<BR />3. Select RedRays ABAP Scanner from the list.<BR />4. Finish the wizard and restart Eclipse when prompted.</P><P>Step 3: Configure the connection</P><P>1. Window → Preferences → RedRays Scanner<BR />2. Set Working mode to RedRays.<BR />3. Set RedRays URL to <A href="https://demo.abap-security.com:8443/" target="_blank" rel="noopener nofollow noreferrer">https://demo.abap-security.com:8443/</A> (or your own instance's URL).<BR />4. Paste the API key from Step 1 into RedRays API key.<BR />5. Click Test connection and confirm it succeeds before continuing.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="vahagn1_0-1783066782307.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/428775iD8C8BE3FF61E2273/image-size/large?v=v2&px=999" role="button" title="vahagn1_0-1783066782307.png" alt="vahagn1_0-1783066782307.png" /></span></P><P> </P><P>Step 4: Run a scan</P><P>1. Right-click any ABAP object in the Project Explorer.<BR />2. Select Scan with RedRays.<BR />3. Choose the Quick scan profile for a first run.<BR />4. Findings appear in a dedicated Eclipse view as the scan completes.</P><P>Reading the results</P><P>- Findings are grouped by severity: Critical, High, Medium, Low.<BR />- Double-clicking a finding opens the source at the exact line.<BR />- Each finding includes a CVSS score and an automated exploitability check, intended to reduce false positives that would otherwise need manual triage.</P><P>Categories currently covered include: SQL/ADBC injection, OS command execution, dynamic WHERE/ORDER BY clauses, path traversal on OPEN DATASET, RFC trust issues, missing AUTHORITY-CHECK, hard-coded credentials, and weak cryptographic algorithms (MD5/SHA-1), among others.</P><P>Beyond the demo</P><P>The same plugin can point at a privately provisioned tenant or an on-premise instance instead of the shared demo, with isolated access per subaccount and no source retention (code is scanned in memory and discarded; only findings are stored). There is also a REST API for scanning from CI/CD, including an endpoint that returns an allow/block decision for a transport based on a severity threshold - useful as a pre-import gate.</P><P>Resources</P><P>- Plugin overview: redrays.io/abap-scanner-eclipse-plugin<BR />- Demo / API key: get.abap-security.com</P>2026-07-03T10:20:40.741000+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/abap-blog-posts/how-to-rename-an-odata-v4-service/ba-p/14433266How to rename an OData V4 service?2026-07-04T12:04:41.946000+02:00Andre_Fischerhttps://community.sap.com/t5/user/viewprofilepage/user-id/55<H1 id="toc-hId-1690022082">Introduction</H1><P>I was approached by a colleague from SAP Fiori Elements development who noticed that it is possible to change the service name of an OData V4 service in an OData V4 service binding.</P><P>As a result the OData service URL will change as well, which would mean that an existing deployed app will not work anymore.</P><H1 id="toc-hId-1493508577">Result in short</H1><P>Original service URL</P><pre class="lia-code-sample language-abap"><code>/sap/opu/odata4/sap/zui_travel_o4_af/srvd/sap/zui_travel_o4/0001/</code></pre><P>Service URL if the service is being renamed</P><pre class="lia-code-sample language-abap"><code>/sap/opu/odata4/sap/zui_travel_o4/srvd/sap/zui_travel_o4_af/0001/ </code></pre><P>Service URL's if an additional service definition is being created and a new service version based on that new service definition is being created</P><pre class="lia-code-sample language-abap"><code>/sap/opu/odata4/sap/zui_travel_o4/srvd/sap/zui_travel_o4/0002/
/sap/opu/odata4/sap/zui_travel_o4/srvd/sap/zui_travel_o4/0001/</code></pre><P>Service URL if a new service binding is being created for the new service definition </P><pre class="lia-code-sample language-abap"><code>/sap/opu/odata4/sap/zui_travel_o4_af/srvd/sap/zui_travel_o4_af/0001/</code></pre><P>This has the same effect from a service URL perspective than renaming the service in an existing service definition.</P><H1 id="toc-hId-1296995072">Trying it out </H1><P>Using the "<A title="from Scratch Wizard - SAP Online Help" href="https://help.sap.com/docs/abap-cloud/abap-rap/using-odata-ui-service-from-scratch-wizard?q=from+scratch+generator" target="_blank" rel="noopener noreferrer">from Scratch Wizard</A>" I generated an OData V4 UI service using the structure /DMO/TRAVEL as a template and created a service binding <SPAN><STRONG>ZUI_TRAVEL_O4</STRONG>.</SPAN></P><P><SPAN>Using the OData V4 catalog service we can find out more details about this service. </SPAN></P><P><SPAN>(I just use relative URL's to the hostname of the SAP BTP ABAP Environment system being used. But the same can be tried out in an on premise system as well.)</SPAN></P><pre class="lia-code-sample language-abap"><code>/sap/opu/odata4/iwfnd/config/default/iwfnd/catalog/0002/ServiceGroups?$expand=DefaultSystem($expand=Services)&$top=500&$filter=GroupId%20eq%20%27ZUI_TRAVEL_O4%27</code></pre><P><SPAN>The response when having published the service looks like follows:</SPAN></P><pre class="lia-code-sample language-json"><code>{
"@odata.context": "$metadata#ServiceGroups(DefaultSystem(Services()))",
"@odata.metadataEtag": "W/\"20260211141301\"",
"value": [
{
"GroupId": "ZUI_TRAVEL_O4",
"Description": "R3TR G4BA ZUI_TRAVEL_O4",
"DefaultSystem": {
"SystemAlias": "LOCAL",
"Description": "Current Client",
"Services": [
{
"RepositoryId": "DEFAULT",
"ServiceId": "/IWBEP/COMMON",
"ServiceVersion": "0001",
"ServiceType": null,
"IsReleasedC2": false,
"ServiceAlias": "",
"ServiceAliasVersion": "0000",
"Description": "V4 Common Service",
"ServiceUrl": "/sap/opu/odata4/sap/zui_travel_o4/default/iwbep/common/0001/?sap-client=100"
},
{
"RepositoryId": "SRVD",
"ServiceId": "ZUI_TRAVEL_O4",
"ServiceVersion": "0001",
"ServiceType": "UI",
"IsReleasedC2": false,
"ServiceAlias": "ZUI_TRAVEL_O4",
"ServiceAliasVersion": "0001",
"Description": "Service Definition for ZC_TRAVEL",
"ServiceUrl": "/sap/opu/odata4/sap/zui_travel_o4/srvd/sap/zui_travel_o4/0001/?sap-client=100"
}
]
}
}
]
}</code></pre><H2 id="toc-hId-1229564286"> </H2><H2 id="toc-hId-1033050781">Option 1 - Renaming the service</H2><P><SPAN>When you try to rename the service in the service binding you first will find out that this doesn't work when the service has already been published. </SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Andre_Fischer_0-1783157612680.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/429111iD8831EBC761CF194/image-size/medium?v=v2&px=400" role="button" title="Andre_Fischer_0-1783157612680.png" alt="Andre_Fischer_0-1783157612680.png" /></span></P><P>When the service is unpublished you can rename it, e.g. to e.g. ZUI_TRAVEL_O4_AF.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Andre_Fischer_1-1783157668688.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/429112iE2ED61ADD5BEB297/image-size/medium?v=v2&px=400" role="button" title="Andre_Fischer_1-1783157668688.png" alt="Andre_Fischer_1-1783157668688.png" /></span></P><P>After you have performed this change you have to press the publish locally button again.</P><P>This then changes the <STRONG>Service Alias</STRONG> and hence the <STRONG>OData ServiceURL. </STRONG></P><P>The Service URL if the service is being renamed is now:</P><pre class="lia-code-sample language-abap"><code>/sap/opu/odata4/sap/zui_travel_o4/srvd/sap/zui_travel_o4_af/0001/ </code></pre><P>When checking the entry in the service catalog we will find that the service catalog entry is still there but contains a different service URL.</P><pre class="lia-code-sample language-json"><code>{
"@odata.context": "$metadata#ServiceGroups(DefaultSystem(Services()))",
"@odata.metadataEtag": "W/\"20260211141301\"",
"value": [
{
"GroupId": "ZUI_TRAVEL_O4",
"Description": "R3TR G4BA ZUI_TRAVEL_O4",
"DefaultSystem": {
"SystemAlias": "LOCAL",
"Description": "Current Client",
"Services": [
{
"RepositoryId": "DEFAULT",
"ServiceId": "/IWBEP/COMMON",
"ServiceVersion": "0001",
"ServiceType": null,
"IsReleasedC2": false,
"ServiceAlias": "",
"ServiceAliasVersion": "0000",
"Description": "V4 Common Service",
"ServiceUrl": "/sap/opu/odata4/sap/zui_travel_o4/default/iwbep/common/0001/?sap-client=100"
},
{
"RepositoryId": "SRVD",
"ServiceId": "ZUI_TRAVEL_O4",
"ServiceVersion": "0001",
"ServiceType": "UI",
"IsReleasedC2": false,
"ServiceAlias": "ZUI_TRAVEL_O4_AF",
"ServiceAliasVersion": "0001",
"Description": "Service Definition for ZC_TRAVEL",
"ServiceUrl": "/sap/opu/odata4/sap/zui_travel_o4/srvd/sap/zui_travel_o4_af/0001/?sap-client=100"
}
]
}
}
]
}</code></pre><P> </P><H2 id="toc-hId-836537276">Option 2 - Creating another service version</H2><P>Instead of renaming the service it is possible to create a second service version in the same service binding. For this you have however to create a new service definition. So we simply copy the existing service definition <SPAN><STRONG>ZUI_TRAVEL_O4</STRONG> and create an additional service definition. to <STRONG>ZUI_TRAVEL_O4_AF.</STRONG></SPAN></P><H3 id="toc-hId-769106490"><SPAN>Service Definition ZUI_TRAVEL_O4</SPAN></H3><pre class="lia-code-sample language-abap"><code>@EndUserText: {
label: 'Service Definition for ZC_TRAVEL'
}
@ObjectModel: {
leadingEntity: {
name: 'ZC_TRAVEL'
}
}
define service ZUI_TRAVEL_O4 provider contracts odata_v4_ui {
expose ZC_TRAVEL as Travel;
}</code></pre><H3 id="toc-hId-572592985">Service Definition <SPAN>ZUI_TRAVEL_O4_AF</SPAN></H3><P><SPAN>Here we expose an additional CDS view so that both services can be better distinguised.</SPAN></P><pre class="lia-code-sample language-abap"><code>@EndUserText: {
label: 'Service Definition for ZC_TRAVEL'
}
@ObjectModel: {
leadingEntity: {
name: 'ZC_TRAVEL'
}
}
define service ZUI_TRAVEL_O4_AF
provider contracts odata_v4_ui {
expose ZC_TRAVEL as Travel;
expose I_Currency as MyCurrency;
}</code></pre><P>When checking the service binding we see two version of our service, 1.0.0 and 2.0.0.</P><P>The service version 2.0.0 exposes two entities as expected.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Andre_Fischer_1-1783158951322.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/429115iCCDCD81EDDFD9AA4/image-size/medium?v=v2&px=400" role="button" title="Andre_Fischer_1-1783158951322.png" alt="Andre_Fischer_1-1783158951322.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Andre_Fischer_2-1783158968232.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/429116i6ED41B1549C47233/image-size/medium?v=v2&px=400" role="button" title="Andre_Fischer_2-1783158968232.png" alt="Andre_Fischer_2-1783158968232.png" /></span></P><P>And the service URL's differ by the service version 0001 and 0002</P><pre class="lia-code-sample language-abap"><code>/sap/opu/odata4/sap/zui_travel_o4/srvd/sap/zui_travel_o4/0001/
/sap/opu/odata4/sap/zui_travel_o4/srvd/sap/zui_travel_o4/0002/</code></pre><P>When checking the OData V4 service catalog we find an additional entry in our service group <STRONG>ZUI_TRAVEL_O4</STRONG>.</P><pre class="lia-code-sample language-json"><code>{
"@odata.context": "$metadata#ServiceGroups(DefaultSystem(Services()))",
"@odata.metadataEtag": "W/\"20260211141301\"",
"value": [
{
"GroupId": "ZUI_TRAVEL_O4",
"Description": "R3TR G4BA ZUI_TRAVEL_O4",
"DefaultSystem": {
"SystemAlias": "LOCAL",
"Description": "Current Client",
"Services": [
{
"RepositoryId": "DEFAULT",
"ServiceId": "/IWBEP/COMMON",
"ServiceVersion": "0001",
"ServiceType": null,
"IsReleasedC2": false,
"ServiceAlias": "",
"ServiceAliasVersion": "0000",
"Description": "V4 Common Service",
"ServiceUrl": "/sap/opu/odata4/sap/zui_travel_o4/default/iwbep/common/0001/?sap-client=100"
},
{
"RepositoryId": "SRVD",
"ServiceId": "ZUI_TRAVEL_O4",
"ServiceVersion": "0001",
"ServiceType": "UI",
"IsReleasedC2": false,
"ServiceAlias": "ZUI_TRAVEL_O4",
"ServiceAliasVersion": "0001",
"Description": "Service Definition for ZC_TRAVEL",
"ServiceUrl": "/sap/opu/odata4/sap/zui_travel_o4/srvd/sap/zui_travel_o4/0001/?sap-client=100"
},
{
"RepositoryId": "SRVD",
"ServiceId": "ZUI_TRAVEL_O4_AF",
"ServiceVersion": "0001",
"ServiceType": "UI",
"IsReleasedC2": false,
"ServiceAlias": "ZUI_TRAVEL_O4",
"ServiceAliasVersion": "0002",
"Description": "Service Definition for ZC_TRAVEL",
"ServiceUrl": "/sap/opu/odata4/sap/zui_travel_o4/srvd/sap/zui_travel_o4/0002/?sap-client=100"
}
]
}
}
]
}</code></pre><P> </P><H2 id="toc-hId-246996761">Option 3 - Creating another service </H2><P>Another option would be to create a new service binding <SPAN><STRONG>ZUI_TRAVEL_O4_AF</STRONG> </SPAN>from our new service definition <STRONG><SPAN>ZUI_TRAVEL_O4_AF</SPAN></STRONG>. </P><P>Here the service URL is named </P><pre class="lia-code-sample language-abap"><code>/sap/opu/odata4/sap/zui_travel_o4_af/srvd/sap/zui_travel_o4_af/0001/ </code></pre><P>So this has from a OData Service URL perspective the same effect as when you rename the existing service.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Andre_Fischer_3-1783159461128.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/429117i7544293055E0151B/image-size/medium?v=v2&px=400" role="button" title="Andre_Fischer_3-1783159461128.png" alt="Andre_Fischer_3-1783159461128.png" /></span></P><P>It has however the big advantage of not being that disruptive and you can decide either to publish a second app using the new URL or to perform the changes to the app only after having transported the newly created service to production.</P><P>In order to find your service in the service catalog you have to change the filter as follows:</P><pre class="lia-code-sample language-abap"><code>/sap/opu/odata4/iwfnd/config/default/iwfnd/catalog/0002/ServiceGroups?$expand=DefaultSystem($expand=Services)&$top=500&$filter=GroupId%20eq%20%27ZUI_TRAVEL_O4_AF%27</code></pre><P>and would get the following result.</P><pre class="lia-code-sample language-json"><code>{
"@odata.context": "$metadata#ServiceGroups(DefaultSystem(Services()))",
"@odata.metadataEtag": "W/\"20260211141301\"",
"value": [
{
"GroupId": "ZUI_TRAVEL_O4_AF",
"Description": "R3TR G4BA ZUI_TRAVEL_O4_AF",
"DefaultSystem": {
"SystemAlias": "LOCAL",
"Description": "Current Client",
"Services": [
{
"RepositoryId": "DEFAULT",
"ServiceId": "/IWBEP/COMMON",
"ServiceVersion": "0001",
"ServiceType": null,
"IsReleasedC2": false,
"ServiceAlias": "",
"ServiceAliasVersion": "0000",
"Description": "V4 Common Service",
"ServiceUrl": "/sap/opu/odata4/sap/zui_travel_o4_af/default/iwbep/common/0001/?sap-client=100"
},
{
"RepositoryId": "SRVD",
"ServiceId": "ZUI_TRAVEL_O4_AF",
"ServiceVersion": "0001",
"ServiceType": "UI",
"IsReleasedC2": false,
"ServiceAlias": "ZUI_TRAVEL_O4_AF",
"ServiceAliasVersion": "0001",
"Description": "Service Definition for ZC_TRAVEL",
"ServiceUrl": "/sap/opu/odata4/sap/zui_travel_o4_af/srvd/sap/zui_travel_o4_af/0001/?sap-client=100"
}
]
}
}
]
}</code></pre><P> </P><P> </P><P> </P><P> </P><P> </P><P> </P><P> </P>2026-07-04T12:04:41.946000+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/building-a-rap-application-with-external-sap-hana-cloud-using-cds-external/ba-p/14428145Building a RAP Application with External SAP HANA Cloud using CDS External Entities – Part 12026-07-08T10:49:55.174000+02:00Sivakumar_Subramaniamhttps://community.sap.com/t5/user/viewprofilepage/user-id/188613<H1 id="toc-hId-1689246492">Why External Entities?</H1><P>CDS external entities provide a modern way to handle secondary database connections in ABAP Cloud. They allow applications to retrieve and modify data from other databases using SQL. Sounds interesting? This blog post covers how to create a RAP application in SAP BTP ABAP Environment with a secondary HANA database connection.</P><P> </P><H1 id="toc-hId-1492732987">Business scenario:</H1><P><BR /><SPAN>Many organizations already have business data stored in a separate </SPAN><STRONG>SAP HANA Cloud database</STRONG><SPAN> and want to build modern </SPAN><STRONG>RAP (ABAP RESTful Application Programming Model)</STRONG><SPAN> applications on SAP BTP ABAP Environment without replicating that data into the ABAP system.</SPAN></P><DIV><P>The blog demonstrates this using a <STRONG>Loyalty Management</STRONG> application.</P><H4 id="toc-hId-1683467639">Scenario</H4><UL><LI>Customer loyalty information (Memberships) is stored in an external SAP HANA Cloud database.</LI><LI>Transaction data related to each membership is also stored in the same external database.</LI><LI>The business wants a Fiori application where users can:<UL><LI>Create loyalty memberships</LI><LI>Maintain loyalty transactions</LI><LI>Update and delete records</LI><LI>View accumulated loyalty points</LI><LI>Persist all changes directly in the external HANA database</LI></UL></LI></UL></DIV><P><A href="https://community.sap.com/source-Ids-list" target="1_ytw4qqjq" rel="nofollow noopener noreferrer"> </A></P><H1 id="toc-hId-1099705977">Prerequisites:</H1><OL><LI>SAP BTP Sub-Account</LI><LI>SAP HANA Cloud Instance</LI><LI>SAP BTP ABAP Environment</LI></OL><H1 id="toc-hId-903192472">Steps:</H1><OL><LI>Setup SAP HANA Cloud instance</LI><LI>Create Schema and Tables</LI><LI>Configure external connection to External HANA database from SAP BTP ABAP Environment using External Entities</LI><LI>Create External Entities</LI></OL><H1 id="toc-hId-706678967">Setup SAP HANA Cloud instance</H1><P>Let’s start on with the creation of <A href="https://help.sap.com/docs/hana-cloud/sap-hana-cloud-administration-guide/subscribing-to-sap-hana-cloud-administration-tools" target="_blank" rel="noopener noreferrer">SAP HANA Cloud instance</A>.</P><OL><LI>Open SAP BTP cockpit and add the following Entitlements.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Sivakumar_Subramaniam_1-1784629294230.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/435449iC66B60271A4BCA58/image-size/large?v=v2&px=999" role="button" title="Sivakumar_Subramaniam_1-1784629294230.png" alt="Sivakumar_Subramaniam_1-1784629294230.png" /></span><BR /><BR /><BR /></LI><LI>Create HANA cloud subscription.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="2.jpg" style="width: 800px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/427802iC14D37786CA6E788/image-size/large?v=v2&px=999" role="button" title="2.jpg" alt="2.jpg" /></span><BR /><BR /></LI><LI>Create HANA Cloud Instance<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="3.jpg" style="width: 800px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/427804iBB423502FA834C80/image-size/large?v=v2&px=999" role="button" title="3.jpg" alt="3.jpg" /></span><BR /><BR />Specify Instance name, Set DBADMIN password and choose Allow all IP address<BR /><div class="lia-spoiler-container"><a class="lia-spoiler-link" href="#" rel="nofollow noopener noreferrer">Spoiler</a><noscript> (Highlight to read)</noscript><div class="lia-spoiler-border"><div class="lia-spoiler-content"><STRONG>Disclaimer on Database IP Access Configuration</STRONG><BR />Allowing unrestricted access (e.g., permitting all IP addresses such as 0.0.0.0/0) to a database that contains production data introduces significant security risks. This approach should only be used in strictly controlled environments.</div><noscript><div class="lia-spoiler-noscript-container"><div class="lia-spoiler-noscript-content">Disclaimer on Database IP Access ConfigurationAllowing unrestricted access (e.g., permitting all IP addresses such as 0.0.0.0/0) to a database that contains production data introduces significant security risks. This approach should only be used in strictly controlled environments.</div></div></noscript></div></div><DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="4.jpg" style="width: 800px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/427806i71BE31BF802E68C1/image-size/large?v=v2&px=999" role="button" title="4.jpg" alt="4.jpg" /></span></DIV><BR /><BR /></LI><LI>Once the Instance status turns into Running state and click on Actions three dots and Open in SAP HANA Database Explorer. <BR />Provide the DBADMIN credentials from the previous step to connect to the HANA database.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="5.jpg" style="width: 800px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/427807iD85EE7115FA464A0/image-size/large?v=v2&px=999" role="button" title="5.jpg" alt="5.jpg" /></span><BR /><BR /></LI></OL><P class="lia-indent-padding-left-30px" style="padding-left : 30px;"> </P><H1 id="toc-hId-510165462">Create Schema and Tables<BR /><BR /></H1><DIV>Open SQL Console and perform the following steps to create the schema and tables.</DIV><UL><LI>Create Schema<BR /><BR /></LI></UL><pre class="lia-code-sample language-sql"><code>CREATE SCHEMA LOYALTY;</code></pre><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="6.jpg" style="width: 801px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/427810i35D6C0266FEEC4C1/image-size/large?v=v2&px=999" role="button" title="6.jpg" alt="6.jpg" /></span></P><UL><LI>Create Membership table: zlm_membship_ee <SPAN> .</SPAN></LI></UL><P class="lia-indent-padding-left-90px" style="padding-left : 90px;">Stores membership details<BR />Primary key: client + membershipuuid</P><pre class="lia-code-sample language-sql"><code>create column table loyalty."zlm_membship_ee" (
"client" nvarchar (000003) default '000' not null,
"membershipuuid" varbinary (000016) default x'00000000000000000000000000000000' not null ,
"membershipid" nvarchar (000010) default '0000000000' not null,
"customer" nvarchar (000010) default '' not null,
"createdby" nvarchar (000012) default '' not null,
"createdat" decimal (000021, 000007) default 0 not null,
"lastchangedby" nvarchar (000012) default '' not null,
"locallastchangedat" decimal (000021, 000007) default 0 not null,
"lastchangedat" decimal (000021, 000007) default 0 not null,
primary key ("client", "membershipuuid" )
) column loadable
</code></pre><UL><LI>Create Transactions table: zlm_transctns_ee</LI></UL><P class="lia-indent-padding-left-90px" style="padding-left : 90px;">Stores transactions linked to membership.<BR />Contains transaction value and loyalty points.</P><pre class="lia-code-sample language-sql"><code>create column table loyalty."zlm_transctns_ee" (
"client" nvarchar (000003) default '000' not null,
"transactionuuid" varbinary (000016) default x'00000000000000000000000000000000' not null ,
"membershipuuid" varbinary (000016) default x'00000000000000000000000000000000' not null ,
"transactiondate" NVARCHAR (000008) DEFAULT '00000000' NOT NULL,
"transactionvalue" DECIMAL (000010, 000002) DEFAULT 0 NOT NULL,
"transactioncurrency" NVARCHAR (000005) DEFAULT '' NOT NULL,
"loyaltypoints" BIGINT DEFAULT 0 NOT NULL,
"createdby" nvarchar (000012) default '' not null,
"createdat" decimal (000021, 000007) default 0 not null,
"lastchangedby" nvarchar (000012) default '' not null,
"locallastchangedat" decimal (000021, 000007) default 0 not null,
"lastchangedat" decimal (000021, 000007) default 0 not null,
primary key ("client", "transactionuuid" )
) column loadable
</code></pre><H1 id="toc-hId-313651957"><BR />Configure connectivity to an external SAP HANA database from Steampunk for data access using External Entities<BR /><BR /></H1><OL><LI>Establish outbound SQL access using an external entity using ABAP Development Tools for Eclipse<BR /><BR /><OL class="lia-list-style-type-lower-roman"><LI>Define and activate a logical external schema whose configuration specifies the connection details for the outbound communication. Create a <A href="https://help.sap.com/docs/ABAP_PLATFORM_NEW/c238d694b825421f940829321ffa326a/cfaa37a4c0054c5cad00c03f7774a7ac.html" target="_blank" rel="noopener noreferrer">logical external schema</A> in ABAP Development Tools (ADT) using the creation wizard.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="7.jpg" style="width: 801px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/427911i20CE33AAB5695F36/image-size/large?v=v2&px=999" role="button" title="7.jpg" alt="7.jpg" /></span><BR /><BR /></LI><LI> Create an Outbound Service of the type Outbound SQL Access for your logical external schema.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="8.jpg" style="width: 799px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/427912iF67DAB3CD7A5D5CC/image-size/large?v=v2&px=999" role="button" title="8.jpg" alt="8.jpg" /></span><BR /><BR /></LI><LI>Create a Communication Scenario.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="9.jpg" style="width: 801px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/427913iF26524F7C38B4E00/image-size/large?v=v2&px=999" role="button" title="9.jpg" alt="9.jpg" /></span><BR /><BR /></LI><LI>Include the outbound service in the communication scenario.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="10.jpg" style="width: 801px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/427914i8F7176169F86D171/image-size/large?v=v2&px=999" role="button" title="10.jpg" alt="10.jpg" /></span><BR /><BR /></LI></OL></LI><LI>Configure External Connection<BR />In the Fiori Launchpad, Logon as Administrator and perform the following steps.<OL class="lia-list-style-type-lower-roman"><LI>Create a Communication Arrangement for scenario ZLM_COM_EXT_SCHEMA_EE.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="11.jpg" style="width: 800px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/427915i88E761244CA7D646/image-size/large?v=v2&px=999" role="button" title="11.jpg" alt="11.jpg" /></span><BR /><BR /><BR /><BR /></LI><LI> Create a Communication System<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="12.jpg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/427916i778ED34E800C4909/image-size/large?v=v2&px=999" role="button" title="12.jpg" alt="12.jpg" /></span><BR /><BR /><BR />Toggle Remote SQL Access and choose Adapter Name as HANA (ODBC) <BR />Adapter Configuration :Driver=<A href="http://libodbchdb.so/" target="_blank" rel="noopener nofollow noreferrer">libodbcHDB.so</A>;ServerNode=<A href="https://*.hanacloud.ondemand.com/" target="_blank" rel="noopener nofollow noreferrer">*.hanacloud.ondemand.com</A>(URL of the External Database):443;<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="13.jpg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/427917i64AB6D94EF3E270D/image-size/large?v=v2&px=999" role="button" title="13.jpg" alt="13.jpg" /></span><BR /><BR /><BR /></LI><LI>Create an Outbound User. Specify the HANA DB user which contains the necessary authorizations for accessing the External Schema.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="14.jpg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/427918i91602AC106B25A84/image-size/large?v=v2&px=999" role="button" title="14.jpg" alt="14.jpg" /></span><BR /><BR /><BR /><BR /></LI></OL></LI></OL><H1 id="toc-hId-117138452">Create CDS External Entities</H1><P>Two types:<BR />1. Writable External Entity → Used for INSERT/UPDATE/DELETE<BR />2. Static External Entity → Used for SELECT (read only)<BR /><BR />These entities map external tables to ABAP CDS.</P><P>In ABAP Development Tools for Eclipse: As an ABAP Developer, here’s what you need to do to establish outbound SQL access using a CDS external entity.</P><UL class="lia-list-style-type-lower-roman"><LI>Define and activate an external entity that represents the external database object.As we are going to perform CUD operation on external database, we need to create Writable External Entity for table zlm_membship_ee which will be referred by external name zlm_membship_ee.</LI></UL><pre class="lia-code-sample language-abap"><code>@EndUserText.label: 'Writable EE for HANA tab zlm_membship_ee'
define writable external entity zlm_membship_cud_ee external name "zlm_membship_ee"
{
key client : abap.char(3) external name "client";
key membershipuuid : sysuuid_x16 external name "membershipuuid";
membershipid : zlm_membershipid_ee external name "membershipid";
customer : zlm_customer_ee external name "customer";
@Semantics.user.createdBy: true
createdby : abp_creation_user external name "createdby";
@Semantics.systemDateTime.createdAt: true
createdat : abp_creation_tstmpl external name "createdat";
@Semantics.user.lastChangedBy: true
lastchangedby : abp_lastchange_user external name "lastchangedby";
@Semantics.systemDateTime.localInstanceLastChangedAt: true
locallastchangedat : abp_locinst_lastchange_tstmpl external name "locallastchangedat";
@Semantics.systemDateTime.lastChangedAt: true
lastchangedat : abp_lastchange_tstmpl external name "lastchangedat";
}
with federated data provided at runtime
</code></pre><UL class="lia-list-style-type-lower-roman"><LI>We need to create Writable External Entity for table zlm_transctns_ee</LI></UL><pre class="lia-code-sample language-abap"><code>@EndUserText.label: 'Writable EE for HANAtab zlm_transctns_ee'
define writable external entity zlm_transctns_cud_ee external name "zlm_transctns_ee"
{
key client : abap.char(3) external name "client";
key transactionuuid : sysuuid_x16 external name "transactionuuid";
membershipuuid : sysuuid_x16 external name "membershipuuid";
transactiondate : zlm_transactiondate_ee external name "transactiondate";
@Semantics.amount.currencyCode : 'transactioncurrency'
transactionvalue : zlm_transactionvalue_ee external name "transactionvalue";
transactioncurrency : zlm_transactioncurrency_ee external name "transactioncurrency";
loyaltypoints : zlm_loyaltypoints_ee external name "loyaltypoints";
@Semantics.user.createdBy: true
createdby : abp_creation_user external name "createdby";
@Semantics.systemDateTime.createdAt: true
createdat : abp_creation_tstmpl external name "createdat";
@Semantics.user.lastChangedBy: true
lastchangedby : abp_lastchange_user external name "lastchangedby";
@Semantics.systemDateTime.localInstanceLastChangedAt: true
locallastchangedat : abp_locinst_lastchange_tstmpl external name "locallastchangedat";
@Semantics.systemDateTime.lastChangedAt: true
lastchangedat : abp_lastchange_tstmpl external name "lastchangedat";
}
with federated data provided at runtime
</code></pre><UL><LI>To securely map a remote physical database object so it can be queried directly, we need to use STATIC EXTERNAL ENTITIES to fetch data from table zlm_membship_ee .</LI></UL><pre class="lia-code-sample language-abap"><code>@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'Static EE for HANA tab zlm_membship_ee'
define external entity zlm_membship_ee external name "zlm_membship_ee"
{
key client : abap.char(3) external name "client";
key membershipuuid : sysuuid_x16 external name "membershipuuid";
membershipid : zlm_membershipid_ee external name "membershipid";
customer : zlm_customer_ee external name "customer";
@Semantics.user.createdBy: true
createdby : abp_creation_user external name "createdby";
@Semantics.systemDateTime.createdAt: true
createdat : abp_creation_tstmpl external name "createdat";
@Semantics.user.lastChangedBy: true
lastchangedby : abp_lastchange_user external name "lastchangedby";
@Semantics.systemDateTime.localInstanceLastChangedAt: true
locallastchangedat : abp_locinst_lastchange_tstmpl external name "locallastchangedat";
@Semantics.systemDateTime.lastChangedAt: true
lastchangedat : abp_lastchange_tstmpl external name "lastchangedat";
}
with federated data provided by zlm_ext_schema_ee
</code></pre><UL><LI>We need another STATIC EXTERNAL ENTITY for table zlm_transctns_ee</LI></UL><pre class="lia-code-sample language-abap"><code>@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'Static EE for HANA tab zlm_transctns_ee'
define external entity zlm_transctns_ee external name "zlm_transctns_ee"
{
key client : abap.char(3) external name "client";
key transactionuuid : sysuuid_x16 external name "transactionuuid";
membershipuuid : sysuuid_x16 external name "membershipuuid";
transactiondate : zlm_transactiondate_ee external name "transactiondate";
@Semantics.amount.currencyCode : 'transactioncurrency'
transactionvalue : zlm_transactionvalue_ee external name "transactionvalue";
transactioncurrency : zlm_transactioncurrency_ee external name "transactioncurrency";
loyaltypoints : zlm_loyaltypoints_ee external name "loyaltypoints";
@Semantics.user.createdBy: true
createdby : abp_creation_user external name "createdby";
@Semantics.systemDateTime.createdAt: true
createdat : abp_creation_tstmpl external name "createdat";
@Semantics.user.lastChangedBy: true
lastchangedby : abp_lastchange_user external name "lastchangedby";
@Semantics.systemDateTime.localInstanceLastChangedAt: true
locallastchangedat : abp_locinst_lastchange_tstmpl external name "locallastchangedat";
@Semantics.systemDateTime.lastChangedAt: true
lastchangedat : abp_lastchange_tstmpl external name "lastchangedat";
}
with federated data provided by zlm_ext_schema_ee
</code></pre><H1 id="toc-hId--79375053">Key Takeaways.</H1><P>External entities enable real-time integration with external databases without replication.<BR /><BR /></P><DIV>In <A title="Building a RAP Application with External SAP HANA Cloud using CDS External Entities – Part 2" href="https://community.sap.com/t5/technology-blog-posts-by-sap/building-a-rap-application-with-external-sap-hana-cloud-using-cds-external/ba-p/14430950" target="_self">Part 2</A> of this series, we will build a RAP application using the data model created here.</DIV><P> </P><H1 id="toc-hId-493851525"> </H1><H1 id="toc-hId-297338020"> </H1><P> </P><P> </P><P> </P><P> </P>2026-07-08T10:49:55.174000+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/technology-blog-posts-by-members/clean-core-levels-a-d-how-to-classify-your-custom-abap-and-what-to-do-with/ba-p/14437956Clean Core Levels A–D: how to classify your custom ABAP — and what to do with each grade2026-07-15T04:47:46.379000+02:00FelixFrenzel_CleanCore-2026https://community.sap.com/t5/user/viewprofilepage/user-id/2317473<P><EM>Disclosure: I'm the author of this post and the creator of Clean-Core.io, a free, non-commercial community tool I mention once near the end. This post is educational; the tool is optional.</EM></P><H2 id="toc-hId-1819230661">Overview</H2><P>With the 2025 update to the ABAP extensibility guide, SAP evolved the familiar 3-tier extensibility model into the <STRONG>clean core level concept</STRONG> — a four-grade classification of custom extensions: A, B, C, D. Instead of a blunt "clean vs. not clean", it tells you <EM>how closely</EM> each extension aligns with Clean Core, and it maps directly to ABAP Test Cockpit (ATC) behaviour:</P><P> </P><P>Level Usage of SAP objects in custom development ATC behaviour</P><TABLE border="1" cellspacing="0" cellpadding="6"><TBODY><TR><TD><STRONG>A</STRONG></TD><TD>Released SAP APIs (local & remote) and extension points</TD><TD>No message</TD></TR><TR><TD><STRONG>B</STRONG></TD><TD>Classic SAP APIs and extension points (SAP-recommended)</TD><TD>Priority 3 · info</TD></TR><TR><TD><STRONG>C</STRONG></TD><TD>Internal SAP APIs (conditionally clean via the changelog-for-SAP-objects check)</TD><TD>Priority 2 · warning</TD></TR><TR><TD><STRONG>D</STRONG></TD><TD>Not-recommended objects & extension technologies (modifications, implicit enhancements)</TD><TD>Priority 1 · error</TD></TR></TBODY></TABLE><P>Level A is the cleanest — on-stack ABAP Cloud or side-by-side on SAP BTP. Levels B–D describe classic ABAP, from SAP-recommended (B) down to not-recommended (D).</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="cleancore-blog-1-levels-A-D.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/431680i45083165E5B3DA03/image-size/large?v=v2&px=999" role="button" title="cleancore-blog-1-levels-A-D.png" alt="cleancore-blog-1-levels-A-D.png" /></span></P><H2 id="toc-hId-1622717156">Why this matters now</H2><P>Every custom object you carry into S/4HANA has to be defensible. The move from a binary "clean/not clean" to A–D is a gift — it lets you transform at your own pace, prioritising the worst first instead of trying to reach "100% clean" overnight.</P><H2 id="toc-hId-1426203651">The real problem</H2><P>Knowing the model is easy. <STRONG>Grading thousands of custom objects against it is not.</STRONG> ATC flags readiness object-by-object, and the Cloudification Repository tells you which standard objects are released — but turning that into a per-object A/B/C/D verdict plus a remediation path, across a grown Z-landscape, is still mostly manual and inconsistent between teams.</P><H2 id="toc-hId-1229690146">A practical classification flow</H2><OL><LI><STRONG>Identify</STRONG> the custom object and what it touches (tables, APIs, function modules, enhancements).</LI><LI><STRONG>Look up</STRONG> each dependency: released API/extension point → A; classic-but-official API → B; internal SAP object → C; modification / not-recommended access → D.</LI><LI><STRONG>Decide remediation</STRONG> per grade: A keep · B keep, plan to lift later · C verify via the changelog-for-SAP-objects approach and wrap behind a released interface · D replace before the upgrade.</LI></OL><H2 id="toc-hId-1033176641">A worked example</H2><P>A classic <CODE>Z_CUSTOMER_REPORT</CODE>:</P><PRE>SELECT kunnr, name1 FROM kna1 INTO TABLE @lt_cust. " direct read of an internal standard table</PRE><P><STRONG>Classify:</STRONG> direct access to <CODE>KNA1</CODE> (an internal SAP object, not a released API) → Level C (ATC: warning). A direct <EM>write</EM> would be Level D (ATC: error).</P><P><STRONG>Remediate:</STRONG> map to the released CDS view <CODE>I_Customer</CODE> → the same logic becomes Level A (ATC: no message):</P><PRE>SELECT Customer, CustomerName FROM I_Customer INTO TABLE @lt_cust.</PRE><P>One dependency, one grade, one clear next step. Repeat across the landscape and you get a prioritised backlog: fix D first (upgrade blockers), lift C, schedule B, keep A.</P><H2 id="toc-hId-836663136">How I approached tooling this (optional)</H2><P>To avoid doing this by hand, I built Clean-Core.io — a free, non-commercial community tool. It runs a deterministic evidence engine first (parsing the code, mapping dependencies against the catalog), then AI on top, and derives an A–D grade per detected object — aligned to the clean core level concept and its ATC priorities. It is complementary to ATC/ADT, not a replacement, and every output is a draft for a qualified architect to review. Free: clean-core.io (link in the comments).</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="cleancore-blog-2-tool-panel.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/431681i7192225E85F6F450/image-size/large?v=v2&px=999" role="button" title="cleancore-blog-2-tool-panel.png" alt="cleancore-blog-2-tool-panel.png" /></span></P><H2 id="toc-hId-640149631">Conclusion</H2><P>The move from 3-tier to A–D isn't a relabel — it's a better mental model for prioritising custom-code remediation. Give each dependency an explicit grade, start with your Level D objects, and turn "we have a lot of Z-code" into a defensible, upgrade-ready plan.</P><P><STRONG>How are you classifying your custom code against the new A–D levels today — by hand, ATC, or something else? I'd genuinely like to compare approaches in the comments.</STRONG></P>2026-07-15T04:47:46.379000+02:00https://community.sap.com/t5/technology-blog-posts-by-members/rap-augmentation-in-managed-scenario-enriching-transactional-requests/ba-p/14409354RAP Augmentation in Managed Scenario – Enriching Transactional Requests Before BO Processing2026-07-17T11:22:43.643000+02:00Abhi_0118https://community.sap.com/t5/user/viewprofilepage/user-id/1874843<H2 id="toc-hId-1816513912"><FONT face="arial,helvetica,sans-serif">Introduction</FONT></H2><P class="">The RESTful Application Programming Model (RAP) provides several extension points for implementing business logic, such as Determinations, Validations, Actions, and Prechecks. <STRONG>RAP Augmentation</STRONG> adds another extension point that allows developers to enrich incoming create or update requests before the framework starts processing the business object.</P><P class="lia-align-justify" style="text-align : justify;">This early execution makes augmentation useful for scenarios where default values, audit information, or business-specific data must be available before any further RAP processing takes place. In this blog, we will understand RAP Augmentation, compare it with Determinations, and implement it using an Employee Management example.</P><HR /><H4 id="toc-hId-1878165845"><FONT face="arial,helvetica,sans-serif">Business Requirement</FONT></H4><P class="">I had a requirement an Employee Management application where users create and maintain employee records. During record creation, the application should automatically populate business-specific information instead of relying on users to enter every value manually.</P><P class="lia-align-justify" style="text-align : justify;">The application should:</P><UL class="lia-align-justify" style="text-align : justify;"><LI>Set the employee status to <STRONG>PENDING_APPROVAL</STRONG>.</LI><LI>Determine whether approval is required based on the selected department.</LI><LI>Capture the current user as the creator.</LI><LI>Maintain audit information during updates.</LI></UL><P class="lia-align-justify" style="text-align : justify;">Instead of implementing all this logic inside the business object, we will use RAP Augmentation to enrich the incoming request before standard processing begins.</P><HR /><H5 id="toc-hId-1810735059"><FONT face="arial,helvetica,sans-serif">Problem Statement</FONT></H5><P class="">Determinations are commonly used in RAP to derive or update field values. However, they execute after the request has already entered the transactional buffer.</P><P class="lia-align-justify" style="text-align : justify;">In some business scenarios, values must be available even before the business object starts processing. For example, default values or audit fields may be required before validations or other business logic execute. In such cases, Augmentation provides a cleaner and more suitable solution by enriching the request at the beginning of the transaction.</P><HR /><H3 id="toc-hId-1356056116"><FONT face="arial,helvetica,sans-serif">What is RAP Augmentation?</FONT></H3><P class="">RAP Augmentation is an extension mechanism that runs during the Interactive Phase of a RAP transaction. It allows developers to enrich incoming create or update requests before the framework processes the business object.</P><P class="lia-align-justify" style="text-align : justify;">Rather than modifying persisted data, augmentation focuses on preparing the request by supplying additional values or applying business-specific logic. Once the request is enriched, RAP continues with its normal processing flow.</P><HR /><H5 id="toc-hId-1417708049"><U><FONT face="arial,helvetica,sans-serif">Augmentation Flow</FONT></U></H5><P class="">The request passes through augmentation before reaching the business object implementation. During this stage, additional values can be added or modified, ensuring the business object receives a complete request for further processing.</P><P>The overall execution flow is:</P><UL><LI>User sends a create or update request.</LI><LI>RAP invokes the registered augmentation.</LI><LI>The request is enriched with additional data.</LI><LI>Standard RAP processing continues.</LI><LI>Data is persisted to the database.</LI></UL><HR /><H4 id="toc-hId-1092111825"><U><FONT face="arial,helvetica,sans-serif">Augmentation vs Determination</FONT></U></H4><TABLE width="852px"><TBODY><TR><TD width="443.575px" height="57px">Defined at the <STRONG>Projection Behavior Definition</STRONG> using use create/update (augment).</TD><TD width="407.625px" height="57px">Defined at the <STRONG>Interface Behavior Definition</STRONG> using <STRONG>determination</STRONG>.</TD></TR><TR><TD width="443.575px" height="57px">Implemented in a Projection Behavior Implementation Class </TD><TD width="407.625px" height="57px">Implemented in the Behavior Pool class.</TD></TR><TR><TD width="443.575px" height="57px">Runs during the <STRONG>Interactive Phase</STRONG>, before the BO implementation processes the request.</TD><TD width="407.625px" height="57px">Runs during ON MODIFY or ON SAVE, after data enters the transactional buffer.</TD></TR><TR><TD width="443.575px" height="57px">Used to <STRONG>enrich or modify the incoming request</STRONG> before BO processing.</TD><TD width="407.625px" height="57px">Used to derive or recalculate values based on data in the transactional buffer.</TD></TR></TBODY></TABLE><H4 id="toc-hId-895598320">When Execution timing matter?</H4><P class="lia-align-justify" style="text-align : justify;">The main advantage of Augmentation is <STRONG>when</STRONG> it executes. Since it runs before business object processing, any values added during augmentation are available to the rest of the RAP processing flow.</P><UL><LI>If the application should automatically set an employee's status or determine whether approval is required, these values are already present when the framework performs subsequent processing. If the same logic were implemented in a Determination, the values would only be available later in the transaction.</LI></UL><H4 id="toc-hId-699084815"><U><FONT face="arial,helvetica,sans-serif">When to Use Augmentation?</FONT></U></H4><P class="">Augmentation is a good choice when the incoming request needs to be enriched before RAP starts processing the business object.</P><P class="lia-align-justify" style="text-align : justify;">Typical use cases include:</P><UL class="lia-align-justify" style="text-align : justify;"><LI>Setting default values.</LI><LI>Populating audit fields.</LI><LI>Deriving values from user input.</LI><LI>Performing lightweight request enrichment.</LI><LI>Preparing data required by later processing steps.</LI></UL><P class="lia-align-justify" style="text-align : justify;">It is not intended to replace Determinations, which remain the preferred option for business logic that should execute after the request has entered the transactional buffer.</P><P> </P><H4 id="toc-hId-502571310"><FONT size="4"><U><FONT face="arial,helvetica,sans-serif">BDEF of Interface</FONT></U></FONT></H4><pre class="lia-code-sample language-abap"><code>managed implementation in class zbp_aky_i_emp unique;
strict ( 2 );
define behavior for zaky_i_emp //alias <alias_name>
persistent table zaky_t_emp
lock master
authorization master ( instance )
//etag master <field_name>
{
create( authorization : global ) ;
update;
delete;
action Approve result [1] $self;
mapping for zaky_t_emp
{
Employeeid = employeeid;
Firstname = firstname;
Lastname = lastname;
Department = department;
Status = status;
Approvalrequired = approvalrequired;
Createdby = createdby;
Createdat = createdat;
Lastchangedby = lastchangedby;
Lastchangedat = lastchangedat;
}
}</code></pre><HR /><H4 id="toc-hId-306057805"><FONT size="4"><U><FONT face="arial,helvetica,sans-serif">BDEF of Projection</FONT></U></FONT></H4><pre class="lia-code-sample language-abap"><code>projection implementation in class zbp_aky_c_emp unique;
strict ( 2 );
define behavior for zaky_c_emp //alias <alias_name>
{
use create( augment );
use update( augment );
use delete;
field ( readonly ) Status;
field ( readonly ) Approvalrequired;
field ( readonly ) Createdby;
field ( readonly ) Createdat;
field ( readonly ) Lastchangedby;
field ( readonly ) Lastchangedat;
use action Approve;
}</code></pre><HR /><H4 id="toc-hId--388172795"><U><FONT face="arial, helvetica, sans-serif" size="4">BP of Projection</FONT></U></H4><pre class="lia-code-sample language-abap"><code>CLASS lhc_zaky_c_emp DEFINITION INHERITING FROM cl_abap_behavior_handler.
PRIVATE SECTION.
METHODS augment_create FOR MODIFY
IMPORTING entities FOR CREATE zaky_c_emp.
METHODS augment_update FOR MODIFY
IMPORTING entities FOR UPDATE zaky_c_emp.
ENDCLASS.
CLASS lhc_zaky_c_emp IMPLEMENTATION.
METHOD augment_create.
LOOP AT entities INTO DATA(entity).
IF entity-Department IS INITIAL.
APPEND VALUE #(
%cid = entity-%cid
%msg = new_message_with_text(
severity = if_abap_behv_message=>severity-error
text = 'Department is mandatory' ) )
TO reported-zaky_c_emp.
APPEND VALUE #( %cid = entity-%cid )
TO failed-zaky_c_emp.
CONTINUE.
ENDIF.
MODIFY AUGMENTING ENTITIES OF zaky_i_emp
ENTITY zaky_i_emp
CREATE FIELDS ( Status Approvalrequired Createdby Createdat )
WITH VALUE #( (
%cid = entity-%cid
Status = 'PENDING_APPROVAL'
Approvalrequired = COND #(
WHEN entity-Department = 'HR'
OR entity-Department = 'FIN'
THEN abap_true
ELSE abap_false )
Createdby = sy-uname
Createdat = cl_abap_context_info=>get_system_date( )
) ).
ENDLOOP.
ENDMETHOD.
METHOD augment_update.
LOOP AT entities INTO DATA(entity).
MODIFY AUGMENTING ENTITIES OF zaky_i_emp
ENTITY zaky_i_emp
UPDATE FIELDS ( Lastchangedby Lastchangedat )
WITH VALUE #( (
Employeeid = entity-Employeeid
Lastchangedby = sy-uname
Lastchangedat = cl_abap_context_info=>get_system_date( )
) ).
ENDLOOP.
ENDMETHOD.
ENDCLASS.</code></pre><H4 id="toc-hId--584686300"><FONT size="4"><U><FONT face="arial,helvetica,sans-serif">BP of interface</FONT></U></FONT></H4><pre class="lia-code-sample language-abap"><code>METHOD Approve.
" Read current status of the employee
READ ENTITIES OF zaky_i_emp IN LOCAL MODE
ENTITY zaky_i_emp
FIELDS ( Status Employeeid )
WITH CORRESPONDING #( keys )
RESULT DATA(employees)
FAILED DATA(read_failed).
" Loop and update status
LOOP AT employees INTO DATA(employee).
" Only approve if current status is PENDING_APPROVAL
IF employee-Status <> 'PENDING_APPROVAL'.
APPEND VALUE #(
%tky = employee-%tky
%msg = new_message_with_text(
severity = if_abap_behv_message=>severity-error
text = 'Only records with PENDING_APPROVAL status can be approved' ) )
TO reported-zaky_i_emp.
APPEND VALUE #( %tky = employee-%tky )
TO failed-zaky_i_emp.
CONTINUE.
ENDIF.
" Update status to APPROVED
MODIFY ENTITIES OF zaky_i_emp IN LOCAL MODE
ENTITY zaky_i_emp
UPDATE FIELDS ( Status )
WITH VALUE #( (
%tky = employee-%tky
Status = 'APPROVED'
) )
FAILED DATA(update_failed)
REPORTED DATA(update_reported).
" Pass back result
APPEND VALUE #(
%tky = employee-%tky
%param = employee
) TO result.
ENDLOOP.
ENDMETHOD.</code></pre><P><U><FONT face="arial,helvetica,sans-serif" size="4"><STRONG>Output</STRONG></FONT></U></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Abhi_0118_1-1782208500025.png" style="width: 657px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/425239i3E505C640B9BC34F/image-dimensions/657x304?v=v2" width="657" height="304" role="button" title="Abhi_0118_1-1782208500025.png" alt="Abhi_0118_1-1782208500025.png" /></span></P><P><STRONG>Click on the create </STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Abhi_0118_2-1782208568634.png" style="width: 654px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/425242i6AE4CACBEC0358D3/image-dimensions/654x310?v=v2" width="654" height="310" role="button" title="Abhi_0118_2-1782208568634.png" alt="Abhi_0118_2-1782208568634.png" /></span></P><P>After adding the value click on the create and put the debugger on the create-augment method to check it is triggering or not because we are doing managed application where creation is handled by framework</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Abhi_0118_0-1783921767429.png" style="width: 532px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/432182i0467F4A6A38B1515/image-dimensions/532x456?v=v2" width="532" height="456" role="button" title="Abhi_0118_0-1783921767429.png" alt="Abhi_0118_0-1783921767429.png" /></span></P><P><STRONG>Execute</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Abhi_0118_4-1782209444122.png" style="width: 628px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/425252iC67537BA421DD23C/image-dimensions/628x153?v=v2" width="628" height="153" role="button" title="Abhi_0118_4-1782209444122.png" alt="Abhi_0118_4-1782209444122.png" /></span></P><P><STRONG>Currently it is in pending state click on the Approve employee.</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Abhi_0118_5-1782209514677.png" style="width: 622px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/425254i1971B2B62521F508/image-dimensions/622x148?v=v2" width="622" height="148" role="button" title="Abhi_0118_5-1782209514677.png" alt="Abhi_0118_5-1782209514677.png" /></span></P><P><STRONG>After clicking on action</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Abhi_0118_6-1782209548205.png" style="width: 622px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/425255i279C217B0C0C4680/image-dimensions/622x70?v=v2" width="622" height="70" role="button" title="Abhi_0118_6-1782209548205.png" alt="Abhi_0118_6-1782209548205.png" /></span></P><P><STRONG>If you not adding the department</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Abhi_0118_0-1782210556795.png" style="width: 630px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/425261i394039D97B6C97F1/image-dimensions/630x326?v=v2" width="630" height="326" role="button" title="Abhi_0118_0-1782210556795.png" alt="Abhi_0118_0-1782210556795.png" /></span></P><P> </P><H2 id="toc-hId--194393791"><U><FONT face="arial,helvetica,sans-serif">Conclusion</FONT></U></H2><P class="">RAP Augmentation provides a simple and effective way to enrich transactional requests before the RAP framework begins processing the business object. It is particularly useful for populating default values, maintaining audit information, and preparing request data that should be available throughout the transaction.</P><P class="lia-align-justify" style="text-align : justify;">In this example, we used augmentation to automatically populate employee details while keeping the business object implementation clean and maintainable. Understanding when to use Augmentation instead of Determinations helps developers choose the right extension point and build more maintainable RAP applications</P>2026-07-17T11:22:43.643000+02:00https://community.sap.com/t5/technology-blog-posts-by-sap/secure-outbound-communication-in-abap-cloud/ba-p/14442255Secure Outbound Communication in ABAP Cloud2026-07-20T09:00:00.024000+02:00SafaBahooshhttps://community.sap.com/t5/user/viewprofilepage/user-id/763514<H2 id="toc-hId-1819998499"><STRONG>Introduction</STRONG></H2><P>Modern ABAP development, especially in cloud environments, is increasingly centered around one core idea: while application logic still triggers and executes the outbound calls, the underlying communication configuration and connection settings must be strictly separated from the application logic to ensure secure and controlled integration. Whether an application calls an external HTTP service or an RFC-enabled system, the goal is no longer just to make the call succeed, but to ensure that every connection is governed, traceable, and aligned with clean-core principles.</P><P>SAP addresses this through a structured communication model in SAP S/4HANA Cloud Public Edition, SAP BTP ABAP environment and SAP S/4HHANA Private Cloud Edition.</P><P>The model is based on two pillars: The development object <A href="https://help.sap.com/docs/abap-cloud/abap-integration-connectivity/using-communication-targets-93ce34a31d0d4c87b02559e0c705152a" target="_blank" rel="noopener noreferrer">Communication Target</A> (CoTa) <SPAN>and the configuration stored in so called <A href="https://help.sap.com/docs/ABAP_PLATFORM_NEW/753088fc00704d0a80e7fbd6803c8adb/4067936321b64086b0322b632d364dd5.html?version=LATEST" target="_blank" rel="noopener noreferrer">Application Destinations</A>.</SPAN></P><P>In SAP S/4HANA Cloud Private Edition (and in on-premise), integrations require both the communication target and the application destinations to be maintained explicitly. In contrast, for SAP S/4HANA Cloud Public Edition and SAP BTP ABAP Environment, the application destination is generated automatically when the administrator saves the communication arrangement, further simplifying configuration and lifecycle management. While the system handles the creation of the destination automatically, meaning customers do not need to write custom code to save the destination itself, users retain full control over where the automatically generated destination name is stored and maintained within the system (see <A href="https://help.sap.com/docs/abap-cloud/abap-integration-connectivity/executing-custom-code-during-communication-arrangement-save" target="_blank" rel="noopener noreferrer">Executing Custom Code During a Communication Arrangement Save | SAP Help Portal</A> <SPAN>)</SPAN></P><P>While ABAP Cloud preserves the principle of separating configuration from application logic and still requires code adaptations when communication protocols change (for example, from RFC to HTTP), it significantly modernizes connectivity management.</P><P>Communication targets replace this approach with a formal development object that represents the intended communication purpose. Rather than referencing a technical destination directly, application code refers to the communication target, and the runtime framework resolves the underlying destination. This automation applies when there is only a single application destination, in other words, the application logic remains completely unaware of the application destination name.</P><P>If multiple application destinations exist, the specific name of the application destination must still be explicitly provided in the code, just as with a traditional SM59 destination.</P><P>Communication targets also act as a logical control layer that governs access to destinations. Unlike the traditional model, where any application could potentially reuse a destination if its name was known, communication targets explicitly define which applications are allowed to use a particular destination. This prevents uncontrolled reuse and establishes a clearer and more governed communication model.</P><P>By enforcing this explicit authorization, the model mitigates critical security risks, such as:</P><UL><LI>Data Spoofing & Interception: Unauthorized applications can no longer masquerade as legitimate services to intercept sensitive data streams.</LI><LI>Resource Depletion (DoS): Rogue or compromised applications are prevented from flooding a destination with traffic, ensuring high availability for authorized users.</LI><LI>Privilege Escalation: It eliminates the risk of an application accidentally (or maliciously) gaining access to high-privilege backend systems simply by guessing a destination name.</LI></UL><P>More in <A href="https://help.sap.com/docs/abap-cloud/abap-integration-connectivity/communication-target" target="_blank" rel="noopener noreferrer">Communication Target | SAP Help Portal</A> and <A href="https://help.sap.com/docs/abap-cloud/abap-integration-connectivity/using-communication-targets-93ce34a31d0d4c87b02559e0c705152a" target="_blank" rel="noopener noreferrer">Using Communication Targets | SAP Help Portal</A></P><P>Although both communication targets and SM59 destinations separate configuration from business logic, communication targets extend this concept through stronger lifecycle integration, improved traceability, controlled destination access, and greater flexibility in managing tenant-specific configuration.</P><P>Besides, communication targets deliver key architectural upgrades by utilizing an object-oriented class basis. Because all communication is routed through communication targets, the user can perform reliable where-used analysis and runtime validation. In addition, communication targets allow developers to define general communication settings and client dependency as part of the development object, reducing configuration errors and simplifying administration. These two advantages represent the core improvements of the new concept.</P><H2 id="toc-hId-1623484994"><STRONG>HTTP Communication via Communication Targets</STRONG></H2><P>For HTTP communication, this model is reinforced by communication target. Each outbound call is validated at runtime to ensure that the application is authorized to use the destination behind the communication target. This major improvement over the classic model significantly strengthens security by design.</P><P>From a development perspective, the beauty of this model is its simplicity in code. Once a communication arrangement is defined and the application destination is generated, the ABAP implementation becomes clean and focused purely on business logic. All technical details such as URLs, authentication, and certificates, are handled outside the application.<BR />In case there will be only one application destination (most likely case), a typical HTTP call in ABAP Cloud looks like below.</P><pre class="lia-code-sample language-abap"><code>DATA: lo_cota TYPE REF TO ZCT_EXAMPLE.
lo_cota = NEW ZCT_EXAMPLE(application_destination = 'Z_APPLDEST_EXAMPLE' ).
DATA(lo_client) = lo_cota->create_web_http_client( ).
DATA(lo_response) = lo_client->execute( if_web_http_client=>get ).</code></pre><P>However, if multiple application destinations are available for the Communication target, you must explicitly pass the name of the relevant application destination as a parameter to ensure the outbound call maps to the correct target system.</P><P>The code is intentionally minimal. For example, in Cloud, the application. This ensures that the application can only communicate with endpoints that are explicitly approved.</P><H2 id="toc-hId-1426971489"><STRONG>RFC Communication via Communication Targets</STRONG></H2><P>The same principle applies to RFC communication: for outbound RFC calls, you should use communication targets together with the application destination. The same principle applies to RFC communication: for outbound RFC calls, it is recommended to use communication targets together with the application destination.<BR />The architectural lifecycle of application destinations is conceptually identical for both RFC and HTTP protocols; in both cases, the communication target serves as the abstract reference in your ABAP code, while administrators manage the destination details. The distinction lies purely in the developer implementation at runtime, where protocol-specific configuration and distinct APIs, such as classic function modules for RFC versus HTTP client classes for REST, must be used to execute the call.</P><P>In the newer governance model, RFC connections can be governed through communication arrangements and communication targets, providing the same structured, secure, and centrally managed approach that is already used for HTTP communication. In code, the call may still look familiar:</P><pre class="lia-code-sample language-abap"><code>DATA: lo_cota TYPE REF TO ZCT_EXAMPLE.
lo_cota = NEW ZCT_EXAMPLE( ).
DATA(lo_remote_session) = lo_cota->create_session( ).
CALL FUNCTION 'RFC_PING' IN REMOTE SESSION lo_remote_session.</code></pre><P>The important difference is not only in the governance of the destination, but also in the syntax itself, which is an important aspect of the new concept. A session object is created from the corresponding CoTa class. With this class-based approach, developers can perform a where-used analysis on the class. This reflects a broader shift in ABAP development. Developers are no longer responsible for managing connectivity details directly. Instead, they consume centrally defined communication configurations. This separation improves maintainability and allows changes to endpoints or credentials without modifying application code.</P><H2 id="toc-hId-1230457984"><STRONG>Cloud VS On-Premise</STRONG></H2><P>In <STRONG>ABAP Cloud</STRONG>, communication target is highly recommended and preferred. Within the Communication Management framework of ABAP Cloud, utilizing a formal communication target is highly recommended and considered best practice. However, while the structured framework is preferred for most scenarios, it is still technically possible to establish outbound connections independently when needed. Developers can bypass the standard communication target lifecycle by dynamically instantiating destinations at runtime using specific provider methods, such as creating a destination directly via a URL or a BTP Cloud Destination.</P><P><BR />In <STRONG>on-premise systems</STRONG>, the landscape is even more flexible, as they can also leverage modern cloud connectivity concepts. Starting with the SAP S/4HANA 2025 release, on-premises systems support modern connectivity features, including the use of communication targets alongside application destinations (APPLDEST) for outbound HTTP and RFC communication. Meanwhile, the traditional approach using transaction SM59 remains available, particularly for earlier on-premises releases or classic scenarios.<BR />Existing SM59 configurations can also be migrated to application destination for an existing <A href="https://help.sap.com/docs/abap-cloud/abap-integration-connectivity/migrating-existing-http-applications-to-using-communication-targets" target="_blank" rel="noopener noreferrer"> HTTP</A> or <A href="https://help.sap.com/docs/abap-cloud/abap-integration-connectivity/migrating-existing-rfc-applications-to-using-communcationg-targets" target="_blank" rel="noopener noreferrer">RFC</A> applications. However, the use of communication targets is not enforced system-wide in on-premises environments, unlike in ABAP Cloud.<BR />By early adoption of communication targets, even in on-premises landscapes, developers can align their applications with a model that is clearly designed for the future, secure, transparent, and ready for cloud-native integration.</P><H2 id="toc-hId-1033944479"><STRONG>Further studies</STRONG></H2><P>If you want to explore this concept in detail, SAP provides both official documentation and deep-dive blogs:</P><H3 id="toc-hId-966513693"><STRONG>SAP Help Portal:</STRONG></H3><UL><LI><A href="https://help.sap.com/docs/abap-cloud/abap-integration-connectivity/enable-http-communication-in-your-abap-code" target="_blank" rel="noopener noreferrer">https://help.sap.com/docs/abap-cloud/abap-integration-connectivity/enable-http-communication-in-your-abap-code</A></LI><LI><A href="https://help.sap.com/docs/abap-cloud/abap-integration-connectivity/developing-external-service-consumption-outbound-communication" target="_blank" rel="noopener noreferrer">Outbound Communication | SAP Help Portal</A></LI><LI><A href="https://help.sap.com/docs/abap-cloud/abap-integration-connectivity/consuming-rfc-service" target="_blank" rel="noopener noreferrer">https://help.sap.com/docs/abap-cloud/abap-integration-connectivity/consuming-rfc-service</A></LI></UL><H3 id="toc-hId-770000188"><STRONG>SAP Community blogs:</STRONG></H3><UL><LI><A href="https://community.sap.com/t5/technology-blog-posts-by-sap/receiver-validation-http-enhance-your-security-by-controlling-destination/ba-p/13972704" target="_blank">https://community.sap.com/t5/technology-blog-posts-by-sap/receiver-validation-http-enhance-your-security-by-controlling-destination/ba-p/13972704</A></LI><LI><A href="https://community.sap.com/t5/technology-blog-posts-by-sap/using-communication-targets-for-outbound-rfc-communication-in-abap/ba-p/14261486" target="_blank">https://community.sap.com/t5/technology-blog-posts-by-sap/using-communication-targets-for-outbound-rfc-communication-in-abap/ba-p/14261486</A></LI></UL><P> </P><P> </P><P> </P><P> </P>2026-07-20T09:00:00.024000+02:00https://community.sap.com/t5/abap-blog-posts/early-idea-vs-code-extension-merging-adt-abaplint-is-this-useful-to-anyone/ba-p/14444083Early idea: VS Code extension merging ADT + abaplint, is this useful to anyone?2026-07-20T09:51:49.341000+02:00AStefanhttps://community.sap.com/t5/user/viewprofilepage/user-id/1543880<P class="">Hey SAP Community,</P><P class="">I got tired of the usual ABAP loop. Write something, hit Ctrl+F3, wait a<BR />few seconds, see the error, fix it, repeat. So I started building<BR />something to get rid of the waiting part.</P><P class="">The idea is simple: run abaplint locally so you get errors instantly while<BR />typing, and when you're ready, send the code to SAP with one command<BR />instead of switching to GUI.</P><P class="">Right now it has inline diagnostics while typing, basic syntax<BR />highlighting, a code outline panel showing classes and methods, keyword<BR />autocomplete, and an activate command that talks to ADT.</P><P class="">I only tested it against a local mock server, not a real SAP system. Auth<BR />for BTP is not properly handled yet. There's no autocomplete from the<BR />actual system. It probably breaks on edge cases I haven't thought of.</P><P class="">I'm posting because I genuinely don't know if this is useful or if someone<BR />already did this better. If the idea resonates, the code is open and the<BR />architecture is meant to be extended. Take it, fork it, break it, improve<BR />it.<BR /><BR />GitHub: <A href="https://github.wdf.sap.corp/I749493/abap-adv-linter" target="_blank" rel="noopener nofollow noreferrer"><SPAN class="">https://github.wdf.sap.corp/I749493/abap-adv-linter</SPAN></A></P><P class="">Honest feedback appreciated, including "this already exists, look here<BR />instead."<BR /><BR />Thanks,</P>2026-07-20T09:51:49.341000+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-sap/how-to-run-different-versions-of-the-abap-development-tools-for-visual/ba-p/14448385How to run different versions of the ABAP development tools for Visual Studio Code in parallel?2026-07-24T20:16:18.829000+02:00Andre_Fischerhttps://community.sap.com/t5/user/viewprofilepage/user-id/55<H1 id="toc-hId-1691095580">Introduction</H1><P>Having now released a second version of the ABAP development tools for Visual Studio Code the question may arise how to run different versions of this plugin in parallel in order to test the latest version or to check differences in the behavior of the new and an older version.</P><P>At least SAP internally this is a question that is of interest for me since I want to run the public available version and the next upcoming version before this is going to be released officially <span class="lia-unicode-emoji" title=":winking_face:">😉</span>.</P><P>For the ABAP Development Tools for Eclipse you have to install a second Eclipse so that you can test a second version there.</P><H1 id="toc-hId-1494582075">How to section</H1><P>Co-Pilot will provide various options to this question from which I chose the IMHO most easiest one, namely to create different profiles and install a different extension version in each profile.</P><P>You can either click on the gear icon and select Profiles.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="profiles_010.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/437046iF0015F5F9A1B01E1/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="profiles_010.png" alt="profiles_010.png" /></span></P><P>Or you can o<SPAN>pen </SPAN><STRONG>Command Palette</STRONG><SPAN> (</SPAN><CODE>Ctrl+Shift+P</CODE><SPAN>) and then enter <STRONG>Profiles</STRONG> and select </SPAN><STRONG>Profiles: New Profile</STRONG><SPAN>.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Andre_Fischer_0-1784916175582.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/437048i740A3DA27F12DCC2/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="Andre_Fischer_0-1784916175582.png" alt="Andre_Fischer_0-1784916175582.png" /></span></P><P>This will open the following dialogue where you can select the default profile from the drop down box.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Andre_Fischer_1-1784916297217.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/437050i71C3B37FB1A8EF58/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="Andre_Fischer_1-1784916297217.png" alt="Andre_Fischer_1-1784916297217.png" /></span></P><P>This let you swith to the newly created profile.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Andre_Fischer_0-1784917974757.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/437103iAAAD4DACEEA63ABE/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="Andre_Fischer_0-1784917974757.png" alt="Andre_Fischer_0-1784917974757.png" /></span></P><P> </P><P>Using the drop down arrow of the "uninstall" button you are offered to install a specific version of the selected extension in the copied profile.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Andre_Fischer_5-1784916612769.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/437055i39E4B4CAA5C4BBE3/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="Andre_Fischer_5-1784916612769.png" alt="Andre_Fischer_5-1784916612769.png" /></span></P><P>Here you are able to select an older version</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Andre_Fischer_6-1784916658027.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/437056i8E3F37D0EAD2AF6A/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="Andre_Fischer_6-1784916658027.png" alt="Andre_Fischer_6-1784916658027.png" /></span></P><P>As a result you can activate this older version by restarting the extension.</P><P>Please note that the <EM>Auto Update</EM> option has been deactivated conveniently.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Andre_Fischer_7-1784916746749.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/437057iE4C29BE921D9FF57/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="Andre_Fischer_7-1784916746749.png" alt="Andre_Fischer_7-1784916746749.png" /></span></P><P> </P><P> </P><P> </P><P> </P><P> </P><P> </P><P> </P><P> </P><P> </P><DIV> </DIV><P> </P><P> </P>2026-07-24T20:16:18.829000+02:00