https://raw.githubusercontent.com/ajmaradiaga/feeds/main/scmt/topics/ABAP-Cloud-blog-posts.xml SAP Community - ABAP Cloud 2026-02-23T18:00:00.866068+00:00 python-feedgen ABAP Cloud blog posts in SAP Community https://community.sap.com/t5/technology-blog-posts-by-sap/overview-and-roadmap-of-sap-joule-for-developers-abap-with-ai-capabilities/ba-p/14310407 Overview and roadmap of SAP Joule for Developers, ABAP with AI capabilities 2026-01-20T09:00:00.019000+01:00 JoseBastidas https://community.sap.com/t5/user/viewprofilepage/user-id/3227 <P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Overview and roadmap of SAP Joule for Developers.png" style="width: 799px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/363011iC51296BE41711158/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="Overview and roadmap of SAP Joule for Developers.png" alt="Overview and roadmap of SAP Joule for Developers.png" /></span></P><P>ABAP is evolving.<BR />AI is accelerating it.<BR />And SAP Joule is right at the center.</P><P>In our live webinar, <STRONG>“Overview and roadmap of SAP Joule for Developers, ABAP with AI capabilities,”</STRONG> we’ll cut straight to what matters for partners: real use cases, clear direction, and practical value.</P><P>You’ll see how ABAP with AI helps speed up development with RAP, how to empower your apps with AI capabilities, and how to move custom code toward SAP BTP and SAP S/4HANA Cloud without breaking clean core principles. &nbsp;No theory overload. &nbsp;Just what works, and why.</P><P>We’ll also walk through the roadmap, so you can align your skills, services, and customer conversations with what’s coming next.</P><P>If you have basic ABAP Cloud knowledge and want to stay ahead instead of catching up, don’t miss this one.</P><P><span class="lia-unicode-emoji" title=":backhand_index_pointing_right:">👉</span> <STRONG>Register now</STRONG> and future-proof your ABAP strategy.&nbsp; <A href="https://partneredge.sap.com/en/library/education/psd/2026/jan/e_oe_te_w_PSD_WEB_00012777.html" target="_blank" rel="noopener noreferrer">https://partneredge.sap.com/en/library/education/psd/2026/jan/e_oe_te_w_PSD_WEB_00012777.html</A></P><P>#SAP #SAPBTP #SAPJoule #ABAPwithAI #SAPPartners #S4HANACloud</P> 2026-01-20T09:00:00.019000+01:00 https://community.sap.com/t5/technology-blog-posts-by-sap/your-2026-roadmap-to-getting-started-with-abap-ai-and-abap-1/ba-p/14312060 Your 2026 Roadmap to Getting Started with ABAP AI and ABAP-1 2026-01-21T18:01:36.956000+01:00 JanMatthes https://community.sap.com/t5/user/viewprofilepage/user-id/194386 <P data-unlink="true"><A title="ABAP AI Capabilities" href="https://help.sap.com/docs/abap-cloud/abap-development-tools-user-guide/joule-for-developers-abap-ai-capabilities-f14ebffef77b41bfb0746c33dcb70e84" target="_blank" rel="noopener noreferrer"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="ABAP_AI.png" style="width: 200px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/363821iFBD41BCBF30A65A8/image-size/small/is-moderation-mode/true?v=v2&amp;px=200" role="button" title="ABAP_AI.png" alt="ABAP_AI.png" /></span></A>The era of "Wait and See" for AI in ABAP development is officially over. With the general availability of <STRONG>Joule for Developers (J4D)</STRONG> and the <A href="https://www.linkedin.com/posts/sonjalienard_introducing-the-next-era-of-abap-development-activity-7391805653905993728-J9a-?utm_source=share&amp;utm_medium=member_desktop&amp;rcm=ACoAAAAwC8YBn3fP-40jJLXucycHYaj7szVogRw" target="_blank" rel="noopener nofollow noreferrer">planned availability of ABAP agentic AI frameworks in 2026</A>,&nbsp; the question isn't <EM>if</EM> you should use AI, but <EM>where</EM> you should start.&nbsp;</P><P data-unlink="true"><STRONG>The "Start Here" Recommendation:&nbsp;&nbsp;</STRONG>For 90% of developers, the best starting point is <STRONG><SPAN class=""><SPAN><A class="" href="https://www.sap.com/products/erp/s4hana-cloud-public-edition-joule-for-developers-abap-ai-capabilities.html" target="_blank" rel="noopener noreferrer">SAP Joule for Developers</A></SPAN></SPAN></STRONG> integrated within <STRONG>ABAP Development Tools (ADT) for Eclipse</STRONG>. In addition you can also experiment with the first versions of <A href="https://help.sap.com/docs/sap-ai-core/generative-ai/sap-abap-1?locale=en-US&amp;version=LATEST" target="_blank" rel="noopener noreferrer">ABAP-1 model to <STRONG>analyze and explain code</STRONG></A> on your own - but be aware that this is <STRONG>currently not for code generation </STRONG>and only for those which want to be independent of J4D<STRONG>.</STRONG> Therefore starting with J4D is the fastest but also the most powerful way to start with ABAP AI.</P><DIV class="">&nbsp;</DIV><DIV class=""><STRONG>Why should I start with Joule for Developers (J4D)?</STRONG></DIV><UL class=""><LI><SPAN class=""><STRONG>Contextual Intelligence:</STRONG> Unlike generic LLMs, Joule for Developers is additionally trained on over <STRONG>250 million lines of proprietary SAP code</STRONG> and is aware of your specific <STRONG>ABAP Cloud context.</STRONG> In general&nbsp;J2D is powered by a combination of third-party foundation models (e.g. OpenAI, Gemini, Anthropic, Mistral AI), alongside SAP-centric models like the LLMs, trained specifically on ABAP and purpose-built for cloud-based SAP development.</SPAN></LI><LI><SPAN class=""><STRONG>It’s Free (For Now):</STRONG> SAP has extended the free promotional period for Joule for Developers until <STRONG>September 2026</STRONG>.</SPAN></LI><LI><SPAN class=""><STRONG>Native Skills:</STRONG> It handles predictive code generation (e.g. RAP generation), "Explain" skills for legacy code, and unit test generation directly within your IDE. So it can do way more then ABAP-1 right now.</SPAN></LI><LI><SPAN class=""><STRONG>J4D&nbsp;</STRONG>is out of the box <STRONG>integrated in Eclipse ADT.</STRONG></SPAN></LI></UL><DIV class=""><STRONG>The Three Paths for ABAP AI Evolution:</STRONG></DIV><DIV class=""><STRONG>1. The Standard Path: Joule for Developers in ADT</STRONG></DIV><UL class=""><LI><SPAN class=""><STRONG>Best for:</STRONG> Daily coding, documentation, and unit testing.</SPAN></LI><LI><SPAN class=""><STRONG>Action:</STRONG> Request access through your administrator (Material 8019124 for customers and 8019541 for partners) and activate it in ADT.</SPAN></LI></UL><DIV class=""><STRONG>2. The Innovation Path: ABAP AI SDK &amp; BTP Free Tier</STRONG></DIV><UL class=""><LI><SPAN class=""><STRONG>Best for:</STRONG> Building your own AI-powered business applications (e.g., automated invoice processing).</SPAN></LI><LI><SPAN class=""><STRONG>Action:</STRONG> Use the <STRONG>SAP BTP Free Tier</STRONG> to access the Generative AI Hub and the <STRONG>ABAP AI SDK</STRONG> to connect your custom ABAP code to external foundation models.</SPAN></LI></UL><DIV class=""><STRONG>3. The Modernization Path: VS Code with ABAP Cloud (Roadmap Q2/2026)</STRONG></DIV><UL class=""><LI><SPAN class=""><STRONG>Best for:</STRONG> Developers looking for a lightweight, file-based experience and for those which want to be the first to leverage agentic ABAP AI in side-by-side approach.</SPAN></LI><LI><STRONG>Action</STRONG>: Explore the new side-by-side ABAP Cloud Extension for <A href="https://community.sap.com/t5/technology-blog-posts-by-sap/introducing-the-next-era-of-abap-development/ba-p/14260522" target="_blank">VS Code (GA planned for Q2 2026) with built-in Agentic AI</A> assistance powered by an <STRONG>ABAP MCP server</STRONG>. This will support a <STRONG>broader range of&nbsp;SAP S/4HANA Private Editions</STRONG> and provide <STRONG>faster update cycles</STRONG>.</LI></UL><DIV class=""><STRONG>Key Takeaway for 2026:</STRONG><BR />Don't get bogged down trying to "prompt engineer" experimental models like ABAP-1 for production code generation. Instead, leverage <STRONG>Joule for Developers</STRONG>&nbsp;mature "Explain" and "Generate" skills to <A href="https://community.sap.com/t5/technology-blog-posts-by-sap/custom-code-migration-to-sap-s-4hana-powered-by-sap-joule-for-developers/ba-p/14329094" target="_blank">maintain a <STRONG>Clean Core</STRONG> and accelerate your migration to SAP S/4HANA.</A></DIV><P><STRONG>Here you can learn more:</STRONG></P><OL><LI><P><SPAN class=""><A class="" href="https://community.sap.com/t5/technology-blog-posts-by-sap/sap-joule-for-developers-expands-to-private-cloud-accelerating-abap/ba-p/14237958" target="_blank">SAP Joule for Developers (J4D) Expands to Private Cloud: Accelerating ABAP Innovation and Transformation </A></SPAN></P></LI><LI><A href="https://community.sap.com/t5/technology-blog-posts-by-sap/abap-ai-revolution-accelerates-the-abap-developer-who-built-enterprise-apps/ba-p/14216073" target="_blank"><SPAN class="">ABAP AI Revolution Accelerates: The ABAP Developer Who Built Enterprise Apps in Minutes </SPAN></A></LI><LI><A href="https://community.sap.com/t5/technology-blog-posts-by-sap/introducing-the-next-era-of-abap-development/ba-p/14260522" target="_blank"><SPAN class="">Joule for Developers and ABAP AI capabilities are coming to SAP S/4HANA Private Edition 2021, 2022, and 2023</SPAN></A></LI><LI><SPAN class="">Public Roadmap: <A href="https://help.sap.com/docs/abap-cross-product/roadmap-info/genai" target="_blank" rel="noopener noreferrer">SAP Help</A> / <A href="https://roadmaps.sap.com/board?PRODUCT=73554900100800001562&amp;PRODUCT=73555000100800001164&amp;range=CURRENT-LAST" target="_blank" rel="noopener noreferrer">SAP Roadmap Explorer</A></SPAN></LI><LI><A href="https://community.sap.com/t5/technology-blog-posts-by-sap/sap-joule-for-developers-abap-ai-capabilities-for-sap-s-4hana-cloud-private/ba-p/14236954" target="_blank"><SPAN class="">Step-by-step guide how to activate SAP Joule for Developers, ABAP AI capabilities for your SAP S/4HANA Cloud Private Edition</SPAN></A></LI><LI><SPAN class=""><SPAN><A href="https://community.sap.com/t5/technology-blog-posts-by-sap/joule-for-developers-with-sap-s-4hana-public-cloud-edition-setup-guide/ba-p/14209989" target="_blank">Joule for Developers (J4D) for S/4HANA Public Cloud Setup Guide</A></SPAN></SPAN></LI><LI><A href="https://discovery-center.cloud.sap/search/abap%20ai" target="_blank" rel="noopener nofollow noreferrer"><SPAN class=""><SPAN>SAP ABAP AI Discovery Center</SPAN></SPAN></A></LI><LI><SPAN class=""><SPAN><A class="" href="https://discovery-center.cloud.sap/search/Free-tier" target="_blank" rel="noopener nofollow noreferrer">SAP BTP Discovery Center (Free Tier Services)</A></SPAN></SPAN></LI><LI><SPAN class=""><SPAN><A href="https://community.sap.com/t5/technology-blog-posts-by-sap/custom-code-migration-to-sap-s-4hana-powered-by-sap-joule-for-developers/ba-p/14329094" target="_blank">Custom code migration to SAP S/4HANA powered by SAP Joule for Developers, ABAP AI capabilities</A> </SPAN></SPAN></LI><LI><A href="http://www.youtube.com/playlist?list=PL6RpkC85SLQAt9lvPw0gF4E3nwbJD0EUe" target="_blank" rel="noopener nofollow noreferrer"><SPAN class=""><SPAN>YouTube playlist for Joule for Developers (J4D)</SPAN></SPAN></A></LI><LI><A href="https://help.sap.com/docs/abap-ai" target="_blank" rel="noopener noreferrer"><SPAN class=""><SPAN>Joule for Developers Help (J4D)</SPAN></SPAN></A></LI><LI><A href="https://github.com/SAP-samples/abap-platform-rap120" target="_blank" rel="noopener nofollow noreferrer">Build SAP Fiori Apps with ABAP Cloud and SAP Joule for developers (RAP120)</A>&nbsp;</LI><LI><A href="https://help.sap.com/docs/abap-cloud/abap-development-tools-user-guide/joule-for-developers-abap-ai-capabilities-f14ebffef77b41bfb0746c33dcb70e84" target="_blank" rel="noopener noreferrer"><SPAN class=""><SPAN>ADT Eclipse AI Capabilities Help</SPAN></SPAN></A></LI><LI><SPAN class=""><SPAN><A class="" href="https://help.sap.com/docs/abap-ai/generative-ai-in-abap-cloud/set-up-abap-ai-sdk-powered-by-intelligent-scenario-lifecycle-management" target="_blank" rel="noopener noreferrer">ABAP AI SDK Help</A></SPAN></SPAN></LI><LI><A href="https://help.sap.com/docs/sap-ai-core/generative-ai/sap-abap-1?locale=en-US&amp;version=LATEST" target="_blank" rel="noopener noreferrer"><SPAN class="">ABAP-1 Help</SPAN></A></LI></OL><P data-unlink="true"><SPAN class="">More high-level insights about <A href="https://www.sap.com/sea/products/artificial-intelligence/joule-for-developers.html" target="_blank" rel="noopener noreferrer">Joule for Developers/ABAP AI</A> and <A href="https://www.sap.com/products/technology-platform/abap/environment.html" target="_blank" rel="noopener noreferrer">ABAP platform can be found&nbsp;here</A>&nbsp;. Here you find <A href="https://www.sap.com/products/artificial-intelligence/sap-abap.html" target="_blank" rel="noopener noreferrer">more on ABAP-&nbsp;1</A>,</SPAN></P> 2026-01-21T18:01:36.956000+01:00 https://community.sap.com/t5/technology-blog-posts-by-members/mass-update-through-custom-action-in-rap/ba-p/14312466 Mass Update Through Custom Action In RAP 2026-01-23T06:31:27.262000+01:00 harsha_reddy24 https://community.sap.com/t5/user/viewprofilepage/user-id/2263071 <P><STRONG>Introduction</STRONG>:</P><P>With the increasing adoption of the RESTful ABAP Programming Model (RAP), SAP developers are encouraged to move away from classic procedural approaches and design applications that are behavior-driven, scalable, and Fiori-ready. While RAP provides powerful standard operations such as create, update, and delete, real-world business scenarios often require <STRONG>mass processing or bulk updates</STRONG> triggered by user actions.</P><P>In this blog, I will walk through a <STRONG>practical implementation of mass update using a custom action in RAP</STRONG>. This approach is especially useful when you need to update multiple records based on business logic that cannot be handled by standard CRUD operations alone.</P><P><STRONG>Solution Overview:</STRONG></P><P>The blog covers:</P><UL><LI><P>Why custom actions are required for mass updates in RAP</P></LI><LI><P>How to define a custom action in the Behavior Definition</P></LI><LI><P>Implementing the action logic in the Behavior Implementation class</P></LI><LI><P>Triggering the mass update from a Fiori Elements UI</P></LI><LI><P>Key considerations and best practices</P></LI></UL><P><BR /><STRONG>Database Table:</STRONG></P><pre class="lia-code-sample language-abap"><code>@EndUserText.label : 'travel uuid table' @AbapCatalog.enhancement.category : #NOT_EXTENSIBLE @AbapCatalog.tableCategory : #TRANSPARENT @AbapCatalog.deliveryClass : #A @AbapCatalog.dataMaintenance : #RESTRICTED define table zuuid_table { key client : abap.clnt not null; key travel_id : sysuuid_x16 not null; description : /dmo/description; status : /dmo/travel_status; @Semantics.amount.currencyCode : 'zuuid_table.currency_code' booking_fee : /dmo/booking_fee; @Semantics.amount.currencyCode : 'zuuid_table.currency_code' total_price : /dmo/total_price; currency_code : /dmo/currency_code; createdby : syuname; createdat : timestampl; lastchangedby : syuname; lastchangedat : abp_locinst_lastchange_tstmpl; }</code></pre><P><STRONG>Root Entity:<BR /></STRONG></P><pre class="lia-code-sample language-abap"><code>@AccessControl.authorizationCheck: #MANDATORY @Metadata.allowExtensions: true @ObjectModel.sapObjectNodeType.name: 'ZUUID_TABLE' @EndUserText.label: '###GENERATED Core Data Service Entity' define root view entity ZR_UUID_TABLE as select from zuuid_table as R_UUID_TABLE { key travel_id as TravelID, description as Description, status as Status, @Semantics.amount.currencyCode: 'CurrencyCode' booking_fee as BookingFee, @Semantics.amount.currencyCode: 'CurrencyCode' total_price as TotalPrice, currency_code as CurrencyCode, createdby as Createdby, createdat as Createdat, lastchangedby as Lastchangedby, @Semantics.systemDateTime.localInstanceLastChangedAt: true lastchangedat as Lastchangedat }</code></pre><P><BR /><STRONG>Projection View:</STRONG></P><pre class="lia-code-sample language-abap"><code>@Metadata.allowExtensions: true @Metadata.ignorePropagatedAnnotations: true @EndUserText: { label: '###GENERATED Core Data Service Entity' } @ObjectModel: { sapObjectNodeType.name: 'ZUUID_TABLE' } @AccessControl.authorizationCheck: #MANDATORY define root view entity ZC_UUID_TABLE provider contract transactional_query as projection on ZR_UUID_TABLE association [1..1] to ZR_UUID_TABLE as _BaseEntity on $projection.TravelID = _BaseEntity.TravelID { key TravelID, Description, Status, @Semantics: { amount.currencyCode: 'CurrencyCode' } BookingFee, @Semantics: { amount.currencyCode: 'CurrencyCode' } TotalPrice, CurrencyCode, Createdby, Createdat, Lastchangedby, @Semantics: { systemDateTime.localInstanceLastChangedAt: true } Lastchangedat, _BaseEntity }</code></pre><P><STRONG>Metadata Extension:<BR /></STRONG></P><pre class="lia-code-sample language-abap"><code><a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1445379">@ui</a>.lineItem: [ { position: 10 , label: 'Modify Status', type: #FOR_ACTION, dataAction: 'UpdateStatus' } ] <a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1445379">@ui</a>.selectionField: [ { position: 10 } ] </code></pre><P><STRONG>&nbsp;</STRONG></P><P><STRONG>Root Behavior Definition:</STRONG></P><UL><LI>define action in BDEF.</LI><LI>parameter which defines inputs for our actions.</LI></UL><pre class="lia-code-sample language-abap"><code>managed implementation in class ZBP_R_UUID_TABLE unique; strict ( 2 ); with draft; extensible; define behavior for ZR_UUID_TABLE alias R_UUID_TABLE persistent table ZUUID_TABLE extensible draft table ZUUID_TABLE_D etag master Lastchangedat lock master total etag Lastchangedat authorization master( global ) { field ( readonly ) TravelID, Lastchangedat; field ( numbering : managed ) TravelID; create; update(features : instance ); delete(features : global); action(features : global) UpdateStatus parameter zstatus_str; draft action Activate optimized; draft action Discard; draft action Edit; draft action Resume; draft determine action Prepare; mapping for ZUUID_TABLE corresponding extensible { TravelID = travel_id; Description = description; Status = status; BookingFee = booking_fee; TotalPrice = total_price; CurrencyCode = currency_code; Createdby = createdby; Createdat = createdat; Lastchangedby = lastchangedby; Lastchangedat = lastchangedat; } }</code></pre><P><STRONG>Parameter For Action:</STRONG></P><pre class="lia-code-sample language-abap"><code>@EndUserText.label : 'staus structure' @AbapCatalog.enhancement.category : #NOT_EXTENSIBLE define structure zstatus_str { status : /dmo/travel_status; }</code></pre><P><BR /><STRONG>Implementation:<BR /></STRONG></P><pre class="lia-code-sample language-abap"><code> METHOD UpdateStatus. MODIFY ENTITIES OF zr_uuid_table IN LOCAL MODE ENTITY r_uuid_table UPDATE FIELDS ( Status ) WITH VALUE #( for key in keys ( %key-TravelID = key-TravelID Status = key-%param-status ) ) REPORTED data(lt_reported) FAILED data(lt_failed). ENDMETHOD.</code></pre><P>&nbsp;</P><P><STRONG>Explanation:<BR /></STRONG></P><UL><LI><STRONG>MODIFY ENTITIES</STRONG> is the RAP statement used to change data in a behavior-managed entity.</LI><LI><STRONG>IN LOCAL MODE</STRONG> ensures the operation runs within the current LUW without immediately committing to the database.</LI><LI><STRONG>UPDATE FIELDS</STRONG>&nbsp; Status&nbsp; explicitly restricts the update to the Status field only, improving clarity and performance.</LI><LI><STRONG>keys</STRONG> contains all selected instances for which the action is triggered.</LI><LI>The <STRONG>FOR</STRONG> expression loops over each selected key, enabling mass processing in a single statement.</LI><LI><STRONG>%key-TravelID</STRONG> identifies the record to be updated.</LI><LI><STRONG>key-%param-status</STRONG> retrieves the action parameter value passed from the UI for ex, a new status selected by the user.</LI><LI><STRONG>lt_reported</STRONG> captures informational, warning, or success messages generated during the update.</LI><LI><STRONG>lt_failed</STRONG> contains records that could not be updated due to validation errors, authorization issues, or business rule violations.</LI><LI>These tables are automatically processed by RAP and reflected back to the UI, ensuring proper user feedback.</LI></UL><P><STRONG>Projection BDEF:</STRONG></P><UL><LI>expose our custom action in projection behavior definition.</LI></UL><pre class="lia-code-sample language-abap"><code>projection implementation in class ZBP_C_UUID_TABLE unique; strict ( 2 ); extensible; use draft; use side effects; define behavior for ZC_UUID_TABLE alias R_UUID_TABLE extensible use etag { use create; use update; use delete; use action Edit; use action Activate; use action Discard; use action Resume; use action Prepare; use action UpdateStatus; }</code></pre><P><STRONG><BR /><BR />Preview</STRONG>:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="harsha_reddy24_0-1769070515390.png" style="width: 524px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/364004iD9317102B5D59FE8/image-dimensions/524x155?v=v2" width="524" height="155" role="button" title="harsha_reddy24_0-1769070515390.png" alt="harsha_reddy24_0-1769070515390.png" /></span></P><UL><LI>select records and click on <STRONG>modify status</STRONG> button.</LI><LI>Assign any travel status and it will be updated.</LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="harsha_reddy24_1-1769070896884.png" style="width: 504px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/364008i51970E15FE7EA866/image-dimensions/504x155?v=v2" width="504" height="155" role="button" title="harsha_reddy24_1-1769070896884.png" alt="harsha_reddy24_1-1769070896884.png" /></span></P><P>&nbsp;</P><P><STRONG>Conclusion:</STRONG></P><P>Custom actions in RAP provide a clean and scalable way to handle mass update scenarios that go beyond standard CRUD operations. By leveraging MODIFY ENTITIES, action parameters, and RAP-managed messaging, developers can implement efficient bulk updates while fully adhering to RAP principles. This approach ensures better performance, cleaner code, and seamless integration with Fiori Elements, making it a recommended pattern for real-world business requirements.<BR /><BR /><a href="https://community.sap.com/t5/c-khhcw49343/ABAP+Connectivity/pd-p/266264953119842772207986043063520" class="lia-product-mention" data-product="313-1">ABAP Connectivity</a>&nbsp; <a href="https://community.sap.com/t5/c-khhcw49343/ABAP+Extensibility/pd-p/338571334339306322581424656448659" class="lia-product-mention" data-product="315-1">ABAP Extensibility</a>&nbsp; <a href="https://community.sap.com/t5/c-khhcw49343/SAP+BTP+ABAP+environment/pd-p/73555000100800001164" class="lia-product-mention" data-product="11-1">SAP BTP ABAP environment</a>&nbsp;</P> 2026-01-23T06:31:27.262000+01:00 https://community.sap.com/t5/artificial-intelligence-blogs-posts/developing-ai-enabled-applications-with-abap-ai-sdk-powered-by-islm/ba-p/14252514 Developing AI Enabled Applications with ABAP AI SDK powered by ISLM 2026-01-23T08:05:00.042000+01:00 Swathy_S https://community.sap.com/t5/user/viewprofilepage/user-id/1972836 <P><A href="https://www.sap.com/documents/2025/02/b4f714de-f57e-0010-bca6-c68f7e60039b.html" target="_self" rel="noopener noreferrer">SAP Joule for Developers</A>,&nbsp;ABAP AI Capabilities&nbsp;is your intelligent coding companion, bringing deep&nbsp;expertise&nbsp;in ABAP Cloud and AI-driven development. When we talk about ABAP AI use cases, they revolve around three key pillars —&nbsp;<EM>Accelerate,&nbsp;Empower, </EM>and&nbsp;<EM>Transform</EM>. Each AI capability is delivered as part of these pillars, helping developers enhance productivity, build smarter applications, and drive innovation. To learn more about SAP Joule for Developers, refer to the blog <SPAN class=""><SPAN>post&nbsp;</SPAN></SPAN><A href="https://community.sap.com/t5/technology-blog-posts-by-sap/joule-speaks-abap/ba-p/14018226" target="_self">Joule speaks ABAP!</A> by Dr. Alexander Rother.</P><P>Have you ever wondered how to infuse intelligence into your ABAP-based business applications and move beyond standard transactional scenarios? If yes,&nbsp;you’ve&nbsp;landed&nbsp;at&nbsp;the right place. In this blog,&nbsp;we’ll&nbsp;explore how you can&nbsp;build AI-enabled applications using the ABAP AI SDK powered by <A href="https://help.sap.com/docs/ABAP_PLATFORM_NEW/7989a582039547ae91d8f483e487058d/436151b128614f0e84024015136043d3.html" target="_self" rel="noopener noreferrer">Intelligent Scenario Lifecycle Management (ISLM)</A>,&nbsp;the main deliverable of the&nbsp;Empower&nbsp;use case.</P><P><STRONG>The Scenario</STRONG><SPAN><STRONG>&nbsp;</STRONG><BR /></SPAN><SPAN>The goal of this scenario is to&nbsp;</SPAN><STRONG><SPAN>infuse generative AI into an ABAP Cloud application</SPAN></STRONG><SPAN>&nbsp;to enhance user experience and automate content creation.</SPAN><SPAN>&nbsp;</SPAN></P><P><STRONG><SPAN>Use Case:</SPAN></STRONG><SPAN>&nbsp;Build an&nbsp;</SPAN><STRONG><SPAN>ABAP Cloud application</SPAN></STRONG><SPAN>&nbsp;to generate a&nbsp;</SPAN><STRONG><SPAN>travel itinerary</SPAN></STRONG><SPAN>&nbsp;for a given city based on user input, along with a&nbsp;</SPAN><STRONG><SPAN>budget breakdown,&nbsp;</SPAN></STRONG><SPAN>using&nbsp;</SPAN><STRONG><SPAN>ABAP AI SDK&nbsp;</SPAN></STRONG><SPAN>powered by</SPAN><STRONG><SPAN>&nbsp;ISLM</SPAN></STRONG><SPAN>.</SPAN><SPAN>&nbsp;</SPAN></P><P><STRONG>Which products are supported?&nbsp;</STRONG></P><P><SPAN>The ABAP AI SDK powered by ISLM is available in:</SPAN><SPAN>&nbsp;</SPAN></P><UL><LI><A href="https://pages.community.sap.com/topics/btp-abap-environment" target="_self" rel="noopener noreferrer"><SPAN>SAP BTP ABAP Environment</SPAN></A></LI></UL><UL><LI><A href="https://www.sap.com/uk/products/erp/s4hana.html" target="_self" rel="noopener noreferrer"><SPAN>SAP S/4HANA Cloud Public Edition</SPAN></A></LI></UL><UL><LI><SPAN><A href="https://www.sap.com/india/products/erp/s4hana-private-edition.html" target="_self" rel="noopener noreferrer">SAP S/4HANA Cloud Private Edition</A> and SAP S/4HANA OnPrem as of release 2025 via standard delivery. Lower releases of SAP S/4HANA Cloud Private Edition and SAP S/4HANA OnPrem are supported via Transport-based Correction Instructions (TCI), see&nbsp;details in&nbsp;</SPAN><A href="https://me.sap.com/notes/3513374" target="_blank" rel="noopener noreferrer"><SPAN>SAP Note 3513374</SPAN></A><SPAN>&nbsp;and the SAP Notes and instructions linked&nbsp;therein.</SPAN><SPAN>&nbsp;</SPAN></LI></UL><P><STRONG><SPAN>Overview</SPAN></STRONG><SPAN>&nbsp;</SPAN></P><P><SPAN>To build this&nbsp;application,&nbsp;we’ll&nbsp;bring together several key components:</SPAN><SPAN>&nbsp;</SPAN></P><UL><LI><A href="https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/what-is-sap-ai-core" target="_blank" rel="noopener noreferrer"><STRONG><SPAN>SAP AI Core</SPAN></STRONG></A><SPAN>&nbsp;– for&nbsp;managing AI scenarios and&nbsp;accessing&nbsp;generative AI capabilities via the generative AI hub.</SPAN><SPAN>&nbsp;</SPAN></LI></UL><UL><LI><A href="https://help.sap.com/docs/SAP_S4HANA_CLOUD/a630d57fc5004c6383e7a81efee7a8bb/16d3b0ed27b64bebb4f1ccdac7663ba0.html?version=2508.VAL" target="_blank" rel="noopener noreferrer"><STRONG><SPAN>Communication&nbsp;Arrangement</SPAN></STRONG></A><SPAN>&nbsp;– to&nbsp;establish&nbsp;secure integration between ABAP and AI Core.</SPAN><SPAN>&nbsp;</SPAN></LI></UL><UL><LI><A href="https://help.sap.com/docs/ABAP_PLATFORM_NEW/7989a582039547ae91d8f483e487058d/436151b128614f0e84024015136043d3.html" target="_blank" rel="noopener noreferrer"><STRONG><SPAN>ISLM (Intelligent Scenario Lifecycle Management)</SPAN></STRONG></A><SPAN>&nbsp;and&nbsp;</SPAN><STRONG><SPAN>ABAP AI SDK</SPAN></STRONG><SPAN>&nbsp;–&nbsp;for seamless integration with Generative AI Hub, SAP BTP AI services</SPAN><SPAN>&nbsp;</SPAN></LI></UL><UL><LI><STRONG><SPAN>Custom ABAP Cloud Application</SPAN></STRONG><SPAN>&nbsp;– to embed and expose AI capabilities through a user-friendly application.</SPAN><SPAN>&nbsp;</SPAN></LI></UL><P><SPAN>&nbsp;</SPAN><STRONG><SPAN>Implementation Steps</SPAN></STRONG><SPAN>&nbsp;</SPAN></P><OL><LI><STRONG><SPAN>Set Up the Environment</SPAN></STRONG><SPAN>&nbsp;<BR /></SPAN><SPAN>Configure the&nbsp;</SPAN><STRONG><SPAN>AI Core service plan</SPAN></STRONG><SPAN>&nbsp;and establish&nbsp;</SPAN><STRONG><SPAN>communication arrangements</SPAN></STRONG><SPAN>&nbsp;between the ABAP system and AI Core.</SPAN><SPAN><BR /></SPAN></LI><LI><STRONG>Build Custom&nbsp;Travel Plan ABAP Cloud application.&nbsp;</STRONG></LI><LI><STRONG><SPAN>Create and Deploy Intelligent Scenarios</SPAN></STRONG><SPAN>&nbsp;<BR /></SPAN><SPAN>Define the AI scenario in&nbsp;</SPAN><STRONG><SPAN>ISLM</SPAN></STRONG><SPAN>, train or connect your model, and deploy it for consumption.</SPAN><SPAN>&nbsp;</SPAN></LI><LI><STRONG><SPAN>Consume Intelligent Scenarios in ABAP</SPAN></STRONG><SPAN>&nbsp;<BR /></SPAN><SPAN>Integrate the deployed scenario within a&nbsp;</SPAN><STRONG><SPAN>custom ABAP Cloud application</SPAN></STRONG><SPAN>&nbsp;to generate AI-driven outputs - in this case, travel itineraries&nbsp;and budget breakdown.</SPAN><SPAN>&nbsp;</SPAN></LI></OL><P><STRONG><SPAN>1. Set Up the Environment</SPAN></STRONG><SPAN>&nbsp;</SPAN><SPAN>&nbsp;</SPAN></P><OL><LI><SPAN>Configure the required entitlements to make&nbsp;SAP AI Core&nbsp;accessible in your subaccount. To use </SPAN><STRONG><SPAN>Generative AI capabilities</SPAN></STRONG><SPAN> (including the Generative AI Hub and LLM access), choose the </SPAN><STRONG><SPAN>extended</SPAN></STRONG><SPAN> service plan. To add a Service Plan, see:</SPAN><SPAN>&nbsp;</SPAN><A href="https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/add-service-plan" target="_blank" rel="noopener noreferrer"><SPAN>Add a Service Plan | SAP Help Portal</SPAN></A><SPAN>&nbsp;</SPAN><SPAN>&nbsp;</SPAN></LI><LI><SPAN>Download the client default certificate of the ABAP system to create the X.509 service key in AI Core instance. Follow the steps here :&nbsp;</SPAN><A href="https://help.sap.com/docs/btp/sap-business-technology-platform/download-certificate-3645813291be47839e72ab08d8a31ac9?utm_source=chatgpt.com" target="_blank" rel="noopener noreferrer"><SPAN>Download Certificate | SAP Help Portal</SPAN></A><SPAN>&nbsp;</SPAN><SPAN>&nbsp;</SPAN></LI><LI><SPAN>Create a service instance and a service key to access SAP AI Core, where the large language models in the generative AI hub are hosted. The X.509 service key is created with the downloaded client default certificate of the ABAP system passed as parameter. Follow</SPAN><SPAN> the steps from here:</SPAN><SPAN>&nbsp;</SPAN><A href="https://help.sap.com/docs/btp/sap-business-technology-platform/create-sap-btp-service-instance-and-key?utm_source=chatgpt.com" target="_blank" rel="noopener noreferrer"><SPAN>Create SAP BTP Service Instance and Key | SAP Help Portal</SPAN></A><SPAN><BR /></SPAN></LI><LI><SPAN>Configure the communication system for </SPAN><STRONG><SPAN>SAP_COM_0A69</SPAN></STRONG><SPAN>. Currently, you can create one instance of the communication scenario per client. Follow the steps from here: </SPAN><A href="https://help.sap.com/docs/btp/sap-business-technology-platform/how-to-configure-communication-system-for-sap-com-0a69-7d691a07627442a3b1d07000417c8056?utm_source=chatgpt.com" target="_blank" rel="noopener noreferrer"><SPAN>How to Configure the Communication System for SAP_COM_0A69 | SAP Help Portal</SPAN></A><SPAN>&nbsp;</SPAN></LI><LI><SPAN>To create the Communication Arrangement for </SPAN><STRONG><SPAN>SAP_COM_0A69.&nbsp;</SPAN></STRONG><SPAN>Follow the steps from here: </SPAN><A href="https://help.sap.com/docs/btp/sap-business-technology-platform/how-to-create-communication-arrangement-for-sap-com-0a69-20014a0910124c18aca114d4477c797e?utm_source=chatgpt.com" target="_blank" rel="noopener noreferrer"><SPAN>How to Create the Communication Arrangement for SAP_COM_0A69 | SAP Help Portal</SPAN></A><SPAN>&nbsp;<BR /></SPAN></LI><LI><SPAN>After the communication system and communication arrangement are configured, create an intelligent scenario and continue managing the lifecycle of the intelligent scenario. You are required to create an intelligent scenario for your custom-owned Gen AI use cases.</SPAN><SPAN>&nbsp;</SPAN></LI></OL><P><STRONG>2. Create a custom ABAP Cloud Application to infuse AI Capabilities</STRONG><SPAN><STRONG>&nbsp;</STRONG></SPAN></P><P><STRONG><SPAN>2.1 Create Package</SPAN></STRONG></P><OL><LI>In ABAP Development Tools (ADT), go to the <STRONG>Project Explorer</STRONG>, right-click on the package <STRONG>ZLOCAL</STRONG>, and select <STRONG>New</STRONG>&nbsp;<STRONG>→</STRONG> <STRONG>ABAP Package</STRONG> from the context menu.</LI><LI>Maintain the required information:&nbsp;<OL class="lia-list-style-type-lower-alpha"><LI>Name: <EM>ZTRAVEL_ITINERARY</EM></LI><LI>Description: <EM>ABAP AI Capabilities</EM><BR />Select the box <STRONG>Add to favorites package</STRONG>. Choose&nbsp;<STRONG>Next</STRONG> and <STRONG>Finish</STRONG>.</LI></OL></LI></OL><P><STRONG>&nbsp;2.2 Create database table&nbsp; </STRONG></P><P>Create a database table to store the Travel Itinerary data.</P><OL><LI>Right-click on your ABAP package <EM>ZTRAVEL_ITINERARY</EM> and select <STRONG>New</STRONG>&nbsp;<STRONG>→</STRONG>&nbsp;<STRONG>Other ABAP Repository Object</STRONG> from the context menu.</LI><LI>Search for <STRONG>database table</STRONG>, select it, and choose&nbsp;<STRONG>Next</STRONG>.</LI><LI>Maintain the required information:&nbsp;<STRONG>Name:</STRONG> <EM>ZRAP_TRAVEL_DATA&nbsp; <STRONG>&nbsp;</STRONG></EM><STRONG>Description:</STRONG> Database Table for Travel Itinerary</LI><LI>Choose&nbsp;<STRONG>Next.</STRONG><STRONG>&nbsp;</STRONG>Choose&nbsp;<STRONG>Finish</STRONG> and replace the default code with the following code snippet:&nbsp;<EM><BR /></EM></LI></OL><pre class="lia-code-sample language-abap"><code>@EndUserText.label : 'Database table for travel Itinerary' @AbapCatalog.enhancement.category : #NOT_EXTENSIBLE @AbapCatalog.tableCategory : #TRANSPARENT @AbapCatalog.deliveryClass : #A @AbapCatalog.dataMaintenance : #RESTRICTED define table zrap_travel_data { key client : abap.clnt not null; key travel_id : sysuuid_x16 not null; traveler_name : abap.char(80); starting_point : abap.char(100); destination : abap.char(100); start_date : /dmo/begin_date; end_date : /dmo/end_date; @Semantics.amount.currencyCode : 'zrap_travel_data.budget_curr' budget : abap.curr(15,2); budget_curr : abap.cuky; transport_mode : abap.char(40); accommodation_type : abap.char(50); ai_itinerary : abap.sstring(1333); ai_budget_breakdown : abap.sstring(1000); status : abap.char(20); local_created_by : abp_creation_user; local_created_at : abp_creation_tstmpl; local_last_changed_by : abp_locinst_lastchange_user; local_last_changed_at : abp_locinst_lastchange_tstmpl; last_changed_at : abp_lastchange_tstmpl; }</code></pre><P>&nbsp; &nbsp; &nbsp; &nbsp; 5. Save<span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Swathy_S_0-1765162371312.png" style="width: 21px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/349463i9681B46ABE2AA9AA/image-dimensions/21x21?v=v2" width="21" height="21" role="button" title="Swathy_S_0-1765162371312.png" alt="Swathy_S_0-1765162371312.png" /></span>&nbsp;and activate&nbsp;<span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Swathy_S_1-1765162371313.png" style="width: 26px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/349462i0A0A551F373ABAC3/image-dimensions/26x28?v=v2" width="26" height="28" role="button" title="Swathy_S_1-1765162371313.png" alt="Swathy_S_1-1765162371313.png" /></span>the changes in the table&nbsp;<EM>ZRAP_TRAVEL_DATA</EM></P><P><STRONG>2.3 Generate transactional UI service</STRONG></P><P>Create your OData V4-based UI service with the built-in ADT generator. The generated business service will be transactional, draft-enabled, and enriched with UI semantics for the generation of the SAP Fiori elements app.</P><OL><LI>Right-click your database table<EM> ZRAP_TRAVEL_DATA</EM>&nbsp;and select <STRONG>Generate ABAP Repository Objects</STRONG> from the context menu.<BR /><BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Swathy_S_5-1765162371331.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/349465i6CA029F7668CA164/image-size/medium?v=v2&amp;px=400" role="button" title="Swathy_S_5-1765162371331.png" alt="Swathy_S_5-1765162371331.png" /></span><BR /><BR /></LI><LI>Select <STRONG>OData UI Service</STRONG> and choose&nbsp;<STRONG>Next </STRONG>and provide the package details<STRONG>.</STRONG><STRONG><BR /><BR /></STRONG><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Swathy_S_6-1765162371335.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/349467i8D71F00086B9D8DD/image-size/medium?v=v2&amp;px=400" role="button" title="Swathy_S_6-1765162371335.png" alt="Swathy_S_6-1765162371335.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Swathy_S_7-1765162371339.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/349468i22747EDFF7B27BE4/image-size/medium?v=v2&amp;px=400" role="button" title="Swathy_S_7-1765162371339.png" alt="Swathy_S_7-1765162371339.png" /></span><BR /><BR /></LI><LI>&nbsp;Maintain the required information on the <STRONG>Configure Generator</STRONG> dialog to provide the name of your data model and generate them.</LI><LI>For that, navigate through the wizard tree <STRONG>(Business Objects, Data Model, etc…)</STRONG>, maintain the artefact names provided and choose&nbsp;<STRONG>Next</STRONG>.</LI><LI>Verify the maintained entries and choose&nbsp;<STRONG>Next </STRONG>to confirm and choose&nbsp;<STRONG>Finish.<BR /></STRONG><BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Swathy_S_8-1765162371347.png" style="width: 449px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/349469iBC29B24051D14FE5/image-dimensions/449x585?v=v2" width="449" height="585" role="button" title="Swathy_S_8-1765162371347.png" alt="Swathy_S_8-1765162371347.png" /></span><BR /><BR /></LI><LI>The artifacts needed will be generated. Go to the <STRONG>Project Explorer</STRONG>, select your package <EM>ZRAP_TRAVEL_ITENERARY</EM>, refresh it by choosing&nbsp;<STRONG>F5</STRONG>, and check all generated ABAP repository objects.<BR /><BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Swathy_S_9-1765162371350.png" style="width: 606px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/349470i4A9AB8DE5D19237D/image-dimensions/606x162?v=v2" width="606" height="162" role="button" title="Swathy_S_9-1765162371350.png" alt="Swathy_S_9-1765162371350.png" /></span><BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Swathy_S_10-1765162371352.png" style="width: 606px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/349472i0DCE41A107C8AAAC/image-dimensions/606x206?v=v2" width="606" height="206" role="button" title="Swathy_S_10-1765162371352.png" alt="Swathy_S_10-1765162371352.png" /></span><BR /><BR /><span class="lia-unicode-emoji" title=":information:">ℹ️</span>&nbsp;NOTE: The names of the artifacts may differ from those shown in this blog post, as they are generated by the wizard.</LI></OL><P><STRONG>2.4 Adjust meta data extensions</STRONG><BR />Open the metadata extension<span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Swathy_S_11-1765162371353.png" style="width: 20px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/349471iD8E99027FF714C03/image-dimensions/20x19?v=v2" width="20" height="19" role="button" title="Swathy_S_11-1765162371353.png" alt="Swathy_S_11-1765162371353.png" /></span>&nbsp;<STRONG>ZC_RAP_TRAVEL_DATA</STRONG> and make the adjustments as shown in the provided code snippet.&nbsp;<EM>ZC_RAP_TRAVEL_DATA</EM> should look like this:</P><pre class="lia-code-sample language-abap"><code>@Metadata.layer: #CORE @UI.headerInfo.title.type: #STANDARD @UI.headerInfo.title.value: 'TravelID' @UI.headerInfo.description.type: #STANDARD @UI.headerInfo.description.value: 'TravelID' annotate view ZC_RAP_TRAVEL_DATA with { .facet: [ { label: 'General Information', id: 'GeneralInfo', purpose: #STANDARD, position: 10, type: #IDENTIFICATION_REFERENCE }, { label: 'AI Generated Itinerary', id: 'AIItineraryFacet', purpose: #STANDARD, position: 200, type: #FIELDGROUP_REFERENCE, targetQualifier: 'AI_ITIN' }, { label: 'AI Budget Breakdown', id: 'AIBudgetFacet', purpose: #STANDARD, position: 210, type: #FIELDGROUP_REFERENCE, targetQualifier: 'AI_BUDGET' } ] @EndUserText.label: 'TravelID' .identification: [ { position: 10, label: 'TravelID' } ] .lineItem: [ { position: 10, label: 'TravelID' } ] .selectionField: [ { position: 10 } ] TravelID; @EndUserText.label: 'TravelerName' .identification: [ { position: 20, label: 'TravelerName' } ] .lineItem: [ { position: 20, label: 'TravelerName' } ] .selectionField: [ { position: 20 } ] TravelerName; @EndUserText.label: 'StartingPoint' .identification: [ { position: 30, label: 'StartingPoint' } ] .lineItem: [ { position: 30, label: 'StartingPoint' } ] .selectionField: [ { position: 30 } ] StartingPoint; @EndUserText.label: 'Destination' .identification: [ { position: 40, label: 'Destination' } ] .lineItem: [ { position: 40, label: 'Destination' } ] .selectionField: [ { position: 40 } ] Destination; .identification: [ { position: 50 } ] .lineItem: [ { position: 50 } ] .selectionField: [ { position: 50 } ] StartDate; .identification: [ { position: 60 } ] .lineItem: [ { position: 60 } ] .selectionField: [ { position: 60 } ] EndDate; @EndUserText.label: 'Budget' .identification: [ { position: 70, label: 'Budget' } ] .lineItem: [ { position: 70, label: 'Budget' } ] .selectionField: [ { position: 70 } ] Budget; @EndUserText.label: 'TransportMode' .identification: [ { position: 80, label: 'TransportMode' } ] .lineItem: [ { position: 80, label: 'TransportMode' } ] .selectionField: [ { position: 80 } ] TransportMode; @EndUserText.label: 'AccommodationType' .identification: [ { position: 90, label: 'AccommodationType' } ] .lineItem: [ { position: 90, label: 'AccommodationType' } ] .selectionField: [ { position: 90 } ] AccommodationType; // FULL-WIDTH AI ITINERARY @EndUserText.label: 'Generated Itinerary' .fieldGroup: [ { qualifier: 'AI_ITIN', position: 10, label: 'AI Generated Itinerary' } ] .multiLineText: true AiItinerary; // FULL-WIDTH AI BUDGET @EndUserText.label: 'Budget Breakdown' .fieldGroup: [ { qualifier: 'AI_BUDGET', position: 10, label: 'AI Budget Breakdown' } ] .multiLineText: true AiBudgetBreakdown; @EndUserText.label: 'Status' .identification: [ { position: 120, label: 'Status' } ] .lineItem: [ { position: 120, label: 'Status' } ] .selectionField: [ { position: 120 } ] Status; @EndUserText.label: '_BaseEntity' .identification: [ { position: 180 , label: '_BaseEntity' } ] .lineItem: [ { position: 180 , label: '_BaseEntity' } ] .selectionField: [ { position: 180 } ] _BaseEntity; }</code></pre><P><SPAN>&nbsp;</SPAN><STRONG><SPAN>2.5 Preview travel app</SPAN></STRONG></P><P>1. Publish the local service endpoint of your service binding and start the <STRONG>Fiori elements App Preview</STRONG>. Open your service binding&nbsp;<EM>ZUI_RAP_TRAVEL_DATA_O4</EM> and choose&nbsp;<STRONG>Publish</STRONG>.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Swathy_S_14-1765162371357.png" style="width: 582px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/349475iE42FAB080724BCB1/image-dimensions/582x182?v=v2" width="582" height="182" role="button" title="Swathy_S_14-1765162371357.png" alt="Swathy_S_14-1765162371357.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Swathy_S_15-1765162371363.png" style="width: 575px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/349476iD2ECEB8B64CE2A7A/image-dimensions/575x210?v=v2" width="575" height="210" role="button" title="Swathy_S_15-1765162371363.png" alt="Swathy_S_15-1765162371363.png" /></span></P><P>2. Double-click on the Entity <EM>ZC_RAP_TRAVEL_DATA</EM> in the <STRONG>Entity Set and Association</STRONG> section to open the <STRONG>Fiori elements App Preview</STRONG>.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Swathy_S_16-1765162371373.png" style="width: 616px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/349477i244638D2AA8A44D9/image-dimensions/616x339?v=v2" width="616" height="339" role="button" title="Swathy_S_16-1765162371373.png" alt="Swathy_S_16-1765162371373.png" /></span></P><P>For reference:&nbsp;<A href="https://developers.sap.com/tutorials/abap-environment-rap100-generate-ui-service.html#top" target="_blank" rel="noopener noreferrer">Create Database Table and Generate UI Service | SAP Tutorials</A></P><H3 id="toc-hId-1892749195"><STRONG>3. Create an Intelligent Scenario (Generative AI)</STRONG><SPAN>&nbsp;&nbsp;</SPAN></H3><P>You first need to create an intelligent scenario for your custom Generative AI use cases. This&nbsp;scenario acts as the central place to manage the entire lifecycle of your AI asset from setup to generating inference results. All lifecycle steps can be executed through the Intelligent Scenario Management app. Here are the key steps to create an intelligent scenario:<STRONG>&nbsp;</STRONG></P><P><STRONG>3.1 Create ISLM Scenario</STRONG><SPAN><BR /></SPAN>An intelligent scenario is an ABAP representation of a predictive business-specific use case. These intelligent scenarios are AI-powered workflows or processes designed to automate and optimize business tasks. <SPAN>&nbsp;</SPAN></P><OL><LI>Select your package, right-click, <STRONG>New → Other → Intelligent Scenario → ZINTS_RAP120<BR /></STRONG><SPAN><BR /></SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Swathy_S_0-1765163757248.png" style="width: 406px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/349480i55F5697A6E4B79FD/image-dimensions/406x345?v=v2" width="406" height="345" role="button" title="Swathy_S_0-1765163757248.png" alt="Swathy_S_0-1765163757248.png" /></span><STRONG><BR /><BR /></STRONG></LI><LI>Enter a name and description. Select <EM>SIDEBYSIDE </EM>for <STRONG>Scenario Technology</STRONG> field. Choose&nbsp;<STRONG>Next.<BR /></STRONG><SPAN><BR /></SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Swathy_S_1-1765163757250.png" style="width: 408px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/349479i51B899FB8444FDF5/image-dimensions/408x426?v=v2" width="408" height="426" role="button" title="Swathy_S_1-1765163757250.png" alt="Swathy_S_1-1765163757250.png" /></span><STRONG><BR /><BR /></STRONG></LI><LI>Set the following parameters for the created Intelligent Scenario.</LI></OL><P>Intelligent Scenario Lifecycle Management supports two primary types of intelligent scenarios:</P><P><STRONG>Embedded Scenarios</STRONG></P><P>Embedded scenarios are built and executed within SAP S/4HANA using the ABAP platform. They rely on the in-database machine learning capabilities of SAP HANA, such as: HANA Predictive Analysis Library (PAL), Automated Predictive Library (APL)</P><P><STRONG>Side-by-Side Scenarios</STRONG></P><P>Side-by-side scenarios, where SAP S/4HANA runs in a separate stack than its machine learning infrastructure provider, such as SAP Business Technology Platform (SAP BTP). These scenarios use external ML services or custom ML models.<BR />Generative AI, SAP AI Core, Data Attribute Recommendation</P><UL><LI>For our scenario, we will be using the <STRONG>side by side</STRONG> scenarios type, sap <STRONG>SAPGEN AI</STRONG><SPAN><BR /></SPAN><STRONG>Turnkey Enablement</STRONG>: Automatically enable SAP-delivered (turnkey) GenAI use cases with minimal configuration effort.</LI></UL><P>&nbsp;</P><TABLE width="362"><TBODY><TR><TD width="211.438px"><P><STRONG>Field</STRONG></P></TD><TD width="149.762px"><P><STRONG>Value</STRONG></P></TD></TR><TR><TD width="211.438px"><P>Intelligent Scenario Type</P></TD><TD width="149.762px"><P>SAPGENAI</P></TD></TR><TR><TD width="211.438px"><P>Automate Turnkey Switch On</P></TD><TD width="149.762px"><P>Check the checkbox</P></TD></TR><TR><TD width="211.438px"><P>Usage Type</P></TD><TD width="149.762px"><P>CUSTOMER</P></TD></TR></TBODY></TABLE><P><SPAN>&nbsp;</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Swathy_S_2-1765163757260.png" style="width: 551px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/349481iC31EE9125E6C91D7/image-dimensions/551x223?v=v2" width="551" height="223" role="button" title="Swathy_S_2-1765163757260.png" alt="Swathy_S_2-1765163757260.png" /></span></P><OL><LI>Activate the object.</LI></OL><P><SPAN><STRONG>3.2 Create ISLM Model<BR /></STRONG><BR /></SPAN>1. Select your package, right-click, <STRONG>New → Other → Intelligent Scenario Model </STRONG><SPAN><BR /></SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Swathy_S_3-1765163757269.png" style="width: 470px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/349484i7C5B73AEBFA29D1B/image-dimensions/470x334?v=v2" width="470" height="334" role="button" title="Swathy_S_3-1765163757269.png" alt="Swathy_S_3-1765163757269.png" /></span></P><P>2. Fill the <EM>Description </EM>and <EM>Model Name </EM>fields. Assign the previously created scenario in <EM>Intelligent Scenario Name.</EM> Choose&nbsp;<STRONG>Next</STRONG>.&nbsp;<SPAN><BR /></SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Swathy_S_4-1765163757271.png" style="width: 460px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/349482iD9DA1FBC5A3267A7/image-dimensions/460x488?v=v2" width="460" height="488" role="button" title="Swathy_S_4-1765163757271.png" alt="Swathy_S_4-1765163757271.png" /></span></P><P>3. Enter the <EM>ExecutableID </EM>and <EM>Large Language Model Name </EM>and <EM>Large Language Model Version</EM></P><P>&nbsp;</P><TABLE width="633"><TBODY><TR><TD width="156"><P><STRONG>Field </STRONG></P></TD><TD width="477"><P><STRONG>Possible values</STRONG></P></TD></TR><TR><TD width="156"><P><EM>Executable Id</EM></P></TD><TD width="477"><P>o&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; aicore-sap</P><P>o&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; aws-bedrock</P><P>o&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; azure-openai</P><P>o&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gcp-vertexai</P></TD></TR><TR><TD width="156"><P><EM>Large Language Model Name</EM></P></TD><TD width="477"><P>It depends on the <EM>Executable Id</EM></P></TD></TR><TR><TD width="156"><P><EM>Large Language Model Version</EM></P></TD><TD width="477"><P>One option is to leave the version field free, then the latest version will be used. This helps to avoid issues in case that the model has been deprecated in AI Core<SPAN><BR /></SPAN>&nbsp;More info:&nbsp;<SPAN><A href="https://me.sap.com/notes/3437766" target="_blank" rel="noopener noreferrer">https://me.sap.com/notes/3437766</A></SPAN></P></TD></TR></TBODY></TABLE><P><SPAN>&nbsp;</SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Swathy_S_5-1765163757273.png" style="width: 627px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/349483i53F17BECA5FE852D/image-dimensions/627x312?v=v2" width="627" height="312" role="button" title="Swathy_S_5-1765163757273.png" alt="Swathy_S_5-1765163757273.png" /></span></P><P><SPAN>&nbsp;</SPAN><SPAN>4. Through the Prompt Library API, we can use predefined prompt templates to generate new&nbsp;prompts. Currently&nbsp;prompt templates are defined through ISLM.&nbsp;To&nbsp;get an instance of the prompt template you want to use, you need to provide the ISLM scenario and the ID of the prompt&nbsp;template. Click&nbsp;on <STRONG>Add</STRONG> and provide the following details:</SPAN><SPAN>&nbsp;<BR /><BR /></SPAN><STRONG><SPAN>Prompt Template Name:&nbsp;</SPAN></STRONG><SPAN>SYSTEM_PROMPT_ITIN</SPAN><SPAN>&nbsp;<BR /></SPAN><STRONG><SPAN>Prompt&nbsp;Template:&nbsp;</SPAN></STRONG><SPAN>System&nbsp;prompt for generating Itinerary</SPAN><SPAN>&nbsp;<BR /></SPAN><STRONG><SPAN>Prompt:</SPAN></STRONG><SPAN>&nbsp;</SPAN><SPAN>You are a professional travel planner. Create a&nbsp;</SPAN><STRONG><SPAN>{ISLM_days}&nbsp;</SPAN></STRONG><SPAN>day itinerary for a given destination, including daily highlights, must-visit&nbsp;spots&nbsp;and activities. Keep it under 1000 characters.</SPAN><SPAN>&nbsp;<BR /></SPAN><SPAN>&nbsp;<BR /></SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Swathy_S_0-1766724835633.png" style="width: 656px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/355642i3856831DBD7CD8A9/image-dimensions/656x250?v=v2" width="656" height="250" role="button" title="Swathy_S_0-1766724835633.png" alt="Swathy_S_0-1766724835633.png" /></span></P><P><SPAN>&nbsp;5.&nbsp;</SPAN><SPAN>The <STRONG>Prompt Parameters</STRONG> is&nbsp;captured from the prompt template&nbsp;after activation.</SPAN>&nbsp;<BR /><SPAN>&nbsp;<BR /></SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Swathy_S_1-1766724835634.png" style="width: 666px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/355643i589E0A109B01685A/image-dimensions/666x248?v=v2" width="666" height="248" role="button" title="Swathy_S_1-1766724835634.png" alt="Swathy_S_1-1766724835634.png" /></span></P><P>6. Add another prompt template for&nbsp;User prompt:<BR /><SPAN>&nbsp;<BR /></SPAN><STRONG><SPAN>Prompt Template Name:&nbsp;</SPAN></STRONG><SPAN>USER_PROMPT_ITIN</SPAN><SPAN>&nbsp;<BR /></SPAN><STRONG><SPAN>Prompt&nbsp;Template:&nbsp;</SPAN></STRONG><SPAN>User&nbsp;prompt&nbsp;template</SPAN><SPAN>&nbsp;<BR /></SPAN><STRONG><SPAN>Prompt:</SPAN></STRONG><SPAN>&nbsp;</SPAN><SPAN>Destination: {ISLM_destination} Departure: {ISLM_startingpoint} Travel Dates: {ISLM_startdate} to {ISLM_enddate}&nbsp; Mode of Transport:&nbsp;</SPAN><SPAN>{ISLM_transportmode} Accommodation Type: {ISLM_accommodationtype} Generate the itinerary now</SPAN><SPAN>&nbsp;<BR /></SPAN><SPAN>&nbsp;</SPAN><SPAN>&nbsp;<BR /></SPAN><SPAN>&nbsp;</SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Swathy_S_2-1766724835635.png" style="width: 651px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/355644i2BFB6CEE8EA7F1A1/image-dimensions/651x257?v=v2" width="651" height="257" role="button" title="Swathy_S_2-1766724835635.png" alt="Swathy_S_2-1766724835635.png" /></span></P><P>7. Activate the object<BR /><STRONG>⚠ WARNING</STRONG><SPAN> : Before you try the ABAP AI SDK out in an ABAP Class, please make sure that the deployment is running.</SPAN>&nbsp;&nbsp;</P><P><STRONG><SPAN>3.3 In Fiori Launchpad</SPAN></STRONG></P><P>To use the Intelligent Scenarios and Intelligent Scenario Management apps, you must have the appropriate access rights to the SAP Fiori Launchpad. The access for ISLM is added to the business role of an analytics specialist; <STRONG>BR_ANALYTICS_SPECIALIST. </STRONG><SPAN><BR /></SPAN><STRONG>&nbsp;</STRONG>You can create and manage ISLM Scenarios through Intelligent Scenario Management app.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Swathy_S_6-1765163757282.png" style="width: 492px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/349487i26F7E91D89270AA2/image-dimensions/492x235?v=v2" width="492" height="235" role="button" title="Swathy_S_6-1765163757282.png" alt="Swathy_S_6-1765163757282.png" /></span></P><P>You can check your previously created scenario in the <STRONG>Intelligent Scenario Management </STRONG>Fiori App.<SPAN><BR /></SPAN>In the next step instantiate ABAP AI SDK using the created ISLM Scenario<SPAN>&nbsp;</SPAN></P><P><STRONG><SPAN>3.4. Consume Intelligent Scenarios in ABAP</SPAN></STRONG></P><P><SPAN><STRONG><A href="https://help.sap.com/docs/abap-ai/generative-ai-in-abap-cloud/learn-9d5945155315417b9d9a4b76b9074870" target="_blank" rel="noopener noreferrer">ABAP AI SDK</A><BR /></STRONG>The ABAP AI SDK powered by Intelligent Scenario Lifecycle Management (ISLM) is an ABAP reuse library that supports you in interacting with large language models (LLMs) hosted on the generative AI hub in SAP AI Core. Using the ABAP AI SDK, you can build your own AI-based features in ABAP.</SPAN></P><P><SPAN><A href="https://help.sap.com/docs/abap-ai/generative-ai-in-abap-cloud/completion-api" target="_blank" rel="noopener noreferrer"><STRONG>Completion API</STRONG></A><BR />This API provides access to the completion API functionality of Large Language Models (LLMs), meaning that it uses an LLM to generate a text response from a prompt.<BR /><BR /></SPAN><STRONG><A href="https://help.sap.com/docs/abap-ai/generative-ai-in-abap-cloud/prompt-library-api" target="_blank" rel="noopener noreferrer">Prompt Library API</A><BR /></STRONG>Using the prompt library API, you can use prompt templates predefined via ISLM to generate new prompts.</P><P><A href="https://help.sap.com/docs/abap-ai/generative-ai-in-abap-cloud/catchable-exceptions" target="_blank" rel="noopener noreferrer"><STRONG>Catchable Exceptions</STRONG></A><BR />The execution of the completion API may cause an error, and therefore, <EM>CX_AIC_COMPLETION_API</EM> can be caught as a result. When the error is triggered by the LLM itself or by the AI service provider, <EM>CX_AIC_COMPLETION_API</EM> provides further information about the error.<BR /><BR />Add a determination to the Travel Business Object and enhance it with the ABAP AI SDK powered by ISLM. Define the determination <STRONG>generateAIItinerary</STRONG> in the behavior definition&nbsp;<STRONG>ZR_RAP_TRAVEL_DATA</STRONG> and implement it in the behavior implementation class, aka behavior pool&nbsp;<STRONG>Z</STRONG><STRONG>BP_R_RAP_TRAVEL_DATA</STRONG>.</P><P>1. Add the mandatory fields. Go to the&nbsp;<STRONG>Project Explorer</STRONG>&nbsp;and open your behaviour definition&nbsp;<STRONG>ZR_RAP_TRAVEL_DATA</STRONG>.</P><pre class="lia-code-sample language-abap"><code>field ( readonly ) TravelID, Status, AiBudgetBreakdown, AiItinerary, LocalCreatedBy, LocalCreatedAt, LocalLastChangedBy, LocalLastChangedAt, LastChangedAt; field ( mandatory : create ) TravelerName, EndDate, StartDate, Budget, AccommodationType, StartingPoint, TransportMode, Destination; determination generateAIItinerary on modify { create; }</code></pre><P>&nbsp;&nbsp;Define the <STRONG>generateAIItinerary</STRONG> determination:<BR /><STRONG><BR /></STRONG><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Swathy_S_10-1765163757290.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/349490iCA676CFDF3A00A53/image-size/medium?v=v2&amp;px=400" role="button" title="Swathy_S_10-1765163757290.png" alt="Swathy_S_10-1765163757290.png" /></span></P><OL><LI>Save and activate the changes in&nbsp;<STRONG>ZR_RAP_TRAVEL_DATA</STRONG>.</LI><LI>Declare the required method in the behavior implementation class&nbsp;<STRONG>ZBP_RAP_TRAVEL_DATA</STRONG> using ADT Quick Fix&nbsp;&nbsp;<EM>Ctrl/Cmd + 1</EM>.<BR /><BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Swathy_S_15-1765163757298.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/349497iA2EF4505BD6D7EA2/image-size/medium?v=v2&amp;px=400" role="button" title="Swathy_S_15-1765163757298.png" alt="Swathy_S_15-1765163757298.png" /></span>&nbsp;<span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Swathy_S_16-1765163757304.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/349495i343AC65C8EF36FFF/image-size/medium?v=v2&amp;px=400" role="button" title="Swathy_S_16-1765163757304.png" alt="Swathy_S_16-1765163757304.png" /></span><P>&nbsp;</P></LI><LI>Save and activate the changes in&nbsp;<STRONG>ZBP_R_RAP_TRAVEL_DATA</STRONG>.</LI><LI>Let's implement the determination <STRONG>generateAIItinerary</STRONG>. In your implementation class&nbsp;<STRONG>ZBP_R_RAP_TRAVEL_DATA</STRONG>, in <STRONG>generateAIItinerary</STRONG> method implementation.</LI><LI>Replace the following code. Your code should look like this:</LI></OL><pre class="lia-code-sample language-abap"><code> METHOD generateAIItinerary. LOOP AT keys INTO DATA(ls_key). READ ENTITIES OF zr_rap_travel_data IN LOCAL MODE ENTITY ZrRapTravelData FIELDS ( destination startdate enddate transportmode accommodationtype BudgetCurr ) WITH CORRESPONDING #( keys ) RESULT DATA(lt_travel). LOOP AT lt_travel INTO DATA(ls_travel). DATA(days) = ls_travel-enddate - ls_travel-startdate + 1. DATA(itinerary) = ``. DATA(budget) = ``. IF ls_travel-AiItinerary IS INITIAL OR ls_travel-AiBudgetBreakdown IS INITIAL. TRY. *Calling the Prompt Library API.Through the Prompt Library API, we can use predefined prompt templates to generate new prompts. FINAL(sys_prompt_template_instance) = cl_aic_islm_prompt_tpl_factory=&gt;get( )-&gt;create_instance( islm_scenario = 'ZINTS_RAP120' template_id = 'SYSTEM_PROMPT_ITIN' ). " Add a system prompt based on an ISLM prompt template with one parameter FINAL(sys_prompt) = sys_prompt_template_instance-&gt;get_prompt( parameters = VALUE #( ( name = 'ISLM_days' value = days ) ) ). " Add a user prompt based on an ISLM prompt template with parameters FINAL(user_prompt_template_instance) = cl_aic_islm_prompt_tpl_factory=&gt;get( )-&gt;create_instance( islm_scenario = 'ZINTS_RAP120' template_id = 'USER_PROMPT_ITIN' ). FINAL(user_prompt) = user_prompt_template_instance-&gt;get_prompt( parameters = VALUE #( ( name = 'ISLM_startdate' value = |{ ls_travel-startdate }| ) ( name = 'ISLM_enddate' value = |{ ls_travel-enddate }| ) ( name = 'ISLM_startingpoint' value = ls_travel-StartingPoint ) ( name = 'ISLM_destination' value = ls_travel-Destination ) ( name = 'ISLM_transportmode' value = ls_travel-transportMode ) ( name = 'ISLM_accommodationtype' value = ls_travel-accommodationtype ) ) ) . FINAL(api_itin) = cl_aic_islm_compl_api_factory=&gt;get( )-&gt;create_instance( islm_scenario = 'ZINTS_RAP120' ). *Set the LLM parameters FINAL(params) = api_itin-&gt;get_parameter_setter( ). params-&gt;set_maximum_tokens( 800 ). FINAL(msg_itin) = api_itin-&gt;create_message_container( ). msg_itin-&gt;set_system_role( sys_prompt ). msg_itin-&gt;add_user_message( user_prompt ). itinerary = api_itin-&gt;execute_for_messages( msg_itin )-&gt;get_completion( ). CATCH cx_aic_api_factory INTO DATA(lx_api_itin). itinerary = |AI instance creation failed for itinerary.|. CATCH cx_aic_completion_api INTO DATA(lx_comp_itin). itinerary = |AI completion call failed for itinerary.|. ENDTRY. IF itinerary IS NOT INITIAL. TRY. * To pass prompts directly without prompt parameters * Your ISLM scenario for itinerary DATA(system_prompt_budget) = |You are a travel finance advisor. Based on the Itenary , destination, duration, | &amp;&amp; |and total budget, estimate how much to allocate for travel, hotel, | &amp;&amp; |food, sightseeing, and miscellaneous expenses. Output under 500 characters.|. DATA(user_prompt_budget) = |Itenerary: { itinerary }| &amp;&amp; |Departure: { ls_travel-StartingPoint }| &amp;&amp; |Destination: { ls_travel-destination }| &amp;&amp; |\nTravel Dates: { ls_travel-startdate } to { ls_travel-enddate }| &amp;&amp; |\nTotal Budget: ₹{ ls_travel-Budget }| &amp;&amp; |\nTotal Budget Currency: ₹{ ls_travel-BudgetCurr }| &amp;&amp; |\nProvide a short, realistic breakdown.|. FINAL(api_budget) = cl_aic_islm_compl_api_factory=&gt;get( )-&gt;create_instance( islm_scenario = 'ZINTS_RAP120' ). " Your ISLM scenario for budget FINAL(msg_budget) = api_budget-&gt;create_message_container( ). msg_budget-&gt;set_system_role( system_prompt_budget ). msg_budget-&gt;add_user_message( user_prompt_budget ). budget = api_budget-&gt;execute_for_messages( msg_budget )-&gt;get_completion( ). CATCH cx_aic_api_factory INTO DATA(lx_api_budget). budget = |AI instance creation failed for budget.|. CATCH cx_aic_completion_api INTO DATA(lx_comp_budget). budget = |AI completion call failed for budget.|. ENDTRY. ENDIF. MODIFY ENTITIES OF zr_rap_travel_data IN LOCAL MODE ENTITY ZrRapTravelData UPDATE FIELDS ( aiitinerary aibudgetbreakdown status ) WITH VALUE #( ( %tky = ls_travel-%tky aiitinerary = itinerary aibudgetbreakdown = budget status = 'Generated' ) ). ENDIF. ENDLOOP. ENDLOOP. ENDMETHOD.</code></pre><OL><LI>Save and activate the changes in&nbsp;<EM>ZBP_R_RAP_TRAVEL_DATA</EM>.</LI><LI><SPAN>Preview and test the enhanced Travel Itinerary App with Generative AI Capabilities.</SPAN></LI></OL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Swathy_S_24-1765163757319.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/349506iEC934CA5E9004E75/image-size/large?v=v2&amp;px=999" role="button" title="Swathy_S_24-1765163757319.png" alt="Swathy_S_24-1765163757319.png" /></span></P><P>&nbsp;</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Swathy_S_25-1765163757335.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/349505iB8BA7F6EDA1D051A/image-size/large?v=v2&amp;px=999" role="button" title="Swathy_S_25-1765163757335.png" alt="Swathy_S_25-1765163757335.png" /></span></P><P>&nbsp;</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Swathy_S_26-1765163757351.png" style="width: 1004px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/349504i369FC24D9F5E102C/image-dimensions/1004x545?v=v2" width="1004" height="545" role="button" title="Swathy_S_26-1765163757351.png" alt="Swathy_S_26-1765163757351.png" /></span></P><P>&nbsp;</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Swathy_S_27-1765163757357.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/349507iF78911A7655C1FE4/image-size/large?v=v2&amp;px=999" role="button" title="Swathy_S_27-1765163757357.png" alt="Swathy_S_27-1765163757357.png" /></span></P><P>For the latest updates, subscribe to the blog posts below :&nbsp;</P><P><A href="https://community.sap.com/t5/enterprise-resource-planning-blog-posts-by-sap/abap-ai-chapter-2/ba-p/14210568" target="_blank">ABAP AI - Chapter 2 - SAP Community</A><BR /><A href="https://community.sap.com/t5/technology-blog-posts-by-sap/introducing-the-next-era-of-abap-development/ba-p/14260522" target="_blank">Introducing the Next Era of ABAP Development - SAP Community</A><BR /><A href="https://community.sap.com/t5/technology-blog-posts-by-sap/joule-speaks-abap/ba-p/14018226" target="_blank">Joule speaks ABAP! - SAP Community</A><BR /><A href="https://community.sap.com/t5/technology-blog-posts-by-sap/from-legacy-to-ai-powered-rise-transformation-revolution-with-joule-for/ba-p/14267448" target="_blank">From Legacy to AI-Powered: RISE Transformation Rev... - SAP Community</A></P><P>Happy Learning!<SPAN>&nbsp;</SPAN></P> 2026-01-23T08:05:00.042000+01:00 https://community.sap.com/t5/technology-blog-posts-by-sap/my-home-in-sap-btp-abap-environment/ba-p/14314918 My Home in SAP BTP ABAP Environment 2026-01-28T10:41:54.700000+01:00 LauraEiraElias https://community.sap.com/t5/user/viewprofilepage/user-id/793763 <P>Good news – My Home is finally available with SAP BTP ABAP environment!</P><P>My Home is your personalized entry page that provides you with easy access to the business insights and applications you need to do your job with greater speed and agility. My Home for SAP BTP ABAP Environment lets you access and manage your favorite pages, your favorite apps, and your insights on any device. It follows a modular approach to meet the needs of different roles and builds on the functionality of the SAP Fiori launchpad using <SPAN><A href="https://help.sap.com/docs/btp/sap-fiori-launchpad-for-sap-btp-abap-environment/spaces-and-pages" target="_self" rel="noopener noreferrer">spaces and pages</A></SPAN>.</P><H3 id="toc-hId-1917747692">&nbsp;</H3><H3 id="toc-hId-1721234187">New Look and Feel</H3><P><STRONG>My Home will be set as default for newly provisioned and existing systems as of SAP BTP ABAP Environment 2602.</STRONG> Accordingly, this soon changes the appearance of the SAP Fiori launchpad for every user. So, look forward to the new look and feel!</P><P><STRONG>However, the setting to disable My Home will still be available for administrators until the release upgrade SAP BTP ABAP environment 2608. Then, My Home will be the one and only entry page within SAP BTP ABAP environment.</STRONG></P><P><STRONG><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="My Home in SAP BTP ABAP environment" style="width: 873px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/365264iFA42766B899B2563/image-size/large?v=v2&amp;px=999" role="button" title="My Home.png" alt="My Home in SAP BTP ABAP environment" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">My Home in SAP BTP ABAP environment</span></span></STRONG></P><P>&nbsp;</P><H4 id="toc-hId-1653803401">&nbsp;</H4><H4 id="toc-hId-1457289896">My Home Sections</H4><P>My Home is divided into different sections. You can view your <STRONG>News</STRONG>, <STRONG>Pages</STRONG>, <STRONG>Apps</STRONG>, <STRONG>Insights Tiles</STRONG>, and <STRONG>Insights Cards</STRONG> on this page.</P><H4 id="toc-hId-1260776391">&nbsp;</H4><H4 id="toc-hId-1064262886">News</H4><P>The News section keeps you updated on your company's latest news, or SAP BTP ABAP environment system news.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="News section on My Home entry page" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/365266i1894F76DC213F66E/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="News.png" alt="News section on My Home entry page" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">News section on My Home entry page</span></span></P><P>&nbsp;</P><H4 id="toc-hId-867749381">Pages</H4><P>The Pages section provides you with quick access to your favorite or most used pages. You can manage the visibility of your pages and order them in a way that enhances your productivity.&nbsp;&nbsp;</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Pages section on My Home entry page" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/365267i4B9ECD9C88714D2B/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="Pages.png" alt="Pages section on My Home entry page" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Pages section on My Home entry page</span></span></P><H4 id="toc-hId-671235876">&nbsp;</H4><H4 id="toc-hId-474722371">Apps</H4><P>The Apps section provides easy access to your favorite, most used, recently used, and recommended applications. The Apps section improves the discoverability of your applications. The <STRONG>Recommended</STRONG> tab offers app suggestions using SAP Business AI, based on your user-specific role assignment. You can add apps to the <STRONG>Favorites</STRONG> tab from your most used, recently used, and recommended applications. You can organize and categorize your favorite applications by using the grouping, ordering and color-coding functionality so you can access them even more efficiently.&nbsp;</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Apps section on My Home entry page" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/365268i87787047F533C3AA/image-size/large?v=v2&amp;px=999" role="button" title="Apps.png" alt="Apps section on My Home entry page" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Apps section on My Home entry page</span></span></P><P>&nbsp;</P><H4 id="toc-hId-278208866">Insights Tiles and Insights Cards</H4><P>The Insights section allows you to manage and monitor your company’s activities. It shows critical business information through KPIs and micro charts. This section is broken into two sections: <STRONG>Insights Tiles</STRONG> and <STRONG>Insights Cards</STRONG>.&nbsp;Insights cards and tiles display dynamic content at a glance. They provide quick and easy access to the applications that can provide more detailed information.</P><P>Insights tiles offer analytical information, such as charts or KPIs. Insights cards are similar to Insights tiles but provide more detailed analytical information in the form of charts, tables or lists from supporting overview page-, list report-, and analytical list page-based applications. Thanks to this information, you can assess what is happening at any time and take action when needed.&nbsp;You can customize the Insights section to display information that enables you to do your job with speed and agility.&nbsp;</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Insights section on My Home entry page" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/365270i6A352999FB17DADD/image-size/large?v=v2&amp;px=999" role="button" title="Tiles and Cards.png" alt="Insights section on My Home entry page" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Insights section on My Home entry page</span></span></P><P>&nbsp;</P><H3 id="toc-hId--122618727">Make it Mine – Personalize My Home to Your Needs</H3><P>Following the “Make it Mine” approach, you can personalize the entry page to hide or display specific sections as well as the content maintained within these sections. Another key feature is the ability to customize the layout of these sections. This personalization capability allows you to prioritize the information that is most important to you.&nbsp;</P><P>To personalize the entry page to your needs, choose <STRONG>My Home Settings</STRONG> from the dropdown menu of the respective sections. Here, you can customize the layout and configure the respective sections.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="My Home Settings" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/365271iA68D69E3C590E099/image-size/large?v=v2&amp;px=999" role="button" title="My Home Settings.png" alt="My Home Settings" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">My Home Settings</span></span></P><P>&nbsp;</P><P>We hope you enjoy working with&nbsp;My Home&nbsp;in SAP BTP ABAP environment and reap its benefits. You can&nbsp;look forward to more enhancements that will improve your My Home experience even further in future releases. Stay tuned for more updates!</P> 2026-01-28T10:41:54.700000+01:00 https://community.sap.com/t5/technology-blog-posts-by-sap/removal-of-business-groups-in-sap-btp-abap-environment-switching-to-spaces/ba-p/14316689 Removal of Business Groups in SAP BTP ABAP Environment: Switching to Spaces and Pages 2026-01-28T11:58:43.178000+01:00 LauraEiraElias https://community.sap.com/t5/user/viewprofilepage/user-id/793763 <P>Recently, we announced <A href="https://community.sap.com/t5/technology-blog-posts-by-sap/my-home-in-sap-btp-abap-environment/ba-p/14314918" target="_self">My Home in SAP BTP ABAP environment.</A><BR />My Home is your personalized entry page that provides you with easy access to the business insights and applications you need to do your job with greater speed and agility.</P><P>As a prerequisite for My Home, SAP Fiori launchpad spaces and pages need to be enabled.<BR />The spaces mode was developed to offer more flexibility to influence the launchpad layout for specific user groups. Pages are assigned to users via spaces that are assigned to business roles. The business role defines which users see a specific space. By defining pages with meaningful sections, you can define in which order the apps are sorted on the page.</P><P>&nbsp;</P><H3 id="toc-hId-1917804609">Switching to Spaces and Pages</H3><P>Spaces and pages have been announced as the standard layout approach for structuring content in the SAP Fiori launchpad with SAP BTP ABAP environment 2302.<BR />Consequently, <STRONG>the classic Fiori launchpad home page with business groups will be removed gradually until 2608 in favor of SAP Fiori launchpad spaces and pages. </STRONG></P><P>Luckily, this is no news: The transition is going on for quite some time now, as spaces and pages are already the default in newly provisioned systems for several years.&nbsp;<BR /><STRONG>The removal of groups will affect newly provisioned systems at first with 2602. Later, with 2605, the switch will take place for existing systems as well.</STRONG></P><P>This means in detail:</P><UL><LI>With 2602, it is no longer possible to switch between spaces and pages and the classic Fiori launchpad home page with groups in newly provisioned systems.</LI><LI>With 2605, spaces and pages will be the default in existing systems as well. The option to switch to the classic home page with groups will still be available for end users if the administrator has enabled it in the Manage Launchpad Settings app.</LI><LI>With 2608, the option to switch to the classic FLP home page will be removed completely in production systems.</LI></UL><P>&nbsp;</P><H3 id="toc-hId-1721291104"><STRONG>How to Prepare for the Transition</STRONG></H3><P>Good news: The transition is straightforward, but there are a few important points to note. Until now, users couldn’t create their own groups in the SAP BTP ABAP environment. They relied on SAP-delivered groups and personalized them by adding, removing, or renaming tiles.</P><P>SAP provides predefined spaces and pages with similarly structured content. SAP-delivered groups will be switched to these predefined spaces and pages. <STRONG>Important: user-level personalizations made to the previous groups will not be carried over and will be lost due to the switch. You will need to recreate personal adjustments after the transition.</STRONG></P><P>To be as well prepared as possible, we recommend administrator to enable the switch to spaces and pages now to remain productive after the transition.</P><P>Here are our best practices for end users:</P><UL><LI>Plan the switch carefully and identify which adjustments are important to you.</LI><LI>Document your existing personalizations so you can rebuild them in spaces and pages.</LI><LI>Use SAP’s predefined spaces and pages as a starting point and tailor them to your workflow.</LI></UL><P>&nbsp;</P><H3 id="toc-hId-1524777599"><STRONG>For Administrators: Summary of the Upcoming Changes</STRONG></H3><P>As part of the mentioned transition to spaces and pages, SAP will change the SAP Fiori launchpad settings in the <EM>Manage Launchpad Settings</EM> app for administrators accordingly over the next release upgrades:</P><P><STRONG>With SAP BTP ABAP environment 2602:</STRONG></P><UL><LI><P>The parameter <FONT face="andale mono,times">SPACES</FONT> is removed in newly provisioned systems.</P></LI><LI>The parameter <FONT face="andale mono,times">SPACES_ENABLE_USER</FONT> is removed in newly provisioned systems.</LI><LI>The parameter <FONT face="andale mono,times">SPACES_CUSTOM_HOME</FONT> is true (ON) as default for all existing and newly provisioned systems. The setting to disable My Home is still available. Since spaces and pages need to be enabled as a prerequisite for My Home, this needs to be manually activated for existing systems.</LI></UL><P><STRONG>With SAP BTP ABAP environment 2605:</STRONG></P><UL><LI>The parameter <FONT face="andale mono,times">SPACES</FONT> is true (ON) as default in existing systems.</LI><LI>The parameter <FONT face="andale mono,times">SPACES_ENABLE_USER</FONT> is false (OFF) as default in existing systems. The settings to enable switching between the classic FLP homepage and the spaces and pages layout is still available.</LI></UL><P><STRONG>With SAP BTP ABAP environment 2608:</STRONG></P><UL><LI>The parameter <FONT face="andale mono,times">SPACES</FONT> is removed.</LI><LI>The parameter <FONT face="andale mono,times">SPACES_ENABLE_USER</FONT> is removed.</LI><LI>The parameter <FONT face="andale mono,times">SPACES_CUSTOM_HOME</FONT> is removed.</LI></UL><P><SPAN>&nbsp;</SPAN></P><P>Ultimately, there will be no option to switch back to groups or to enable toggling between spaces and pages and groups after the SAP BTP ABAP environment 2608 release upgrade. You must complete the transition to spaces and pages before the final, irreversible switch in production systems with the 2608 release upgrade.</P><P>We therefore invite all customers to begin transitioning now and proactively embrace this change.</P> 2026-01-28T11:58:43.178000+01:00 https://community.sap.com/t5/sap-codejam-blog-posts/sap-codejam-roadshow-2026-brazil-edition-kicking-off-in-march-and/ba-p/14317926 SAP CodeJam Roadshow 2026 - Brazil edition 🇧🇷 (Kicking off in March and continuing in April) 2026-01-30T12:35:15.511000+01:00 ajmaradiaga https://community.sap.com/t5/user/viewprofilepage/user-id/107 <P>Oi SAP Developers!</P><P data-unlink="true">I've got some exciting news to share with you. The SAP CodeJam roadshow is coming back to Latin America! This time,&nbsp; we will do a special edition in Brazil.&nbsp; We will have many stops on the roadshow starting the 1st week of March, doing CodeJams as part of SAP Inside Tracks, organised by local community members, and then continuing&nbsp; in April. Also, we'll organise a couple of meet-ups as we've done in previous year. :-).</P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;"><STRONG><EM><FONT color="#3366FF">Keep an eye on this blog post as more events will be announced as part of the roadshow shortly</FONT></EM></STRONG></P><H3 id="toc-hId-1917837094"><STRONG><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="brazil-roadshow-map.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/370537i3BD0309CC0223DBA/image-size/medium/is-moderation-mode/true?v=v2&amp;px=400" role="button" title="brazil-roadshow-map.png" alt="brazil-roadshow-map.png" /></span></STRONG></H3><P>&nbsp;</P><H3 id="toc-hId-1721323589"><STRONG>SAP CodeJam events and meetups part of the roadshow (Register Now!)</STRONG></H3><P>Below is a listing of the SAP CodeJam events and quedadas (meetups) on the roadshow schedule:</P><TABLE width="705px"><TBODY><TR><TD width="157px" height="50px"><P><STRONG>Dates</STRONG></P></TD><TD width="243px" height="50px"><P><STRONG>CodeJam topic</STRONG></P></TD><TD width="201px" height="50px"><P><STRONG>Location</STRONG></P></TD><TD width="104px" height="50px"><P><STRONG>Registration<BR /></STRONG></P></TD></TR><TR><TD width="157px" height="77px">2 Mar</TD><TD width="243px" height="77px"><P>Build AI services using the CAP and Generative AI Hub</P></TD><TD width="201px" height="77px"><P>Campinas, Brazil <span class="lia-unicode-emoji" title=":brazil:">🇧🇷</span></P></TD><TD width="104px" height="77px"><P><A href="https://community.sap.com/t5/sap-codejam/build-ai-services-using-the-cap-and-generative-ai-hub-campinas-brazil/ev-p/14317691" target="_blank">Link</A></P></TD></TR><TR><TD width="157px" height="97px">3 Mar</TD><TD width="243px" height="97px"><P>Joule Studio: Create Joule Skills and Agents Without Coding</P></TD><TD width="201px" height="97px"><P>São Paulo, Brazil <span class="lia-unicode-emoji" title=":brazil:">🇧🇷</span></P><P><span class="lia-unicode-emoji" title=":brazil:">🇧🇷</span></P></TD><TD width="104px" height="97px"><P><A href="https://community.sap.com/t5/sap-codejam/joule-studio-create-joule-skills-and-agents-without-coding-s%C3%A3o-paulo-brazil/ev-p/14317678" target="_blank">Link</A></P></TD></TR><TR><TD width="157px" height="97px">3 Mar</TD><TD width="243px" height="97px"><P><EM><FONT color="#3366FF">São Paulo meetup</FONT></EM></P></TD><TD width="201px" height="97px"><P>São Paulo, Brazil&nbsp;<span class="lia-unicode-emoji" title=":brazil:">🇧🇷</span></P></TD><TD width="104px" height="97px"><P><A href="https://community.sap.com/t5/s%C3%A3o-paulo-events/meet-up-s%C3%A3o-paulo-2026-03-03-brazilroadshow2026/ec-p/14319322#M38" target="_self">Link</A></P></TD></TR><TR><TD width="157px" height="77px"><P>4 Mar</P></TD><TD width="243px" height="77px"><P>SAP Build: Create Event-Based Processes</P></TD><TD width="201px" height="77px"><P>São Paulo, Brazil <span class="lia-unicode-emoji" title=":brazil:">🇧🇷</span></P></TD><TD width="104px" height="77px"><P><A href="https://community.sap.com/t5/sap-codejam/sap-build-create-event-based-processes-s%C3%A3o-paulo-brazil/ev-p/14317705" target="_blank">Link</A></P></TD></TR><TR><TD width="157px" height="97px"><P>5 Mar</P></TD><TD width="243px" height="97px"><P>Getting started with Generative AI Hub on SAP AI Core</P></TD><TD width="201px" height="97px"><P>Rio de Janeiro, Brazil <span class="lia-unicode-emoji" title=":brazil:">🇧🇷</span></P></TD><TD width="104px" height="97px"><P><A href="https://community.sap.com/t5/sap-codejam/getting-started-with-generative-ai-hub-on-sap-ai-core-rio-de-janeiro-brazil/ev-p/14317716" target="_blank">Link</A></P></TD></TR><TR><TD width="157px" height="77px"><P>13 Mar</P></TD><TD width="243px" height="77px"><P>Getting started with Generative AI Hub on SAP AI Core</P></TD><TD width="201px" height="77px">Joinville, Brazil <span class="lia-unicode-emoji" title=":brazil:">🇧🇷</span></TD><TD width="104px" height="77px"><P><A href="https://community.sap.com/t5/sap-codejam/getting-started-with-generative-ai-hub-on-sap-ai-core-joinville-brazil/ev-p/14322316" target="_self">Link</A></P></TD></TR><TR><TD width="157px"><P>14 Mar</P></TD><TD width="243px"><P>SAP Inside Track - Joinville</P></TD><TD width="201px"><P>Joinville, Brazil <span class="lia-unicode-emoji" title=":brazil:">🇧🇷</span></P></TD><TD width="104px"><P><A href="https://community.sap.com/t5/joinville-events/eb-p/joinvilleoccasion-board" target="_self">Link</A></P></TD></TR><TR><TD width="157px" height="77px"><P>20 Mar</P></TD><TD width="243px" height="77px"><P>Getting started with Generative AI Hub on SAP AI Core</P></TD><TD width="201px" height="77px">Belo Horizonte, Brazil <span class="lia-unicode-emoji" title=":brazil:">🇧🇷</span></TD><TD width="104px" height="77px"><P><A href="https://community.sap.com/t5/sap-codejam/getting-started-with-generative-ai-hub-on-sap-ai-core-belo-horizonte-brazil/ev-p/14322967" target="_self">Link</A></P></TD></TR><TR><TD width="157px" height="77px"><P>21 Mar</P></TD><TD width="243px" height="77px"><P>SAP Inside Track - Belo Horizonte</P></TD><TD width="201px" height="77px">Belo Horizonte, Brazil <span class="lia-unicode-emoji" title=":brazil:">🇧🇷</span></TD><TD width="104px" height="77px"><P><A href="https://community.sap.com/t5/belo-horizonte-events/sap-inside-track-belo-horizonte-21-mar%C3%A7o-de-2026/ev-p/14317172" target="_self">Link</A></P></TD></TR><TR><TD width="157px"><P>6 Apr</P></TD><TD width="243px"><P>Combine SAP CAP with SAP HANA Cloud to Create Full-Stack App</P></TD><TD width="201px" height="97px"><P>São Paulo, Brazil <span class="lia-unicode-emoji" title=":brazil:">🇧🇷</span></P></TD><TD width="104px" height="97px"><P><A href="https://community.sap.com/t5/sap-codejam/combine-sap-cap-with-sap-hana-cloud-to-create-full-stack-app-s%C3%A3o-paulo/ev-p/14322980" target="_self">Link</A></P></TD></TR><TR><TD width="157px"><P>7 Apr</P></TD><TD width="243px"><P>ABAP AI: Capabilities in SAP Joule for Developers CodeJam</P></TD><TD width="201px" height="77px"><P>São Paulo, Brazil <span class="lia-unicode-emoji" title=":brazil:">🇧🇷</span></P></TD><TD width="104px" height="77px"><P><A href="https://community.sap.com/t5/sap-codejam/abap-ai-capabilities-in-sap-joule-for-developers-codejam-s%C3%A3o-paulo-brazil/ev-p/14322983" target="_blank">Link</A></P></TD></TR><TR><TD width="157px"><P>8 Apr</P></TD><TD width="243px"><P><SPAN>ABAP AI: Capabilities in SAP Joule for Developers CodeJam</SPAN></P></TD><TD width="201px">Londrina, Brazil <span class="lia-unicode-emoji" title=":brazil:">🇧🇷</span></TD><TD width="104px"><P><A href="https://community.sap.com/t5/sap-codejam/abap-ai-capabilities-in-sap-joule-for-developers-codejam-londrina-brazil/ec-p/14324622#M1084" target="_self">Link</A></P></TD></TR><TR><TD width="157px" height="77px"><P>10 Apr</P></TD><TD width="243px" height="77px"><P>Getting started with Generative AI Hub on SAP AI Core</P></TD><TD width="201px" height="77px">Curitiba, Brazil <span class="lia-unicode-emoji" title=":brazil:">🇧🇷</span></TD><TD width="104px" height="77px"><P><A href="https://community.sap.com/t5/sap-codejam/getting-started-with-generative-ai-hub-on-sap-ai-core-curitiba-brazil/ev-p/14322976" target="_self">Link</A></P></TD></TR><TR><TD><P>10 Apr</P></TD><TD><P>SAP HANA Cloud for AI Applications: ML, Vectors, and Knowledge Graphs</P></TD><TD><P>Ribeirão Preto, Brazil <span class="lia-unicode-emoji" title=":brazil:">🇧🇷</span></P></TD><TD><P><A href="https://community.sap.com/t5/sap-codejam/sap-hana-cloud-for-ai-applications-ml-vectors-and-knowledge-graphs-ribeir%C3%A3o/ev-p/14330764" target="_self">Link</A></P></TD></TR><TR><TD width="157px" height="77px"><P>13 Apr</P></TD><TD width="243px" height="77px"><P>SAP HANA Cloud for AI Applications: ML, Vectors, and Knowledge Graphs</P></TD><TD width="201px" height="77px">São Leopoldo, Brazil <span class="lia-unicode-emoji" title=":brazil:">🇧🇷</span></TD><TD width="104px"><P><A href="https://community.sap.com/t5/sap-codejam/sap-hana-cloud-for-ai-applications-ml-vectors-and-knowledge-graphs-s%C3%A3o/ev-p/14330771" target="_self">Link</A></P></TD></TR><TR><TD width="157px" height="77px"><P>14 Apr</P></TD><TD width="243px" height="77px"><P>Build code-based AI Agents on SAP BTP</P></TD><TD width="201px" height="77px">São Leopoldo, Brazil&nbsp;<span class="lia-unicode-emoji" title=":brazil:">🇧🇷</span></TD><TD width="104px"><P><A href="https://community.sap.com/t5/sap-codejam/build-code-based-ai-agents-on-sap-business-technology-platform-s%C3%A3o-leopoldo/ev-p/14330791" target="_self">Link</A></P></TD></TR><TR><TD width="157px" height="77px"><P>16 Apr</P></TD><TD width="243px" height="77px"><P>SAP HANA Cloud for AI Applications: ML, Vectors, and Knowledge Graphs</P></TD><TD width="201px" height="77px">Recife, Brazil <span class="lia-unicode-emoji" title=":brazil:">🇧🇷</span></TD><TD width="104px"><P><A href="https://community.sap.com/t5/sap-codejam/sap-hana-cloud-for-ai-applications-ml-vectors-and-knowledge-graphs-recife/ev-p/14330773" target="_self">Link</A></P></TD></TR><TR><TD width="157px" height="77px"><P>17 Apr</P></TD><TD width="243px" height="77px"><P>Build code-based AI Agents on SAP BTP</P></TD><TD width="201px" height="77px">Recife, Brazil <span class="lia-unicode-emoji" title=":brazil:">🇧🇷</span></TD><TD width="104px"><P><A href="https://community.sap.com/t5/sap-codejam/build-code-based-ai-agents-on-sap-business-technology-platform-recife/ev-p/14330796" target="_self">Link</A></P></TD></TR></TBODY></TABLE><P>Make sure to register to secure your place. It is likely that the places available will go fast.</P><P>What if the CodeJam topics do not cover the SAP technology that you focus on? We've organised additional local meetups just to get together and have a chat. See you all somewhere in Brazil on the roadshow!</P> 2026-01-30T12:35:15.511000+01:00 https://community.sap.com/t5/technology-blog-posts-by-members/updating-records-using-dialog-box-in-rap/ba-p/14318971 Updating records using Dialog Box in RAP 2026-02-03T07:30:32.746000+01:00 Faizan_khan1 https://community.sap.com/t5/user/viewprofilepage/user-id/1451076 <P><SPAN><STRONG><SPAN class=""><SPAN class="">Description :</SPAN></SPAN></STRONG>&nbsp;In this blog, we implement a RAP-based solution to&nbsp;</SPAN><STRONG><SPAN>update existing records using a Dialog Box (popup)</SPAN></STRONG><SPAN>&nbsp;instead of navigating to a separate page.</SPAN><SPAN>&nbsp;</SPAN></P><P><SPAN>In&nbsp;this&nbsp;&nbsp;scenario&nbsp;user&nbsp;&nbsp;need&nbsp;to update the records in list page itself instead of going of going to object page using a dialog box in RAP application</SPAN></P><P><SPAN><STRONG><SPAN class=""><SPAN class="">Step&nbsp;</SPAN><SPAN class="">1 :</SPAN><SPAN class="">&nbsp;Create a Data base table&nbsp;</SPAN></SPAN></STRONG><SPAN class="">&nbsp;</SPAN></SPAN></P><pre class="lia-code-sample language-abap"><code>@EndUserText.label : 'DB table for Numbering' @AbapCatalog.enhancement.category : #NOT_EXTENSIBLE @AbapCatalog.tableCategory : #TRANSPARENT @AbapCatalog.deliveryClass : #A @AbapCatalog.dataMaintenance : #RESTRICTED define table zfa_dt_num { key managed_num : sysuuid_x16 not null; key unmanged_id : char10 not null; name : char10; age : char2; attendance_status : char10; lastchangedat : abp_locinst_lastchange_tstmpl; } </code></pre><P>&nbsp;</P><P><STRONG><SPAN class=""><SPAN class="">Step</SPAN><SPAN class="">2 :</SPAN><SPAN class="">&nbsp;create&nbsp;</SPAN><SPAN class="">a</SPAN><SPAN class="">&nbsp;interface view and projection view upon data base&nbsp;</SPAN></SPAN><SPAN class="">&nbsp;</SPAN></STRONG></P><P><STRONG><SPAN class="">Interface View</SPAN></STRONG></P><pre class="lia-code-sample language-abap"><code>@AbapCatalog.viewEnhancementCategory: [#NONE] @AccessControl.authorizationCheck: #NOT_REQUIRED @EndUserText.label: 'interface view for numbering' @Metadata.ignorePropagatedAnnotations: true define root view entity zi_zfa_num as select from zfa_dt_num { key managed_num as ManagedNum, key unmanged_id as UnmangedId, name as Name, age as Age, attendance_status as AttendanceStatus, @Semantics.systemDateTime.localInstanceLastChangedAt: true lastchangedat as LastChangeAt } </code></pre><P><STRONG>Projection View</STRONG></P><pre class="lia-code-sample language-abap"><code>@AccessControl.authorizationCheck: #NOT_REQUIRED @EndUserText.label: 'Projection view num' @Metadata.ignorePropagatedAnnotations: true @Metadata.allowExtensions: true define root view entity zc_zfa_num as projection on zi_zfa_num { key ManagedNum, key UnmangedId, Name, Age, AttendanceStatus, @Semantics.systemDateTime.localInstanceLastChangedAt: true LastChangeAt </code></pre><P><STRONG><SPAN class=""><SPAN class="">Step</SPAN><SPAN class="">3 :</SPAN><SPAN class="">&nbsp;create a behavior definition for both interface view and projection view&nbsp;</SPAN></SPAN><SPAN class="">&nbsp;</SPAN></STRONG></P><P><STRONG><SPAN class="">Interface View Behavior definition&nbsp;</SPAN></STRONG></P><pre class="lia-code-sample language-abap"><code>managed implementation in class zbp_i_zfa_num unique; strict ( 2 ); define behavior for zi_zfa_num //alias &lt;alias_name&gt; persistent table zfa_dt_num lock master authorization master ( instance ) etag master LastChangeAt late numbering { action Updateatt parameter za_zfa_num result[1] $self; create ( authorization : global ); update; delete; field ( readonly ) ManagedNum , UnmangedId; mapping for zfa_dt_num{ ManagedNum = managed_num; UnmangedId = unmanged_id; Name = name; Age = age; AttendanceStatus = attendance_status; LastChangeAt = lastchangedat; } } </code></pre><P><STRONG>Projection view Behavior defination</STRONG></P><pre class="lia-code-sample language-abap"><code>projection; strict ( 2 ); define behavior for zc_zfa_num //alias &lt;alias_name&gt; use etag { use create; use delete; use action Updateatt; } </code></pre><P><SPAN class=""><STRONG><SPAN class="">Step</SPAN><SPAN class="">4 :</SPAN><SPAN class="">&nbsp;implement the&nbsp;</SPAN><SPAN class="">behavior</SPAN></STRONG><SPAN class=""><STRONG>&nbsp;pool class</STRONG>&nbsp;</SPAN></SPAN><SPAN class="">&nbsp;</SPAN></P><pre class="lia-code-sample language-abap"><code>CLASS lhc_zi_zfa_num DEFINITION INHERITING FROM cl_abap_behavior_handler. PRIVATE SECTION. METHODS get_instance_authorizations FOR INSTANCE AUTHORIZATION IMPORTING keys REQUEST requested_authorizations FOR zi_zfa_num RESULT result. METHODS get_global_authorizations FOR GLOBAL AUTHORIZATION IMPORTING REQUEST requested_authorizations FOR zi_zfa_num RESULT result. METHODS updateatt FOR MODIFY IMPORTING keys FOR ACTION zi_zfa_num~updateatt RESULT result. ENDCLASS. CLASS lhc_zi_zfa_num IMPLEMENTATION. METHOD get_instance_authorizations. ENDMETHOD. METHOD get_global_authorizations. ENDMETHOD. METHOD Updateatt. data(lt_keys) = keys. read eNTITIES OF zi_zfa_num in LOCAL MODE ENTITY zi_zfa_num fiELDS ( AttendanceStatus Name Age ) wiTH corRESPONDING #( keys ) reSULT data(lt_res). data(lv_new_status) = lt_keys[ 1 ]-%param-attendance_status. data(lv_new_Name) = lt_keys[ 1 ]-%param-name. data(lv_new_age) = lt_keys[ 1 ]-%param-age. modIFY enTITIES OF zi_zfa_num in LOCAL MODE entity zi_zfa_num uPDATE fiELDS ( AttendanceStatus Name Age ) wITH vaLUE #( ( %tky = lt_res[ 1 ]-%tky AttendanceStatus = lv_new_status Name = lv_new_name age = lv_new_age ) ). read eNTITIES OF zi_zfa_num in LOCAL MODE ENTITY zi_zfa_num all fiELDS wiTH corRESPONDING #( keys ) reSULT data(lt_res1). result = value #( for &lt;lfs_num&gt; in lt_res1 ( %tky = &lt;lfs_num&gt;-%tky %param = &lt;lfs_num&gt; ) ). ENDMETHOD. ENDCLASS. CLASS lsc_ZI_ZFA_NUM DEFINITION INHERITING FROM cl_abap_behavior_saver. PROTECTED SECTION. METHODS adjust_numbers REDEFINITION. METHODS cleanup_finalize REDEFINITION. ENDCLASS. CLASS lsc_ZI_ZFA_NUM IMPLEMENTATION. METHOD adjust_numbers. DATA(lt_managedid) = cl_uuid_factory=&gt;create_system_uuid( )-&gt;create_uuid_x16( ). SELECT MAX( unmanged_id ) FROM zfa_dt_num INTO (lv_num). IF sy-subrc = 0. lv_num += 1 . ELSE. lv_num = 000000001 . ENDIF. LOOP AT mapped-zi_zfa_num REFERENCE INTO DATA(ls_num). ls_num-&gt;ManagedNum = lt_managedid. ls_num-&gt;UnmangedId = lv_num. ENDLOOP. ENDMETHOD. METHOD cleanup_finalize. ENDMETHOD. ENDCLASS. </code></pre><P><STRONG><SPAN class=""><SPAN class="">Step&nbsp;</SPAN><SPAN class="">5 :</SPAN><SPAN class="">&nbsp;For achieving the Dialog box we&nbsp;</SPAN><SPAN class="">have to</SPAN><SPAN class="">&nbsp;make use of&nbsp;</SPAN><SPAN class="">a</SPAN><SPAN class="">&nbsp;a</SPAN><SPAN class="">bstract&nbsp;</SPAN><SPAN class="">entity ,</SPAN><SPAN class="">&nbsp; in this abstract entity declare the fields which you&nbsp;</SPAN><SPAN class="">have to</SPAN><SPAN class="">&nbsp;update&nbsp;</SPAN></SPAN></STRONG><SPAN class="">&nbsp;</SPAN></P><pre class="lia-code-sample language-abap"><code>@EndUserText.label: 'Abstract entity for numbering' @Metadata.allowExtensions: true define abstract entity za_zfa_num // with parameters parameter_name : parameter_type { name : char10; age : char2; attendance_status : char10; } </code></pre><P><STRONG><SPAN class="">Step&nbsp;</SPAN><SPAN class="">6 :</SPAN><SPAN class="">&nbsp;create a&nbsp;</SPAN><SPAN class="">metadata</SPAN><SPAN class="">&nbsp;for this abstract entity</SPAN></STRONG></P><pre class="lia-code-sample language-abap"><code>@Metadata.layer: #CORE annotate entity za_zfa_num with { @EndUserText.label: ' Update Name' name; @EndUserText.label: ' Update Age' age; @EndUserText.label: 'Set Student Status' attendance_status; } </code></pre><P><STRONG><SPAN class=""><SPAN class="">Step</SPAN><SPAN class="">7 :</SPAN><SPAN class="">&nbsp;now for displaying the popup we&nbsp;</SPAN><SPAN class="">have to</SPAN><SPAN class="">&nbsp;make use of custom&nbsp;</SPAN><SPAN class="">actions ,</SPAN><SPAN class="">&nbsp; declare&nbsp;</SPAN><SPAN class="">a</SPAN><SPAN class="">&nbsp;actions with&nbsp;</SPAN><SPAN class="">parameters ,</SPAN><SPAN class="">&nbsp;in parameter give the abstract ent</SPAN><SPAN class="">ity name&nbsp;</SPAN></SPAN><SPAN class="">&nbsp;</SPAN></STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Faizan_khan1_0-1769852117176.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/367577iA2AB9F15AE056BD3/image-size/large?v=v2&amp;px=999" role="button" title="Faizan_khan1_0-1769852117176.png" alt="Faizan_khan1_0-1769852117176.png" /></span></P><P><SPAN class=""><STRONG><SPAN class="">Step</SPAN><SPAN class="">8 :</SPAN><SPAN class="">&nbsp;now implement the logic for updating the records in&nbsp;</SPAN></STRONG><SPAN class=""><STRONG>action method</STRONG>&nbsp;</SPAN></SPAN><SPAN class="">&nbsp;</SPAN></P><pre class="lia-code-sample language-abap"><code>METHOD Updateatt. data(lt_keys) = keys. read eNTITIES OF zi_zfa_num in LOCAL MODE ENTITY zi_zfa_num fiELDS ( AttendanceStatus Name Age ) wiTH corRESPONDING #( keys ) reSULT data(lt_res). data(lv_new_status) = lt_keys[ 1 ]-%param-attendance_status. data(lv_new_Name) = lt_keys[ 1 ]-%param-name. data(lv_new_age) = lt_keys[ 1 ]-%param-age. modIFY enTITIES OF zi_zfa_num in LOCAL MODE entity zi_zfa_num uPDATE fiELDS ( AttendanceStatus Name Age ) wITH vaLUE #( ( %tky = lt_res[ 1 ]-%tky AttendanceStatus = lv_new_status Name = lv_new_name age = lv_new_age ) ). read eNTITIES OF zi_zfa_num in LOCAL MODE ENTITY zi_zfa_num all fiELDS wiTH corRESPONDING #( keys ) reSULT data(lt_res1). result = value #( for &lt;lfs_num&gt; in lt_res1 ( %tky = &lt;lfs_num&gt;-%tky %param = &lt;lfs_num&gt; ) ). ENDMETHOD. </code></pre><P><STRONG><SPAN class="">Step</SPAN><SPAN class="">9 :</SPAN><SPAN class="">&nbsp;Create a service definition and service binding for the projection view and expose it</SPAN></STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Faizan_khan1_0-1769853368459.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/367578i1E6FFFB90706F0CA/image-size/large?v=v2&amp;px=999" role="button" title="Faizan_khan1_0-1769853368459.png" alt="Faizan_khan1_0-1769853368459.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Faizan_khan1_1-1769853394588.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/367579i7319517636A157FA/image-size/large?v=v2&amp;px=999" role="button" title="Faizan_khan1_1-1769853394588.png" alt="Faizan_khan1_1-1769853394588.png" /></span></P><P><SPAN class=""><SPAN class="">Here we can see we have 2 records and a button is visible UPDATE RECORDS&nbsp;</SPAN></SPAN><SPAN class="">&nbsp;</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Faizan_khan1_2-1769853423270.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/367580i2DDDD1CCB2B45149/image-size/large?v=v2&amp;px=999" role="button" title="Faizan_khan1_2-1769853423270.png" alt="Faizan_khan1_2-1769853423270.png" /></span></P><P><SPAN class=""><SPAN class="">Select the button and click on the update record action&nbsp;</SPAN></SPAN><SPAN class="">&nbsp;</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Faizan_khan1_3-1769853564349.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/367581i79AE18A415BA14B9/image-size/large?v=v2&amp;px=999" role="button" title="Faizan_khan1_3-1769853564349.png" alt="Faizan_khan1_3-1769853564349.png" /></span></P><P><SPAN class=""><SPAN class="">Edit the records&nbsp;</SPAN></SPAN><SPAN class="">&nbsp;</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Faizan_khan1_4-1769853601785.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/367582i36248796BB6508E9/image-size/medium?v=v2&amp;px=400" role="button" title="Faizan_khan1_4-1769853601785.png" alt="Faizan_khan1_4-1769853601785.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Faizan_khan1_5-1769853632182.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/367583i778A21EFAF923424/image-size/large?v=v2&amp;px=999" role="button" title="Faizan_khan1_5-1769853632182.png" alt="Faizan_khan1_5-1769853632182.png" /></span></P><P><SPAN>Here you can see the records have been updated&nbsp;</SPAN><SPAN>&nbsp;</SPAN></P><P><SPAN>Conclusion :&nbsp;&nbsp;Using a Dialog Box in RAP makes record updates faster and more user-friendly by keeping the user on the same screen while still following RAP’s behavior, validations, and transactional processing</SPAN><SPAN>&nbsp;</SPAN></P><P>&nbsp;</P><P>&nbsp;</P> 2026-02-03T07:30:32.746000+01:00 https://community.sap.com/t5/technology-blog-posts-by-sap/tweaks-for-rap-bo-events-addressing-filtering-before-send-and-too-small/ba-p/14320767 Tweaks for RAP BO events addressing filtering (before send) and too small payload (callbacks needed) 2026-02-03T15:18:52.529000+01:00 mlauber https://community.sap.com/t5/user/viewprofilepage/user-id/157846 <P>Are you working on modernizing your SAP integrations, or looking for better ways to integrate with clean core compliance? But when you've looked at "Event Objects" from the SAP Business Accelerator Hub, you have found that it's not exactly matching your needs? Too many events are fired (can I filter?). The callback API is too time-consuming/unwanted. Or maybe you are simply interested in how ABAP RESTful Programming Model (RAP) Events work, how you can use and/or extend SAP Standard events?</P><P>In this blog I'll go through first some basic info and then start to showcase some tips / tweaks / workarounds you may or may not be aware about. Let's go.</P><H1 id="toc-hId-1660384843">1 ABAP RESTful Programming Model (RAP) Events Intro</H1><P>I'll keep this very brief as the meat of this blog is to go into the nitty-gritty details. But, for the uninitiated, RAP BO events are events that have been built with the RAP framework which can easily integrate with event brokers, such as SAP Business Technology Platform's Event Mesh or Advanced Event Mesh. They are a sort of modern version of BTEs. You may refer to a previous blog of mine where I go into one full end-to-end example, showcasing how to find SAP standard events and then use them: <A href="https://community.sap.com/t5/technology-blog-posts-by-sap/working-with-rap-bo-events-end-to-end-event-driven-architecture-event/ba-p/14018775" target="_blank">Working with RAP BO Events end-to-end</A>&nbsp;. The short version is that all events can be found on the&nbsp;<A href="https://hub.sap.com/" target="_blank" rel="noopener noreferrer">SAP Business Accelerator Hub</A>&nbsp;-&gt; Your SAP Product -&gt; Events.</P><H1 id="toc-hId-1463871338">2 Too many events are fired / I want to filter</H1><P>This is probably one of the most common discussion points when I work with my customers. More often than not a "Created" or even more interestingly, a "Changed" event is simply fired too often for the actual integration needs. So what can we do here? In essence we have 3 main options:</P><OL><LI><STRONG>Integration middleware handles filtering</STRONG> (= no changes in SAP system, use event as is)<OL><LI>This can be desirable if there are lots of receiving systems that need to receive information for a certain object, and maybe each of them would like to filter a little different. The middleware receives the event as it happens and can then handle the distribution accordingly. This way 1 single event could be the foundation of several functioning integrations (instead of several point-to-point integrations). The quote-on-quote downside to this is that you would of course increase the complexity in the middleware itself, but again if the same event benefits several receivers, this could be a good option.<BR /><BR /></LI></OL></LI><LI><STRONG>Extend SAP standard event</STRONG> to include filtering fields (= extension development in your SAP system, use extended event, not standard)<OL><LI>This can be used if you know for sure you always want to filter out certain types of objects, that none of the integrated systems would want to be informed about.&nbsp;The quote-on-quote downside here is that we need to create an extension. Secondly, we first have to check if the SAP Standard RAP BO in question even allows behavior extensions. If not, we cannot use this option at all.<BR /><BR /></LI></OL></LI><LI><STRONG>Use custom event in combination with SAP Standard event</STRONG> as a workaround (= custom development in your SAP system, use custom event, not standard)<OL><LI>Same as for the previous one, this option can be used if we know for a fact we always want to filter away certain objects. We can use this over the extend option, if for example the extension was not possible, or if the extension possibilities do not suffice (for example we need to add fields that are not easily associated in the RAP BO, or we need some complex logic and checking before we send an event)<BR /><BR /></LI></OL></LI></OL><P>As this blog focuses on RAP, I'll skip the first option and let the integration gurus tackle that one. Let's take a closer look at the other two...</P><H2 id="toc-hId-1396440552">2.1 Extend SAP standard event</H2><P>If we found a suitable SAP standard RAP BO event and all we want is to add a few filter fields, we can do that with what is called Derived Events. Please refer to this page for details:&nbsp;<A href="https://help.sap.com/docs/abap-cloud/abap-rap/derived-business-events?version=s4hana_cloud" target="_blank" rel="noopener noreferrer">Derived Business Events | SAP Help Portal</A></P><P>For my showcase I'll be using <STRONG>R_SalesOrderTP~Changed</STRONG> event. First of, we need to check if the behavior definition of the BO allows extensions. Open it and check for the word "<FONT color="#FF6600"><STRONG>extensible</STRONG></FONT>" somewhere at the beginning of the definition + on the entity which has the event (so we need <U><STRONG>two</STRONG></U> <FONT color="#FF6600"><STRONG>extensible</STRONG></FONT>).&nbsp;</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="mlauber_0-1770118376066.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368508i197CA85BDC2C2AC5/image-size/large?v=v2&amp;px=999" role="button" title="mlauber_0-1770118376066.png" alt="mlauber_0-1770118376066.png" /></span></P><P>If it's there, we can proceed. Next we can also check the event itself and the payload (if no <FONT color="#FF6600"><STRONG>parameter</STRONG> </FONT>statement is written there, the payload is the key field(s) of the BO alone).</P><H3 id="toc-hId-1329009766">2.1.1 Create derived event payload with filter fields</H3><P>Before we extend the behavior, we need a custom payload that includes our filter fields. Create a new data definition root entity and define your custom payload. For example:</P><pre class="lia-code-sample language-abap"><code>@AccessControl.authorizationCheck: #NOT_REQUIRED @EndUserText.label: 'Sales Ord. ext. event for derived event' define root view entity ZP_SalesOrder_EventExt as select from I_SalesOrder { key SalesOrder, .context.attribute: 'xsapordtype' SalesOrderType, .context.attribute: 'xsapslsorg' SalesOrganization, .context.attribute: 'xsapbillplc' _BillingPlan.BillingPlanCategory, DistributionChannel, OrganizationDivision, SoldToParty, CustomerGroup, ShippingCondition, IncotermsClassification, OverallSDProcessStatus }</code></pre><P>Few points:</P><UL><LI>Key fields must match the RAP BO you are extending</LI><LI>You can access fields just like the standard RAP BO and also associated fields (I showcase this with BillingPlanCategory above). Note, we focus only flat structures, so the associated field needs to be 1:1 (for deep structures, please refer to chapter 3).</LI><LI>With above, we created exactly 3 filter fields: Sales Order Type, Sales Organization, and Billing Plan Category. Filters must have the annotation "<STRONG>Event.context.attribute</STRONG>" and <U>must start with</U> "<STRONG>xsap</STRONG>"!</LI></UL><H3 id="toc-hId-1132496261">2.1.2 Extend standard RAP BO behavior to create a derived event (with our custom payload)</H3><P>Now we are ready to extend the behavior definition as per usual practice: find/display it in the project explorer - right click - New Behavior Extension. Here type out your derived event, for example:</P><pre class="lia-code-sample language-abap"><code>extension //using interface i_salesordertp ; extend behavior for SalesOrder { managed event ZZChangedExtended on Changed parameter ZP_SalesOrder_EventExt; }</code></pre><P>Few notes on the above:</P><UL><LI>First of I want to start with the <STRONG>interface</STRONG> commented away above. Bear with me, this is important to understand!<BR />In RAP it is always best to interact with RAP BOs via their interface, if there is one (not to be confused with a basic interface view, such as I_SalesOrder or I_Customer etc., which reads from the DB table). In the case of R_SalesOrderTP, it has a transactional interface called <STRONG>I_SalesOrderTP</STRONG>. This interface is meant as a stable "API" to interact with the BO, and is usually released with C1/C0 contracts for clean core compliance. So in truth, we should be using the interface as we are extending this BO, but as you see above, it's commented away. That is because we must, in this case. I_SalesOrderTP does not include any of the events, and because we need those, we cannot use the interface in this case. What this means is that my extension behavior definition, as of right now, must be saved as "<STRONG>Standard ABAP</STRONG>" and cannot be assigned to a package with an ABAP Cloud software component. HOWEVER, <U><STRONG>this is clean core compliant</STRONG></U>, because&nbsp;R_SalesOrderTP is released with a C0 contract for extension, thus allowing such extensions. The problem is that the syntax check for <STRONG>ABAP for Cloud Development</STRONG> only checks for C1 contracts (which is missing on R_SalesOrderTP behavior), which is why, as of right now, we have to save this as Standard ABAP, meaning a "level B" extension which is clean core compliant (it would have been "level C", if R_SalesOrderTP hadn't had the C0).</LI><LI>The rest is quite straight forward. We say which entity we are extending (<STRONG>SalesOrder</STRONG>, using the alias in the behavior definition) and we are stating the <STRONG>Changed</STRONG> event to be extended with <STRONG>ZZChangedExtended</STRONG> with our own payload we previously created.</LI></UL><H3 id="toc-hId-935982756">2.1.3 Create Event Binding for derived event</H3><P>Next up we need an Event Binding for our derived event. As a small side note: if you only intend to consume your own derived within your SAP system (the same system) and not send it out to an event broker, then you would not need an event binding.<BR />Create a new Event Binding object (Business Service - Event Binding or just search for event binding in the new ABAP object dialog) and add the event we just created to it:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="mlauber_1-1770120045083.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368517iADDE8D17051D9C5B/image-size/large?v=v2&amp;px=999" role="button" title="mlauber_1-1770120045083.png" alt="mlauber_1-1770120045083.png" /></span></P><P>Note that we of course refer to the SAP Standard RAP BO, which now includes our derived event thanks to the extension we just did.</P><H3 id="toc-hId-739469251">2.1.4 Configure Event Channel to include your derived event</H3><P>Lastly, to send our derived event to an event broker, we need to add it to our event channel. Assuming you already prepared an event channel (refer to my other blog linked above for more info on that), go to <STRONG>/n/IWXBE/CONFIG</STRONG>, select your event channel and go to <STRONG>Outbound Bindings</STRONG>.</P><P>Click the create button to add the event binding you just created. It could look something like this:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="mlauber_2-1770120572456.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368521i9EAB0A3A0D0D0D9B/image-size/large?v=v2&amp;px=999" role="button" title="mlauber_2-1770120572456.png" alt="mlauber_2-1770120572456.png" /></span></P><P>The above means that my Event Mesh on my BTP subaccount receives the SAP standard Sales Order Created event, and my own derived Sales Order Changed event.</P><P>And that's it: now we are ready for filtering or for simply getting the larger payload as per our derived event.</P><H3 id="toc-hId-542955746">2.1.5 Adding Filters</H3><P>In the same location as we were (/n/IWXBE/CONFIG -&gt; Event Channel -&gt; Outbound Bindings) click on the button <STRONG>Filters</STRONG> at the top. Open up the folder <STRONG>Outbound Bindings</STRONG> for your event channel and click on your derived event. Clicking on the plus-button shows all available filter fields, in this example:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="mlauber_3-1770120808327.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368528iFC46CE4591114DC4/image-size/medium?v=v2&amp;px=400" role="button" title="mlauber_3-1770120808327.png" alt="mlauber_3-1770120808327.png" /></span></P><P>Create a filter, for example that only Sales Order Type "OR" should be sent to out:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="mlauber_4-1770120857823.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368529i86EE30B213E86B56/image-size/large?v=v2&amp;px=999" role="button" title="mlauber_4-1770120857823.png" alt="mlauber_4-1770120857823.png" /></span></P><H3 id="toc-hId-346442241">2.1.6 Subscribe to the event on your event broker</H3><P>To receive this derived event for example in Event Mesh on SAP BTP, you need of course a corresponding queue and then add the subscription for this new derived event. In my example:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="mlauber_5-1770121089544.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368531i011AEB159CE6B0E4/image-size/medium?v=v2&amp;px=400" role="button" title="mlauber_5-1770121089544.png" alt="mlauber_5-1770121089544.png" /></span></P><H3 id="toc-hId-149928736">2.1.6 Test example</H3><P>I changed a sales order in my system and saved. This now triggered my derived changed event, which I can see in the events monitoring transaction <STRONG>/n/IWXBE/EVENT_MONITOR</STRONG> (select event channel, click on Outbound Events, double-click on derived event)...</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img1.png" style="width: 321px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368878i3A7336D1CA08EA56/image-size/medium?v=v2&amp;px=400" role="button" title="img1.png" alt="img1.png" /></span></P><P>...and on SAP BTP Event Mesh where I added the subscription:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="mlauber_7-1770121288238.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368533i6721A20876B09CD9/image-size/medium?v=v2&amp;px=400" role="button" title="mlauber_7-1770121288238.png" alt="mlauber_7-1770121288238.png" /></span></P><P>Here we can only see what's sitting in the queue. So let me consume the message in the test tool to show the same payload as in our monitor:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img2.png" style="width: 789px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368882i1C15646C036E5838/image-size/large?v=v2&amp;px=999" role="button" title="img2.png" alt="img2.png" /></span></P><P>Awesome! We succeeded and this concludes the extend event option.</P><H2 id="toc-hId-171586869">2.2 Use custom event in combination with SAP Standard event</H2><P>This is an interesting one and in my experience comes with some confusion attached to it. I have heard sentences such as "But can't we just create a custom event instead of the standard one and use that?" And the simple answer to that is yes, but no&nbsp;<span class="lia-unicode-emoji" title=":smiling_face_with_smiling_eyes:">😊</span>. Let me explain...</P><P>Now of course if we create our own, custom RAP BOs, we can add events to them. That is clear. And within that custom BO you decide when that event is fired. Clear and no problem. But this is all custom.</P><P>And now, if you want "your custom event" <STRONG>to be trigged <U>during</U> SAP standard processing</STRONG>, well no, SAP standard can't do that, as it does not know your custom event exists. And if you are thinking to use user exits or BAdIs to do this; think again, because it would be wrong to do so. User exits and BAdIs are called while the processing has not yet completed. Meaning at this point, in theory, something could still go wrong (no update in DB), but you already triggered your event. So, do not do this, ever! The point of the event framework is to inform about a state change. So you only want to do that, if the state change has actually occurred, meaning after the DB is fully updated.</P><P>So what else then, you wonder? That's where the SAP standard event comes in (which yes, is fired AFTER the state change occurred and all processing has completed). The SAP Standard event <U>will trigger</U>, and thus if you want more flexibility than just explored in the previous option with the extension of the SAP standard event, that's when we can try to combine standard with custom event.</P><P>Essentially, this is the pattern:</P><OL><LI>SAP standard process does something, which triggers an event for a certain object. This triggering happens at the exact time you want, but the SAP Standard event does not fulfill your requirement (and we can't / don't want to do a derived event)</LI><LI>You will create a custom event on a "dummy" RAP BO which includes the exact payload you need (flat structure for EM, it can be a deep one for AEM).</LI><LI>You will create a local event listener (within your SAP system) for the SAP standard event that triggers at the right moment. Within this local consumption you can now do any ABAP logic you may need. Complex filtering. Complex data collection (calling BAPIs or other things) etc.<BR />Once all your data validation and collection is done, you fill the payload format of your custom event and finally you trigger your custom event (with a slight workaround, as events can only be raised from with the RAP BO itself)</LI><LI>You only configure your custom event in the event channel for the event broker. The event arriving there is ready to be consumed with all needed fields and only events are that are really expected are arriving there.</LI></OL><P>Let's do this example now. We stick with <STRONG>R_SalesOrderTP</STRONG>, this time using <STRONG>Created</STRONG> as the SAP Standard event.</P><P>Let's assume I don't just want to send all sales order that are created. Sales order type filtering is not good enough. In fact, it matters whether a product is sold that has certain characteristics, for example.&nbsp;As a simplified example here, I will only check the product type of the product, but hopefully this gives you some ideas; we could check anything at this point.</P><H3 id="toc-hId--318329643">2.2.1 Create custom event</H3><P>Our custom event doesn't need much of a BO. Meaning we don't want to (re)create read/update/delete etc. functionality, but this is purely for defining how the event payload should look like and for triggering the custom event.&nbsp;</P><P>In my example I took it a step further: what if I create a <STRONG>generic "event forwarder"</STRONG>, that could potentially be used together with many SAP standard objects? Now, this isn't to say that I recommend this approach, in fact quite the opposite. And depending on your exact requirement, this may definitely the wrong approach. But I did this also in an effort to answer if this is at all feasible.</P><P>If having an event trigger with only key field information and then having a subsequent callback API later in the integration is a good pattern for you, then this could potentially help you, as you could reuse it for several use cases.</P><P>But, if instead you want something very specific, for example only forward my object under certain circumstances and including already all data needed, then of course it makes more sense to create a tailored custom event, with the exact payload of that object you want.</P><P>So please bear that in mind as we continue with this example. <STRONG>With this example I handle only a generic key-field based payload</STRONG>.</P><H4 id="toc-hId--808246155">2.2.1.1 Custom entity data definition</H4><P>We start of course with the data definition. Custom entity is in my opinion the best, as again we don't actually need any read or update functionality, but we simply describe our event payload at this point (and here you could have a large flat/deep structure):</P><pre class="lia-code-sample language-abap"><code>@EndUserText.label: 'Event Forwarder BO' define root custom entity ZR_EventForwarder { key ObjectKey : abap.string; key ObjectType : zevent_fwd_object; }</code></pre><H4 id="toc-hId--1004759660">2.2.1.2 Custom entity behavior definition</H4><P>Next we need the behavior that will include our custom event:</P><pre class="lia-code-sample language-abap"><code>unmanaged implementation in class zbp_r_eventforwarder unique; strict ( 2 ); define behavior for ZR_EventForwarder lock master authorization master ( instance ) { field ( readonly ) ObjectKey, ObjectType; event ForwardEvent; }</code></pre><P>Finally, let ADT generate the BP implementation for you (we do not need to fill any of the methods but so it's properly created (again, we need no read/save methods etc.)). So I will not paste the whole Class/or Local Types.</P><P>Instead, what we need to do here is now offer an option to "raise" our custom event "<STRONG>ForwardEvent</STRONG>" from outside this BO. The "<FONT color="#3366FF"><STRONG>raise entity event</STRONG></FONT>" command is not allowed outside the RAP BO itself. So instead, we need to encapsulate it in a way that ABAP code from outside this behavior pool can call it. For this we need 2 things:</P><OL><LI>"Local event handler" (not actually inheriting anything =&gt; chose this to separate it from other, standard RAP BP behavior methods)</LI><LI>Method in the global class that can be called from other ABAP code</LI></OL><P>Let's start with the "local event handler". Within the section <STRONG>Local Types</STRONG> of your behavior implementation class, add something this:</P><pre class="lia-code-sample language-abap"><code>class lcl_event_handler definition friends zbp_r_eventforwarder. public section. class-methods on_forward_event importing it_events type zbp_r_eventforwarder=&gt;tt_events. endclass. class lcl_event_handler implementation. method on_forward_event. raise entity event zr_eventforwarder~forwardevent from it_events. endmethod. endclass.</code></pre><P>Note the "<FONT color="#0000FF"><STRONG>friends</STRONG></FONT>" command in the class definition. This is needed to be able to access private/protected class variables from the behavior pool (raising our entity event).</P><P>And in the <STRONG>Global Class</STRONG>, we change it as follow (full code copied):</P><pre class="lia-code-sample language-abap"><code>class zbp_r_eventforwarder definition public abstract final for behavior of zr_eventforwarder. types tt_events type table for event zr_eventforwarder~forwardevent. public section. constants: co_type_salesorder type zevent_fwd_object value 'SALESORDER'. class-methods raise_forward_event importing it_events type tt_events. endclass. class zbp_r_eventforwarder implementation. method raise_forward_event. " tell RAP framework that we are in a SAVE sequence (otherwise it thinks " we are in the middle of a MODIFY) cl_abap_tx=&gt;save( ). " trigger event (only allowed during SAVE) lcl_event_handler=&gt;on_forward_event( it_events ). endmethod. endclass.</code></pre><P>We did 3 main things: a global type for the event payload table, a constant to distinguish different types of RAP BO that I mean to handle with my generic one (right now only one) and, most importantly, a global class method that can be called from other ABAP code.</P><H4 id="toc-hId--1201273165">2.2.1.3 Event Binding</H4><P>As before, we need an event binding if we want to forward this to an event broker:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="mlauber_9-1770124792302.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368569iA7F765998E574E12/image-size/large?v=v2&amp;px=999" role="button" title="mlauber_9-1770124792302.png" alt="mlauber_9-1770124792302.png" /></span></P><P>(Namespace, object type etc. can be freely chosen.)</P><P>And that's all for our custom event. Remember that the only purpose of this custom event is to offer a way to define the payload and to trigger it. Any functionality, such as filtering, complex validation or data selection etc. we do when the real SAP standard event is triggered. Meaning in the local consumption.&nbsp;</P><H3 id="toc-hId--1104383663">2.2.2 Local consumption of SAP Standard event</H3><P>Now I won't go into step-by-step on this one, as I have done this already on the above linked blog post of mine. Please check there if the below steps are not enough for you.</P><P>I have an ABAP Class, abstract, final with the "<STRONG><FONT color="#3366FF">for events of</FONT></STRONG>" functionality, where once again we must type R_SalesOrderTP here (and not I_SalesOrderTP, which would have been the preferred option). This means my class has to be again saved as "Standard ABAP" and cannot be in an ABAP for Cloud Development package. But this is clean core compliant, as explained above.</P><P>In Local Types I have my local class that inherits from&nbsp;<STRONG>cl_abap_behavior_event_handler</STRONG> and I add a method for the Created event:</P><pre class="lia-code-sample language-abap"><code>class lcl_event_cons definition inheriting from cl_abap_behavior_event_handler. private section. methods: consume_created for entity event instances for salesorder~created. endclass.</code></pre><P>And here the implementation of that method (we'll go through it one by one below):</P><pre class="lia-code-sample language-abap"><code> data: lt_fwd_event type zbp_r_eventforwarder=&gt;tt_events. " go through RAP BO entity instances that triggerd the event " (should only be 1 as we listend to sales order (header) created) loop at instances into data(instance). " get data needed for complex filtering select salesorderitem, product, \_product-producttype from i_salesorderitem where salesorder = @instance-salesorder into table (lt_items). " check if sales order should be handled (forwarded to event broker) if line_exists( lt_items[ producttype = 'HAWA' ] ). " this sales order is now filtered OK and will be added to the forwarding instances append initial line to lt_fwd_event assigning field-symbol(&lt;fs_event&gt;). &lt;fs_event&gt; = value #( objectkey = instance-salesorder objecttype = zbp_r_eventforwarder=&gt;co_type_salesorder ). else. continue. " we are not interested in this Sales Order endif. endloop. " now that we checked all instances, only those that we filtered will be forwarded if lt_fwd_event is not initial. zbp_r_eventforwarder=&gt;raise_forward_event( lt_fwd_event ). endif.</code></pre><UL><LI>We create an internal table of the payload type that is the custom event (we created a global type in the behavior definition)</LI><LI>We loop through all instances that were sent by the SAP standard event (since this is a sales order (header), this will only ever include 1)</LI><LI>As we loop, we select some additional data to do "some complex logic" for checking if this sales order should be forwarded or filtered out.</LI><LI>Once all requirements are met for forwarding the sales order, we fill the custom event payload table.</LI><LI>When the looping is done, we check if any sales orders remained (if we have any custom event payload) and if yes, we now call the method we offered on the custom event RAP BO behavior as global class method and give it the payload we just filled.</LI></UL><P>&nbsp;And that's all&nbsp;<span class="lia-unicode-emoji" title=":astonished_face:">😲</span><span class="lia-unicode-emoji" title=":grinning_face:">😀</span></P><H3 id="toc-hId--1300897168">2.2.3 Finishing</H3><P>As before, we need to configure our custom event (binding) in the event channel in order to forward it to the event broker:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="mlauber_10-1770125042635.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368582iD3055B5DF16B25C3/image-size/large?v=v2&amp;px=999" role="button" title="mlauber_10-1770125042635.png" alt="mlauber_10-1770125042635.png" /></span></P><P>On the event broker, we need to subscribe to that topic, to receive it there:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="mlauber_12-1770125246503.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368585iCBCED5DFB3A60DDE/image-size/medium?v=v2&amp;px=400" role="button" title="mlauber_12-1770125246503.png" alt="mlauber_12-1770125246503.png" /></span></P><P>To summarize, this is what will happen:</P><OL><LI>A user creates any sales order</LI><LI>R_SalesOrderTP-Created is triggered</LI><LI>Our local consumption of the SAP standard event is called: our local consumption checks if the sales order has any items with products of product type HAWA. If yes, we add it to be forwarded. If no, we disregard it.</LI><LI>If we had any sales order to forward, the ZR_EventForwarder behavior is called via workaround (a little bit nasty by just calling the global class but I could not think of any other way. For example we can't use an action, as actions are invoked via EML MODIFY, which in turn does not allow for RAISE EVENT). This triggers the&nbsp;ZR_EventForwarder-EventForwarded event with our payload</LI><LI>The custom event is forwarded to event broker</LI></OL><H3 id="toc-hId--1497410673">2.2.4 Testing</H3><P>Let's test this. I create a new sales order and I include 1 item that has a product of type HAWA. Meaning my filtering will allow this sales order and eventually trigger my custom event.&nbsp;</P><P>Let's see what the event monitor says:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img3.png" style="width: 369px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368883i54C7B49E5FC7E40A/image-size/medium?v=v2&amp;px=400" role="button" title="img3.png" alt="img3.png" /></span></P><P>And consuming this message in BTP Event Mesh:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img4.png" style="width: 780px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368884i5357FD956B2A568C/image-size/large?v=v2&amp;px=999" role="button" title="img4.png" alt="img4.png" /></span></P><H1 id="toc-hId--1107118164">3 I want a larger payload</H1><P>This is without a doubt the 2nd most discussed topic when talking event based integrations. In order to avoid callback APIs, maybe this is the way to go for you. As of right now, SAP Standard delivers notification events only, meaning small payloads to allow for the creation of fast, simple, integrations that can be easily reused.</P><P>You may already noticed that we already covered this in chapter 2. Both when extending the SAP standard event or when creating a custom event to work in combination with standard: I showcased how we can decide our own payload. So far I have only mentioned <STRONG>flat structures</STRONG>, as that is the only type that is supported by Event Mesh on SAP BTP. If you have a need for <STRONG>deep structure payloads</STRONG>, you may want to consider to upgrade to Advanced Event Mesh instead. And instead of creating a brand new example, please check out this blog post by a colleague that goes into deep payload: <A href="https://community.sap.com/t5/technology-blog-posts-by-sap/rap-business-events-with-advanced-event-mesh-3-creating-events-with-deep/ba-p/13914285" target="_self">RAP Events with AEM 3 - Creating Events with deep payload</A>.</P><H1 id="toc-hId--1303631669">Conclusion / Final Words</H1><P>I hope this blog post helps and gives some ideas how far you can take RAP BO events and influence your integration landscape, in a positive way (of course, that's the end goal).</P><P>Is there anything I've missed? Another requirement that you would like to solve with eventing? Or any other questions or comments/feedback? Let me know in the comments and let's see&nbsp;<span class="lia-unicode-emoji" title=":smiling_face_with_smiling_eyes:">😊</span></P> 2026-02-03T15:18:52.529000+01:00 https://community.sap.com/t5/technology-blog-posts-by-sap/abap-ai-podcast-reflecting-on-2025-and-looking-ahead-to-2026/ba-p/14322098 ABAP AI Podcast: Reflecting on 2025 and Looking Ahead to 2026 2026-02-05T11:20:57.156000+01:00 SHRUTHISADAGOPANPITCHUMANI https://community.sap.com/t5/user/viewprofilepage/user-id/1699865 <H4 id="toc-hId-2047685949">&nbsp;2025: The Year ABAP AI Became Tangible</H4><P>As Simona and I reflected on 2025, one theme stood out: it was the year ABAP AI stopped being a promise and became something developers could <EM>touch</EM>, <EM>use</EM>, and <EM>trust</EM>. That shift didn’t happen all at once — it was shaped across the year through a series of releases that progressively deepened what ABAP and AI could do together.</P><P><STRONG>The journey began with Release 2502</STRONG>, our first big delivery, which marked a turning point for the ABAP developer experience. This release introduced the foundational AI capabilities that developers immediately felt in their workflow: the initial wave of explain ability for ABAP and CDS, predictive and context‑aware code suggestions, and early ABAP Cloud compliance insights. 2502 was a statement: ABAP AI had arrived, and it was ready for real use cases.</P><P>Building on this momentum, <STRONG>Release 2505</STRONG> expanded and strengthened the story. the RAP BO Generator for Fiori applications. The explain model grew to cover more ABAP constructs, predictive assistance became more capable, and clean‑core compliance checks were enhanced to give developers clearer, more actionable guidance.</P><P>Toward the end of the year, <STRONG>Release 2508</STRONG> brought refinement and specialization. AI guidance became more scenario‑aware — better tuned for migration, modernization, and, AI‑supported extensibility patterns. Autogenerated documentation became richer and more reliable. Custom code migration also received a boost with deeper AI‑powered insights and more intelligent documentation support — small but meaningful improvements that helped teams move faster and with more confidence.</P><P>And throughout all of this, we made sure customers in private cloud were not left behind. With the <STRONG>2025 PCE add</STRONG><STRONG>‑</STRONG><STRONG>ins</STRONG>, <EM>Joule for Developers</EM> became available to S/4HANA Private Cloud Edition customers as well — enabling AI‑assisted custom code migration, modernization support, and clean‑core guidance even for those on older releases. This was a major step in democratizing ABAP AI and bringing its value to a much broader installed base.</P><H4 id="toc-hId-1851172444"><STRONG>Key Features and Developer Impact</STRONG></H4><P>With <STRONG>Joule for Developers</STRONG>, ABAP developers immediately benefited from a range of intelligent capabilities, including:</P><UL><LI>Predictive and context‑aware code suggestions</LI><LI>Automated ABAP Cloud compliance checks</LI><LI>Natural‑language explanations for both legacy and new ABAP code and extended explain use for autogenerated technical documentation</LI><LI>Developers could even generate complete <STRONG>Fiori applications</STRONG> simply by describing the functional requirements.</LI></UL><P>These advancements significantly accelerated development cycles and reduced manual effort. AI also enhanced custom code migration by proposing simplifications, improving code quality, and easing the transition to clean‑core architectures.</P><H4 id="toc-hId-1654658939"><STRONG>ABAP and AI: A Strengthened Relationship</STRONG></H4><P>Simona shared insights into why ABAP required SAP‑specific AI models. Because ABAP is proprietary, large language models were not initially trained on it. SAP addressed this by training internal models on over <STRONG>250 million lines of ABAP code</STRONG> and <STRONG>30 million lines of CDS views</STRONG>, unlocking high‑quality AI support tailored specifically to ABAP.&nbsp;</P><P>To hear the full conversation, listen to the episode:&nbsp;<A href="https://youtu.be/lJcAikOgk4c?si=xYlkQb4c5oS9LGrm" target="_self" rel="nofollow noopener noreferrer"><SPAN>ABAP AI Podcast: Reflecting on 2025 and Looking Ahead to 2026 <div class="video-embed-right video-embed"><iframe class="embedly-embed" src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FlJcAikOgk4c%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DlJcAikOgk4c&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FlJcAikOgk4c%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="400" height="225" scrolling="no" title="SAP Code Talk: ABAP AI Podcast" frameborder="0" allow="autoplay; fullscreen; encrypted-media; picture-in-picture;" allowfullscreen="true"></iframe></div></SPAN></A></P><P>Another important point we touched on in the conversation is how ABAP AI brings together the best of both worlds. SAP pairs its own ABAP‑specialized models—trained on hundreds of millions of lines of ABAP and CDS code—with best‑of‑breed third‑party foundation models. This hybrid approach ensures developers always get the most accurate and context‑aware support for ABAP tasks, while still benefiting from the broad language understanding and creativity of large general‑purpose models. And for customers who are primarily interested in explain ability, SAP also offers <STRONG><EM>the explain</EM></STRONG><STRONG><EM>‑</EM></STRONG><STRONG><EM>only model through the AI Hub, making ABAP</EM></STRONG><STRONG><EM>‑</EM></STRONG><STRONG><EM>focused code explanations accessible even without the full Joule for Developers experience.</EM></STRONG></P><P>Far from replacing developers, AI strengthens the ABAP ecosystem. The ABAP community has shown excitement and readiness to embrace these advancements, seeing AI as a powerful augmentation of their skills.&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</P><H4 id="toc-hId-1458145434"><STRONG>2026: Scaling the Promise</STRONG></H4><P>Looking forward, 2026 is shaping up to be a pivotal year of <EM>scaling</EM> ABAP AI. SAP plans to bring AI capabilities to customers running older private cloud releases through a <STRONG>side</STRONG><STRONG>‑</STRONG><STRONG>by</STRONG><STRONG>‑</STRONG><STRONG>side version of Joule for Developer</STRONG><STRONG>, </STRONG>ensuring broader access also for customers on older S4HANA versions.&nbsp;&nbsp;</P><P>SAP will also add to it <STRONG>agentic tools and frameworks and an ABAP MCP Server</STRONG>, enabling SAP teams and partners to build intelligent agents that automate development tasks and connect seamlessly into an integrated agentic ecosystem. Investment in <STRONG>AI</STRONG><STRONG>‑</STRONG><STRONG>assisted custom code migration</STRONG> will continue, focusing on clean‑core compliance and automated code simplification proposals.</P><H4 id="toc-hId-1261631929"><STRONG>VS Code and Modern Tooling</STRONG></H4><P>A major priority for 2026 is establishing <STRONG>VS Code as a first</STRONG><STRONG>‑</STRONG><STRONG>class development environment for ABAP</STRONG>. By combining VS Code’s modern developer experience with Joule and AI‑centric capabilities, SAP aims to reposition ABAP as a future‑proof, cloud‑native, enterprise‑grade language.</P><H4 id="toc-hId-1065118424"><STRONG>Trust and Enterprise Readiness</STRONG></H4><P>As AI evolves, SAP continues to emphasize <STRONG>safety</STRONG>, <STRONG>compliance</STRONG>, and <STRONG>enterprise</STRONG><STRONG>‑</STRONG><STRONG>grade ethics</STRONG>. All AI use cases undergo rigorous validation to meet SAP’s security and trust standards.</P><H4 id="toc-hId-868604919"><STRONG>Custom Code Migration (CCM)</STRONG></H4><P>A core focus area we highlighted in the podcast is the continued evolution of <STRONG>Custom Code Migration (CCM)</STRONG> and its central role in helping customers transition to clean‑core, cloud‑ready architectures. Throughout 2025, AI became a powerful companion in this journey — analyzing legacy patterns, identifying simplification opportunities, and guiding developers toward more future‑proof designs. With Joule for Developers, teams benefit from usage‑aware insights, automated refactoring suggestions, and richer technical documentation that dramatically reduces the manual effort usually tied to migration projects. As we move into 2026, CCM is set to scale even further, with deeper automation and more intelligent guidance that make modernization and S/4HANA transitions faster, more predictable, and far less error‑prone.<span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SHRUTHISADAGOPANPITCHUMANI_0-1770292362345.gif" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369167i3C6305F9D5217841/image-size/medium/is-moderation-mode/true?v=v2&amp;px=400" role="button" title="SHRUTHISADAGOPANPITCHUMANI_0-1770292362345.gif" alt="SHRUTHISADAGOPANPITCHUMANI_0-1770292362345.gif" /></span></P><P><STRONG>Conclusion</STRONG></P><P>The year 2025 proved the real, tangible value of ABAP AI. In 2026, ABAP and AI will become inseparable—empowering developers with intelligent tools that make coding faster, smarter, and more reliable. The vision is clear: the future of ABAP development is deeply AI‑enhanced, enabling organizations to innovate with confidence and speed.</P> 2026-02-05T11:20:57.156000+01:00 https://community.sap.com/t5/developer-news/sap-developer-news-february-5th-2026/ba-p/14322485 SAP Developer News, February 5th, 2026 2026-02-05T21:10:00.018000+01:00 thomas_jung https://community.sap.com/t5/user/viewprofilepage/user-id/139 <P><div class="video-embed-center video-embed"><iframe class="embedly-embed" src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FHqlUHFtW0g4%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DHqlUHFtW0g4&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FHqlUHFtW0g4%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="400" height="225" scrolling="no" title="Build Q4 2025, My Home ABAP, DYK Mocking Auth, Devtoberfest Winners | SAP Developer News" frameborder="0" allow="autoplay; fullscreen; encrypted-media; picture-in-picture;" allowfullscreen="true"></iframe></div></P><H3 id="toc-hId-1918607040">DESCRIPTION</H3><P><STRONG>SAP Build Q4 2025 Release Highlights</STRONG></P><UL><LI><A href="https://community.sap.com/t5/tooling-sap-build-blog-posts/what-s-new-in-sap-build-q4-2025-release-highlights/bc-p/14316927" target="_blank">https://community.sap.com/t5/tooling-sap-build-blog-posts/what-s-new-in-sap-build-q4-2025-release-highlights/bc-p/14316927</A></LI></UL><P><STRONG>My Home in SAP BTP ABAP Environment</STRONG></P><UL><LI><A href="https://community.sap.com/t5/technology-blog-posts-by-sap/my-home-in-sap-btp-abap-environment/ba-p/14314918" target="_blank">https://community.sap.com/t5/technology-blog-posts-by-sap/my-home-in-sap-btp-abap-environment/ba-p/14314918</A></LI></UL><P>&nbsp;</P><P><STRONG>Did You Know? #2 – Mocking Auth in CAP</STRONG></P><P><SPAN><STRONG>Devtoberfest 2025 – Winners Announcement</STRONG></SPAN></P><UL><LI><A href="https://community.sap.com/t5/devtoberfest-blog-posts/devtoberfest-2025-winners-announcement/ba-p/14320779" target="_blank">https://community.sap.com/t5/devtoberfest-blog-posts/devtoberfest-2025-winners-announcement/ba-p/14320779</A></LI></UL><P><STRONG>New live stream series and blog post series on CAP topics</STRONG></P><UL><LI>Modules, modularity &amp; reuse in CDS models (blog post series) <A href="https://qmacro.org/blog/posts/2026/01/01/modules-modularity-and-reuse-in-cds-models/" target="_blank" rel="nofollow noopener noreferrer">https://qmacro.org/blog/posts/2026/01/01/modules-modularity-and-reuse-in-cds-models/</A></LI><LI>Hands-on SAP Dev CXL live stream series playlist <A href="https://www.youtube.com/playlist?list=PL6RpkC85SLQCEU8XcyqnA5wYEZGxMPm6B" target="_blank" rel="nofollow noopener noreferrer">https://www.youtube.com/playlist?list=PL6RpkC85SLQCEU8XcyqnA5wYEZGxMPm6B</A></LI><LI>A new Hands-on SAP Dev mini-series on the core expression language in CDS (blog post) <A href="https://qmacro.org/blog/posts/2025/12/09/a-new-hands-on-sap-dev-mini-series-on-the-core-expression-language-in-cds/" target="_blank" rel="nofollow noopener noreferrer">https://qmacro.org/blog/posts/2025/12/09/a-new-hands-on-sap-dev-mini-series-on-the-core-expression-language-in-cds/</A></LI><LI>Constraints, expressions and axioms in action (blog post) <A href="https://qmacro.org/blog/posts/2026/01/27/constraints-expressions-and-axioms-in-action/" target="_blank" rel="nofollow noopener noreferrer">https://qmacro.org/blog/posts/2026/01/27/constraints-expressions-and-axioms-in-action/</A></LI></UL><H3 id="toc-hId-1722093535">CHAPTER TITLES</H3><P>0:00 Intro</P><P>0:10 SAP Build Q4 2025 Release Highlights</P><P>1:36 My Home in SAP BTP ABAP Environment</P><P>3:04 DYK #2 Mocking Auth in CAP</P><P>4:10 Devtoberfest 2025 – Winners Announcement</P><P>4:44 New live stream series and blog post series on CAP topics</P><H3 id="toc-hId-1525580030">Transcription</H3><P>00;00;00;29 - 00;00;05;28<BR />Announcer Guy<BR />This is the SAP Developer News for February 5th, 2026.</P><P>00;00;06;00 - 00;00;09;25<BR />Shrini Neelamegam<BR />Q4 of 2025 was a huge season for SAP Build,</P><P>00;00;09;27 - 00;00;40;11<BR />Shrini Neelamegam<BR />and we have got some powerful new features to talk about. First up, the agent builder in Joule Studio is officially GA. With MCP server integration and the ability to link multiple agents together. You can now build production grade AI agents that actually moves the needle for your business. Plus, Joule is now baked into every edition of Work Zone, bringing context aware answers and proactive insights right to your team's fingertips.</P><P>00;00;40;13 - 00;01;07;17<BR />Shrini Neelamegam<BR />For the developers out there, you can now spin up Freestyle UI5 apps in SAP Build Code with a simple slash command. And if you are looking to automate, you have added new ways to trigger processes and build process automation, making it easier to bridge the gap between SAP and non SAP systems. On the design front end SAP mobile start just got a makeover with Apple's liquid glass look.</P><P>00;01;07;20 - 00;01;35;14<BR />Shrini Neelamegam<BR />And for the admins, Workzone sites can now handle thousands of documents and translations. We are just scratching the surface here. There is plenty more on decision tables, decision rules, HTML templates for notifications, and new CAPannotations. Head over to Frederick's latest blog post for full Q4 2025 release announcement.</P><P>00;01;35;17 - 00;02;07;13<BR />Sheena M K<BR />SAP has rolled out My Home, the new personalized, light entry page for the SAP BTP ABAP Environment. By default, from at least 2602, and it will be the one and only entry page from release 2608. My home is designed to boost productivity with a modular, customizable layout that includes key sections such as news pages, add and insights, and cards, all aimed at giving users quick access to the tools and information they interact with the most.</P><P>00;02;07;15 - 00;02;40;00<BR />Sheena M K<BR />While the new section keeps you updated with the latest company or system updates, beta section offers quick access to your most used or favorite pages. The apps section improves discoverability with favorite, recent and most used apps. Plus, AI powered recommendations based on role assignments via SAP Business AI. The inside 30s provide immediate visibility into KPIs and analytics and data, offering quick access to apps for further details.</P><P>00;02;40;03 - 00;03;06;08<BR />Sheena M K<BR />Following the “Make It Mine” approach, users can hide, reorder and restructure sections. The skew then working side across all devices. So start exploring my home for a clean, organized and smarter navigation for the SAP BTP ABAP Environment. And for details, check out the blog post from Laura in the description below.</P><P>00;03;06;10 - 00;03;33;19<BR />DJ Adams<BR />Did you know that CAP has a mocked authentication strategy you can use in local development? So you don't have to put off this important part of your domain design? Here's a simple service annotated with some auth requirements. Authentication is required generally, and there are some role based restrictions on one of the entities. With CDS watch we get this strategy out of the box, as we can see, along with some users and roles too.</P><P>00;03;33;21 - 00;04;01;05<BR />DJ Adams<BR />Here's Alice with the admin role. For example. Let's explore. How about trying to read the Book Stocks Entity? 401! We need to authenticate, of course. Let's authenticate as Alice. Now we have read access. What about write? 403. Nope. Alice doesn't have the requisite role. Let's fix that with some extra config in dot cdsrc dot Json, for example, which assigns her the back office role that's required.</P><P>00;04;01;08 - 00;04;09;21<BR />DJ Adams<BR />Okay, let's try again. Success output request as Alice is now accepted. Nice.</P><P>00;04;09;23 - 00;04;31;17<BR />Kevin Kiedelsheimer<BR />Hey, SAP Community, it's finally time! We have the full list of the ten Devtoberfest 2025 winners ready and online. You can find a link to the blog post down in the description of this video, so you can head over to the SAP community and see if you are one of the approved winners of last year's Devtoberfest.</P><P>00;04;31;20 - 00;04;42;27<BR />Kevin Kiedelsheimer<BR />And if you're one of the winners, you can look forward to a great fully paid trip to SAP TechEd this year. I can't wait to see you there!</P><P>00;04;43;00 - 00;05;21;13<BR />DJ Adams<BR />The developer advocates mission is to help developers. That's you be successful. To that end, we create lots of content in various forms CodeJam, tutorials, videos, talks, and lots more. We just wanted to highlight a couple of recent series in the CAP area. First, there's a blog post series on the topic of CDS modeling. The series is called Modules Modularity and Reuse in CDS models, and it explores how we can use modules for reuse in and across our projects and beyond.</P><P>00;05;21;15 - 00;05;53;15<BR />DJ Adams<BR />It illustrates this by first creating and publishing a simple passive reuse module before moving on to understand, explore and dig into the active Capire common reuse module. We're also running a series right now on our hands on SAP Devs live stream show. It's on CAP’s Expression Language, C XL, and we're very happy to have Patrice Bender from the Cap compiler team take us through the beautiful detail in this show and tell style series.</P><P>00;05;53;17 - 00;06;21;10<BR />DJ Adams<BR />As always, driven by curiosity and the desire to understand. By the way, there's also a related blog post just published that explains some of the amazing detail that Patrice revealed in showing how constraints are realized by pushing down to the database. This week sees the third livestream episode in this series. You can join live at the usual hands on SAP Dev time.</P><P>00;06;21;10 - 00;06;29;09<BR />DJ Adams<BR />It's Friday mornings in Europe, and of course you can always watch the replays at your leisure links in the description.</P><P>&nbsp;</P> 2026-02-05T21:10:00.018000+01:00 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 Triggering SAP Datasphere/BDC Task Chains from SAP BTP ABAP Cloud using the Task Chain REST API 2026-02-10T16:44:24.061000+01:00 stefan_geiselhart2 https://community.sap.com/t5/user/viewprofilepage/user-id/200897 <P>Our modern data landscapes thrive on automation. In this post, we’ll walk end-to-end through a real-life integration scenario that tackles one of the building blocks in this context:</P><P class="lia-align-center" style="text-align: center;"><STRONG>Starting a SAP Datasphere Task Chain remotely from SAP BTP ABAP Cloud using OAuth 2.0 Client Credentials and the Datasphere Task Chain REST API</STRONG></P><P>The goal is to orchestrate Datasphere data processing flows directly from ABAP Cloud — securely, programmatically, and fully automated.</P><P>We will cover the below points:</P><UL><LI>Creating a Task Chain in Datasphere</LI><LI>Configuring OAuth clients in Datasphere</LI><LI>Setting up Communication System &amp; Arrangement in ABAP Cloud</LI><LI>Executing the Task Chain remotely: Consume REST API from ABAP Cloud</LI></UL><P><FONT size="5"><STRONG>1 Architecture Overview</STRONG></FONT></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Solution Architecture" style="width: 550px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/371166iB8C9DA6C7F6550B3/image-dimensions/550x406?v=v2" width="550" height="406" role="button" title="image.png" alt="Solution Architecture" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Solution Architecture</span></span></P><P>ABAP Cloud&nbsp;Task Chain Execution: ABAP Cloud acts as the caller. Datasphere exposes the Task Chain API protected by OAuth.</P><P><FONT size="5"><STRONG>2 Prerequisites</STRONG></FONT></P><P>You must have:</P><UL><LI>SAP Datasphere tenant with developer + admin access</LI><LI>A Task Chain to trigger</LI><LI>SAP BTP ABAP Environment (ABAP Cloud) with developer access</LI><LI>BTP ABAP: Authorization to configure OAuth clients and Communication Arrangements</LI></UL><P><FONT size="5"><STRONG>3 Creating a Task Chain in SAP Datasphere</STRONG></FONT></P><P>The first step is defining a Task Chain that encapsulates the processing logic you want to execute remotely.</P><P>In the given example:</P><UL><LI>The Task Chain starts with a <STRONG>Begin</STRONG> node</LI><LI>Executes a <STRONG>Replication Flow</STRONG>&nbsp;for loading dimension data</LI><LI>(Can be extended with transformations, views, or further flows)</LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SAP Datasphere Task Chain with Replication Flow inside" style="width: 592px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/371084i85FF39979A8A1F3B/image-dimensions/592x320?v=v2" width="592" height="320" role="button" title="image.png" alt="SAP Datasphere Task Chain with Replication Flow inside" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">SAP Datasphere Task Chain with Replication Flow inside</span></span></P><P><EM>Main takeaways:</EM></P><UL><LI>Task Chain must be <EM>Deployed</EM></LI><LI>Note the <EM>Technical Name</EM> (used later by API)</LI><LI>Verify it runs manually before you automate via the API<STRONG>&nbsp;</STRONG></LI></UL><P><FONT size="5"><STRONG>4 Configuring OAuth Client in SAP Datasphere</STRONG></FONT></P><P>To allow ABAP Cloud to call Datasphere APIs securely, we create an OAuth Client in Datasphere Administration.</P><P><EM>Navigation Path</EM></P><P>Datasphere → Administration → App Integration → OAuth Clients</P><P><EM>OAuth Endpoints Provided</EM></P><P>Amongst others, SAP Datasphere automatically exposes:</P><UL><LI>Authorization URL</LI><LI>Token URL</LI></UL><P>These are required for OAuth2 token retrieval. Moreover you must create a technical user that has access to the Datasphere space and is able to run the task chains that are in scope. Typically this is done by assigning a scoped role.</P><P><EM>Configured OAuth Client (based on Technical User)</EM></P><P><STRONG><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Menu Path Datasphere" style="width: 172px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/371014i26654901577A6E67/image-size/large?v=v2&amp;px=999" role="button" title="image.png" alt="Menu Path Datasphere" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Menu Path Datasphere</span></span></STRONG></P><P>This is where you see the OAuth Client specific URLs - take note of them for later configuration in ABAP BTP:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="OAuth Client Generation" style="width: 764px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/371054i4BB7492B30B71B30/image-dimensions/764x458?v=v2" width="764" height="458" role="button" title="image.png" alt="OAuth Client Generation" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">OAuth Client Generation</span></span></P><P>Your specific OAuth client for consumption from ABAP BTP. The secret key is only shown once upon creation - keep this in mind!</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="OAuth Client Details" style="width: 404px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/371055i19C15B5494614179/image-dimensions/404x580?v=v2" width="404" height="580" role="button" title="image.png" alt="OAuth Client Details" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">OAuth Client Details</span></span></P><P><EM>Important settings:</EM></P><TABLE><TBODY><TR><TD><P><STRONG>Parameter</STRONG></P></TD><TD><P><STRONG>Value</STRONG></P></TD></TR><TR><TD><P>Grant Type</P></TD><TD><P>Client Credentials</P></TD></TR><TR><TD><P>Purpose</P></TD><TD><P>Technical User</P></TD></TR><TR><TD><P>Roles</P></TD><TD><P>space access must be given (e.g. by scope role in DSP)</P></TD></TR><TR><TD><P>Token Lifetime</P></TD><TD><P>e.g. 60 minutes</P></TD></TR></TBODY></TABLE><P>Save the <EM>Client ID</EM> and <EM>Client Secret </EM>— this is used in ABAP Cloud later on.</P><P><FONT size="5"><STRONG>&nbsp;5&nbsp;</STRONG><STRONG>Creating Communication Artifacts in ABAP Cloud</STRONG></FONT></P><P>Now we configure the outbound technical connection from ABAP Cloud to Datasphere.</P><P>First create an Outbound Service of type HTTP:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Create Outbound Service" style="width: 498px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/371664i6B7CF4506456A6F6/image-dimensions/498x184?v=v2" width="498" height="184" role="button" title="image.png" alt="Create Outbound Service" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Create Outbound Service</span></span></P><P>Create a Communication Scenario with Authentication Methods = OAuth 2.0 only, bind it to your outbound service and publish it:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Communication Scenario Creation" style="width: 618px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/371665iF1366B36E6FF0402/image-dimensions/618x251?v=v2" width="618" height="251" role="button" title="image.png" alt="Communication Scenario Creation" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Communication Scenario Creation</span></span></P><P><EM>Navigation:&nbsp;</EM>ABAP Environment Web Access → Communication Management → Communication Systems</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="ABAP Cloud Web Access" style="width: 671px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/371057i5B672EC77D24D22E/image-dimensions/671x269?v=v2" width="671" height="269" role="button" title="image.png" alt="ABAP Cloud Web Access" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">ABAP Cloud Web Access</span></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="ABAP Cloud Communication Systems" style="width: 672px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/371058i1807DF17EA76120F/image-dimensions/672x113?v=v2" width="672" height="113" role="button" title="image.png" alt="ABAP Cloud Communication Systems" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">ABAP Cloud Communication Systems</span></span></P><P>The hostname is your Datasphere tenant URL. Outbound OAuth URLs (like Token/Authentication) can be found on the Datasphere side under Administration -&gt; App Integration (previous step).</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="ABAP Cloud Communication Systems Details" style="width: 673px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/371059iF14B49A880B877F1/image-dimensions/673x497?v=v2" width="673" height="497" role="button" title="image.png" alt="ABAP Cloud Communication Systems Details" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">ABAP Cloud Communication Systems Details</span></span></P><P>You have to add a user "OAuth 2.0 (Basic)":</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="ABAP Cloud Communication Systems Users" style="width: 672px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/371061i0EC89B23ACC3A7F5/image-dimensions/672x269?v=v2" width="672" height="269" role="button" title="image.png" alt="ABAP Cloud Communication Systems Users" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">ABAP Cloud Communication Systems Users</span></span></P><P><EM>Key fields:</EM></P><TABLE><TBODY><TR><TD><P><EM>Field</EM></P></TD><TD><P><EM>Example</EM></P></TD></TR><TR><TD><P>System ID</P></TD><TD><P>DSP_REST</P></TD></TR><TR><TD><P>Host Name</P></TD><TD><P>&lt;your-datasphere-host&gt; (tenant URL)</P></TD></TR><TR><TD><P>Port</P></TD><TD><P>443</P></TD></TR><TR><TD><P>OAuth 2.0 Endpoints</P></TD><TD><P>From Datasphere for Token &amp; Authorization URL (Audience URL not required)</P></TD></TR><TR><TD><P>Client ID</P></TD><TD><P>Datasphere OAuth Client ID</P></TD></TR><TR><TD><P>Client Secret</P></TD><TD><P>Datasphere Secret (you must take note of this when creating the OAuth Client)</P></TD></TR></TBODY></TABLE><P><FONT size="5"><STRONG>6 Creating a Communication Arrangement in SAP ABAP Cloud</STRONG></FONT></P><P>Now we bind the Communication System to a Communication Scenario that allows REST calls.</P><P><EM>Navigation:&nbsp;</EM>Communication Management → Communication Arrangements</P><P><EM>Arrangement Example: ZDSP_CS_REST</EM></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="ABAP Cloud Communication Arrangements" style="width: 675px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/371062i5D6E57F823E5F6EB/image-dimensions/675x138?v=v2" width="675" height="138" role="button" title="image.png" alt="ABAP Cloud Communication Arrangements" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">ABAP Cloud Communication Arrangements</span></span></P><P>Note the service path: The dynamic parts of the path are set from ABAP (this is to keep the space + task chain flexible and controllable from the actual caller: ABAP).</P><P><EM><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="ABAP Cloud Communication Arrangements Detailed Configuration" style="width: 673px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/371063i82A3F766212E7AA8/image-dimensions/673x334?v=v2" width="673" height="334" role="button" title="image.png" alt="ABAP Cloud Communication Arrangements Detailed Configuration" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">ABAP Cloud Communication Arrangements Detailed Configuration</span></span></EM></P><P><EM>What this provides:</EM></P><UL><LI>Preconfigured service URL</LI><LI>OAuth token handling by ABAP runtime</LI><LI>Secure outbound API consumption</LI></UL><P><FONT size="5"><STRONG>7 Calling the Datasphere Task Chain API from ABAP Cloud</STRONG></FONT></P><P>Now comes the fun part: consuming the REST API. Datasphere exposes endpoints such as:</P><UL><LI>POST /api/v1/datasphere/tasks/chains/&lt;space_id&gt;/run/&lt;task_chain_technical_name&gt;</LI><LI>GET&nbsp;/api/v1/datasphere/tasks/logs/&lt;space_id&gt;/&lt;log_id&gt;</LI></UL><P>Which triggers a new execution or reads the status of a task chain run.</P><P><EM>ABAP Cloud Implementation Pattern</EM></P><P>In ABAP Cloud when working with REST API to integrate external services, you typically:</P><OL><LI>Create HTTP destination automatically from the created Communication Arrangement</LI><LI>Use CL_WEB_HTTP_CLIENT_MANAGER</LI><LI>Perform POST/GET requests</LI><LI>Parse response (run ID, status)</LI></OL><P>The code snippet performs the following parts in more detail:</P><OL><LI><EM>Run as a class-run program</EM> (IF_OO_ADT_CLASSRUN) -&gt; you can execute directly from ADT and print to the console.</LI><LI><EM>Locate the configured Communication Arrangement</EM> (bound to our Communication System DSP_REST) using CL_COM_ARRANGEMENT_FACTORY.</LI><LI><EM>Create an HTTP destination</EM> from the Communication Arrangement using CL_HTTP_DESTINATION_PROVIDER=&gt;CREATE_BY_COMM_ARRANGEMENT.</LI><LI><EM>Create an HTTP client</EM> from the destination (CL_WEB_HTTP_CLIENT_MANAGER).</LI><LI><EM>POST</EM>&nbsp;request to the Task Chain “run” endpoint:</LI><UL><LI>triggers a new run</LI><LI>receives a JSON response containing a <EM>LogId</EM></LI></UL><LI><EM>WAIT</EM> a few seconds.</LI><LI><EM>GET</EM> the log endpoint using the returned&nbsp;<EM>LogId</EM>:</LI><UL><LI>retrieves the execution status (RUNNING, later SUCCESS / FAILED, etc.)</LI></UL><LI>Print everything in the <EM>ABAP Console</EM>.</LI></OL><P>ABAP-Code Snippet:</P><pre class="lia-code-sample language-abap"><code>CLASS zcl_dsp_rest_api DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. INTERFACES if_oo_adt_classrun. CLASS-DATA: out TYPE REF TO if_oo_adt_classrun_out. CLASS-METHODS: call_dsp RAISING cx_http_dest_provider_error cx_web_http_client_error. ENDCLASS. CLASS zcl_dsp_rest_api IMPLEMENTATION. METHOD if_oo_adt_classrun~main. zcl_dsp_rest_api=&gt;out = out. TRY. call_dsp( ). CATCH cx_web_http_client_error cx_http_dest_provider_error INTO DATA(exception). out-&gt;write( exception-&gt;get_text( ) ). ENDTRY. ENDMETHOD. METHOD call_dsp. TYPES: BEGIN OF ty_log, logId TYPE i, END OF ty_log. DATA: ls_log TYPE ty_log. DATA(communication_system) = 'DSP_REST'. DATA(arrangement_factory) = cl_com_arrangement_factory=&gt;create_instance( ). DATA(comm_arrangement_range) = VALUE if_com_arrangement_factory=&gt;ty_query-cs_id_range( ( sign = 'I' option = 'EQ' low = communication_system ) ). arrangement_factory-&gt;query_ca( EXPORTING is_query = VALUE #( cs_id_range = comm_arrangement_range ) IMPORTING et_com_arrangement = DATA(arrangements) ). DATA(arrangement) = arrangements[ 1 ]. DATA(destination) = cl_http_destination_provider=&gt;create_by_comm_arrangement( comm_scenario = 'ZDSP_CS_REST' service_id = 'ZDSP_REST_SRV_REST' comm_system_id = arrangement-&gt;get_comm_system_id( ) ). DATA(http_client) = cl_web_http_client_manager=&gt;create_by_http_destination( destination ). DATA(request) = http_client-&gt;get_http_request( ). request-&gt;set_uri_path( '/chains/BDCPOC/run/TC_DIM2_A001' ). DATA(response) = http_client-&gt;execute( if_web_http_client=&gt;post ). CALL METHOD /ui2/cl_json=&gt;deserialize EXPORTING json = response-&gt;get_text( ) CHANGING data = ls_log. data(log_str) = CONV string( ls_log-logId ). out-&gt;write( 'Task Chain started. LogId created:' &amp;&amp; log_str ). WAIT UP TO 10 SECONDS. CONCATENATE '/logs/BDCPOC/' log_str INTO DATA(uri). clear: request, response, http_client. http_client = cl_web_http_client_manager=&gt;create_by_http_destination( destination ). request = http_client-&gt;get_http_request( ). request-&gt;set_uri_path( uri ). response = http_client-&gt;execute( if_web_http_client=&gt;get ). out-&gt;write( 'Task Chain Log REST API - via GET - Task Chain Status:' &amp;&amp; response-&gt;get_text( ) ). ENDMETHOD. ENDCLASS.</code></pre><P>Once triggered:</P><UL><LI>Datasphere creates a new Task Chain run</LI><LI>Execution can be monitored in Datasphere UI</LI><LI>API returns run ID and status</LI></UL><P>Follow-up calls can fetch:</P><UL><LI>Execution status</LI><LI>Logs</LI><LI>Completion result</LI></UL><P><FONT size="5"><STRONG>8 Execution Results</STRONG></FONT></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="ABAP Cloud Console Log: Results" style="width: 964px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/371044iA43931A0457AB770/image-size/large?v=v2&amp;px=999" role="button" title="image.png" alt="ABAP Cloud Console Log: Results" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">ABAP Cloud Console Log: Results</span></span></P><P>The Task Chain in Datasphere is in Running status:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SAP Datasphere Task Chain Running Status" style="width: 871px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/371046i89C5349410537884/image-size/large?v=v2&amp;px=999" role="button" title="image.png" alt="SAP Datasphere Task Chain Running Status" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">SAP Datasphere Task Chain Running Status</span></span></P><P><FONT size="5"><STRONG>9 Conclusion/Outlook &amp; Further aspects:</STRONG></FONT></P><P><STRONG>Overview of the major building blocks:</STRONG></P><TABLE><TBODY><TR><TD><P><STRONG>Capability</STRONG></P></TD><TD><P><STRONG>Result</STRONG></P></TD></TR><TR><TD><P>Secure Auth</P></TD><TD><P>OAuth 2.0 Client Credentials</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</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><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>CI/CD data pipelines</LI><LI>API-driven analytical data refresh</LI></UL><P><STRONG>References</STRONG></P><UL><LI><SPAN>SAP Datasphere Task Chain API Documentation: </SPAN><A href="https://api.sap.com/api/DatasphereTasks/overview" target="_blank" rel="noopener noreferrer"><SPAN>https://api.sap.com/api/DatasphereTasks/overview</SPAN></A></LI><LI><SPAN>SAP Datasphere Task Chain Help Page: </SPAN><A href="https://help.sap.com/docs/SAP_DATASPHERE/c8a54ee704e94e15926551293243fd1d/274f2736465c4c48a091c675880502a2.html?locale=en-US" target="_blank" rel="noopener noreferrer"><SPAN>https://help.sap.com/docs/SAP_DATASPHERE/c8a54ee704e94e15926551293243fd1d/274f2736465c4c48a091c675880502a2.html?locale=en-US</SPAN></A></LI><LI><SPAN>ABAP Cloud - how to call external APIs: </SPAN><A href="https://jacekw.dev/blog/2022/oauth-client-credentials-from-abap-cloud/" target="_blank" rel="noopener nofollow noreferrer"><SPAN>https://jacekw.dev/blog/2022/oauth-client-credentials-from-abap-cloud/</SPAN></A></LI></UL><P><STRONG>These are your main takeaways to further <U>sharpen</U> the solution:</STRONG></P><UL><LI>Use short token lifetimes</LI><LI>Separate technical OAuth users</LI><LI>Monitor task runs via API from ABAP</LI><LI>Handle retries &amp; failures in ABAP</LI><LI>Log run IDs for observability</LI></UL><P>If you have any aspects, comments and/or concerns, please raise them and let's discuss. I'm happy and proud that this article was written by at least 90% human and only 10% AI <span class="lia-unicode-emoji" title=":slightly_smiling_face:">🙂</span></P> 2026-02-10T16:44:24.061000+01:00 https://community.sap.com/t5/technology-blog-posts-by-sap/a-sap-btp-kyma-encryption-decryption-microservice-for-all-contexts-e-g-sap/ba-p/14326277 A SAP BTP Kyma Encryption/Decryption Microservice for ALL Contexts (e.g. SAP Datasphere/BDC/ABAP) 2026-02-11T16:12:01.099000+01:00 stefan_geiselhart2 https://community.sap.com/t5/user/viewprofilepage/user-id/200897 <P>G’day!</P><P><STRONG>Warning</STRONG>: This is only for readers who are really interested in this subject&nbsp;<span class="lia-unicode-emoji" title=":smiling_face_with_heart_eyes:">😍</span> The article is quite comprehensive and has got some cross-article links inside, that also need to be considered. Therefore: A lot of reading and a lot of hands-on + thinking if you want to rebuild the thing.​</P><P><U>Below is the structure of this article:</U></P><UL><LI><FONT size="3">1 Status Quo on En-/Decryption in BTP</FONT></LI><LI><FONT size="3">2 Motivation</FONT></LI><LI><FONT size="3">3 Fundamentals&nbsp;</FONT></LI><LI><FONT size="3">4 Architecture​</FONT></LI><LI><FONT size="3">5 HDLFS Configuration</FONT></LI><LI><FONT size="3">6 Insights into Python</FONT></LI><LI><FONT size="3">7 Containerization &amp; Deployment in Kyma</FONT></LI><LI><FONT size="3">8 Achievements</FONT></LI><LI><FONT size="3">9 More Scope</FONT></LI><LI><FONT size="3">10 References</FONT></LI></UL><P>Let's begin:</P><P><STRONG><FONT size="5">1 Status Quo on En-/Decryption in BTP</FONT></STRONG></P><P><FONT size="3">When it comes to&nbsp;En-/Decryption on SAP BTP, there are a couple of pitfalls to be considered.&nbsp;</FONT>The following roughly outlines the situation, platform and application-wise:</P><UL><LI>Individual applications (e.g. SAP Successfactors) got proprietary encryption/decryption mechanisms available. They are typically <STRONG>not reusable</STRONG>.</LI><LI><STRONG>SAP Integration Suite has got PGP En-/Decryptor nodes</STRONG> available. However, it is <STRONG><U>not</U> advisable to run</STRONG> large volume scenarios using this approach. It has been built for data sizes on the levels represented within message handling scenarios (I‘m not an expert therein, but I guess thats typically not in the area of GBs).</LI><LI>A policy/rule for data to remain encrypted until its landing into BTP: You face challenges to <STRONG>securely onboard large volume files</STRONG> containing sensitive data <STRONG>into BTP</STRONG>, because there is no out-of-the-box solution to keep them encrypted in motion and decrypt them at rest once available in BTP (and vice versa for an outbound flow).</LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="The Challenge" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/371589i1ED7B676DB32AA4F/image-size/large?v=v2&amp;px=999" role="button" title="image.png" alt="The Challenge" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">The Challenge</span></span></P><P><STRONG><FONT size="5">2 Motivation</FONT></STRONG></P><P>​Due to the above limitations, we were eager to find an appropriate solution approach that first of all satifies our specific scenario, but can also be augmented to other contexts. This is why the following motivation arose:</P><UL><LI>Especially En-/Decryption for larger files on BTP side seems to be a missing piece in the puzzle.</LI><LI>Our ambition is to encapsulate such kind of mechanism centrally as a reusable service. <STRONG>Multiple kinds of contexts can be served</STRONG>, exposing this service: Applications, data flows &amp; transformations etc. – in our context the consumer will be SAP Datasphere.</LI><LI>There is another consequence of finally being able to load decrypted large data sets into BTP. To be more precise: To onboard this data into SAP Datasphere to further process and transform, the fact that Base64 encoded data must be handled in our context too, why not also expose or <STRONG>incorporate columnar Base64 En-/Decoding</STRONG> into the microservice?</LI><LI>The intended solution is <STRONG>custom-built</STRONG> and must be managed individually. However, the baseline that will be set <STRONG>can be reused and adapted</STRONG> to various customer needs and application contexts.</LI></UL><P><STRONG><FONT size="5">3 Fundamentals</FONT></STRONG>&nbsp;</P><P>​The following represent some fundamentals and success criteria we‘ve established for our solution:</P><UL><LI>Use HANA Data Lake Files (<STRONG>HDLFS</STRONG>) as a file store for inbound/outbound persistency</LI><LI>Implement the service as <STRONG>containerized Python</STRONG> code logic</LI><LI>Service capabilities must be <STRONG>controllable and schedulable within Kyma</STRONG></LI><LI>Service can handle <STRONG>PGP encrypted</STRONG> files, but can also decrypt for outbound delivery</LI><LI>Service can decode <STRONG>Base64</STRONG> columns for inbound source files</LI><LI>Service <STRONG>manages and cleans up</STRONG> directories and file in-/output on HDLFS</LI><LI>Service can handle <STRONG>files with sizes in GB range</STRONG></LI><LI>Deploy service into a <STRONG>Kyma Cluster</STRONG> (Cloud Foundry? -&gt; no, Memory/Sizing limitations)</LI><LI><STRONG>Security</STRONG>: Facilitate simple and secure handling of all required secrets and certificates</LI><LI>Service <STRONG>not exposed via HTTP endpoints</STRONG> (this is kind of a contradiction to a true microservice, however this requirement applies in our context. Under "More Scope" you will find guidelines/directions how to enable HTTP based microservices)</LI></UL><P><STRONG><FONT size="5">4 Architecture</FONT></STRONG>​</P><P>The following architectural components represent what we‘ve picked out for our solution:</P><UL><LI>Usage of HANA Data Lake Files (<STRONG>HDLFS</STRONG>) as a file store for <STRONG>inbound/outbound persistency</STRONG></LI><LI>Use <STRONG>BTP Kyma for service runtime</STRONG> (Kyma deployed in the 2nd smallest T-Shirt size)</LI><LI><STRONG>SAP Datasphere</STRONG> represents the <STRONG>persistency layer</STRONG> (DSP as a consumer is exchangeable but in our case relevant for the business scenario)</LI><LI>The other more general blue box "other BTP Solutions" indicates, that the service implementation on Kyma isn't necessary limited to SAP Datasphere only, but should be rather considered as something agnostic. This of course heavily depends how it is built and finally implemented.</LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="BTP Solution Architecture Kyma Microservice" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/371516i29EF2B1C74333CEB/image-size/large?v=v2&amp;px=999" role="button" title="image.png" alt="BTP Solution Architecture Kyma Microservice" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">BTP Solution Architecture Kyma Microservice</span></span></P><P><STRONG><FONT size="5">5 HDLFS Configuration</FONT></STRONG></P><P><FONT size="4">I strongly recommend to read the <A href="https://developers.sap.com/tutorials/data-lake-file-containers-hdlfscli.html" target="_self" rel="noopener noreferrer">tutorial by Jason Hinsperger</A> to familiarize yourself with the HDLFS REST API dependencies and the essential steps to spin up the instance. You must follow all the steps described therein.</FONT></P><P><FONT size="4">Its important to note that the <STRONG>generated client key and client certificate</STRONG> is what you are about to use from python level. Moreover <STRONG>you should take note of the REST API endpoint</STRONG>. This is the endpoint you run all your requests against (you find it in HANA Cloud Central -&gt; Instances -&gt; HDLFS Instance -&gt; "Files REST API Endpoint".).</FONT></P><P><FONT size="4">To familiarize yourself in general with the HDLFS REST API documentation, you can use this <A href="https://help.sap.com/doc/9d084a41830f46d6904fd4c23cd4bbfa/2025_3_QRC/en-US/index.html#tag/WebHDFS" target="_self" rel="noopener noreferrer">link</A>.</FONT></P><P><STRONG><FONT size="5"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="HDLFS REST API Endpoint" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/371618i735BEFA7C02FCA36/image-size/large?v=v2&amp;px=999" role="button" title="image.png" alt="HDLFS REST API Endpoint" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">HDLFS REST API Endpoint</span></span></FONT></STRONG></P><P><FONT size="4">One essential detail I don't want to hide, is the IP whitelisting of the Kyma environment. In order to do that, navigate to the start page of your cluster dashboard. There is a section called "Cluster Overview --&gt; Metadata". Copy the (typically three) IP listed there: "NAT Gateway IP Addresses".</FONT></P><P><FONT size="4">Go to your HANA Cloud Central and navigate to your HDLFS instance. Click "Manage Configuration" and go to the section "Connections": If you have enabled the setting to only allow specific IP addresses, likewise maintain the ones of the Kyma Cluster that you previously copied:</FONT></P><P><FONT size="4"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="HDLFS Configuration Connections" style="width: 706px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/371638i636055B083947539/image-dimensions/706x435?v=v2" width="706" height="435" role="button" title="image.png" alt="HDLFS Configuration Connections" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">HDLFS Configuration Connections</span></span></FONT></P><P><STRONG><FONT size="5">6 Insights into Python</FONT></STRONG></P><P><FONT size="3">The python coding part is split into several modules, which are all described in a detailed way further below:</FONT></P><OL><LI><FONT size="3">Inbound processing</FONT></LI><LI><FONT size="3">Outbound processing</FONT></LI><LI><FONT size="3">Common functions</FONT></LI><LI><FONT size="3">Crypto function for encryption/decryption</FONT></LI></OL><P><FONT size="3"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Python Modules Sketch" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/371586i15DBFF5CC94401F9/image-size/large?v=v2&amp;px=999" role="button" title="image.png" alt="Python Modules Sketch" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Python Modules Sketch</span></span></FONT></P><P><FONT size="4"><STRONG>Inbound Module (1)</STRONG></FONT></P><P>The inbound part scans a given datalake path for <CODE>.gpg</CODE> files, then decrypts each file locally in parallel using a configurable worker count. After decryption, it samples the CSV (semicolon-delimited), detects which columns contain base64-encoded data, and runs a transformation step to produce a cleaned output file. The transformed result is uploaded to a decrypted output path, and the original encrypted input is moved to an archive folder. It logs success or errors with timing details on file level and exits with a failure code if any file fails.</P><P>This code snippet describes the parallel processing of files:</P><pre class="lia-code-sample language-python"><code> with ThreadPoolExecutor(max_workers=MAX_PARALLEL_JOBS) as exe: futs = {exe.submit(processFile, f): f for f in files} for fut in as_completed(futs): f = futs[fut] try: res = fut.result() ok += 1 print(f"[OK] {res['input']} -&gt; {res['output']} sec={res['sec']:.2f} base64_cols={res['base64_cols']}") except Exception as ex: err.append((f, str(ex))) print(f"[ERR] {f}: {ex}")</code></pre><P>Sampel code of processing an individual file:</P><pre class="lia-code-sample language-python"><code>def processFile(file_name: str): t0 = timer() out_name = normalize_output_name(file_name) with tempfile.TemporaryDirectory() as td: enc_path = os.path.join(td, file_name) dec_path = os.path.join(td, out_name + ".decrypted.csv") out_path = os.path.join(td, out_name) download_to_file(f"{PATH_IN_DATALAKE}/{file_name}", enc_path) decrypt_symmetric(enc_path, dec_path) header, sample = sample_csv(dec_path, delimiter=";") base64_cols = detect_base64_columns(out_name, header, sample) transform_csv(dec_path, out_path, base64_cols, delimiter=";") mkdirs(PATH_OUT_DATALAKE) upload_file_chunked(f"{PATH_OUT_DATALAKE}/{out_name}", out_path) mkdirs(PATH_ARCHIVE) rename(f"{PATH_IN_DATALAKE}/{file_name}", f"{PATH_ARCHIVE}/{file_name}") return {"input": file_name, "output": out_name, "base64_cols": base64_cols, "sec": timer() - t0}</code></pre><P><FONT size="4"><STRONG>Outbound module (2)</STRONG></FONT></P><P><FONT size="3">It scans the HDLFS outbound folder for .csv files and subdirectories containing Parquet parts, then processes them in parallel using a configurable worker count. CSV files are downloaded locally, then encrypted and uploaded back again to an encrypted outbound path. The originals are moved to an archive folder. Parquet file based directories on HDLFS (when enabled) are downloaded, consolidated into a single CSV using PyArrow, encrypted and uploaded similarly. As a last step, they are marked with an _SUCCESS file to prevent reprocessing and moved to the archive.&nbsp;</FONT></P><P><FONT size="4"><STRONG>Crypto Module (3)</STRONG></FONT></P><P>It provides helper functions for symmetric file encryption and decryption using the <CODE>gpg</CODE> command-line tool with an AES-256 cipher. It requires a passphrase supplied via the <CODE>PASSPHRASE</CODE> environment variable (from a Kyma Secret). Both <CODE>encrypt_symmetric</CODE> and <CODE>decrypt_symmetric</CODE> execute GPG in batch mode through <CODE>subprocess</CODE>, capturing stdout/stderr and validating the return code.</P><P>The&nbsp;<CODE>decrypt_symmetric</CODE> function is implemented as follows:</P><P>&nbsp;</P><pre class="lia-code-sample language-python"><code>def decrypt_symmetric(enc_path: str, dec_path: str): _require_passphrase() cmd = [ "gpg", "--batch", "--yes", "--pinentry-mode", "loopback", "--passphrase", PASSPHRASE, "--output", dec_path, "--decrypt", enc_path ] r = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) if r.returncode != 0: raise RuntimeError(f"GPG decrypt failed: {r.stderr.decode('utf-8', 'replace')}")</code></pre><P><FONT size="4"><STRONG>Common Functions Module (4)</STRONG></FONT></P><DIV class=""><DIV class=""><DIV class=""><DIV class=""><DIV class=""><DIV class=""><DIV class=""><P>All major control variables are built using environment variables (defined as secrets in Kyma) for endpoint/container, TLS certificates, verification behavior, timeouts, retries, and chunk size.</P><P>In one function it builds a reusable SSL context. API requests are wrapped with exponential-backoff retries for transient HTTP statuses (e.g., 429/5xx) and network errors. It provides HDLFS related helpers to list files/directories, check existence, create directories, rename paths, download remote content to disk in chunks, and upload files.</P><P>The below part builds the SSL context to connect to HDLFS via its REST API:</P></DIV></DIV></DIV></DIV></DIV></DIV></DIV><pre class="lia-code-sample language-python"><code>def buildSSLContext() -&gt; ssl.SSLContext: ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) if os.path.exists(CRT_PATH) and os.path.exists(KEY_PATH): ctx.load_cert_chain(certfile=CRT_PATH, keyfile=KEY_PATH) if TLS_VERIFY: if CA_CERT_PATH: ctx.load_verify_locations(CA_CERT_PATH) else: ctx.load_default_certs() ctx.verify_mode = ssl.CERT_REQUIRED ctx.check_hostname = True else: ctx.check_hostname = False ctx.verify_mode = ssl.CERT_NONE return ctx</code></pre><P><FONT size="4">This part establishes a connection to the HDLFS REST API endpoint as defined in the environment variable FILES_REST_API:</FONT></P><pre class="lia-code-sample language-abap"><code>def _conn(): if not FILES_REST_API: raise RuntimeError("FILES_REST_API is empty (set env FILES_REST_API).") return http.client.HTTPSConnection(FILES_REST_API, timeout=HTTP_TIMEOUT, context=_SSL_CTX)</code></pre><P><FONT size="4">The below function represents the upload (HDLFS REST API PUT) of a file in streaming mode to an HDLFS directory:</FONT></P><pre class="lia-code-sample language-python"><code>def _put_to_location(location: str): url = urlparse(location) if u.scheme and u.netloc: host = url.netloc path = (url.path or "/") + (("?" + url.query) if url.query else "") conn = http.client.HTTPSConnection(host, timeout=HTTP_TIMEOUT, context=_SSL_CTX) else: path = location conn = _conn() try: conn.putrequest("PUT", path) conn.putheader("x-sap-filecontainer", CONTAINER) conn.putheader("Content-Type", "application/octet-stream") conn.putheader("Content-Length", str(size)) conn.putheader("Connection", "close") conn.endheaders() with open(file_path, "rb") as f: while True: chunk = f.read(CHUNK_SIZE) if not chunk: break conn.send(chunk) r = conn.getresponse() data = r.read() status = r.status r.close() if status in _RETRYABLE_STATUSES: raise RetryableHttpError(f"PUT retryable: {status} {data[:200]!r}") if status not in (200, 201): raise RuntimeError(f"PUT failed {remote_path_no_leading_slash}: {status} {data[:200]!r}") finally: conn.close()</code></pre><P><STRONG><FONT size="5">7 Containerization &amp; Deployment in Kyma</FONT></STRONG></P><P>​I won't describe in detail, how the creation of a docker container is made step by step. I just provide some essentials + hints to guarantee that you succeed and don't stumble upon the same issues I had faced. The following prerequisites must be met in order to create a runnable docker container based on your Dockerfile + python code:</P><UL><LI>​Local installation of docker (Docker Desktop)</LI><LI>Docker registry (e.g. GitHub Docker Registry) – this is from where the Pod pulls the docker image</LI><LI>kubectl cli</LI><LI>IDE such as Visual Studio code</LI></UL><P>​For an overall procedure, including the part in Kyma, you can refer to this <A href="http://​https://community.sap.com/t5/technology-blog-posts-by-members/develop-and-deploy-python-rest-api-with-kubernetes-docker-in-sap-btp-kyma/ba-p/13533279" target="_blank" rel="noopener nofollow noreferrer">blog entry on SCN</A>. I strongly recommend that you try to rebuild the example the author walks through first, BEFORE you tackle your actual project.</P><P>Recommendations out of my personal learnings:</P><UL><LI>Try to not create any Kyma artifacts via the UI, but rather define those within descriptor yaml files of the corresponding kinds (e.g. kind: Deployment or Service or APIRule).</LI><LI><STRONG>​!!!</STRONG> A minor but very important thing to consider when running the docker build command, run it as follows:</LI></UL><pre class="lia-code-sample language-bash"><code>docker build . --tag ghcr.io/&lt;github_user&gt;/&lt;git_repo_name&gt;:latest --platform linux/amd64</code></pre><UL><LI>The deployment.yaml in the blog specified above is based on three Kyma/K8S artifacts that are created: <STRONG>Deployment, Service + APIRule</STRONG>. Which kind of artifacts you actually require strongly depends on your python implementation and how your service/logic runs. In the event of a purely job schedule based execution of your processing logic, <STRONG>you don't need a service or APIRule</STRONG> artifact, of course. Instead, you'd only need a <STRONG>deployment of kind: CronJob</STRONG>. This will spin up all dependent artifacts implicitely. In a CronJob based deployment you will have to specify the following details in the yaml file: scheduling details (time, frequency, time zone), required volumes, container spec including secrets to pull image, container level: mounts &amp; env variables, resource allocation.</LI><LI>A template for a CronJob based deployment can look like this:</LI></UL><pre class="lia-code-sample language-json"><code>apiVersion: batch/v1 kind: CronJob metadata: name: &lt;job_name&gt; namespace: &lt;kyma_namespace&gt; spec: suspend: false schedule: "* * * * *" timeZone: "Europe/Berlin" jobTemplate: spec: backoffLimit: 3 template: spec: restartPolicy: Never imagePullSecrets: - name: ghcr-pull-secret volumes: - name: gnupg-home emptyDir: {} initContainers: - name: init-gnupg image: busybox:1.36 command: ["sh","-c","mkdir -p /tmp/gnupg &amp;&amp; chmod 700 /tmp/gnupg"] volumeMounts: - name: gnupg-home mountPath: /tmp/gnupg resources: requests: cpu: "10m" memory: "32Mi" limits: cpu: "50m" memory: "64Mi" containers: - name: inbound image: &lt;container_registry_path&gt; imagePullPolicy: Always command: [&lt;custom_os_level_command_if_required&gt;] volumeMounts: - name: gnupg-home mountPath: /tmp/gnupg env: - name: KEY_PATH value: "/keys/keyfile.key" - name: PASSPHRASE valueFrom: secretKeyRef: name: kyma-secret key: PASSPHRASE resources: requests: cpu: "100m" memory: "1Gi" limits: cpu: "200m" memory: "2Gi"</code></pre><P><STRONG><FONT size="5">8 Achievements</FONT></STRONG></P><P>​The following functionality and service details were delivered:</P><UL><LI>The Python code was improved multiple times: Handling approx. 30 files in one go with a total of 10 GB in encrypted state could be accelerated to &lt; 30 minutes of processing time</LI><LI>Cron Jobs in the Kyma cluster can be used to schedule individual services, e.g. inbound processing of files that reside in a specific folder on HDLFS</LI><LI>SAP Datasphere writes local tables via Replication Flows back into HDLFS, on which the outbound service performs encryption and marks the files to „collectible“</LI></UL><P><STRONG><FONT size="5">9 More Scope</FONT></STRONG></P><P><FONT size="4">...up to come soon. I will cover aspects how to further mature the microservice/python logic and moreover exemplify on HTTP based encryption/decryption service endpoints, exposed on the Kyma Cluster.</FONT></P><P><FONT size="4"><STRONG><FONT size="5">10 References</FONT></STRONG></FONT></P><P><A href="https://community.sap.com/t5/technology-blog-posts-by-members/develop-and-deploy-python-rest-api-with-kubernetes-docker-in-sap-btp-kyma/ba-p/13533279" target="_self">​K8S/Kyma + Python SCN Blog</A></P><P><A href="http://​https://developers.sap.com/tutorials/data-lake-file-containers-hdlfscli.html" target="_self" rel="nofollow noopener noreferrer">​Getting Started with Data Lake Files HDLFSCLI</A></P><P><A href="http://​&nbsp;https://help.sap.com/doc/9d084a41830f46d6904fd4c23cd4bbfa/2025_3_QRC/en-US/index.html#tag/WebHDFS" target="_self" rel="nofollow noopener noreferrer">​HDLFS REST API Guide</A></P><P><FONT size="4"><STRONG><FONT size="5">Thx...</FONT></STRONG></FONT></P><P><FONT size="4">...to my fellow colleagues at SAP who provides meaningful input and discussed about solution options. Furthermore I am especially grateful to our implementation partner who also supported, implemented and showed strong endurance in building up this scenario.</FONT></P><P><FONT size="4">I hope you enjoyed reading this article and could have gained some deeper insights into what we did. If you have comments or suggestions of any kind, don't hesitate to comment and start-off a discussions with me and hopefully other SMEs.</FONT></P> 2026-02-11T16:12:01.099000+01:00 https://community.sap.com/t5/technology-blog-posts-by-members/yaai-cloud-abap-ai-tools-cloud-version/ba-p/14327764 yaai_cloud - ABAP AI tools Cloud version 2026-02-16T08:04:23.543000+01:00 ChristianSilva https://community.sap.com/t5/user/viewprofilepage/user-id/608785 <P><STRONG>yaai_cloud - ABAP AI tools Cloud version</STRONG><BR /><I>Open-Source AI Tools for ABAP Developers</I></P><P>A few months after releasing the <A href="https://community.sap.com/t5/technology-blog-posts-by-members/yaai-amp-yaai-ui-open-source-ai-tools-for-abap-developers/ba-p/14145639" target="_blank">ABAP AI tools</A> last year, I started working on a new version, created specifically for ABAP Cloud environments.</P><P>I decided to build a cloud version for a couple of reasons. First, for the challenge itself. I had no idea how far I could go in developing these tools, given the restrictions of the SAP BTP ABAP Trial Environment compared to an on‑premise system, where we can essentially do anything we want. Second, not everyone has access to an on‑premise ABAP system to install and experiment with these tools. Since AI tools can introduce security risks, we need to be careful not to expose sensitive data. And finally, this was a great opportunity to build something more complex in a SAP BTP ABAP environment and explore features that only exist in SAP BTP ABAP Environments.</P><P>So, let me introduce the <STRONG>ABAP AI tools Cloud version</STRONG>.</P><P>This new version comes with many more features and a different approach compared to the on‑premise version. The Cloud version was built with AI agent development as its primary focus, and all the tooling is designed to support ABAP developers in building and testing AI agents.</P><P>It also includes a library with a variety of tools for function calling, most of them related to ABAP development tasks and built on top of the <A href="https://help.sap.com/docs/btp/sap-business-technology-platform/overview-of-xco-modules?locale=en-US" target="_self" rel="noopener noreferrer">XCO Library</A>. These tools allow AI agents to create and maintain DDIC objects, messages, translations, classes, interfaces, and more.</P><P>The ABAP AI tools Cloud is organized into four packages:</P><UL><LI>ABAP AI tools Cloud - <A href="https://github.com/christianjianelli/yaai_cloud" target="_blank" rel="noopener nofollow noreferrer">https://github.com/christianjianelli/yaai_cloud</A></LI><LI>ABAP AI tools Cloud Function Calling - <A href="https://github.com/christianjianelli/yaai_cloud_fc" target="_blank" rel="noopener nofollow noreferrer">https://github.com/christianjianelli/yaai_cloud_fc</A></LI><LI>ABAP AI tools Cloud REST API - <A href="https://github.com/christianjianelli/yaai_cloud_rest" target="_blank" rel="noopener nofollow noreferrer">https://github.com/christianjianelli/yaai_cloud_rest</A></LI><LI>ABAP AI tools Cloud Cockpit - <A href="https://github.com/christianjianelli/yaai_cloud_cockpit" target="_blank" rel="noopener nofollow noreferrer">https://github.com/christianjianelli/yaai_cloud_cockpit</A></LI></UL><P>The first package contains all the core objects that form the foundation of the ABAP AI tools Cloud.</P><P>The other packages provide additional resources and features, such as the function calling library and the Cockpit, which makes it easier to manage settings and test AI agents.</P><P>There is also a fifth package, <STRONG>yaai_cloud_examples</STRONG> (<A href="https://github.com/christianjianelli/yaai_cloud_examples" target="_self" rel="nofollow noopener noreferrer">https://github.com/christianjianelli/yaai_cloud_examples</A>), which, as the name suggests, contains examples of how to use the tools.</P><P><STRONG>AI Agents Development using ABAP AI tools Cloud</STRONG></P><P>AI agents need at least two fundamental things: <STRONG>guidance</STRONG> and <STRONG>tools</STRONG>.</P><P>To guide an AI agent, we provide system instructions that define its role, responsibilities, and how it should use the available tools.</P><P>For the agentic part, we need to supply tools that the AI agent can call so it can perform tasks in the system on our behalf.</P><P>In ABAP AI tools Cloud, there are basically two ways to develop AI agents.</P><P>The first is to manually set everything in the code, the model, its settings, the system instructions, the tools, and so on.</P><P>The second way is to configure an AI agent by assigning an LLM model, defining the model settings, configuring the system instructions markdown document, registering the tools available to the agent, and so on.</P><P>Let’s look at two coding examples to compare the two development options.</P><P>In this first example, everything is defined directly in the code.</P><PRE>CLASS zcl_aaic_example_fc_openai DEFINITION PUBLIC FINAL CREATE PUBLIC . PUBLIC SECTION. INTERFACES if_oo_adt_classrun. PROTECTED SECTION. PRIVATE SECTION. ENDCLASS. CLASS ZCL_AAIC_EXAMPLE_FC_OPENAI IMPLEMENTATION. METHOD if_oo_adt_classrun~main. DATA: l_api_key TYPE string, l_message TYPE string, l_system_instructions TYPE string. DATA(lo_aaic_conn) = NEW ycl_aaic_conn( i_api = yif_aaic_const=&gt;c_openai ). lo_aaic_conn-&gt;set_api_key( i_api_key = l_api_key ). DATA(lo_aaic_db) = NEW ycl_aaic_db( i_api = yif_aaic_const=&gt;c_openai ). DATA(lo_aaic_openai) = NEW ycl_aaic_openai( i_model = 'gpt-5' i_o_connection = lo_aaic_conn i_o_persistence = lo_aaic_db ). l_system_instructions = |# Identity\n|. l_system_instructions = |{ l_system_instructions }You are a friendly and helpful math support assistant.\n|. l_system_instructions = |{ l_system_instructions }Your primary role is to assist users with mathematical questions and problems.\n|. l_system_instructions = |{ l_system_instructions }You must use the provided calculation tools to solve numerical problems, ensuring accuracy.\n|. l_system_instructions = |{ l_system_instructions }Never do the calculations yourself. Always use the provided tools instead, respecting the results returned.\n|. l_system_instructions = |{ l_system_instructions }Call one tool at a time. You must wait for the result from one tool before making any subsequent tool calls.\n|. l_system_instructions = |{ l_system_instructions }Never send multiple tool calls at once.\n|. l_system_instructions = |{ l_system_instructions }Always be patient, encouraging, and explain your steps in a clear and understandable way.\n|. lo_aaic_openai-&gt;set_system_instructions( l_system_instructions ). DATA(lo_function_calling) = NEW ycl_aaic_func_call_openai( ). lo_function_calling-&gt;add_methods( VALUE #( ( class_name = 'zcl_aaic_math_tools' method_name = 'add' description = 'Use this method to add two numbers (i_num1 + i_num2)' ) ( class_name = 'zcl_aaic_math_tools' method_name = 'subtract' description = 'Use this method to subtract two numbers (i_num1 - i_num2)' ) ( class_name = 'zcl_aaic_math_tools' method_name = 'multiply' description = 'Use this method to multiply two numbers (i_num1 * i_num2)' ) ( class_name = 'zcl_aaic_math_tools' method_name = 'divide' description = 'Use this method to divide two numbers (i_num1 / i_num2)' ) ) ). lo_aaic_openai-&gt;bind_tools( lo_function_calling ). l_message = 'Hi there! What is the result of 5 + 7?'. lo_aaic_openai-&gt;chat( EXPORTING i_message = l_message IMPORTING e_t_response = DATA(lt_response) ). out-&gt;write( lt_response ). ENDMETHOD. ENDCLASS.</PRE><P>In the second example, we make use of a configured AI agent.</P><PRE>CLASS zcl_aaic_example_openai_agent DEFINITION PUBLIC FINAL CREATE PUBLIC . PUBLIC SECTION. INTERFACES if_oo_adt_classrun. PROTECTED SECTION. PRIVATE SECTION. ENDCLASS. CLASS ZCL_AAIC_EXAMPLE_OPENAI_AGENT IMPLEMENTATION. METHOD if_oo_adt_classrun~main. DATA: l_api_key TYPE string, l_message TYPE string. DATA(lo_aaic_conn) = NEW ycl_aaic_conn( i_api = yif_aaic_const=&gt;c_openai ). lo_aaic_conn-&gt;set_api_key( i_api_key = l_api_key ). DATA(lo_aaic_db) = NEW ycl_aaic_db( i_api = yif_aaic_const=&gt;c_openai ). DATA(lo_agent) = NEW ycl_aaic_agent( i_agent_id = CONV #( 'C6111BEC04B71FE0B9DFCCB09425F70E' ) "Replace the agent id with your agent id i_chat_id = lo_aaic_db-&gt;m_id ). DATA(lo_aaic_openai) = NEW ycl_aaic_openai( i_model = 'gpt-5-nano' i_o_connection = lo_aaic_conn i_o_persistence = lo_aaic_db i_o_agent = lo_agent ). l_message = 'What data elements does the package yaai_cloud contain?'. lo_aaic_openai-&gt;chat( EXPORTING i_message = l_message IMPORTING e_t_response = DATA(lt_response) ). out-&gt;write( lt_response ). ENDMETHOD. ENDCLASS.</PRE><P><STRONG>ABAP AI tools Cloud Cockpit</STRONG></P><P>Configuring an AI agent in ABAP AI tools Cloud involves maintaining a bunch of database tables. To make this whole process easier, the <A href="https://github.com/christianjianelli/yaai_cloud_cockpit" target="_self" rel="nofollow noopener noreferrer">ABAP AI tools Cloud Cockpit</A> was built. It’s a frontend application designed to streamline the development of AI agents created with ABAP AI tools Cloud.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="cockpit-main-view-screenshot.jpg" style="width: 100%px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/372655i1F897E606CDE8FA1/image-size/large?v=v2&amp;px=999" role="button" title="cockpit-main-view-screenshot.jpg" alt="cockpit-main-view-screenshot.jpg" /></span></P><P><STRONG>ABAP AI tools Cloud Cockpit Main Features</STRONG></P><P><U>Configuration</U></P><UL><LI>Setup of LLM APIs</LI><LI>Setup of tools for function calling</LI><LI>Setup of documents for RAG (Retrieval Augmented Generation)</LI><LI>Setup of AI agents</LI></UL><P><U>Testing and Monitoring</U></P><UL><LI>Integrated Chat</LI><LI>Chat Monitoring</LI><LI>System Logs</LI><LI>Background Task Monitoring</LI></UL><P><STRONG>Configuring AI Agents</STRONG></P><P>The configuration of AI agents in the Cockpit is a simple process that basically consists of the following steps:</P><UL><LI>Register the tools (function calling).&gt;</LI><LI>Upload the markdown file containing the system instructions.</LI><LI>Create the agent and assign the system instructions.</LI><LI>Assign the tools you want the AI agent to have access to.</LI><LI>Set the LLM model and its parameters.</LI></UL><P>In the tools section we register the tools.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="cockpit-tools-view-screenshot.jpg" style="width: 100%px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/372725i7C6B7A8F2FD2AEEC/image-size/large?v=v2&amp;px=999" role="button" title="cockpit-tools-view-screenshot.jpg" alt="cockpit-tools-view-screenshot.jpg" /></span></P><P>In the documents section, we can upload and edit markdown documents.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="cockpit-documents-view-screenshot.jpg" style="width: 100%px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/372726i56AB5524CF4F2CC3/image-size/large?v=v2&amp;px=999" role="button" title="cockpit-documents-view-screenshot.jpg" alt="cockpit-documents-view-screenshot.jpg" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="cockpit-document-view-screenshot.jpg" style="width: 100%px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/372724i6C7FD42046DCF14A/image-size/large?v=v2&amp;px=999" role="button" title="cockpit-document-view-screenshot.jpg" alt="cockpit-document-view-screenshot.jpg" /></span></P><P>Once we have the tools registered and the system instructions uploaded, we can proceed with the agent creation and configuration, which is done in the Agents section.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="cockpit-agent-view-screenshot-1.jpg" style="width: 100%px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/372727i4E5F25D218436AFF/image-size/large?v=v2&amp;px=999" role="button" title="cockpit-agent-view-screenshot-1.jpg" alt="cockpit-agent-view-screenshot-1.jpg" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="cockpit-agent-view-screenshot-2.jpg" style="width: 100%px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/372728iE4D1F2CA0EF2AD76/image-size/large?v=v2&amp;px=999" role="button" title="cockpit-agent-view-screenshot-2.jpg" alt="cockpit-agent-view-screenshot-2.jpg" /></span></P><P><STRONG>Testing AI Agents</STRONG></P><P>But the ABAP AI tools Cloud Cockpit is really helpful when it comes to testing AI agents. Once we’ve developed all the tools the agent needs, defined the system instructions, and added any extra documentation it may require to accomplish its tasks, we don’t need to jump straight into writing code to test and debug it. Instead, we can use the testing tooling available in the cockpit.</P><P>The ABAP AI tools Cloud Cockpit comes with some handy features that make testing and analyzing an AI agent’s execution much easier and much faster.</P><P><U>Integrated Chat</U></P><P>The Cockpit includes an integrated chat on the right side, which we can use to test the AI agent.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="cockpit-integrated-chat-screenshot.jpg" style="width: 100%px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/372684i63EEE6DE2646A710/image-size/large?v=v2&amp;px=999" role="button" title="cockpit-integrated-chat-screenshot.jpg" alt="cockpit-integrated-chat-screenshot.jpg" /></span></P><P><U>Chat Monitoring</U></P><P>In the chat monitoring view, we can see all the messages exchanged with the AI agent, including the tool calls and their corresponding responses.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="cockpit-chat-view-screenshot-1.jpg" style="width: 100%px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/372712i2764814764AF7AD4/image-size/large?v=v2&amp;px=999" role="button" title="cockpit-chat-view-screenshot-1.jpg" alt="cockpit-chat-view-screenshot-1.jpg" /></span></P><P>Another really useful feature is the message sequence diagram, where we can visualize the entire conversation flow, including the tools that were called and the exact order in which they were triggered.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="cockpit-chat-view-screenshot-2.jpg" style="width: 100%px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/372715i164CDDD5B4A33449/image-size/large?v=v2&amp;px=999" role="button" title="cockpit-chat-view-screenshot-2.jpg" alt="cockpit-chat-view-screenshot-2.jpg" /></span></P><P>And last but not least, there is the system log, which can be extremely helpful when things go wrong, like communication errors or unexpected behavior.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="cockpit-chat-view-screenshot-3.jpg" style="width: 100%px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/372716iA678A06B79AD95D6/image-size/large?v=v2&amp;px=999" role="button" title="cockpit-chat-view-screenshot-3.jpg" alt="cockpit-chat-view-screenshot-3.jpg" /></span></P><P><STRONG>Built‑in Tools</STRONG></P><P>The ABAP AI Tools Cloud core package <STRONG>yaai_cloud</STRONG> comes with a few built‑in tools that are bundled with the core components because of their importance. Their main goal is simple: <STRONG>keep the context window as small as possible.</STRONG></P><P><U>Retrieval Augmented Generation (RAG) tools.</U></P><P>Class: ycl_aaic_rag_tools</P><P>Methods:</P><UL><LI><SPAN>get_list_of_documents</SPAN></LI><LI><SPAN>get_documentation</SPAN></LI></UL><P>Instead of relying on a vector database to retrieve documents (or chunks of documents), the strategy here is a bit different. The idea is to provide tools that the LLM can use to first fetch a list of all available documentation. From there, the LLM decides which documents it actually needs in order to perform the task it was instructed to execute.</P><P>Once it knows what it needs, it can request the specific documents using the corresponding tool. With this approach, we avoid loading unnecessary information into the context window, keeping it as small and focused as possible.</P><P><U>Function‑Calling Related Tools.</U></P><P>Class: ycl_aaic_func_call_tools</P><P>Methods:</P><UL><LI><SPAN>get_available_tools</SPAN></LI><LI><SPAN>request_tools</SPAN></LI></UL><P>These tools follow the same philosophy as the RAG tools. The goal is identical: <STRONG>keep the context window as small as possible</STRONG>.</P><P>Instead of loading the JSON schema of every available tool into the context window upfront, we let the LLM first retrieve a list of available tools. Then it can request only the ones it actually needs to perform its task. This avoids overloading the context window with information that might never be used and gives the model more control over what it pulls in.</P><P><STRONG>Closing Thoughts</STRONG></P><P>There’s still a lot more to cover about the ABAP AI tools Cloud, but I’ll save that for future blog posts.</P><P>The official documentation is available in the GitHub repositories. It’s still a work in progress, but I’m actively updating it and will do my best to complete it as soon as possible.</P><P>Thanks for reading, and I hope these tools help you have some fun building AI agents in ABAP Cloud.</P><DIV><FONT size="2"><EM>ABAP AI tools Cloud is released under the MIT License.</EM></FONT></DIV> 2026-02-16T08:04:23.543000+01:00 https://community.sap.com/t5/abap-blog-posts/transport-developer-extensibility-artifacts-in-sap-public-cloud/ba-p/14329300 Transport Developer Extensibility Artifacts in SAP Public Cloud 2026-02-17T09:04:00.881000+01:00 Sanketsethi https://community.sap.com/t5/user/viewprofilepage/user-id/122565 <P class="lia-align-center" style="text-align: center;"><FONT size="5" color="#000080"><STRONG>Transport Developer Extensibility Artifacts<BR /></STRONG></FONT></P><P><FONT color="#000080"><STRONG>&nbsp;</STRONG><STRONG>Introduction:&nbsp;</STRONG></FONT></P><P>In the SAP S/4HANA Public Cloud 3-System Landscape (3SL), developers often face challenges when transporting extensibility artifacts across environments. While the customizing tenant (client 100) is dedicated to configuration, the development tenant (client 080) is where ABAP coding and developer extensibility take place.<BR /><BR />This blog aims to provide a high-level overview of how developer extensibility artifacts (such as custom CDS views and service bindings) can be moved upstream in the landscape.<BR /><BR />It also highlights important restrictions, such as the absence of a transport path from ADT-created objects into the customizing tenant, and points to SAP Note 3324929 for further clarification. By walking through a practical example, we will explore the steps required to expose CDS views securely via OData services and ensure smooth integration with external systems.</P><P>To set the context, here’s a quick snapshot of the artifacts available through developer extensibility and key user extensibility.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Sanketsethi_0-1771245761035.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/373053i2070B0091FB50310/image-size/medium?v=v2&amp;px=400" role="button" title="Sanketsethi_0-1771245761035.png" alt="Sanketsethi_0-1771245761035.png" /></span></P><P><FONT color="#000080"><STRONG>Detailed Explanation:</STRONG></FONT></P><P>When working with developer extensibility in SAP S/4HANA Public Cloud, one common requirement is to expose custom CDS views so they can be consumed by integration teams. However, due to technical restrictions in the cloud environment, you cannot directly publish an OData service from a CDS view using the <a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1599241">@odata</a>.publish: true annotation. Instead, the recommended approach is to expose the CDS view through a service binding.</P><P>Let’s walk through the process step by step. We begin in the <STRONG>development tenant (client 080)</STRONG>.</P><UL><LI>Create a Custom CDS view in ADT</LI><LI>Create Service Definition to expose your CDS view</LI><LI>Create Service Binding – Select Binding type as per your need. In this example, OData V4 - Web API is selected</LI><LI>Publish your Service Binding</LI><LI>It will then generate an Inbound service</LI><LI>Security is a critical aspect here. To ensure that your OData service is protected, you must configure authentication, which forms the basis for secure external consumption.</LI><LI>To do this you need to create a Communication Scenario in Development tenant (Client 080)</LI><LI>In ADT, create a Communication Scenario.</LI></UL><UL><LI>Give this new Communication Scenario a name starting with "Z". e.g., ZSAP_COM_825</LI><LI>Add needed Inbound Service ID:</LI><OL><LI>Click the<STRONG>&nbsp;Inbound&nbsp;</STRONG>configuration</LI><LI>Click the&nbsp;<STRONG>Add</STRONG>&nbsp;button</LI><LI>Click the<STRONG>&nbsp;Browse</STRONG>&nbsp;button</LI><LI>Select the&nbsp;<STRONG>S_PRIVILEGED_SQL1</STRONG><BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Sanketsethi_1-1771245761039.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/373054iB89935F8854E3998/image-size/medium?v=v2&amp;px=400" role="button" title="Sanketsethi_1-1771245761039.png" alt="Sanketsethi_1-1771245761039.png" /></span><P>&nbsp;</P></LI></OL><LI>Add Authorization Object:</LI><OL><LI>Click the&nbsp;<STRONG>Authorization</STRONG>&nbsp;configuration</LI><LI>Click the&nbsp;<STRONG>Insert</STRONG>&nbsp;button</LI><LI>Search for&nbsp;<STRONG>SQL_VIEW</STRONG></LI><LI>Select&nbsp;<STRONG>SQL_VIEW<BR /></STRONG><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Sanketsethi_2-1771245761044.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/373052i270E4D980F7664F0/image-size/medium?v=v2&amp;px=400" role="button" title="Sanketsethi_2-1771245761044.png" alt="Sanketsethi_2-1771245761044.png" /></span><P>&nbsp;</P></LI><LI>Expand Authorization 0001</LI><OL><LI>SQL_SCHEMA:&nbsp;The name of the&nbsp;<STRONG>Service Binding&nbsp;</STRONG>(exposed as a schema) that you want to grant access to<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Sanketsethi_3-1771245761046.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/373056i6FA735BFDCA3424A/image-size/medium?v=v2&amp;px=400" role="button" title="Sanketsethi_3-1771245761046.png" alt="Sanketsethi_3-1771245761046.png" /></span><P>&nbsp;</P></LI><LI>SQL_VIEW:&nbsp;Comma-separated list of all CDS view entities to which you want to grant access or&nbsp;*&nbsp;(if you want to allow access to all CDS view entities in the service definition)<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Sanketsethi_4-1771245761048.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/373055i5D1F107F04A480BA/image-size/medium?v=v2&amp;px=400" role="button" title="Sanketsethi_4-1771245761048.png" alt="Sanketsethi_4-1771245761048.png" /></span><P>&nbsp;</P></LI><LI>SQL_VIEWOP:&nbsp;Choose at least one option</LI></OL></OL></UL><P>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;For Remote Tables → Choose&nbsp;<STRONG>SELECT<BR /></STRONG></P><P>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Sanketsethi_5-1771245761050.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/373057i2DF0709E4339AC03/image-size/medium?v=v2&amp;px=400" role="button" title="Sanketsethi_5-1771245761050.png" alt="Sanketsethi_5-1771245761050.png" /></span></P><P>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;For Replication Flows → Choose&nbsp;<STRONG>REPLICATE<BR /></STRONG></P><P>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Sanketsethi_6-1771245761052.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/373058iFDD078F6A6875D53/image-size/medium?v=v2&amp;px=400" role="button" title="Sanketsethi_6-1771245761052.png" alt="Sanketsethi_6-1771245761052.png" /></span></P><UL><LI>Click the&nbsp;<STRONG>Publish Locally</STRONG>&nbsp;button<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Sanketsethi_7-1771245761054.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/373059i463D1F9B8E0CBD11/image-size/medium?v=v2&amp;px=400" role="button" title="Sanketsethi_7-1771245761054.png" alt="Sanketsethi_7-1771245761054.png" /></span></LI></UL><P>You are all done from Development tenant (Client 080). The next stage takes place in the <STRONG>customizing tenant (client 100)</STRONG>.</P><P>Login to your Customizing tenant.</P><UL><LI>Create the Communication arrangement using the scenario delivered from 080</LI><LI>Open the&nbsp;<STRONG>Communication Arrangements</STRONG>&nbsp;APP.</LI></UL><UL><LI>Click the&nbsp;<STRONG>New</STRONG>&nbsp;button.</LI><LI>Search for the required scenario.</LI><LI>Click the required scenario.</LI><LI>Rename the&nbsp;<STRONG>Arrangement Name.</STRONG></LI><LI>Click the<STRONG>&nbsp;Create&nbsp;</STRONG>button.<STRONG><BR /></STRONG><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Sanketsethi_8-1771245761059.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/373060iBE9EBE3DA342DA2C/image-size/medium?v=v2&amp;px=400" role="button" title="Sanketsethi_8-1771245761059.png" alt="Sanketsethi_8-1771245761059.png" /></span><STRONG>&nbsp;</STRONG><P>&nbsp;</P></LI></UL><UL><LI><STRONG>Configurate the Communication Arrangement</STRONG></LI></UL><OL><LI>Select the<STRONG>&nbsp;Customer&nbsp;Communication system</STRONG>.</LI><LI>Record the&nbsp;<STRONG>API-URL</STRONG>. e.g., &nbsp;<A href="https://myxxxxxx-api.lab.s4hana.cloud.sap/" target="_blank" rel="noopener nofollow noreferrer">https://myXXXXXX-api.s4hana.cloud.sap</A><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Sanketsethi_9-1771245761065.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/373061iA9D8D6D73754B431/image-size/medium?v=v2&amp;px=400" role="button" title="Sanketsethi_9-1771245761065.png" alt="Sanketsethi_9-1771245761065.png" /></span><P>&nbsp;</P>Click the&nbsp;<STRONG>Save</STRONG>&nbsp;button.<STRONG><BR /></STRONG><DIV class="">&nbsp;</DIV></LI></OL><P>Congratulations <span class="lia-unicode-emoji" title=":party_popper:">🎉</span><span class="lia-unicode-emoji" title=":party_popper:">🎉</span>, you are all set now and ready to push your transport into upward environments. Now you can get CDS data from this API. You can test it from Postman and connect to this API using IS tools for example CPI.</P><P><STRONG>Tip</STRONG><span class="lia-unicode-emoji" title=":light_bulb:">💡</span><BR />If your Communication Scenario does not appear in client 100, then most likely you have not published it in Development tenant (client 080).</P><P>&nbsp;</P><P><FONT color="#000080"><STRONG>Additional information:</STRONG></FONT></P><P>Why You can't See Communication Arrangements in the Export Software Collection App</P><P>SAP clearly states that:</P><UL><LI>The <STRONG>Export Software Collection</STRONG> app is used only for <STRONG>key‑user extensibility objects</STRONG> (custom CDS, custom fields, custom logic, custom business objects, UI changes, etc.)</LI><LI><STRONG>Communication Arrangements are <EM>not</EM> part of key user extensibility</STRONG>; therefore, they don’t appear in software collections.</LI></UL><P>This is explained in the SAP 3‑System Landscape transport overview.</P><P>&nbsp;</P><TABLE width="614"><TBODY><TR><TD width="200"><P><STRONG>Object Type</STRONG></P></TD><TD width="253"><P><STRONG>Can appear in Software Collection?</STRONG></P></TD><TD width="161"><P><STRONG>Transport Method</STRONG></P></TD></TR><TR><TD width="200"><P>Custom CDS (Key User)</P></TD><TD width="253"><P>Yes</P></TD><TD width="161"><P>Software Collection</P></TD></TR><TR><TD width="200"><P>Custom Business Objects</P></TD><TD width="253"><P>Yes</P></TD><TD width="161"><P>Software Collection</P></TD></TR><TR><TD width="200"><P>UI Flex Changes</P></TD><TD width="253"><P>Yes</P></TD><TD width="161"><P>Software Collection</P></TD></TR><TR><TD width="200"><P>Custom Communication Scenarios (ADT)</P></TD><TD width="253"><P>No</P></TD><TD width="161"><P>Developer Transport</P></TD></TR><TR><TD width="200"><P>SQL Service Bindings (ADT)</P></TD><TD width="253"><P>No</P></TD><TD width="161"><P>Developer Transport</P></TD></TR></TBODY></TABLE><P>For this simple reason:</P><P><span class="lia-unicode-emoji" title=":backhand_index_pointing_right:">👉</span> <STRONG>Communication Arrangements do not appear in Software Collections</STRONG><BR /><span class="lia-unicode-emoji" title=":backhand_index_pointing_right:">👉</span> <STRONG>Communication Arrangements do not move inside developer transports</STRONG><BR /><span class="lia-unicode-emoji" title=":backhand_index_pointing_right:">👉</span> <STRONG>Communication Arrangements must be created manually in every system</STRONG></P><P>SAP’s official help states Communication Arrangements must be configured through the Communication Arrangements app, <STRONG>per system</STRONG>.<BR /><BR /><STRONG>Clean and Simple summary:</STRONG></P><TABLE width="623"><TBODY><TR><TD width="189"><P><STRONG>Object</STRONG></P></TD><TD width="107"><P><STRONG>Transportable</STRONG></P></TD><TD width="119"><P><STRONG>Moves Automatically?</STRONG></P></TD><TD width="89"><P><STRONG>Appears in TEST?</STRONG></P></TD><TD width="120"><P><STRONG>Action needed</STRONG></P></TD></TR><TR><TD width="189"><P>Custom Communication Scenario (ADT)</P></TD><TD width="107"><P>Yes (developer transport)</P></TD><TD width="119"><P>Yes</P></TD><TD width="89"><P>Visible</P></TD><TD width="120"><P>Nothing</P></TD></TR><TR><TD width="189"><P>Communication Arrangement (client 100)</P></TD><TD width="107"><P>No</P></TD><TD width="119"><P>No</P></TD><TD width="89"><P>Not Visible</P></TD><TD width="120"><P>Should be created in each client</P></TD></TR></TBODY></TABLE><P><STRONG>&nbsp;</STRONG></P><P>So, What Must You Do Now? (<STRONG>Correct</STRONG> Next Step)</P><P>In the <STRONG>TEST system</STRONG>, you must now <EM>manually recreate</EM> the Communication Arrangement:</P><OL><LI>Log in to <STRONG>TEST</STRONG> system</LI><LI>Open <STRONG>Communication Arrangements</STRONG> app</LI><LI>Click <STRONG>New</STRONG></LI><LI>Select your transported scenario</LI><LI>Create the arrangement</LI><LI>Re-select:</LI><LI>Communication System</LI><LI>Communication User</LI><LI>Authentication method</LI><LI>Any inbound/outbound parameters</LI><LI>Save</LI></OL><P>&nbsp;</P><P><FONT color="#000080"><STRONG>Conclusion:</STRONG></FONT></P><P>Transporting developer extensibility artifacts in SAP Public Cloud requires a clear understanding of what can and cannot be moved automatically. While custom CDS views, service definitions, and communication scenarios created in ADT are transportable through developer transports, <STRONG>communication arrangements</STRONG> remain system-specific and must be recreated manually in each environment. This distinction is crucial for ensuring secure and consistent integration across the landscape.</P><P>By following the outlined steps: creating CDS views, service bindings, and communication scenarios in the <STRONG>development tenant</STRONG>, then configuring communication arrangements in the <STRONG>customizing tenant</STRONG>, you can successfully expose your CDS data via OData services and make it consumable for integration tools like SAP CPI.</P><P>Ultimately, this process reinforces the importance of separating extensibility artifacts from environment-specific configurations, ensuring both flexibility and compliance in SAP’s cloud transport model.</P> 2026-02-17T09:04:00.881000+01:00 https://community.sap.com/t5/technology-blog-posts-by-sap/live-demos-at-the-sap-btp-abap-environment-customer-amp-partner-roundtable/ba-p/14328427 Live Demos at the SAP BTP ABAP Environment Customer & Partner Roundtable – 03 March 2026 2026-02-17T09:22:16.939000+01:00 Burcu_Karlidag https://community.sap.com/t5/user/viewprofilepage/user-id/151005 <P>Join our next <STRONG>SAP BTP ABAP Environment Customer &amp; Partner Roundtable</STRONG> on <STRONG>03.03.2026 (10:00–11:00 CET)</STRONG>&nbsp;</P><P>Packed with live demos and product insights:</P><P><span class="lia-unicode-emoji" title=":small_blue_diamond:">🔹</span><STRONG>Fiori Elements development with building blocks </STRONG>(Katrin Polloczek &amp; Marcel Wächter)</P><P><span class="lia-unicode-emoji" title=":small_blue_diamond:">🔹</span><STRONG>New My Home&nbsp;</STRONG>(Caroline Welsh)</P><P><span class="lia-unicode-emoji" title=":small_blue_diamond:">🔹</span><STRONG>Product Updates&nbsp;</STRONG>(Frank Jentsch)</P><P>The roundtable is a <STRONG>monthly series</STRONG> taking place on the <STRONG>first Tuesday of every month (10:00–11:00 CET)</STRONG>.</P><P><SPAN class="lia-unicode-emoji"><span class="lia-unicode-emoji" title=":backhand_index_pointing_right:">👉</span></SPAN><STRONG>Download the</STRONG><SPAN>&nbsp;</SPAN><STRONG><A href="https://github.com/iwonahahn/SAP-BTP-ABAP-Environment-Roundtable/releases/download/v26/SAP.BTP.ABAP.Environment.Customer.und.Partner.Roundtable.ics" target="_self" rel="nofollow noopener noreferrer">.ics calendar file</A><SPAN>&nbsp;</SPAN>for the full 2026 series</STRONG><SPAN>&nbsp;and&nbsp;import it directly into your calendar.</SPAN><BR /><SPAN>Each calendar entry already includes the Microsoft Teams meeting link.</SPAN></P><P><SPAN>Microsoft Teams meeting link (valid for the entire 2026 series):&nbsp;<A href="https://teams.microsoft.com/l/meetup-join/19%3ameeting_YTE0YzFlNGMtMDA2NC00NThlLWEzYWQtNWExNzU3MmRmNGE1%40thread.v2/0?context=%7b%22Tid%22%3a%2242f7676c-f455-423c-82f6-dc2d99791af7%22%2c%22Oid%22%3a%223d2a93aa-8f6e-4294-826f-80727ddf8588%22%7d" target="_self" rel="nofollow noopener noreferrer">Microsoft Teams meeting link</A>&nbsp;</SPAN></P><P><SPAN>All agendas, slides, recordings, and updates from past and current sessions are published centrally via the</SPAN><BR /><A href="https://pages.community.sap.com/topics/btp-abap-environment/customer-partner-roundtable" target="_self" rel="noopener noreferrer"><STRONG>SAP Community – SAP BTP ABAP Environment Customer &amp; Partner Roundtable.</STRONG></A></P><P>We’re looking forward to seeing you there!</P> 2026-02-17T09:22:16.939000+01:00 https://community.sap.com/t5/technology-blog-posts-by-members/setting-the-right-expectations-around-ai-for-code-generation-and-getting/ba-p/14327300 Setting the right expectations around AI for code generation and getting past the inherent limits 2026-02-17T11:02:11.670000+01:00 dirk_roeckmann https://community.sap.com/t5/user/viewprofilepage/user-id/191581 <P>With over two decades of working on AI, starting with my master's thesis on multi-layer perceptrons, I’m excited about the recent innovations in this area, especially as related to code generation. In this blog post, I want to share my perspective on using AI in a very specific context: coding with AI agents based on transformer models, as these are the primary tools we have at our disposal for this purpose today. I’ll start with why I use AI and then share some limitations of AI models and how to get around these pitfalls. Let’s start with a quick definition…</P><H3 id="toc-hId-1918754781">Generative AI is Only One Form of Artificial Intelligence</H3><P>There's a lot of buzz around Artificial Intelligence (AI) these days, and it feels like every conversation about technology eventually lands on this topic. However, the term "AI" is often automatically conflated with "Generative AI" (GenAI). It's important to make a quick distinction. AI is the broad field of making machines smart. Machine Learning (ML) is a subset of AI that uses data to train models, and Deep Learning (DL) is a further subset of ML using neural networks. GenAI, which creates new content, is the latest evolution that has captured everyone's imagination.</P><H2 id="toc-hId-1593158557">Why I Use AI</H2><H3 id="toc-hId-1525727771">AI is Practical</H3><P>Large Language Models (LLMs) have provided us with an unprecedented natural language interface. This makes them incredibly powerful for tasks like web search and information retrieval, where a human can quickly verify the results. Coding is a domain where outputs are verifiable, which makes AI agents a significant efficiency booster. They aren't here to replace us, but to augment our abilities.</P><P>It's crucial to remember that <STRONG>LLMs have zero semantic understanding</STRONG>. They are masters of syntax, predicting the next word (or token) in a sequence through an auto-regressive process. They don't "understand" code; they predict what code should look like.</P><H3 id="toc-hId-1329214266">AI Adds Value to My Work</H3><P>From my experience, AI brings tangible benefits to my development workflow. Here’s how:</P><UL><LI><STRONG>Understanding Codebases:</STRONG> When jumping into a new or complex project, I use AI to get a quick summary of how different parts of the code interact.</LI><LI><STRONG>Project Planning:</STRONG> Through agent orchestration, AI can help outline project structures, suggest potential components, and map out dependencies.</LI><LI><STRONG>Code Documentation:</STRONG> This is a huge one. AI is exceptionally good at generating boilerplate documentation, docstrings, and comments, which frees me up to focus on the more complex descriptions.</LI><LI><STRONG>Enforcing Guidelines:</STRONG> We can use AI to enforce <STRONG>Clean Core</STRONG> principles and other coding guidelines, ensuring that our code remains compliant and release-ready.</LI></UL><H3 id="toc-hId-1132700761">My History with AI</H3><P>My journey with AI didn't start with the recent hype. It goes back to my college days, long before I entered the SAP ecosystem. My master's thesis was on multi-layer perceptrons and scaled conjugate gradient descent methods. Ever since then, I've been independently researching and following the advancements in this fascinating field.</P><H2 id="toc-hId-807104537">Potential Pitfalls with AI and Take-aways</H2><H3 id="toc-hId-739673751">Differences Between Prompts and Target Language</H3><P>Natural language is inherently ambiguous, imprecise, and often not concise. Science, and by extension software development, is about making formal, unambiguous statements. The greatest leaps in scientific history, like the formalization of algebra by Leibniz and Newton, came from moving <EM>away</EM> from rhetorical natural language and <EM>towards</EM> formal paradigms. The programming languages we use today are a natural evolution of this.</P><P>So-called "vibe coding," where one tries to build complex systems using only conversational language, is great for keynotes and simple examples but falls apart for enterprise-grade systems. I've seen attempts to "formalize" prompts to make agents more reliable, but this is a self-defeating exercise. You end up re-inventing a formal programming language, the very thing you were trying to avoid.</P><P><STRONG>Take-away:</STRONG> This is a fundamental problem that won't be solved by simply scaling models. My practical advice is to iteratively update your agent's prompts and instructions as you code. Let the agent update its own instructions when it runs into issues. And most importantly: <STRONG>never commit code without verifying it yourself</STRONG><STRONG>.</STRONG> Human experience is still an absolute necessity.</P><H3 id="toc-hId-543160246">Predicting Syntax vs. Understanding Semantics</H3><P>As mentioned, all modern coding agents are based on a <STRONG>transformer</STRONG> architecture. They predict syntax, token by token, without any semantic intelligence or understanding of programming metaconcepts. They operate on a vast joint probability distribution and can generalize well <EM>within</EM> that distribution.</P><P>However, when faced with an out-of-distribution (OOD) prompt, they "hallucinate." While syntax prediction without semantic understanding is often "good enough" to boost the efficiency of an experienced software engineer, it's irresponsible to leave critical design decisions to these agents without human oversight.</P><P><STRONG>Take-away:</STRONG> Until a new paradigm emerges that gives AI true semantic understanding, human oversight is paramount. Used responsibly, AI is an incredibly rewarding tool that greatly supports our daily work.</P><H3 id="toc-hId-346646741">Hallucinations (First and Higher Order)</H3><P>OOD prompts lead to what I call "first-order hallucinations," where the LLM itself can't generalize and essentially makes things up. The answers are unreliable and require verification. Methods to minimize this include training on more data (scaling) or grounding the LLM with symbolic systems like databases or knowledge graphs.</P><P>This leads to what I term "higher-order hallucinations." The grounded data source might be perfectly accurate. However, to access it, the agent must translate your natural language prompt into a formal query. If it hallucinates during this translation, it can create an invalid query (getting no data) or a faulty query that retrieves the <EM>wrong</EM> correct data. The source is clean, but the retrieval is flawed.</P><P><STRONG>Take-away:</STRONG> In the absence of a new paradigm, it's best to use simpler query sequences instead of one complex one. Simplify the toolset available to your agents and bundle related tasks into a single tool to minimize these translation errors.</P><H3 id="toc-hId-150133236">Non-Determinism in Answers</H3><P>While the forward-pass of a transformer is deterministic, the token decoding phase is not. This means if you prompt an LLM five times, you might get five different answers. For coding, this is problematic. Even with the temperature parameter set to zero, non-determinism persists.</P><P><STRONG>Take-away:</STRONG> You never know if you've received the "best" possible generated code, and neither does the AI. This makes human verification absolutely critical, always. For mass refactoring, a robust review process is essential. Interestingly, review agents can help here, but the final decision must rest with a human.</P><H3 id="toc-hId--121611638">Explainability &amp; Verifiability</H3><P>LLMs are notoriously black boxes. Billions of floating-point numbers don't offer a semantic explanation for <EM>why</EM> a particular answer was generated. Research into making these models more transparent is still in its infancy. The lack of semantic understanding, paired with non-determinism, makes true explainability incredibly difficult.</P><P><STRONG>Take-away:</STRONG> For now, the only option for users is to wait for new research and paradigms to emerge.</P><H2 id="toc-hId--24722136">TL;DR</H2><OL><LI>Human oversight is critical until AI gains a true semantic understanding, which it currently lacks.</LI><LI>Use generative AI to speed your coding, but…</LI><LI>Never commit code without verifying it yourself.</LI><LI>Use simpler query sequences instead of one complex one.</LI><LI>Have a robust code-review process with humans making the final decision.</LI></OL><H2 id="toc-hId--221235641">Next Steps</H2><P>It is irresponsible for any serious software engineer to ignore the current suite of AI tools, despite their shortcomings. Demonizing them is counter-productive. For those who know what they're doing, these tools are massive efficiency boosters. With responsible use and human oversight, they can be successfully integrated into enterprise workflows and offer many opportunities to improve the human-machine interface.</P><H2 id="toc-hId--417749146">Outlook</H2><P>We should not believe all the hype or inflate our expectations of what AI can realistically do today. At the same time, we shouldn't refrain from engaging with these tools in a meaningful way. We, the developers, are still the ones with the creativity, innovation, and semantic understanding. Let's use these tools to amplify that.</P><P>Happy coding!</P><P>What are your thoughts? Share your experiences with AI in the comments below!</P> 2026-02-17T11:02:11.670000+01:00 https://community.sap.com/t5/enterprise-resource-planning-blog-posts-by-sap/all-that-you-love-to-know-about-srmprotocol/ba-p/14331438 All that you love to know about SRMPROTOCOL 2026-02-19T09:33:37.572000+01:00 Nanjundesh https://community.sap.com/t5/user/viewprofilepage/user-id/1615055 <P>Please note that the term SRM used here stands for SAP Records Management.<BR /><BR />Managing SAP database growth is a constant balancing act between system performance and compliance. If you’ve noticed the <STRONG>SRMPROTOCOL</STRONG> table climbing to the top of your "Top Growth" charts, you aren't alone. With some systems housing billions of records, understanding and managing this table is critical for a healthy SAP environment.</P><P>Here is a guide on what SRMPROTOCOL does, how to control it, and how to reclaim your space.</P><HR /><H2 id="toc-hId-1790417899">1. Understanding SRMPROTOCOL: The "Who, When, and What"</H2><P>At its core, the <STRONG>SRMPROTOCOL</STRONG> table functions as the audit trail for SAP Records and Case Management. Whenever a case or record or document in SRM is created, modified, or deleted, the system generates an entry here to maintain a history of activity.</P><UL><LI><P><STRONG>Audit Importance:</STRONG> This table is vital for legal and regulatory requirements. It ensures that businesses can track the lifecycle of a document or case for accountability.</P></LI><LI><P><STRONG>Data Content:</STRONG> It stores the "SPS ID" (Service Provider Selection ID) and timestamps that link back to specific business objects.</P></LI></UL><P>Because these logs track every granular change, the table can grow exponentially in high-volume environments, eventually impacting database performance and backup times.</P><HR /><H2 id="toc-hId-1593904394">2. How to Control Log Growth</H2><P>You don't have to let the table grow indefinitely. SAP provides built-in mechanisms to define how long these logs should live before they are eligible for removal.</P><H3 id="toc-hId-1526473608">Check Your Current Configuration</H3><P>To see how your system is currently handled, follow these steps:</P><OL><LI><P>Execute Transaction <STRONG>SRMREGEDIT</STRONG>.</P></LI><LI><P>Locate the <STRONG>SPS ID</STRONG> relevant to your business (you can find these IDs within the SRMPROTOCOL table itself).</P></LI><LI><P>Double-click the <STRONG>SPS Element ID</STRONG>.</P></LI><LI><P>Navigate to the <STRONG>Classification</STRONG> tab to view the specific logging parameters.</P></LI></OL><H3 id="toc-hId-1329960103">Define "Log Keep Days"</H3><P>Every organization has different audit requirements. SAP allows you to customize the <STRONG>expiry time</STRONG> for these logs. By setting a specific "retention period," you ensure that the system only flags entries for deletion once they are no longer legally or operationally required.</P><P>More details available in the <A title="SRMPROTOCOL Logging" href="https://help.sap.com/docs/ABAP_PLATFORM_NEW/09006942e22a470ea79db9236cfc66ee/4d48d85b7ca10b4ae10000000a42189e.html?q=archiv&amp;locale=en-US&amp;version=LATEST" target="_blank" rel="noopener noreferrer">Records Management Logging</A>&nbsp;product documentation page.</P><HR /><H2 id="toc-hId-1004363879">3. Cleaning Up and Reducing Space</H2><P>Once you have defined your retention policies, there are two primary methods to reduce the size of the SRMPROTOCOL table: <STRONG>Deletion</STRONG> or <STRONG>Archiving</STRONG>.</P><P>&nbsp;</P><TABLE><TBODY><TR><TD><STRONG>Feature</STRONG></TD><TD><STRONG>Option A: Deletion</STRONG></TD><TD><STRONG>Option B: Archiving&nbsp;</STRONG>(Recommended for Compliance)</TD></TR><TR><TD width="117.156px" height="242px"><STRONG>Primary Tool</STRONG></TD><TD width="364.836px" height="242px">FM - SRM_PROTOCOL_DELETE_EXPIRY<BR />SAP Note 795613</TD><TD width="389.508px" height="242px"><P>&nbsp;If you are using Records Management as a standalone product, t-code <STRONG>ORGANIZER</STRONG>, consider referring to&nbsp;<A title="https://help.sap.com/docs/abap_platform_new/09006942e22a470ea79db9236cfc66ee/4d41470c9bfa5c4be10000000a42189e.html?q=archiv&amp;locale=en-us&amp;version=latest" href="https://help.sap.com/docs/ABAP_PLATFORM_NEW/09006942e22a470ea79db9236cfc66ee/4d41470c9bfa5c4be10000000a42189e.html?q=archiv&amp;locale=en-US&amp;version=LATEST" target="_blank" rel="noreferrer noopener"><STRONG>Archiving in Records Management</STRONG></A>&nbsp;to handle logs related to documents and records. <STRONG>Case Management:</STRONG> If you are using the framework of Case Management, t-code <STRONG>SCASE</STRONG>, consider referring to&nbsp;<A title="https://help.sap.com/docs/abap_platform_new/8ce194a1a3a24911ab5679318167e841/4d4cca1e49f2348be10000000a42189e.html?q=folders+management&amp;locale=en-us&amp;version=latest" href="https://help.sap.com/docs/ABAP_PLATFORM_NEW/8ce194a1a3a24911ab5679318167e841/4d4cca1e49f2348be10000000a42189e.html?q=folders+management&amp;locale=en-US&amp;version=LATEST" target="_blank" rel="noreferrer noopener"><STRONG>Archiving in Case Management</STRONG></A><STRONG>&nbsp;</STRONG>for logs specifically tied to cases.</P></TD></TR><TR><TD width="117.156px" height="77px"><STRONG>Data Retention</STRONG></TD><TD width="364.836px" height="77px">Data is <STRONG>permanently removed</STRONG> from the system.</TD><TD width="389.508px" height="77px"><P>Data can be moved to <STRONG>long-term storage</STRONG> (external files).</P></TD></TR><TR><TD width="117.156px" height="57px"><STRONG>Best Use Case</STRONG></TD><TD width="364.836px" height="57px">When logs are past their legal "Keep Days" and no longer needed.</TD><TD width="389.508px" height="57px">When logs must be kept for 5–10 years for audit/legal compliance.</TD></TR><TR><TD width="117.156px" height="57px"><STRONG>System Impact</STRONG></TD><TD width="364.836px" height="57px">Immediate reduction in table row count; requires a "Reorg" to shrink disk files.</TD><TD width="389.508px" height="57px">High initial effort to set up, but provides a sustainable long-term solution.</TD></TR><TR><TD width="117.156px" height="77px"><STRONG>Accessibility</STRONG></TD><TD width="364.836px" height="77px"><P>Logs are deleted forever once the function module is processed.</P></TD><TD width="389.508px" height="77px"><P>Logs remain accessible via archive search tools if needed.</P></TD></TR><TR><TD width="117.156px" height="132px"><P><STRONG>Handling Large Volumes</STRONG></P></TD><TD width="364.836px" height="132px"><P>If you have a massive table, do not run the FM online. Instead, wrap the Function Module in a <STRONG>custom report</STRONG> and execute it as a <STRONG>background job</STRONG> to avoid timeouts and system strain.</P></TD><TD width="389.508px" height="132px"><P>Archiving is handled within the archiving framework. Each step is ideally scheduled as background job</P></TD></TR></TBODY></TABLE><P>&nbsp;</P><P><SPAN>&nbsp;</SPAN></P> 2026-02-19T09:33:37.572000+01:00 https://community.sap.com/t5/beginner-corner-blog-posts/understanding-the-basic-terminologies-of-sap-cloud-world-a-beginner/ba-p/14320880 Understanding the Basic Terminologies of SAP Cloud World : A Beginner ‑ Friendly Guide 2026-02-19T10:03:58.866000+01:00 chandra_maverick1506 https://community.sap.com/t5/user/viewprofilepage/user-id/2199531 <DIV>𝗗𝗲𝗺𝘆𝘀𝘁𝗶𝗳𝘆𝗶𝗻𝗴 𝗦/𝟰𝗛𝗔𝗡𝗔, 𝗕𝗧𝗣, 𝗥𝗔𝗣 &amp; 𝗖𝗔𝗣, 𝗥𝗜𝗦𝗘 𝗪𝗜𝗧𝗛 𝗦𝗔𝗣, 𝗖𝗹𝗲𝗮𝗻 𝗖𝗼𝗿𝗲, 𝗖𝗙𝗟, 𝗦𝗶𝗱𝗲 𝗯𝘆 𝗦𝗶𝗱𝗲 𝗘𝘅𝘁𝗲𝗻𝘀𝗶𝗯𝗶𝗹𝗶𝘁𝘆 - 𝗔 𝗣𝗿𝗮𝗰𝘁𝗶𝗰𝗮𝗹 𝗝𝗼𝘂𝗿𝗻𝗲𝘆 𝗳𝗼𝗿 𝗔𝗕𝗔𝗣 𝗗𝗲𝘃𝗲𝗹𝗼𝗽𝗲𝗿𝘀</DIV><DIV>&nbsp;</DIV><DIV>𝟭. 𝗦/𝟰𝗛𝗔𝗡𝗔 𝗗𝗲𝗽𝗹𝗼𝘆𝗺𝗲𝗻𝘁 𝗠𝗼𝗱𝗲𝗹𝘀 𝗘𝘅𝗽𝗹𝗮𝗶𝗻𝗲𝗱</DIV><DIV>&nbsp;</DIV><DIV>𝗢𝗻-𝗣𝗿𝗲𝗺𝗶𝘀𝗲&nbsp;</DIV><DIV>✔ You own/manage servers like ECC&nbsp;</DIV><DIV>✔ Full ABAP Freedom - Custom Code, Debug, SE80/ADT</DIV><DIV>&nbsp;</DIV><DIV>𝗣𝗿𝗶𝘃𝗮𝘁𝗲 𝗖𝗹𝗼𝘂𝗱</DIV><DIV>✔&nbsp; SAP Manages Servers for you(𝗦𝗶𝗻𝗴𝗹𝗲 𝗧𝗲𝗻𝗮𝗻𝘁)</DIV><DIV>✔ Limited Custom Code - Must Follow Clean Core Principles</DIV><DIV>&nbsp;</DIV><DIV>𝗣𝘂𝗯𝗹𝗶𝗰 𝗖𝗹𝗼𝘂𝗱</DIV><DIV>✔ Shared Infrastructure(𝗠𝘂𝗹𝘁𝗶 𝗧𝗲𝗻𝗮𝗻𝘁)</DIV><DIV>✔ No Custom ABAP - Extensions Via BTP only</DIV><DIV>&nbsp;</DIV><DIV>𝟮. 𝗦𝗶𝗻𝗴𝗹𝗲 𝗧𝗲𝗻𝗮𝗻𝘁 𝗩𝘀 𝗠𝘂𝗹𝘁𝗶 𝗧𝗲𝗻𝗮𝗻𝘁 : 𝗧𝗵𝗲 𝗛𝗼𝘂𝘀𝗶𝗻𝗴 𝗔𝗻𝗮𝗹𝗼𝗴𝘆</DIV><DIV>&nbsp;</DIV><DIV>𝗨𝗻𝗱𝗲𝗿𝘀𝘁𝗮𝗻𝗱𝗶𝗻𝗴 𝘁𝗵𝗲 𝗔𝗿𝗰𝗵𝗶𝘁𝗲𝗰𝘁𝘂𝗿𝗲 𝗗𝗶𝗳𝗳𝗲𝗿𝗲𝗻𝗰𝗲</DIV><DIV>&nbsp;</DIV><DIV>■ 𝗣𝗿𝗶𝘃𝗮𝘁𝗲 𝗖𝗹𝗼𝘂𝗱( 𝗦𝗶𝗻𝗴𝗹𝗲 𝗧𝗲𝗻𝗮𝗻𝘁 )</DIV><DIV>&nbsp;</DIV><DIV>𝗛𝗼𝘂𝘀𝗶𝗻𝗴 𝗔𝗻𝗮𝗹𝗼𝗴𝘆 : You Rent an entire independent house - SAP is your Landlord who Maintains it, but you're the only resident.</DIV><DIV>&nbsp;</DIV><DIV>𝗪𝗵𝗮𝘁 𝘁𝗵𝗶𝘀 𝗠𝗲𝗮𝗻𝘀 :</DIV><DIV>✔&nbsp; Your Data is Completely isolated from other companies</DIV><DIV>✔ You get your own dedicated hardware/software stack</DIV><DIV>✔ SAP manages infrastructure ( Servers, OS, backups )</DIV><DIV>✔ You still control configurations and some customizations</DIV><DIV>&nbsp;</DIV><DIV>𝗘𝘅𝗮𝗺𝗽𝗹𝗲:</DIV><DIV>Company A :&nbsp; Server 1 Running S/4 HANA Instance A</DIV><DIV>Company B :&nbsp; Server 2 Running S/4 HANA Instance B</DIV><DIV>Company C : Server 3 Running S/4 HANA Instance c</DIV><DIV>&nbsp;</DIV><DIV>Each Company has their own 𝗦𝗲𝗽𝗮𝗿𝗮𝘁𝗲 𝗶𝗻𝘀𝘁𝗮𝗹𝗹𝗮𝘁𝗶𝗼𝗻.</DIV><DIV>&nbsp;</DIV><DIV>&nbsp;</DIV><DIV>■&nbsp; 𝗣𝘂𝗯𝗹𝗶𝗰 𝗖𝗹𝗼𝘂𝗱&nbsp;</DIV><DIV>&nbsp;</DIV><DIV>𝗛𝗼𝘂𝘀𝗶𝗻𝗴 𝗔𝗻𝗮𝗹𝗼𝗴𝘆: You rent an apartment in a shared building - many families live in the same building, sharing elevators/parking but have separate locked units.</DIV><DIV>&nbsp;</DIV><DIV>𝗪𝗵𝗮𝘁 𝗧𝗵𝗶𝘀 𝗠𝗲𝗮𝗻𝘀:</DIV><DIV>✔ Your data is logically separated (like database partitions)</DIV><DIV>✔ Same software version for all customers (no custom patches)</DIV><DIV>✔ Shared infrastructure (like AWS/Azure multi-tenancy)</DIV><DIV>✔ No custom ABAP allowed (everyone uses same codebase)</DIV><DIV>&nbsp;</DIV><DIV>𝗘𝘅𝗮𝗺𝗽𝗹𝗲:</DIV><DIV>Single Server → Single S/4 Instance</DIV><DIV>&nbsp; ├── Company A Data (Tenant ID: 001)</DIV><DIV>&nbsp; ├── Company B Data (Tenant ID: 002)</DIV><DIV>&nbsp; └── Company C Data (Tenant ID: 003)</DIV><DIV>&nbsp;</DIV><DIV>𝗥𝗲𝗮𝗹-𝗪𝗼𝗿𝗹𝗱 𝗖𝗼𝗺𝗽𝗮𝗿𝗶𝘀𝗼𝗻</DIV><DIV>𝗣𝗿𝗶𝘃𝗮𝘁𝗲 𝗖𝗹𝗼𝘂𝗱 𝗶𝘀 𝗹𝗶𝗸𝗲:</DIV><DIV>Having your own ECC system but SAP hosts the servers</DIV><DIV>✔ You still get your own environment (DEV/QAS/PRD)</DIV><DIV>✔ Can have some customizations (within clean core limits)</DIV><DIV>&nbsp;</DIV><DIV>𝗣𝘂𝗯𝗹𝗶𝗰 𝗖𝗹𝗼𝘂𝗱 𝗶𝘀 𝗹𝗶𝗸𝗲:</DIV><DIV>✔ Using Gmail - Google's servers, everyone uses same version</DIV><DIV>✔ You can't modify Gmail's code - only configure it</DIV><DIV>✔ Cost-effective but zero flexibility</DIV><DIV>&nbsp;</DIV><DIV>𝗪𝗵𝗶𝗰𝗵 𝗖𝗼𝗺𝗽𝗮𝗻𝗶𝗲𝘀 𝘂𝘀𝗲 𝘄𝗵𝗮𝘁 ?</DIV><DIV>Manufacturing(Large) - Private Cloud/ On premise ( Heavy Customizations )</DIV><DIV>Retail(Small/mid) - Public Cloud ( Standard Process, Fast Deployments )</DIV><DIV>Start ups - Public cloud ( Cost Effective )</DIV><DIV>&nbsp;</DIV><DIV>𝟯. 𝗪𝗵𝗮𝘁 𝗶𝘀 𝗥𝗜𝗦𝗘 𝘄𝗶𝘁𝗵 𝗦𝗔𝗣 ?</DIV><DIV>&nbsp;</DIV><DIV>𝗥𝗜𝗦𝗘 𝗶𝘀 𝗡𝗢𝗧 𝗮 𝗽𝗿𝗼𝗱𝘂𝗰𝘁 - 𝗶𝘁'𝘀 𝗮 𝘀𝘂𝗯𝘀𝗰𝗿𝗶𝗽𝘁𝗶𝗼𝗻 𝗽𝗮𝗰𝗸𝗮𝗴𝗲 like buying a car with insurance/maintenance bundled.</DIV><DIV>&nbsp;</DIV><DIV>𝗥𝗜𝗦𝗘 = 𝗦/𝟰𝗛𝗔𝗡𝗔 𝗖𝗹𝗼𝘂𝗱 (𝗣𝗿𝗶𝘃𝗮𝘁𝗲/𝗣𝘂𝗯𝗹𝗶𝗰) + 𝗕𝗧𝗣 + 𝗦𝘂𝗽𝗽𝗼𝗿𝘁 + 𝗠𝗶𝗴𝗿𝗮𝘁𝗶𝗼𝗻 𝗧𝗼𝗼𝗹𝘀</DIV><DIV>&nbsp;</DIV><DIV>For you as a developer: It's just a licensing model. Your actual work doesn't change drastically unless your company chooses Public Cloud.</DIV><DIV>&nbsp;</DIV><DIV>𝟰. 𝗪𝗵𝗮𝘁 𝗶𝘀 𝗕𝗧𝗣? 𝗧𝗵𝗲 𝗦𝗶𝗺𝗽𝗹𝗲 𝗧𝗿𝘂𝘁𝗵</DIV><DIV>&nbsp;</DIV><DIV>𝗕𝗧𝗣 (𝗕𝘂𝘀𝗶𝗻𝗲𝘀𝘀 𝗧𝗲𝗰𝗵𝗻𝗼𝗹𝗼𝗴𝘆 𝗣𝗹𝗮𝘁𝗳𝗼𝗿𝗺) is SAP's cloud platform where you build apps that extend S/4HANA without touching its core code.</DIV><DIV>&nbsp;</DIV><DIV>𝗢𝗹𝗱 𝗘𝗖𝗖 𝗪𝗮𝘆 (𝗬𝗼𝘂𝗿 𝗖𝘂𝗿𝗿𝗲𝗻𝘁 𝗪𝗼𝗿𝗹𝗱):</DIV><DIV>" Customer asks: "We need a custom approval workflow for purchase orders"</DIV><DIV>&nbsp;</DIV><DIV>" 𝗬𝗼𝘂 𝗱𝗼 𝘁𝗵𝗶𝘀:</DIV><DIV>1. Create Z-table (SE11)</DIV><DIV>2. Write custom ABAP program (SE38/SE80)</DIV><DIV>3. Modify standard SAP transaction (User Exit/BADI)</DIV><DIV>4. Add custom fields to EKKO table</DIV><DIV>&nbsp;</DIV><DIV>𝗥𝗲𝘀𝘂𝗹𝘁: System becomes "dirty" → upgrades break your code</DIV><DIV>&nbsp;</DIV><DIV>𝗦/𝟰 + 𝗕𝗧𝗣 𝗪𝗮𝘆 (𝗡𝗲𝘄 𝗔𝗽𝗽𝗿𝗼𝗮𝗰𝗵):</DIV><DIV>You do this:</DIV><DIV>1. Keep S/4HANA standard (no modifications)</DIV><DIV>2. Build approval app on BTP (separate system)</DIV><DIV>3. Connect to S/4 via APIs</DIV><DIV>4. Store custom data in BTP database</DIV><DIV>&nbsp;</DIV><DIV>𝗥𝗲𝘀𝘂𝗹𝘁: S/4 stays "clean" → smooth upgrades</DIV><DIV>&nbsp;</DIV><DIV>𝟱. 𝗥𝗔𝗣 𝘃𝘀 𝗖𝗔𝗣</DIV><DIV>✔ 𝗥𝗔𝗣 = 𝗔𝗕𝗔𝗣-𝗯𝗮𝘀𝗲𝗱 (𝗿𝘂𝗻𝘀 𝗜𝗡 𝗦/𝟰𝗛𝗔𝗡𝗔)</DIV><DIV>&nbsp;</DIV><DIV>• RAP runs inside S/4HANA system - whether Public or Private Cloud.</DIV><DIV>&nbsp;</DIV><DIV>𝗥𝗔𝗣 𝗶𝗻 𝗣𝗿𝗶𝘃𝗮𝘁𝗲 𝗖𝗹𝗼𝘂𝗱&nbsp;</DIV><DIV>&nbsp;•&nbsp; Create custom database tables (Z-tables)</DIV><DIV><SPAN>•&nbsp; Access standard SAP tables directly</SPAN></DIV><DIV><SPAN>•&nbsp; Some custom ABAP classes (within clean core guidelines)</SPAN></DIV><DIV><SPAN>•&nbsp; Traditional debugging in ADT</SPAN></DIV><DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="chandra_maverick1506_0-1770132190588.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368621iDF22FB3D887F13E5/image-size/medium?v=v2&amp;px=400" role="button" title="chandra_maverick1506_0-1770132190588.png" alt="chandra_maverick1506_0-1770132190588.png" /></span><P>&nbsp;</P></DIV><DIV>𝗥𝗔𝗣 𝗶𝗻 𝗣𝘂𝗯𝗹𝗶𝗰 𝗖𝗹𝗼𝘂𝗱</DIV><DIV>•&nbsp; NO direct table access (VBAK, KNA1, etc.) - must use&nbsp; &nbsp;released CDS views (I_* views)</DIV><DIV><SPAN>•&nbsp; NO custom database tables in S/4</SPAN></DIV><DIV><SPAN>•&nbsp; Only released APIs/BAPIs allowed</SPAN></DIV><DIV><SPAN>•&nbsp; Cannot use SE11/SE80 - only Eclipse ADT</SPAN></DIV><DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="chandra_maverick1506_1-1770132230812.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368622iF440DCBBED3D5840/image-size/medium?v=v2&amp;px=400" role="button" title="chandra_maverick1506_1-1770132230812.png" alt="chandra_maverick1506_1-1770132230812.png" /></span><P>&nbsp;</P></DIV><DIV>✔ 𝗖𝗔𝗣 = 𝗡𝗼𝗱𝗲.𝗷𝘀/𝗝𝗮𝘃𝗮-𝗯𝗮𝘀𝗲𝗱 (𝗿𝘂𝗻𝘀 𝗢𝗡 𝗕𝗧𝗣 - 𝘀𝗲𝗽𝗮𝗿𝗮𝘁𝗲 𝗳𝗿𝗼𝗺 𝗦/𝟰)</DIV><DIV>&nbsp;</DIV><DIV>• CAP is completely separate from S/4HANA - runs on BTP only.</DIV><DIV><DIV><DIV><P>𝗖𝗔𝗣 𝘄𝗶𝘁𝗵 𝗣𝗿𝗶𝘃𝗮𝘁𝗲 𝗖𝗹𝗼𝘂𝗱 𝗦/𝟰<BR />𝗖𝗼𝗻𝗻𝗲𝗰𝘁𝗶𝘃𝗶𝘁𝘆:<BR />• Uses SAP Cloud Connector (secure tunnel to on-premise/private)<BR />• Can call any OData service you expose from S/4<BR />• More flexible integration (can use custom RFCs if needed)</P><P>𝗖𝗔𝗣 𝘄𝗶𝘁𝗵 𝗣𝘂𝗯𝗹𝗶𝗰 𝗖𝗹𝗼𝘂𝗱 𝗦/𝟰<BR />𝗥𝗲𝘀𝘁𝗿𝗶𝗰𝘁𝗶𝗼𝗻𝘀:<BR />• Can only use SAP's released APIs (API Business Hub)<BR />• No custom OData services from S/4 (since you can't create custom code there)<BR />• Direct internet connectivity (no Cloud Connector)</P><P>&nbsp;</P><DIV>𝟲. 𝗖𝗹𝗲𝗮𝗻 𝗖𝗼𝗿𝗲</DIV><DIV>&nbsp;</DIV><DIV>𝗪𝗵𝗮𝘁 𝗶𝘁 𝗶𝘀: A principle that keeps your SAP system's standard code unchanged and upgrade-safe.</DIV><DIV>&nbsp;</DIV><DIV>Simple explanation: Don't modify SAP's delivered code directly. Keep the "core" clean.</DIV><DIV>&nbsp;</DIV><DIV>𝗘𝘅𝗮𝗺𝗽𝗹𝗲 :</DIV><DIV>𝗢𝗹𝗱 𝗔𝗽𝗽𝗿𝗼𝗮𝗰𝗵 :</DIV><DIV>&nbsp;</DIV><DIV>Third Party System → Inbound IDoc → BADI/Customer Exit ( Data Mapping for Idoc segments ) → SAP Standard Processing</DIV><DIV>&nbsp;</DIV><DIV>𝗖𝗹𝗲𝗮𝗻 𝗰𝗼𝗿𝗲 :</DIV><DIV>Third Party System → IDoc → AIF Layer → Data Mapping → SAP Standard Processing</DIV><DIV>&nbsp;</DIV><DIV>&nbsp;𝗕𝗲𝗻𝗲𝗳𝗶𝘁𝘀 𝗼𝗳 𝗔𝗜𝗙 𝗔𝗽𝗽𝗿𝗼𝗮𝗰𝗵:</DIV><DIV><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span>𝗖𝗹𝗲𝗮𝗻 𝗖𝗼𝗿𝗲 𝗖𝗼𝗺𝗽𝗹𝗶𝗮𝗻𝗰𝗲:</DIV><DIV>&nbsp;</DIV><DIV><SPAN>•&nbsp; No code in customer exits/BADIs</SPAN></DIV><DIV><SPAN>•&nbsp; Configuration-driven transformations</SPAN></DIV><DIV><SPAN>•&nbsp; Standard AIF framework handles processing</SPAN></DIV><DIV>&nbsp;</DIV><DIV>𝟳. 𝗕𝗧𝗣 𝗦𝗶𝗱𝗲-𝗯𝘆-𝗦𝗶𝗱𝗲 𝗘𝘅𝘁𝗲𝗻𝘀𝗶𝗯𝗶𝗹𝗶𝘁𝘆</DIV><DIV>&nbsp;</DIV><DIV>𝗪𝗵𝗮𝘁 𝗶𝘁 𝗶𝘀: Building custom applications on SAP Business Technology Platform (BTP) that work alongside your SAP system.</DIV><DIV>&nbsp;</DIV><DIV>𝗦𝗶𝗺𝗽𝗹𝗲 𝗲𝘅𝗽𝗹𝗮𝗻𝗮𝘁𝗶𝗼𝗻: Create new apps on the cloud that connect to SAP via APIs, without touching the core system.</DIV><DIV>&nbsp;</DIV><DIV>𝗕𝗲𝗻𝗲𝗳𝗶𝘁𝘀: Innovation without risking core stability, use modern cloud technologies</DIV><DIV>&nbsp;</DIV><DIV>𝟴. 𝗖𝗙𝗟 (𝗖𝘂𝘀𝘁𝗼𝗺 𝗙𝗶𝗲𝗹𝗱𝘀 &amp; 𝗟𝗼𝗴𝗶𝗰)</DIV><DIV>&nbsp;</DIV><DIV>𝗪𝗵𝗮𝘁 𝗶𝘁 𝗶𝘀: SAP's embedded extensibility framework for adding custom fields and business logic without code modifications.</DIV><DIV>&nbsp;</DIV><DIV>𝗦𝗶𝗺𝗽𝗹𝗲 𝗲𝘅𝗽𝗹𝗮𝗻𝗮𝘁𝗶𝗼𝗻: Point-and-click tool to add fields and simple logic to standard SAP objects.</DIV><DIV>&nbsp;</DIV><DIV>Add simple extensions inside SAP using key user tools.</DIV><P>&nbsp;</P><P>&nbsp;</P></DIV></DIV></DIV> 2026-02-19T10:03:58.866000+01:00 https://community.sap.com/t5/technology-blog-posts-by-sap/sap-btp-abap-environment-release-2602/ba-p/14329182 SAP BTP ABAP Environment - Release 2602 2026-02-19T10:47:10.350000+01:00 Nora_Klemp https://community.sap.com/t5/user/viewprofilepage/user-id/1641196 <DIV><H2 id="toc-hId-1789729972">SAP BTP ABAP Environment - Release 2602</H2><DIV>&nbsp;</DIV><DIV>On February 14, the new 2602 release was delivered as the successor to the 2511 release.&nbsp;<SPAN>In this blog post, we provide a detailed overview of the new features and enhancements included in this release, highlighting the key improvements and innovations introduced with 2602. Some highlights in the new release include the&nbsp;<STRONG>My Home</STRONG> as your new personalized entry page in SAP Fiori Launchpad, the <STRONG>CDS Embedded Analytics Star Schema Generator</STRONG> and the&nbsp;<STRONG>RAP recommendations for input assistance</STRONG> based on the user input and interaction history.&nbsp;</SPAN></DIV></DIV><P><SPAN>The list of all new features including more information can be found on the What's New for <A href="https://help.sap.com/whats-new/7a822d3bcaa74f31b98fa315601e9c96?Software_Lifecycle=General+Availability&amp;Version=ABAP+Environment+2602" target="_blank" rel="noopener noreferrer">SAP BTP ABAP environment page</A>. The new AI-related features are listed separately on the What's New for <A href="https://help.sap.com/whats-new/4d359a7f8e8248e18f98e85ea0b9d83e?Version=SAP+BTP+ABAP+environment+2602" target="_self" rel="noopener noreferrer">ABAP Generative AI in ABAP Cloud</A>.</SPAN></P><H4 id="toc-hId-1851381905"><SPAN>ABAP Development Tools (ADT)</SPAN></H4><UL><LI><SPAN><STRONG>New Grouping Option</STRONG> Effect on transports in ATC Problems View</SPAN></LI><LI><SPAN>ABAP Testability: <STRONG>Enhancements to Test Double Frameworks</STRONG> (<A href="https://help.sap.com/docs/abap-cloud/abap-development-tools-user-guide/abap-cds-test-double-framework?version=sap_btp" target="_blank" rel="noopener noreferrer">details</A>)</SPAN></LI><LI><SPAN><STRONG>Global User ID</STRONG> for ATC Exemptions</SPAN></LI><LI><SPAN><STRONG>Displaying the Used Objects</STRONG> of CDS Service Definitions in the Relation Explorer</SPAN></LI></UL><H4 id="toc-hId-1406433835" id="toc-hId-1654868400">ABAP RESTful Application Programming Model (RAP)</H4><UL><LI><SPAN><STRONG>Collaborative Draft</STRONG>,&nbsp;&nbsp;now also works in cross-business object scenarios if both business objects are collaborative draft-enabled, and if the cross-business object scenario is fully draft scope-enabled (<A href="https://help.sap.com/docs/abap-cloud/abap-rap/collaborative-draft" target="_blank" rel="noopener noreferrer">details</A>)</SPAN></LI><LI><SPAN><SPAN><STRONG>Recommendations</STRONG>, p</SPAN></SPAN>reviously, business users had to fill out input fields manually and choose the right values. The new RAP recommendations standardize and ease this process: In RAP applications on an SAP Fiori user interface, RAP recommendations provide input assistance by proposing field values for input fields based on the user input and interaction history. RAP recommendations can be implemented using deterministic rules or using generative AI, which predicts the most likely values for each input field based on the context of the data. By integrating the ABAP AI SDK powered by Intelligent Scenario Lifecycle Management, you can embed AI capabilities into the application, enriching traditional value help with context-aware suggestions (<A href="https://help.sap.com/docs/abap-cloud/abap-rap/recommendations" target="_blank" rel="noopener noreferrer">details</A>)</LI><LI><SPAN><SPAN><STRONG>Embedded Analytics Star Schema Generator</STRONG>, the&nbsp;<SPAN class="">Star Schema Generator Wizard</SPAN>&nbsp;streamlines the creation of star schema models using ABAP Core Data Services. It empowers you to build comprehensive analytical models with ease. This tool guides you through the entire generation process, ensuring a consistent and efficient workflow. The wizard supports the following key components:&nbsp;</SPAN></SPAN>Transactional Scenario, Analytical Cube and Dimension Views (<A href="https://help.sap.com/docs/abap-cloud/abap-development-tools-user-guide/star-schema-generator" target="_blank" rel="noopener noreferrer">details</A>)</LI></UL><H4 id="toc-hId-1458354895"><SPAN>Identity and Access Management</SPAN></H4><UL><LI><SPAN><STRONG>IAM App Assignment:</STRONG>&nbsp;So far, it was only possible to assign access to Fiori apps to business users indirectly via business catalogs. Now, it's also possible to directly create business roles based on IAM apps for SAP-delivered business catalogs</SPAN></LI><LI><SPAN><STRONG>Maintain Business Roles</STRONG>, you can now directly assign IAM apps in the&nbsp;<SPAN class="">Maintain Business Roles</SPAN>&nbsp;app. This supports you in handling authorizations more flexibly. You can also use the&nbsp;<SPAN class="">Mass Change Wizard</SPAN>&nbsp;if you need to add or remove multiple IAM apps at once (<A href="https://help.sap.com/docs/sap-btp-abap-environment/abap-environment/maintain-business-roles?version=Cloud" target="_blank" rel="noopener noreferrer">details</A>)</SPAN></LI><LI><SPAN>App References, the <STRONG>following apps now contain references to IAM apps</STRONG>:&nbsp;</SPAN>Maintain Business Roles, Manage Business Role, Changes After Upgrade, Display Restriction Types, Business Catalogs, Business Role Templates, IAM Information System (<A href="https://help.sap.com/docs/sap-btp-abap-environment/abap-environment/apps-identity-and-access-management?version=Cloud" target="_blank" rel="noopener noreferrer">details</A>)</LI><LI><SPAN><STRONG>Information System, the main entity&nbsp;<SPAN class="">Application</SPAN>&nbsp;is now deprecated</STRONG>. The successor will be the IAM app, which is now contained in the&nbsp;<SPAN class="">Main Entity</SPAN>&nbsp;dropdown list (<A href="https://help.sap.com/docs/sap-btp-abap-environment/abap-environment/iam-information-system?version=Cloud" target="_blank" rel="noopener noreferrer">details</A>)</SPAN></LI><LI><SPAN><STRONG>App Authorization Variant,</STRONG> you can now use the IAM app of the<SPAN class="">&nbsp;App Authorization Variant</SPAN>&nbsp;type. This gives you more flexibility in managing restrictions because it allows you to activate or deactivate app authorization variants to define different access rights per business role (<A href="https://help.sap.com/docs/sap-btp-abap-environment/abap-environment/work-with-iam-apps-app-authorization-variants?version=Cloud#loioe2b39fb01689420393931a9eb3f627ec" target="_blank" rel="noopener noreferrer">details</A>)</SPAN></LI></UL><H4 id="toc-hId-1261841390"><SPAN>Manage API Snapshots</SPAN></H4><UL><LI><SPAN>As a <STRONG>provider for released APIs</STRONG>, you can now <STRONG>download and upload API snapshots using the&nbsp;<SPAN class="">Manage API Snapshots</SPAN>&nbsp;app</STRONG>. This way, you can download API snapshots from the test system and upload them in the development system, thus preventing incompatible changes to your released objects early in the development process (<A href="https://help.sap.com/docs/sap-btp-abap-environment/abap-environment/manage-api-snapshots?version=Cloud" target="_blank" rel="noopener noreferrer">details</A>)</SPAN></LI></UL><H4 id="toc-hId-1065327885"><SPAN>SAP Fiori Launchpad</SPAN></H4><UL><LI><SPAN><STRONG><SPAN class="">My Home</SPAN></STRONG>&nbsp;in SAP BTP ABAP environment&nbsp;</SPAN></LI><LI><SPAN><STRONG>Launching an App with a Transaction Code</STRONG> (<A href="https://help.sap.com/docs/btp/sap-fiori-launchpad-for-sap-btp-abap-environment/searching-for-business-objects-and-apps?version=Cloud" target="_blank" rel="noopener noreferrer">details</A>)</SPAN></LI><LI><SPAN><STRONG>Download and Upload of Spaces</STRONG>&nbsp;</SPAN></LI><LI><SPAN><STRONG>Removal of Business Groups</STRONG>&nbsp;</SPAN></LI></UL><H4 id="toc-hId-868814380"><SPAN>Landscape Portal</SPAN></H4><UL><LI><SPAN><STRONG>Publish Product</STRONG>: Publish up to Two Product Versions (<A href="https://help.sap.com/docs/sap-btp-abap-environment/landscape-portal/publish-product" target="_blank" rel="noopener noreferrer">details</A>)</SPAN></LI><LI><SPAN><STRONG>Deploy Product</STRONG>: System multi-select supported and performance improved (<A href="https://help.sap.com/docs/sap-btp-abap-environment/landscape-portal/deploy-product" target="_blank" rel="noopener noreferrer">details</A>)</SPAN></LI></UL><H4 id="toc-hId-672300875"><SPAN>Infrastructure</SPAN></H4><UL><LI><SPAN><STRONG>Optional Integration with SAP Key Management Service</STRONG>,&nbsp;SAP BTP ABAP environment provides an optional integration with the SAP Key Management Service (KMS). With this integration, it's possible to manage the SAP HANA Cloud database of an ABAP environment instance via SAP KMS (<A href="https://help.sap.com/docs/sap-btp-abap-environment/abap-environment/integration-with-sap-key-management-service?version=Cloud" target="_blank" rel="noopener noreferrer">details</A>)</SPAN></LI></UL> 2026-02-19T10:47:10.350000+01:00