https://raw.githubusercontent.com/ajmaradiaga/feeds/main/scmt/topics/SAPUI5-blog-posts.xmlSAP Community - SAPUI52025-06-22T08:01:41.726861+00:00python-feedgenSAPUI5 blog posts in SAP Communityhttps://community.sap.com/t5/technology-blog-posts-by-sap/simplify-sapui5-code-extensions-with-the-sap-build-extensibility-wizard/ba-p/14087839Simplify SAPUI5 Code Extensions with the SAP Build Extensibility Wizard2025-04-28T07:50:34.669000+02:00OliverGraeffhttps://community.sap.com/t5/user/viewprofilepage/user-id/4124<P><STRONG>SAPUI5 flexibility to adapt standard SAP apps<BR /></STRONG>SAPUI5 is SAP’s strategic Web framework for SAP Fiori. SAPUI5 flexibility allows developers, key users and end users to adapt standard apps with simple drag-and-drop tools. It supports a clean core approach by enabling on-stack extensions without requiring any predefined extension points. Discover all the capabilities in: <A href="https://help.sap.com/docs/UI5_FLEXIBILITY/430e2c1a4ff241bc8162df4bf51e0730/e36d19b3d24f47199a9a82d3faa508c3.html" target="_blank" rel="noopener noreferrer">SAPUI5 Flexibility - All You Need to Know</A>.</P><P><STRONG>Key user adaptation vs. Developer adaptation<BR /></STRONG>In the SAP Community and many customer interactions<SPAN>,</SPAN> <SPAN>questions often arise about</SPAN> when <SPAN>to </SPAN>you use Key user adaptation vs. Developer adaptation<SPAN>.</SPAN> Key user adaptation allows business experts to change standard apps using tools directly within a running app. On the other hand, Developer adaptation targets developers <SPAN>who create </SPAN>custom code in a code-first environment using SAP Build. For a detailed comparison, check out our <A href="https://help.sap.com/docs/UI5_FLEXIBILITY/430e2c1a4ff241bc8162df4bf51e0730/589e3714f9a44f10b4b088a6e0b46d9b.html?version=Cloud&language=en-US" target="_blank" rel="noopener noreferrer">When to Use What guide</A>.</P><P><STRONG>The SAP Build Extensibility Wizard<BR /></STRONG>SAP S/4HANA Cloud introduced the new SAP Build Extensibility Wizard, consolidating multiple extension options into one streamlined tool. No more juggling various tools or manually entering parameters such as the technical ID of the app to be extended. Instead, launch the wizard directly from a running SAP Fiori app for a simplified extension process. Learn more in: <SPAN><A href="https://community.sap.com/t5/technology-blogs-by-sap/sap-build-extensibility-wizard-for-sap-s-4hana-cloud-public-edition/ba-p/13867427" target="_blank">SAP Build Extensibility Wizard for SAP S/4HANA Cloud Public Edition</A></SPAN>.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Screenshot 2025-04-24 at 11.23.48.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/255327i2478936FC19C38F9/image-size/medium?v=v2&px=400" role="button" title="Screenshot 2025-04-24 at 11.23.48.png" alt="Screenshot 2025-04-24 at 11.23.48.png" /></span></P><P> </P><P><STRONG>What is new in SAP Build Extensibility Wizard?<BR /></STRONG>The latest update to the SAP Build Extensibility Wizard introduces the ability to also create an SAPUI5 adaptation project as a User Interface Extension.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Screenshot 2025-04-24 at 11.10.52.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/255328i91051CC5BF222F5C/image-size/medium?v=v2&px=400" role="button" title="Screenshot 2025-04-24 at 11.10.52.png" alt="Screenshot 2025-04-24 at 11.10.52.png" /></span></P><P> </P><P>The wizard automatically fills the technical ID of the application to be adapted, asks for the SAP BTP Destination to connect to the SAP standard app, lets you enter the project name and off you go to SAP Business Application Studio to add your custom code.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Screenshot 2025-04-24 at 11.15.40.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/255330i6CCD2E176E131F61/image-size/medium?v=v2&px=400" role="button" title="Screenshot 2025-04-24 at 11.15.40.png" alt="Screenshot 2025-04-24 at 11.15.40.png" /></span></P><P><SPAN>For details see SAP Help:</SPAN></P><UL><LI><SPAN><A href="https://help.sap.com/docs/build/sap-build-core/create-sapui5-adaptation?version=Cloud" target="_blank" rel="noopener noreferrer">SAP Build - Creating a User Interface Extension: SAPUI5 Adaptation</A></SPAN></LI><LI><SPAN><A href="https://help.sap.com/docs/bas/developing-sap-fiori-app-in-sap-business-application-studio/create-project" target="_blank" rel="noopener noreferrer">Details on Creating the Adaptation Project</A></SPAN></LI></UL><P><STRONG>Summary<BR /></STRONG>SAP Build is the go-to platform for extending the SAP Business Suite, making it easier than ever to add custom extensions. With the new SAPUI5 adaptation project feature in the SAP Build Extensibility Wizard, developers can more easily extend standard SAP Fiori apps. Start leveraging this new option today to tailor your SAP experience to what your business users need.</P>2025-04-28T07:50:34.669000+02:00https://community.sap.com/t5/technology-blog-posts-by-members/improve-sap-ui5-application-performance-using-lazy-loading/ba-p/14087156Improve SAP UI5 Application Performance using Lazy Loading2025-04-29T19:04:55.156000+02:00RamakrishnaM7https://community.sap.com/t5/user/viewprofilepage/user-id/1716495<P><STRONG>Hi Everyone,</STRONG><BR />Today, I’m writing a blog about How to improve Performance of SAP UI5 Application.<BR />Below, I'll guide you through a simple step-by-step process How to improve Performance of UI Application.<BR /><STRONG>What is Lazy Loading</STRONG><BR />Lazy loading is a performance optimization technique that loads only the necessary resources at first,<BR />and defers loading the rest until they are actually needed.<BR />In SAPUI5, lazy loading can be applied to views, fragments, components, and data. Here's how to do it:<BR />Improving application performance using lazy loading in SAPUI5 is a great topic for blog.<BR />Lazy loading means loading only what's needed at the time—like loading views, fragments, or heavy datasets only when required instead of at startup. this makes the app faster and more efficient.</P><P>Here’s a <STRONG>step-by-step guide with source code</STRONG> and clear explanation using <STRONG>View and Controller</STRONG> to demonstrate lazy loading of a fragment when a button is clicked.<BR /><STRONG>What We'll Do</STRONG><BR />Create a simple View with a Button.<BR />Load a Fragment only when the button is clicked (lazy loaded).<BR />Use the loaded fragment to show a dialog.<BR /><STRONG>Folder Structure (for reference)</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="RamakrishnaM7_0-1745665050695.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/255186i32979E27A325931A/image-size/medium?v=v2&px=400" role="button" title="RamakrishnaM7_0-1745665050695.png" alt="RamakrishnaM7_0-1745665050695.png" /></span></P><P><STRONG>1 Main View (Lazy loading trigger)</STRONG><BR /><STRONG>View1.view.xml</STRONG></P><pre class="lia-code-sample language-markup"><code><mvc:View controllerName="project1.controller.View1"
xmlns:mvc="sap.ui.core.mvc"
xmlns="sap.m">
<Page id="page" title="{i18n>title}">
<VBox id="_IDGenVBox" class="sapUiSmallMargin">
<Button id="_IDGenButton1"
text="Open Lazy Loaded Dialog"
press="onOpenDialog" />
</VBox>
</Page>
</mvc:View></code></pre><P><STRONG>2 Fragment to Load Lazily<BR />DialogFragment.fragment.xml<BR /></STRONG></P><pre class="lia-code-sample language-markup"><code><core:FragmentDefinition
xmlns="sap.m"
xmlns:core="sap.ui.core">
<Dialog
id="myLazyDialog"
title="Lazy Loaded Dialog"
draggable="true"
resizable="true"
contentWidth="400px"
contentHeight="200px"
class="sapUiResponsivePadding--header sapUiResponsivePadding--content sapUiResponsivePadding--footer"
>
<Text id="_IDGenText1" text="This dialog was loaded lazily!" />
<beginButton>
<Button id="_IDGenButton" text="Close" press="onCloseDialog" />
</beginButton>
</Dialog>
</core:FragmentDefinition></code></pre><P><STRONG>3 Controller (Lazy loading logic)<BR />View1.controller<BR /></STRONG></P><pre class="lia-code-sample language-markup"><code>sap.ui.define([
"sap/ui/core/mvc/Controller",
"sap/ui/core/Fragment"
], (Controller,Fragment) => {
"use strict";
return Controller.extend("project1.controller.View1", {
onOpenDialog: function () {
var oView = this.getView();
// Check if dialog is already loaded
if (!this._pDialog) {
this._pDialog = Fragment.load({
id: oView.getId(),
name: "project1.view.DialogFragment",
controller: this
}).then(function(oDialog){
oView.addDependent(oDialog);
return oDialog;
});
}
this._pDialog.then(function(oDialog){
oDialog.open();
});
},
onCloseDialog: function () {
// Close the dialog
this.byId("myLazyDialog").close();
}
});
});</code></pre><P><STRONG>When will you click on open Lazy Loaded Button it's will show Lazy loaded Dialog Fragment <BR /></STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="RamakrishnaM7_0-1745904328438.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/255852iC57994873635EF64/image-size/medium?v=v2&px=400" role="button" title="RamakrishnaM7_0-1745904328438.png" alt="RamakrishnaM7_0-1745904328438.png" /></span></P><P><STRONG>Explanation:<BR />Why this improves performance:<BR />Without Lazy Loading: </STRONG>All fragments load at app start, even if not used.<STRONG><BR />With Lazy Loading: </STRONG>The dialog is only loaded into memory when the user clicks the button.<STRONG><BR />What’s happening:<BR />Fragment. load()</STRONG> is asynchronous, returning a promise.<STRONG><BR /></STRONG>It loads the fragment only once and caches it using this._pDialog.<BR /><STRONG>add Dependent() </STRONG>ensures the fragment is destroyed when the view is.<STRONG><BR /></STRONG></P><P> </P>2025-04-29T19:04:55.156000+02:00https://community.sap.com/t5/technology-blog-posts-by-sap/switch-from-sap-com-0086-neo-to-sap-com-0623-cloud-foundry/ba-p/14090192Switch from SAP_COM_0086 (Neo) to SAP_COM_0623 (Cloud Foundry)2025-04-30T10:56:41.393000+02:00barbara_hartelhttps://community.sap.com/t5/user/viewprofilepage/user-id/184416<P>In this blog post, I will guide you through the process of switching from the theming communication scenario <STRONG>SAP_COM_0086</STRONG> (SAP BTP, Neo environment) to <STRONG>SAP_COM_0623</STRONG> (SAP BTP, Cloud Foundry environment). This switch enables you to access the latest features of the UI theme designer, such as theme migration.</P><H2 id="toc-hId-1710039078">Background</H2><P>In an S/4HANA Cloud system, you use the UI theme designer from either the SAP BTP, Cloud Foundry environment or the SAP BTP, Neo environment to create and manage custom themes for SAP applications. To do this, you must implement one of the communication scenarios for the UI theme designer. For more details, refer to the documentation on <A href="https://help.sap.com/docs/SAP_S4HANA_CLOUD/0f69f8fb28ac4bf48d2b57b9637e81fa/643199014a4e4d6f9535cd6a9af5af8c.html?locale=en-US" target="_blank" rel="noopener noreferrer">Integrating UI Theme Designer</A>.</P><P><STRONG>Why is it important to switch to the communication scenario SAP_COM_0623 (SAP BTP, Cloud Foundry environment)?</STRONG></P><UL><LI><STRONG>Sunsetting of SAP BTP, Neo Environment:</STRONG> The SAP BTP, Neo environment will be retired by the end of 2028. For more information, refer to the blog post <A href="https://community.sap.com/t5/technology-blogs-by-sap/farewell-neo-sap-btp-multi-cloud-environment-the-deployment-environment-of/ba-p/13560080" target="_blank">Farewell, Neo!</A></LI><LI><STRONG>End-of-Life for Belize Theme:</STRONG> The Belize theme has reached its end-of-life with SAPUI5 1.135. By using the UI theme designer on the SAP BTP, Cloud Foundry environment, you can migrate your custom themes to modern themes based on Quartz or Horizon. For further details, see:<UL><LI>SAP note <A href="https://me.sap.com/notes/3595596" target="_blank" rel="noopener noreferrer">3595596</A>.</LI><LI>Blog posts: <A href="https://community.sap.com/t5/technology-blogs-by-sap/announcement-removal-of-belize-theme-of-sap-fiori/ba-p/14061924" target="_blank">Removal of Belize Theme of SAP Fiori</A> and <A href="https://community.sap.com/t5/technology-blogs-by-sap/upcoming-removal-of-sap-fiori-themes-belize-and-blue-crystal/ba-p/14063111" target="_blank">Upcoming Removal of SAP Fiori Themes Belize and Blue Crystal</A>.</LI></UL></LI></UL><H2 id="toc-hId-1513525573">Prerequisites</H2><UL><LI>You already have a subaccount on the SAP BTP, Cloud Foundry environment.</LI></UL><H2 id="toc-hId-1317012068">Procedure</H2><H3 id="toc-hId-1249581282">Step 1: Initial Setup</H3><OL><LI>Set up the UI theme designer on the SAP BTP, Cloud Foundry environment as described in the guide <A href="https://help.sap.com/docs/btp/ui-theme-designer/portal-scenario?locale=en-US" target="_blank" rel="noopener noreferrer">Initial Setup of UI Theme Designer: Portal Scenario</A>.</LI></OL><H3 id="toc-hId-1053067777">Step 2: Copy Themes</H3><OL><LI>Export your custom themes from the UI theme designer in the SAP BTP, Neo environment. For detailed instructions, refer to <A href="https://help.sap.com/docs/btp/ui-theme-designer/exporting-themes?locale=en-US" target="_blank" rel="noopener noreferrer">Exporting Themes</A>.</LI><LI>Import your custom themes into the UI theme designer in the SAP BTP, Cloud Foundry environment. For detailed instructions, refer to <A href="https://help.sap.com/docs/btp/ui-theme-designer/importing-themes?locale=en-US" target="_blank" rel="noopener noreferrer">Importing Themes</A>.</LI><LI>If your custom theme is based on the Belize theme, migrate it to a theme based on Horizon or Quartz. See <A href="https://help.sap.com/docs/btp/ui-theme-designer/migrating-themes?locale=en-US" target="_blank" rel="noopener noreferrer">Migrating Themes</A> for further information.<BR /><STRONG>Note:</STRONG> The Belize theme has been deprecated since SAPUI5 version 1.120 and was removed in SAPUI5 version 1.135.</LI><LI>After a successful migration, rename your theme accordingly. Use the same theme ID as before to ensure that no changes are needed for users to continue using the theme. <SPAN>For detailed instructions, refer to </SPAN><A href="https://help.sap.com/docs/btp/ui-theme-designer/renaming-themes?locale=en-US" target="_blank" rel="noopener noreferrer">Renaming Themes</A><SPAN>.</SPAN></LI><LI>Test your theme using the preview pages available in the UI theme designer. <SPAN>For detailed instructions, refer to </SPAN><A href="https://help.sap.com/docs/btp/ui-theme-designer/editing-themes?locale=en-US" target="_blank" rel="noopener noreferrer">Editing Themes</A><SPAN>.</SPAN><BR /><STRONG>Note:</STRONG> <SPAN>Migration will keep as many of your changes as possible, such as changed parameters or uploaded resources like a logo. However, there will be cases where the result is not 100% correct. Revisit the migration result and use it as a starting point for manual fine-tuning.</SPAN></LI><LI>Publish your theme to make it available for use. For detailed instructions, refer to <A href="https://help.sap.com/docs/btp/ui-theme-designer/publishing-themes?locale=en-US" target="_blank" rel="noopener noreferrer">Publishing Themes</A>.</LI></OL><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="copy_themes.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/256492i9287709DF8B0A309/image-size/large?v=v2&px=999" role="button" title="copy_themes.png" alt="copy_themes.png" /></span></P><H3 id="toc-hId-856554272">Step 3: Switch Communication Scenario</H3><P><STRONG>Important:</STRONG> Perform this step during a maintenance window when few or no users are active in the system. While switching the communication scenario, applications will temporarily display the SAP standard theme.</P><OL><LI>Delete the communication scenario <STRONG>SAP_COM_0086</STRONG> for the SAP BTP, Neo environment.</LI><LI>Create a new communication scenario for <STRONG>SAP_COM_0623</STRONG> (SAP BTP, Cloud Foundry environment) as described in the guide <A href="https://help.sap.com/docs/SAP_S4HANA_CLOUD/0f69f8fb28ac4bf48d2b57b9637e81fa/78444165263648c39d1584c82af5eddc.html?locale=en-US" target="_blank" rel="noopener noreferrer">SAP BTP, Cloud Foundry Environment (SAP_COM_0623)</A>.</LI><LI>Test your custom themes with the SAP Fiori Launchpad in the S/4HANA Cloud system.</LI></OL><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="SAP_COM_0623 Create.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/256493i6D6CE2BE457C3E51/image-size/medium?v=v2&px=400" role="button" title="SAP_COM_0623 Create.png" alt="SAP_COM_0623 Create.png" /></span></P><H2 id="toc-hId-530958048">Recap</H2><P>By following the outlined steps—setting up the UI theme designer on the SAP BTP, Cloud Foundry environment, migrating your themes, and switching the communication scenario—you can modernize your theming approach and ensure a seamless transition with minimal disruption to your users.</P><P>For additional information, refer to the linked SAP Notes and guides. If you need further assistance, feel free to reach out via component <STRONG>CA-UI2-THD</STRONG>.</P>2025-04-30T10:56:41.393000+02:00https://community.sap.com/t5/technology-blog-posts-by-sap/introducing-application-frontend-service/ba-p/14091408Introducing Application Frontend Service2025-05-01T18:49:02.245000+02:00NachshonVagmaysterhttps://community.sap.com/t5/user/viewprofilepage/user-id/172862<P><SPAN>As part of our exciting <A href="https://news.sap.com/2025/04/sap-build-sap-s4hana-cloud-simplify-development/" target="_blank" rel="noopener noreferrer">SAP Build </A>release, we're happy to announce the release of Application Frontend service, a new SaaS application on SAP Business Technology Platform (BTP) for hosting, serving and operating frontend applications.</SPAN></P><P><STRONG><SPAN>Next Generation Solution for hosting frontend applications</SPAN></STRONG></P><P><SPAN>Application Frontend serves as a single point of entry for hosting, serving and operating frontend applications. By consolidating all aspects of UI application management under one managed service, Application Frontend simplifies the development experience and enhances custom application operations.</SPAN></P><P><STRONG><SPAN>Bridging the Gap Between Neo and Multi-Cloud</SPAN></STRONG></P><P><SPAN>If you have been around SAP BTP for more than 10 years then, most likely, you have used the Neo environment. If you developed an HTML5 application in Neo, then you probably used the HTML5 Runtime. Many customers we met in the past years have reported that the snappy experience they had in Neo, when developing and operating HTML5 applications, was lost when moving to the multi-cloud environment, where the HTML5 Application Repository and the managed application router (approuter) are used.<BR />This feedback was received, noted and motivated us to come up with a new solution for managing HTML5 applications. A solution that will bring back the simplicity and flexibility customers liked so much in the Neo environment. With Application Frontend, we aim to bring that experience into the multi-cloud environment.</SPAN></P><P><SPAN>The first capabilities Neo fans will find familiar are host-based routing, the versioning concept and a direct deployment option. Additional capabilities like extended control from the SAP BTP cockpit will be added in the future.</SPAN></P><P><SPAN>But don’t get me wrong, Application Frontend is not a replica of HTML5 Runtime in Neo. It is a multi-cloud service compatible with the multi-cloud development model. We use the same descriptors used in HTML5 Repository and application router, ensuring that developers don't need to learn yet another paradigm.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Very high level architecture diagram" style="width: 940px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/256895iF79427327BDA4E46/image-size/large?v=v2&px=999" role="button" title="Nachshon_1-1746115862062.png" alt="Very high level architecture diagram" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Very high level architecture diagram</span></span></SPAN></P><P> </P><P><STRONG><SPAN>A New SaaS application</SPAN></STRONG></P><P><SPAN>Application Frontend is a SaaS application which is not coupled to any specific SAP BTP runtime environment or other SAP BTP applications. You can find and subscribe to the service from the SAP BTP cockpit. Application Frontend is also equipped with a service broker to support interaction flows using service instances, for example when using MTA deploy in the CF environment. </SPAN></P><P><SPAN>While there is native support in the good old MTA concept for lifecycle management, Application Frontend also provides a command line interface (CLI) as a first-class tool for managing your applications. With the CLI, you can directly interact with the service and execute all actions supported by Application Frontend to enjoy fast response times and new integration opportunities.</SPAN></P><P> </P><P><STRONG><SPAN>Supported Use cases</SPAN></STRONG></P><P><SPAN>At the moment, Application Frontend supports hosting of single tenant, stand-alone applications. (S<EM>tand-alone </EM>means applications that are not embedding other applications.)<BR />In the future we will extend the supported use cases to cover more scenarios like applications dependencies, multi-tenancy, native SAP Build Work Zone integration, etc.<BR /></SPAN>Application Frontend is perfect if you have a Build license and developing new HTML5 applications or migrating existing ones from Neo.<BR /><SPAN>If the HTML5 Repository and application router are more suitable for your needs, please continue using them.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Application Frontend management UI in SAP BTP Cockpit" style="width: 940px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/256896iBBE43EDC9408A568/image-size/large?v=v2&px=999" role="button" title="Nachshon_2-1746116072220.png" alt="Application Frontend management UI in SAP BTP Cockpit" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Application Frontend management UI in SAP BTP Cockpit</span></span></SPAN></P><P><SPAN> </SPAN><STRONG>Next steps</STRONG></P><P><SPAN>Application Frontend service is starting its journey. We will continuously release additional features to support new scenarios and delight your experience.<BR />In few weeks’ time, we will also make Application Frontend available in the SAP trial environment, so you can try it out more easily.<BR />Note: Application Frontend will reside next to the HTML5 Repository, and the managed Application Router (approuter) hosted in SAP Build Work Zone. Both services will continue to be available, supported and developed as needed. </SPAN></P><P><SPAN> <STRONG>How to get started</STRONG></SPAN></P><P><SPAN>SAP Build is available for subscription, more details in <A href="https://discovery-center.cloud.sap/serviceCatalog/sap-build?service_plan=default&region=all&commercialModel=subscription" target="_blank" rel="noopener nofollow noreferrer">SAP Discovery Center</A><BR /></SPAN><SPAN>Once you purchased SAP Build, follow <A href="https://help.sap.com/docs/application-frontend-service/application-frontend-service/initial-setup" target="_blank" rel="noopener noreferrer">these steps</A> for Application Frontend on-boarding.<BR />Check out this intro tutorial for <A class="" href="https://community.sap.com/t5/technology-blog-posts-by-sap/simple-ui-applications-with-application-frontend-service/ba-p/14096009" target="_blank">Simple UI Applications with Application Frontend Service</A> </SPAN></P><P> </P><P> </P>2025-05-01T18:49:02.245000+02:00https://community.sap.com/t5/technology-blog-posts-by-members/ui5-autofocus/ba-p/14037351UI5 autofocus2025-05-05T09:39:52.172000+02:00WouterLemairehttps://community.sap.com/t5/user/viewprofilepage/user-id/9863<H1 id="toc-hId-1575625567"><SPAN>Problem</SPAN>:</H1><P>I used UI5 to create my own website and aimed to make it look different from a typical UI5 application. During this process, I encountered an issue where UI5 would automatically scroll to certain sections when navigating between pages. After some investigation, I discovered the cause: a button positioned at the bottom of the page. UI5 automatically sets the focus on the first clickable element it finds, which in this case, caused the page to scroll down.</P><P> </P><P>Although I removed the button, you can still check out my site at <A href="https://wouter.lemaire.tech" target="_self" rel="nofollow noopener noreferrer">https://wouter.lemaire.tech</A> .</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="WouterLemaire_0-1741381000818.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/234601iA7B2BCDBE4E21FB5/image-size/large?v=v2&px=999" role="button" title="WouterLemaire_0-1741381000818.png" alt="WouterLemaire_0-1741381000818.png" /></span></P><P> </P><P>I also discovered that many others have faced similar issues with UI5 automatically managing focus and causing unexpected scrolling behavior:</P><P><SPAN><A href="https://community.sap.com/t5/technology-q-a/stop-focus-on-control/qaq-p/11295709" target="_blank">https://community.sap.com/t5/technology-q-a/stop-focus-on-control/qaq-p/11295709</A></SPAN></P><P><SPAN><A href="https://community.sap.com/t5/technology-q-a/prevent-autofocus-on-sap-ui-unified-calendar/qaq-p/11173411" target="_blank">https://community.sap.com/t5/technology-q-a/prevent-autofocus-on-sap-ui-unified-calendar/qaq-p/11173411</A></SPAN></P><P> </P><P><SPAN><A href="https://community.sap.com/t5/technology-q-a/disable-soft-keyboard-or-autofocus-in-sapui5-mobile/qaq-p/682939" target="_blank">https://community.sap.com/t5/technology-q-a/disable-soft-keyboard-or-autofocus-in-sapui5-mobile/qaq-p/682939</A></SPAN></P><P> </P><H1 id="toc-hId-1379112062"><SPAN>Solution</SPAN>:</H1><P>In my case, the solution turned out to be quite simple—I just needed to disable the autoFocus property of the App control. I wasn’t aware of this functionality, and despite searching through numerous posts about focus issues on the SAP Community, I didn’t come across this solution. Here’s how I solved it:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="WouterLemaire_1-1741381000823.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/234602iD34277B66470F68E/image-size/large?v=v2&px=999" role="button" title="WouterLemaire_1-1741381000823.png" alt="WouterLemaire_1-1741381000823.png" /></span></P><P> </P>2025-05-05T09:39:52.172000+02:00https://community.sap.com/t5/application-development-and-automation-blog-posts/creating-your-custom-validation-in-cap-java-messagetargets-for-composition/ba-p/14090235Creating your custom validation in CAP (JAVA) + MessageTargets for composition associations2025-05-05T10:37:38.704000+02:00NicholasAreftahttps://community.sap.com/t5/user/viewprofilepage/user-id/876567<H2 id="toc-hId-1710039856">Objective</H2><P>Implement dynamic field control on a chosen field, add our own validation along with an error message that targets that field when the validation fails.</P><P>Source code: <SPAN class=""><A href="https://github.com/nickcantstop/SchoolExample" target="_blank" rel="noopener nofollow noreferrer">https://github.com/nickcantstop/SchoolExample</A></SPAN></P><P>As per capire documentation when using dynamic field control, it forces you to create your custom validations.</P><DIV class=""><DIV class=""><DIV><DIV><DIV class=""><DIV><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="capire fieldcontrol" style="width: 784px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/247819iAC31A3AFAF62BDC2/image-size/large?v=v2&px=999" role="button" title="capire field control.png" alt="capire fieldcontrol" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">capire fieldcontrol</span></span></DIV></DIV></DIV></DIV></DIV></DIV><P>Available field control options.</P><DIV class=""><DIV class=""><DIV class=""><DIV class=""><DIV><STRONG>Number Key</STRONG><STRONG>Field Control</STRONG><SPAN> </SPAN></DIV><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Screenshot 2025-05-01 at 4.38.49 pm.png" style="width: 305px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/256753iF47DA34EFEE7568E/image-dimensions/305x217?v=v2" width="305" height="217" role="button" title="Screenshot 2025-05-01 at 4.38.49 pm.png" alt="Screenshot 2025-05-01 at 4.38.49 pm.png" /></span></DIV><DIV class=""><SPAN>In our example we want the field averageGrade to be (Read Only) when firstName is null and then Mandatory when firstName has a value.</SPAN></DIV></DIV></DIV></DIV></DIV><P>We will use <SPAN class="">averageGradeFC</SPAN> field to store and also annotate our <SPAN class="">averageGrade</SPAN> field.</P><P>(./db/school.cds)</P><P>The composition associations are included purely for illustrative purposes <span class="lia-unicode-emoji" title=":slightly_smiling_face:">🙂</span></P><PRE>namespace my.domain.education;
entity School {
key ID : Integer;
name : String;
address : String;
classes : Composition of many School.Classes
on classes.parent = $self;
}
entity School.Classes {
key ID : Integer;
key parent : Association to School;
subject : String;
students : Composition of many School.Classes.Students
on students.parent = $self;
}
entity School.Classes.Students {
key ID : Integer;
key parent : Association to School.Classes;
firstName : String;
lastName : String;
averageGrade : String;
averageGradeFC : Integer default 1;
}</PRE><P>Service Layer (./srv/schoolService.cds)</P><PRE>using {my.domain.education as education} from '../db/school';
service SchoolService {
@odata.draft.enabled
entity School as projection on education.School;
@cds.redirection.target: true
entity SchoolClasses as projection on education.School.Classes;
@cds.redirection.target: true
entity SchoolClassesStudents as projection on education.School.Classes.Students;
}</PRE><P>In annotations file (./app/school/annotations.cds)</P><DIV class=""><PRE>annotate service.SchoolClassesStudents with @(Common : { SideEffects #averageGradeSideEffect : {
SourceProperties: [firstName],
TargetProperties: ['averageGradeFC']
}}) {
averageGrade @Common.FieldControl : averageGradeFC;
};</PRE></DIV><P>Using the target method as seen here <SPAN class="">messages.error(“Error”).target()</SPAN> can help us indicate to the user which field needs attention, in our example we are throwing an error for each averageGrade field that does not pass the validation in the existing School entity.</P><P>If we use the following code snippet <SPAN class="">averageGrade <a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1648847">@Common</a>.FieldControl : 7; </SPAN>the framework will append a red asterisk (*) next to the annotated field, to signal that this field is mandatory, but it does not enforce that mandatory rule.</P><P>The following handler provides us the validation needed to enforce our mandatory field.</P><P>SchoolHandler - validation on when School entity is updated</P><DIV class=""><PRE>@Component
@ServiceName(SchoolService_.CDS_NAME)
public class SchoolHandler implements EventHandler {
@Autowired
Messages messages;
SchoolHandler(Messages messages) {
messages = this.messages;
}
@Before(entity = School_.CDS_NAME, event = CqnService.EVENT_UPDATE)
public void onSchoolUpdate(School school) {
school.getClasses().forEach(classes -> classes.getStudents().forEach(students -> {
if (Objects.isNull(students.getAverageGrade())) {
messages.error("Average Grade cannot be null.").target(School_.class,
sc -> sc.classes(
cl -> cl.ID().eq(classes.getId())
.and(cl.parent_ID().eq(classes.getParentId())
.and(cl.IsActiveEntity().eq(false))))
.students(
stu -> stu.ID().eq(students.getId())
.and(stu.parent_ID().eq(students.getParentId()))
.and(stu.parent_parent_ID().eq(students.getParentParentId()))
.and(stu.IsActiveEntity().eq(false)))
.averageGrade());
}
}));
messages.throwIfError();
}
@Before(entity = SchoolClassesStudents_.CDS_NAME, event = DraftService.EVENT_DRAFT_PATCH)
public void onStudentSideEffect(SchoolClassesStudents students) {
if (Objects.isNull(students.getFirstName())) {
students.setAverageGradeFC(1);
} else {
students.setAverageGradeFC(7);
}
}
}</PRE></DIV><P>With this code if I leave the field averageGrade as null when it is set to mandatory in the field control, I am met with this error when saving the draft.</P><DIV class=""><DIV class=""><DIV class=""><DIV><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="error highlighted.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/247820i9ACD8FFC6F8024F2/image-size/large?v=v2&px=999" role="button" title="error highlighted.png" alt="error highlighted.png" /></span></DIV><DIV> </DIV><DIV>The following error message is returned in the backend, it depicts the target as the odata path to the corresponding field.</DIV></DIV></DIV></DIV><DIV class=""><PRE>{
"error": {
"code": "400",
"message": "Average Grade cannot be null.",
"target": "in/classes(ID=2,parent_ID=1,IsActiveEntity=false)/students(ID=3,parent_ID=2,parent_parent_ID=1,IsActiveEntity=false)/averageGrade"
}
}</PRE></DIV>2025-05-05T10:37:38.704000+02:00https://community.sap.com/t5/technology-blog-posts-by-members/implementing-user-role-based-views-in-sapui5-a-complete-guide/ba-p/14088222Implementing User Role-Based Views in SAPUI5: A Complete Guide2025-05-05T10:49:01.710000+02:00RanishreeBV25https://community.sap.com/t5/user/viewprofilepage/user-id/178838<P><STRONG>Implementing User Role-Based Views in SAPUI5: A Complete Guide</STRONG></P><P><STRONG>Introduction</STRONG></P><P>In today's enterprise application development, delivering the right experience to the right users is just as crucial as the functionality itself. One of the most effective ways to achieve this is through role-based view management - a powerful approach that tailors the user interface based on individual permissions and responsibilities.</P><P>I'm excited to share this comprehensive guide on implementing role-based views in SAPUI5 applications. Whether you're building a new application from scratch or enhancing an existing one, implementing proper view segregation will not only improve security but also create a more focused and efficient user experience.</P><P>In this blog, we'll explore:</P><UL><LI>The critical importance of role-based views in enterprise applications</LI><LI>A step-by-step implementation guide using SAPUI5's powerful features</LI><LI>How to combine OData services with dynamic UI controls</LI><LI>Professional best practices refined from real-world implementations</LI></UL><P>By the end of this guide, you'll be able to create applications where:</P><UL><LI><STRONG>Administrators (ADMN)</STRONG> have complete system access</LI><LI><STRONG>Project Managers (PM)</STRONG> see management-relevant views</LI><LI><STRONG>Team Leads (TL)</STRONG> access team coordination features</LI><LI><STRONG>Regular Employees (RE)</STRONG> work with task-specific interfaces</LI></UL><P>Let's transform your SAPUI5 application into a secure, role-appropriate experience that users will appreciate!</P><P><STRONG>Why Role-Based Views Matter More Than Ever</STRONG></P><P>In our increasingly security-conscious digital landscape, role-based views provide three fundamental benefits:</P><OL><LI><STRONG>Security Through Obscurity</STRONG><BR />By completely hiding unauthorized functionality rather than just disabling it, we eliminate potential attack vectors and accidental access to sensitive operations.</LI><LI><STRONG>Cognitive Simplicity</STRONG><BR />Users aren't distracted by irrelevant menu items or functions they can't use, leading to higher productivity and satisfaction.</LI><LI><STRONG>Compliance Ready</STRONG><BR />Many industry regulations (GDPR, SOX, HIPAA) explicitly require proper access controls that role-based views help implement.</LI></OL><P><STRONG>Prerequisites for Implementation</STRONG></P><P>Before we begin, you'll need:</P><P>✔ <STRONG>SAPUI5 Fundamentals</STRONG> - Comfort with MVC concepts and data binding<BR />✔ <STRONG>Development Environment</STRONG> - SAP Business Application Studio or local IDE setup<BR />✔ <STRONG>Backend Access</STRONG> - OData service with employee data (mock data works for testing)<BR />✔ <STRONG>Basic Security Understanding</STRONG> - Familiarity with authentication flows</P><P> </P><P>Let's begin our journey to create a truly professional role-based SAPUI5 application!<BR /><BR /></P><P><STRONG>Project Structure</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="RanishreeBV25_0-1745835614130.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/255445iEC6DAEE27BB595BC/image-size/medium?v=v2&px=400" role="button" title="RanishreeBV25_0-1745835614130.png" alt="RanishreeBV25_0-1745835614130.png" /></span></P><P> </P><P><STRONG>Data</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="RanishreeBV25_1-1745837442210.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/255489iC81C6BE9F4BA2AB7/image-size/medium?v=v2&px=400" role="button" title="RanishreeBV25_1-1745837442210.png" alt="RanishreeBV25_1-1745837442210.png" /></span></P><P> </P><P><STRONG>Step 1: Set Up the Login System</STRONG></P><P><STRONG>Login Controller (</STRONG>Login.controller.js<STRONG>)</STRONG></P><pre class="lia-code-sample language-markup"><code> onInit() {
var oComponentModel = this.getOwnerComponent().getModel();
var oModel = this.getOwnerComponent().getModel('employeesModel')
oComponentModel.read("/your_entitySetName",{
method:'GET',
success: function (oData, response){
oModel.setProperty('/employees',oData.results)
},
error: function(error){
console.error("Error Loading Data: " + error);
},
});
},</code></pre><pre class="lia-code-sample language-javascript"><code>onPressLoginBtn: function() {
const sUsername = this.byId("name").getValue();
const sPassword = this.byId("userId").getValue();
const oModel = this.getOwnerComponent().getModel("employeesModel");
const aEmployees = oModel.getProperty("/employees") || [];
const oEmployee = aEmployees.find(emp =>
emp.UserId === sUsername && emp.Password === sPassword
);
if (oEmployee) {
oModel.setProperty("/currentUser", oEmployee); // Store user data
this.getOwnerComponent().getRouter().navTo("MainView");
} else {
sap.m.MessageToast.show("Invalid credentials");
}
}</code></pre><P><BR /><STRONG>Key Points</STRONG>:</P><UL><LI>Validates credentials against fetched employee data.</LI><LI>Stores the logged-in user in employees Model.</LI></UL><P><STRONG>Login View(</STRONG>Login.view.xml<STRONG>)</STRONG></P><pre class="lia-code-sample language-markup"><code><VBox justifyContent="Center" alignItems="Center" height="100%">
<Panel width="430px" class="loginFormPanel">
<form:SimpleForm title="Login Here" class="sapUiMediumMarginTopBottom">
<Label></Label>
<Input id="name" placeholder="Enter Name"></Input>
<Label></Label>
<Input id="userId" placeholder="Enter UserId" type="Password"></Input>
<Label></Label>
<Button text="Login" press="onPressLoginBtn" type="Emphasized"></Button>
</form:SimpleForm>
</Panel>
</VBox></code></pre><P><STRONG>Main View(</STRONG>Main.view.xml<STRONG>)</STRONG></P><pre class="lia-code-sample language-markup"><code><core:Fragment fragmentName="roleassignment.fragments.IconTabBar" type="XML"></core:Fragment></code></pre><P><STRONG>IconTabBar Fragment (</STRONG>IconTabBar.fragment.xml<STRONG>)</STRONG></P><pre class="lia-code-sample language-markup"><code> <IconTabBar id="idIconTabBar" expandable="false" headerMode="Inline">
<items>
<IconTabFilter text="Roles" key="roles">
<mvc:View viewName="roleassignment.view.subView.AllRole" type="XML"></mvc:View>
<items>
<IconTabFilter text="AdminView" key="AdminView" visible="{= ${employeesModel>/currentUser/Role} === 'ADM' }">
<mvc:View viewName="roleassignment.view.subView.Admin" type="XML"/>
</IconTabFilter>
<IconTabFilter text="ProjectManagerView" key="ProjectManagerView" visible="{= ${employeesModel>/currentUser/Role} === 'ADM' || ${employeesModel>/currentUser/Role} === 'PM' }">
<mvc:View viewName="roleassignment.view.subView.ProjectManager" type="XML"/>
</IconTabFilter>
<IconTabFilter text="TeamLeadView" key="TeamLeadView" visible="{= ${employeesModel>/currentUser/Role} === 'ADM' || ${employeesModel>/currentUser/Role} === 'PM' || ${employeesModel>/currentUser/Role} === 'TL' }">
<mvc:View viewName="roleassignment.view.subView.TeamLead" type="XML"/>
</IconTabFilter>
<IconTabFilter text="RegularEmpView" key="RegularEmpView" >
<mvc:View viewName="roleassignment.view.subView.RegularEmp" type="XML"/>
</IconTabFilter>
</items>
</IconTabFilter>
</items>
</IconTabBar></code></pre><P><STRONG>AllRole View(</STRONG>AllRole.view.xml)</P><pre class="lia-code-sample language-markup"><code><Table >
<columns>
<Column >
<Text text="ID"></Text>
</Column>
<Column >
<Text text="Name"></Text>
</Column>
<Column >
<Text text="Role Description"></Text>
</Column>
</columns>
<items>
<ColumnListItem>
<cells>
<Text text="{employeesModel>/currentUser/Id}"></Text>
<Text text="{employeesModel>/currentUser/Name}"></Text>
<Text text="{employeesModel>/currentUser/Roledescription}"></Text>
</cells>
</ColumnListItem>
</items>
</Table></code></pre><P><STRONG>Admin View(</STRONG>Admin.view.xml)</P><pre class="lia-code-sample language-markup"><code> <c:Fragment fragmentName="roleassignment.fragments.tables.Admin" type="XML"></c:Fragment></code></pre><P><STRONG>Admin Fragment</STRONG>(Admin.fragment.xml)</P><pre class="lia-code-sample language-markup"><code><Table items="{employeesModel>/ADMData}">
<columns>
<Column>
<Text text="ID"></Text>
</Column>
<Column>
<Text text="Name"></Text>
</Column>
<Column>
<Text text="Role"></Text>
</Column>
<Column>
<Text text="Role Description"></Text>
</Column>
</columns>
<items>
<ColumnListItem >
<cells>
<Text text="{employeesModel>Id}"></Text>
<Text text="{employeesModel>Name}"></Text>
<Text text="{employeesModel>Role}"></Text>
<Text text="{employeesModel>Roledescription}"></Text>
</cells>
</ColumnListItem>
</items>
</Table></code></pre><P><STRONG>Admin Controller </STRONG>(Admin.controller.js)</P><pre class="lia-code-sample language-javascript"><code>var oComponentModel = this.getOwnerComponent().getModel();
var oModel = this.getOwnerComponent().getModel('employeesModel')
oComponentModel.read("/Your_entitySetName",{
method:'GET',
urlParameters: {
"$filter": "Role eq 'ADM'"
},
success: function (oData, response){
oModel.setProperty('/ADMData',oData.results)
},
error: function(error){
console.error("Error Loading Data: " + error);
},
}); </code></pre><P><STRONG>How It Works</STRONG>:</P><UL><LI>Binds visibility to the user’s role.</LI><LI>Only shows tabs matching the user’s permissions.</LI></UL><P> </P><P><STRONG>Other Views</STRONG></P><UL><LI><P class="">ProjectManager.view.xml</P></LI><LI><P class="">TeamLead.view.xml</P></LI><LI><P class="">RegularEmp.view.xml</P></LI></UL><P><STRONG>Other Controllers</STRONG></P><UL><LI><P class="">ProjectManager.controller.js</P></LI><LI><P class="">TeamLead.controller.js</P></LI><LI><P class="">RegularEmp.controller.js.</P></LI></UL><P class="">The implementation follows a consistent pattern where only the fragment names differ based on roles. Here's how to adapt the same logic across all views:</P><OL><LI><P class=""><STRONG>Fragment Naming Structure</STRONG></P><UL><LI><P class="">Each role has its own fragment file following this naming pattern:</P><UL><LI><P class="">Admin.fragment.xml</P></LI><LI><P class="">ProjectManager.fragment.xml</P></LI><LI><P class="">TeamLead.fragment.xml</P></LI><LI><P class="">RegularEmp.fragment.xml</P></LI></UL></LI></UL></LI><LI><P class=""><STRONG>Identical Implementation Logic</STRONG><BR />While the fragment names are different, they all share:</P><UL><LI><P class="">The same table structure and column layout</P></LI><LI><P class="">The same type of data bindings</P></LI><LI><P class="">The same controller approach for data loading</P></LI></UL></LI><LI><P class=""><STRONG>How to Apply This Pattern</STRONG><BR />For each role view:</P><UL><LI><P class="">Create a new fragment file with the role-specific name</P></LI><LI><P class="">Copy the same table structure from existing fragments</P></LI><LI><P class="">Only change:</P><OL><LI><P class="">The binding path to match the role (PMData/TLData/REData)</P></LI><LI><P class="">The filter condition in controller ("Role eq 'PM'" etc.).<BR /><BR /></P></LI></OL></LI></UL></LI></OL><H3 id="toc-hId-1838437348"><STRONG>UI Output Screenshots</STRONG></H3><P><STRONG><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="image.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/255455i1148A24FD616942E/image-size/large?v=v2&px=999" role="button" title="image.png" alt="image.png" /></span></STRONG></P><P><STRONG><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="image.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/255457iBCDCA1406EAF6084/image-size/large?v=v2&px=999" role="button" title="image.png" alt="image.png" /></span></STRONG></P><P><STRONG><EM>Administrator sees all available tabs</EM></STRONG></P><P> </P><P> </P><P> </P><P><STRONG><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="image.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/255461iC12B3A323225D701/image-size/large?v=v2&px=999" role="button" title="image.png" alt="image.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="image.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/255463i3110D4ECC0EC84D9/image-size/large?v=v2&px=999" role="button" title="image.png" alt="image.png" /></span></STRONG></P><P><STRONG><EM>Project Manager access with PM/TL/RE tabs (Admin tab hidden)</EM></STRONG></P><P> </P><P> </P><P><STRONG><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="image.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/255465i5DDF3336BBF9D513/image-size/large?v=v2&px=999" role="button" title="image.png" alt="image.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="image.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/255466i658F454B9A4E83C3/image-size/large?v=v2&px=999" role="button" title="image.png" alt="image.png" /></span></STRONG></P><P><STRONG><EM>Single-tab interface for regular employees.<BR /></EM></STRONG></P><P> </P><H3 id="toc-hId-1641923843"><STRONG>Key Visual Differentiators</STRONG></H3><OL><LI><P class=""><STRONG>Role-Specific Tab Visibility</STRONG></P><UL><LI><P class="">Admin: 4 tabs visible</P></LI><LI><P class="">PM: 3 tabs visible</P></LI><LI><P class="">TL: 2 tabs visible</P></LI><LI><P class="">RE: 1 tab visible</P></LI></UL></LI><LI><P class=""><STRONG>Data Columns</STRONG><BR /><EM>Same structure across all fragments, with:</EM></P><UL><LI><P class="">ID, Name, Role, Role Description fields</P></LI><LI><P class="">Color-coded by role (admin=red, pm=blue, tl=green, re=grey)</P></LI></UL></LI><LI><P class=""><STRONG>Visual Cues</STRONG></P><UL><LI><P class="">Role badge in header</P></LI><LI><P class="">Disabled/hidden elements for unauthorized actions</P></LI><LI><P class="">Consistent table styling across fragments.</P></LI></UL></LI></OL><P> </P><P><STRONG>Conclusion</STRONG></P><P>By leveraging SAPUI5’s binding and OData capabilities, we built a secure, role-based navigation system that:<BR />✔ <STRONG>Restricts views</STRONG> based on roles<BR />✔ <STRONG>Optimizes data loading</STRONG><BR />✔ <STRONG>Scales easily</STRONG> for new roles.</P><P>I hope you found this guide helpful! If you have any questions or feedback, feel free to leave a comment below. Happy coding!</P>2025-05-05T10:49:01.710000+02:00https://community.sap.com/t5/technology-blog-posts-by-sap/time-to-migrate-your-belize-theme-on-sap-btp-cloud-foundry-environment/ba-p/14093190Time to migrate your Belize theme on SAP BTP, Cloud Foundry environment2025-05-05T13:46:33.595000+02:00barbara_hartelhttps://community.sap.com/t5/user/viewprofilepage/user-id/184416<P>In this blog post, I will guide you through the process of migrating your custom theme based on Belize to a theme based on Quartz or Horizon.</P><H2 id="toc-hId-1710128449">Background</H2><P>The Belize theme has been deprecated since SAPUI5 version 1.120. As of SAPUI5 version 1.135, the Belize theme has reached its end-of-life and is no longer supported for SAPUI5 applications. For more details, refer to the documentation on <A href="https://ui5.sap.com/#/topic/38ff8c27b022475a92b591bcf6262551" target="_blank" rel="noopener noreferrer">Supported Combinations of Themes and Libraries</A> and the announcements <A href="https://community.sap.com/t5/technology-blogs-by-sap/announcement-removal-of-belize-theme-of-sap-fiori/ba-p/14061924" target="_blank">Removal of Belize Theme of SAP Fiori</A> and <A href="https://community.sap.com/t5/technology-blogs-by-sap/upcoming-removal-of-sap-fiori-themes-belize-and-blue-crystal/ba-p/14063111" target="_blank">Upcoming Removal of SAP Fiori Themes Belize and Blue Crystal</A>.</P><P><STRONG>Why Is It Important to migrate themes based on Belize?</STRONG></P><P>With the removal of the Belize theme in SAPUI5, custom themes based on Belize will no longer be applied to SAPUI5 applications. Instead, the applications will default to the Horizon theme, which may not align with your desired branding.</P><H2 id="toc-hId-1513614944">Prerequisites</H2><UL><LI>You have a subaccount on the SAP BTP, Cloud Foundry environment and have created a custom theme based on Belize.</LI><LI>You are using the custom theme for applications running on SAP BTP, Cloud Foundry environment, or you have created a communication scenario for the UI theme designer in S/4HANA Cloud (communication scenario <A href="https://help.sap.com/docs/SAP_S4HANA_CLOUD/0f69f8fb28ac4bf48d2b57b9637e81fa/78444165263648c39d1584c82af5eddc.html?locale=en-US" target="_self" rel="noopener noreferrer">SAP_COM_0623</A>).</LI></UL><H2 id="toc-hId-1317101439">Step 1: Migrate the Theme</H2><OL><LI>Open the UI theme designer in the SAP BTP, Cloud Foundry environment.</LI><LI>Select the theme that is based on Belize.</LI><LI>Click the "Migrate" button to migrate your theme. For detailed instructions, refer to <A href="https://help.sap.com/docs/btp/ui-theme-designer/migrating-themes?locale=en-US" target="_blank" rel="noopener noreferrer">Migrating Themes</A>.</LI></OL><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="migrate_cf.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/257632iBEACD6CE97480C5F/image-size/large?v=v2&px=999" role="button" title="migrate_cf.png" alt="migrate_cf.png" /></span></P><H2 id="toc-hId-1120587934">Step 2: Test and Adjust the Migrated Theme</H2><OL><LI>Edit the migrated theme in the UI theme designer. For detailed instructions, refer to <A href="https://help.sap.com/docs/btp/ui-theme-designer/editing-themes?locale=en-US" target="_blank" rel="noopener noreferrer">Editing Themes</A>.</LI><LI>Test the theme using the available preview pages.</LI><LI>Adjust any parameters as needed to achieve the same look and feel as before.</LI><LI>If you have implemented custom CSS, verify that it still works as expected.<BR /><STRONG>Note</STRONG><SPAN>: Theming capabilities have been enhanced for the Horizon theme, offering more options for customization. Consider replacing custom CSS with theming parameters to ensure your theme is more robust and compatible with future UI technology upgrades</SPAN></LI></OL><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="edit_cf.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/257634i458BABF95C8721DB/image-size/large?v=v2&px=999" role="button" title="edit_cf.png" alt="edit_cf.png" /></span></P><H3 id="toc-hId-1053157148">Step 3: Publish Your Theme</H3><OL><LI>Rename the old theme based on Belize. For detailed instructions, refer to <A href="https://help.sap.com/docs/btp/ui-theme-designer/renaming-themes?locale=en-US" target="_blank" rel="noopener noreferrer">Renaming Themes</A>.</LI><LI>Rename the migrated theme to use the same theme ID as before. This ensures that no changes are required for users to continue using the theme.</LI><LI>Publish your theme to make it available for use. For detailed instructions, refer to<SPAN> </SPAN><A href="https://help.sap.com/docs/btp/ui-theme-designer/publishing-themes?locale=en-US" target="_blank" rel="noopener noreferrer">Publishing Themes</A>.</LI></OL><H2 id="toc-hId-727560924">Step 4: Test Your Applications</H2><OL><LI>Test your applications thoroughly with the migrated theme to ensure everything works as expected.</LI></OL><H2 id="toc-hId-531047419">Step 5: Delete the Belize-Based Theme</H2><OL><LI>Once you have confirmed that the migrated theme works correctly, you can safely delete the old theme based on Belize. For detailed instructions, refer to <A href="https://help.sap.com/docs/btp/ui-theme-designer/deleting-themes?locale=en-US" target="_self" rel="noopener noreferrer">Deleting Themes.</A></LI></OL><H2 id="toc-hId-334533914">Recap</H2><P>By following these steps, you can ensure a smooth transition from the deprecated Belize theme to a modern theme based on Quartz or Horizon, while maintaining a consistent user experience across your applications.</P><P><SPAN>For additional information, refer to the linked guides. If you need further assistance, feel free to reach out via component </SPAN><STRONG>CA-UI2-THD</STRONG><SPAN>.</SPAN></P>2025-05-05T13:46:33.595000+02:00https://community.sap.com/t5/rome-blog-posts/ciao-everyone-and-a-big-welcome-to-the-new-sap-community-group-rome/ba-p/14091701Ciao everyone and a big welcome to the new SAP Community Group – Rome2025-05-05T13:51:39.812000+02:00patty_1982https://community.sap.com/t5/user/viewprofilepage/user-id/42326<P>I’m super happy that Rome finally has its own local group in the SAP Community and I really hope lots of you will join! <span class="lia-unicode-emoji" title=":party_popper:">🎉</span><BR />Sono davvero contenta che anche Roma abbia finalmente il suo spazio nella community… e spero che in tanti decideranno di farne parte!</P><P>This is our place to stay in touch between events, share ideas, plan meetups or just have some relaxed conversations.<BR />Qui possiamo tenerci in contatto tra un evento e l’altro, scambiarci idee, organizzare qualcosa insieme o semplicemente fare due chiacchiere in libertà.</P><P>Feel free to start a discussion on anything SAP topics, ideas for the next SAP Stammtisch Rome, thoughts for a SAP Inside Track, or even just to say hi! <span class="lia-unicode-emoji" title=":slightly_smiling_face:">🙂</span><BR />Sentitevi liberi di iniziare nuove conversazioni: spunti per eventi, domande, curiosità… oppure anche solo per salutarci!</P><P>This group is informal and open to everyone the more voices, the more fun! <span class="lia-unicode-emoji" title=":smiling_face_with_smiling_eyes:">😊</span><BR />È un gruppo aperto, informale, dove tutti sono i benvenuti... più siamo, meglio è!</P><P>I’ve been part of the SAP Community for many years, and I’m really happy that we finally have a local group here in Italy’s capital!<BR />My hope is to bring together people from Rome and beyond, anyone who’s interested in connecting, sharing ideas, and helping this group grow. Whether you’re new or experienced, you’re more than welcome to join us. Let’s make some noise together!</P><P>Faccio parte della SAP Community da tantissimi anni, e sono davvero felice che finalmente abbiamo un gruppo locale qui nella capitale.<BR />Il mio desiderio è riuscire a riunire persone da Roma e da tutta Italia, chiunque abbia voglia di conoscersi, condividere idee e far crescere insieme questo gruppo. Che siate nuovi o parte della community da tempo, siete più che benvenuti. Facciamo casino insieme!</P><P>Can’t wait to chat with you all and see what we’ll build together here in Rome!<BR />Non vedo l’ora di conoscervi e vedere cosa riusciremo a creare insieme qui a Roma!</P>2025-05-05T13:51:39.812000+02:00https://community.sap.com/t5/enterprise-resource-planning-blog-posts-by-sap/sap-fiori-development-newsletter-may-2025-issue-34/ba-p/14091410SAP Fiori development newsletter May 2025 (issue #34)2025-05-06T15:40:00.038000+02:00PeterSpielvogelhttps://community.sap.com/t5/user/viewprofilepage/user-id/543<P>SAP Sapphire is coming, so you should expect lots of announcements about how AI solves complex business problems. AI also plays a major role in application development and simplifying the user experience. This issue has information about some product innovations that will make your life as a developer easier.</P><P>For ongoing updates, I encourage you to join our monthly SAP Fiori development roundtable. You can meet online with fellow developers and the SAP engineers who build our professional development tools. <A href="https://docs.google.com/forms/d/1ZqIX3zzGBOOIqehmlIRz_HhpQEhqunkLSzN1gnaOwP8/edit" target="_blank" rel="noopener nofollow noreferrer">Register online</A><SPAN> </SPAN>or email me for an invitation. Our next meeting is Wednesday, May 14, 2025. </P><P><SPAN>If you prefer to receive this in your inbox, please </SPAN><A href="https://www.sap.com/cmp/nl/sap-fiori-development-newsletter/index.html" target="_blank" rel="noopener noreferrer">subscribe to the SAP Fiori development newsletter.</A></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SAP_Fiori_Dev_Newsletter_34.png" style="width: 652px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/256893iD31DA5F5F23C9349/image-size/large?v=v2&px=999" role="button" title="SAP_Fiori_Dev_Newsletter_34.png" alt="SAP_Fiori_Dev_Newsletter_34.png" /></span></P><H2 id="toc-hId-1704677385" id="toc-hId-1710071502">Development News</H2><P><STRONG>Sapphire preview blog post</STRONG></P><P>SAP Sapphire and the ASUG Annual Conference are a great way to see the art of the possible, get inspired, and take away some concrete next steps on how to move your organization forward. This post contains sessions on AI, UX, moving to SAP S/4HANA Cloud, and personal development, including organizational change management.<BR /><A href="https://community.sap.com/t5/enterprise-resource-planning-blogs-by-sap/ux-ai-sap-s-4hana-transformation-sessions-at-sap-sapphire-and-asug-annual/ba-p/14068806" target="_blank">https://community.sap.com/t5/enterprise-resource-planning-blogs-by-sap/ux-ai-sap-s-4hana-transformation-sessions-at-sap-sapphire-and-asug-annual/ba-p/14068806</A></P><P><STRONG>Announcement: removal of Belize theme of SAP Fiori</STRONG></P><P>Know about the removal of the Belize theme of SAP Fiori and how to handle custom themes based on Belize.<BR /><A href="https://community.sap.com/t5/technology-blogs-by-sap/announcement-removal-of-belize-theme-of-sap-fiori/ba-p/14061924" target="_blank">https://community.sap.com/t5/technology-blogs-by-sap/announcement-removal-of-belize-theme-of-sap-fiori/ba-p/14061924</A></P><P><STRONG>UI5 linter just got smarter: Autofix is here!</STRONG></P><P>UI5 linter is the tool of choice to check your UI5 project for using best practices and replacement of deprecated UI5 APIs. With UI5 linter v1.12.0, we are happy to announce the initial version of an autofix feature: Use the "--fix" argument to let UI5 linter apply fixes to your code automatically. <A href="https://community.sap.com/t5/technology-blogs-by-sap/migrate-your-code-with-ui5-linter-autofix-has-landed/ba-p/14048470" target="_blank">https://community.sap.com/t5/technology-blogs-by-sap/migrate-your-code-with-ui5-linter-autofix-has-landed/ba-p/14048470</A></P><P><STRONG>SAPUI5 adoption now reaches all seven continents</STRONG></P><P>SAPUI5 is the foundation of many SAP solutions such SAP S/4HANA. Developers experience modern tools in SAP Build Code and frameworks such as SAP Fiori elements to efficiently develop and extend SAPUI5 applications. The combination of its power and ease of use is what drives its adoption across every continent, including Antarctica.<BR /><A href="https://community.sap.com/t5/technology-blogs-by-sap/sapui5-adoption-becoming-more-universal/ba-p/14064364" target="_blank">https://community.sap.com/t5/technology-blogs-by-sap/sapui5-adoption-becoming-more-universal/ba-p/14064364</A></P><P><STRONG>Simplify SAPUI5 code extensions with the SAP Build Extensibility Wizard</STRONG></P><P>SAP S/4HANA Cloud introduced the new SAP Build Extensibility Wizard, consolidating multiple extension options into one streamlined tool. Launch the wizard directly from a running SAP Fiori app for a simplified extension process. The latest update to the SAP Build Extensibility Wizard introduces the ability to also create an SAPUI5 adaptation project as a User Interface Extension.<BR /><A href="https://community.sap.com/t5/technology-blogs-by-sap/simplify-sapui5-code-extensions-with-the-sap-build-extensibility-wizard/ba-p/14087839" target="_blank">https://community.sap.com/t5/technology-blogs-by-sap/simplify-sapui5-code-extensions-with-the-sap-build-extensibility-wizard/ba-p/14087839</A></P><P><STRONG>Energy supplier badenova transforms work order coordination with SAP Fiori Makers, BTP, and user research insights</STRONG></P><P>SAP customer and German energy supplier badenova embarked on a transformative journey to streamline its work order coordination processes. To better manage the persistent operational challenges around customer requests, its subsidiary badenovaNETZE joined SAP to create a user-centric and future-focused design and solution for a new work order cockpit. They use SAP Fiori elements, SAP BTP, Scenes, and end user insights to get the job done. <BR /><A href="https://news.sap.com/2025/03/badenovanetze-work-order-coordination-sap-fiori-bootcamp/" target="_blank" rel="noopener noreferrer">https://news.sap.com/2025/03/badenovanetze-work-order-coordination-sap-fiori-bootcamp/</A></P><P><STRONG>SAP Fiori tools 2503 update: icons, app Info page, adaptation projects, preview</STRONG></P><P>SAP Fiori tools 2503 release introduces a refreshed icon set, improvements to the Application Info page, a new approach to previewing applications using virtual endpoints, and enhancements for UI adaptation. This post covers these and several other updates.<BR /><A href="https://community.sap.com/t5/technology-blogs-by-sap/sap-fiori-tools-2503-update-icons-app-info-page-adaptation-projects-preview/ba-p/14056256" target="_blank">https://community.sap.com/t5/technology-blogs-by-sap/sap-fiori-tools-2503-update-icons-app-info-page-adaptation-projects-preview/ba-p/14056256</A></P><P><STRONG>SAP Build Code updates</STRONG></P><P>The latest updates to SAP Build Code include a new high productivity experience for CAP Java projects, the creation of UI applications via our AI copilot Joule, and the development of MDK-based projects utilizing Joule. And much more. Details in the latest summary post. <BR /><A href="https://community.sap.com/t5/technology-blogs-by-sap/product-updates-for-sap-build-code-march-2025-edition/ba-p/14056060" target="_blank">https://community.sap.com/t5/technology-blogs-by-sap/product-updates-for-sap-build-code-march-2025-edition/ba-p/14056060</A></P><P><STRONG>SAP Build has new, simplified pricing and packaging to provide a unified experience for all developers</STRONG></P><P>SAP is introducing a new, unified commercial model for SAP Build that consolidates capabilities for pro-code, low-code, and AI-powered development tools. This makes it easier to build applications and extensions within the SAP ecosystem. <BR /><A href="https://community.sap.com/t5/technology-blogs-by-sap/introducing-the-new-pricing-and-packaging-for-sap-build-a-unified/ba-p/14086382" target="_blank">https://community.sap.com/t5/technology-blogs-by-sap/introducing-the-new-pricing-and-packaging-for-sap-build-a-unified/ba-p/14086382</A></P><H2 id="toc-hId-1508163880" id="toc-hId-1513557997">Events</H2><P><STRONG>SAP Fiori Innovation Day dates in 2025</STRONG></P><P>We have the dates for our next SAP Fiori Innovation Day events. </P><UL><LI>October 17 in Dallas, Texas</LI><LI>December 10 in Paris, France</LI></UL><P>The registration pages will go live during the summer, but you can mark your calendar now.</P><H2 id="toc-hId-1311650375" id="toc-hId-1317044492"><STRONG>Back issues from the past year</STRONG></H2><P><A href="https://community.sap.com/t5/enterprise-resource-planning-blogs-by-sap/sap-fiori-development-newsletter-march-2025-issue-33/ba-p/14036207" target="_self">SAP Fiori development newsletter March 2025 (Issue #33)</A></P><P><A href="https://community.sap.com/t5/enterprise-resource-planning-blogs-by-sap/sap-fiori-development-newsletter-january-2025-issue-32/ba-p/13984589" target="_self">SAP Fiori development newsletter January 2025 (issue #32)</A></P><P><A href="https://community.sap.com/t5/enterprise-resource-planning-blogs-by-sap/sap-fiori-development-newsletter-november-2024-issue-31/ba-p/13929385" target="_blank">SAP Fiori development newsletter November 2024 (issue #31)</A></P><P><A href="https://community.sap.com/t5/enterprise-resource-planning-blogs-by-sap/sap-fiori-development-newsletter-september-2024-issue-30/ba-p/13870115" target="_blank">SAP Fiori development newsletter September 2024 (issue #30)</A></P><P><A href="https://community.sap.com/t5/enterprise-resource-planning-blogs-by-sap/sap-fiori-development-newsletter-july-2024-issue-29/ba-p/13762548" target="_blank">SAP Fiori development newsletter July 2024 (issue #29)</A></P><P><A href="https://community.sap.com/t5/enterprise-resource-planning-blogs-by-sap/sap-fiori-development-newsletter-may-2024-issue-28/ba-p/13702765" target="_blank">SAP FIori development newsletter May 2024 (issue #28)</A></P>2025-05-06T15:40:00.038000+02:00https://community.sap.com/t5/technology-blog-posts-by-sap/sap-fiori-for-web-v6-0/ba-p/14095494SAP Fiori for Web v6.02025-05-08T09:26:58.489000+02:00SiyanaDicheva10https://community.sap.com/t5/user/viewprofilepage/user-id/13344<P><SPAN>We’re excited to share that the latest version of the <STRONG>SAP Fiori for Web UI Kit</STRONG> is now live in the <A href="https://www.figma.com/@sap" target="_self" rel="nofollow noopener noreferrer">SAP Figma Community</A>!</SPAN></P><P><SPAN>This update is essential for anyone designing enterprise web apps: it helps teams work faster, avoid rework and ensures your designs stay consistent, efficient, and ready for implementation.</SPAN></P><P><SPAN>The updates below include new components, improved variants, and refreshed design variables, all of which directly impact how you build and maintain high-quality UI elements.</SPAN></P><P><SPAN><A href="https://www.figma.com/community/file/1494295794601744471" target="_self" rel="nofollow noopener noreferrer"><STRONG>Check it out here</STRONG></A></SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SAP Figma Community" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/258419iD52A60AF911DF1FF/image-size/large?v=v2&px=999" role="button" title="External Kit published.png" alt="SAP Figma Community" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">SAP Figma Community</span></span><BR /></SPAN></P><H2 id="toc-hId-1710190918"><SPAN>What’s New - and What’s Evolved? </SPAN></H2><P><SPAN>Here’s a quick overview of the most important updates we’ve introduced over the past few versions, now all included in the new file:</SPAN></P><H3 id="toc-hId-1642760132"><SPAN>9+ New components:</SPAN></H3><P><SPAN>Tool Header, User Menu, Settings, Shell Bar, Side Navigation, and Notifications introduced.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Disclaimer: This image is a conceptual composition and does not represent a real-life use case." style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/258420iECCB8621955FE246/image-size/large?v=v2&px=999" role="button" title="Frame 162865.png" alt="Disclaimer: This image is a conceptual composition and does not represent a real-life use case." /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Disclaimer: This image is a conceptual composition and does not represent a real-life use case.</span></span></SPAN></P><P><SPAN>Form has been added to streamline structured data input.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Form component" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/258421i04422D6B1D2A0B4C/image-size/medium?v=v2&px=400" role="button" title="Frame 162869.png" alt="Form component" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Form component</span></span></SPAN></P><P><SPAN>The Legend provides a visual guide for interpreting content in the Calendar. The Legend Item represents individual status indicators within the Legend.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Calendar with Legend" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/258422iAFC1B45DE03957BA/image-size/medium?v=v2&px=400" role="button" title="Frame 162868.png" alt="Calendar with Legend" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Calendar with Legend</span></span></SPAN></P><P><SPAN>A new badge type called the Attention Badge has been introduced for Buttons, building on the existing Counter Badge.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Button with Attention Badge" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/258423iC01B62AAAB3238B3/image-size/medium?v=v2&px=400" role="button" title="Frame 162872.png" alt="Button with Attention Badge" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Button with Attention Badge</span></span></SPAN></P><H3 id="toc-hId-1446246627">Variables:</H3><P><SPAN>All design variables have been updated to align with the latest version, ensuring consistency and accuracy across components.</SPAN></P><H3 id="toc-hId-1249733122"><SPAN>Component Improvements:</SPAN></H3><P><SPAN>Additional variants have been added to existing components.<BR /><BR /></SPAN></P><H2 id="toc-hId-924136898"><SPAN>What This Means for You</SPAN></H2><P><SPAN>You have access to an accurate, easy-to-use, and regularly updated UI Kit - all in one place. Whether you're designing, prototyping, or building with SAP Fiori for Web, this setup ensures you're always working with the latest standards.</SPAN></P><P><SPAN>Thanks for being part of the journey. We’re already preparing for the next update. We can’t wait to see what you create with the <STRONG>SAP Fiori for Web UI Kit</STRONG>!</SPAN></P><P><SPAN>Feel free to check out our other kits in the <A href="https://www.figma.com/@sap" target="_self" rel="nofollow noopener noreferrer">SAP Figma Community</A>.<BR /><BR /><FONT color="#999999"><EM>Authors: Siyana Dicheva (UX Designer, SAP Core Design Team) and Janina Fichtner (UX Designer, SAP Core Design Team)</EM></FONT><BR /></SPAN></P>2025-05-08T09:26:58.489000+02:00https://community.sap.com/t5/technology-blog-posts-by-members/sap-segw-vs-rap-vs-cap-making-the-most-of-function-imports-actions-and/ba-p/14093471SAP SEGW vs RAP vs CAP: Making the most of Function Imports, Actions and Functions (Part 1)2025-05-08T09:35:18.963000+02:00valentincadarthttps://community.sap.com/t5/user/viewprofilepage/user-id/786198<P><SPAN>After working on several SAP projects, I have noticed a common trend consisting in a plethora of SEGW projects full of function imports that are generally misused or unnecessary. With my experience—and after delving into the SAP documentation—I have decided to write this blog to shed some light on function imports. I will explain what they are, what they are used for, when to use them and when to avoid using them, and will do so not only for SAP SEGW projects, but also for their equivalents within the more recent SAP RAP and CAP frameworks—since I am actively diving into these modern development approaches and working on business projects that leverage them. To make this more concrete, I’ll walk through a practical example, which I’ve made available on GitHub.</SPAN></P><P><SPAN>Let's clear up the confusion together. So, grab your coffee, and let’s dive in ! </SPAN></P><UL><LI>Part 1. SEGW Context</LI><LI><A href="https://community.sap.com/t5/technology-blog-posts-by-members/sap-segw-vs-rap-vs-cap-making-the-most-of-function-imports-actions-and/ba-p/14095075" target="_self">Part 2. SAP RAP and SAP CAP + github project</A></LI></UL><P> </P><H2 id="toc-hId-1710131271"><STRONG>SAP SEGW Context</STRONG></H2><P><SPAN>A function import in OData is a way to define and call custom operations in one’s service that goes beyond the standard data handling actions—like creating, reading, updating, or deleting records (CRUD). These standard actions are typically handled through the HTTP methods POST, GET, PUT/MERGE, and DELETE.</SPAN></P><P><SPAN>However, if you need to perform a more specialized task that does not neatly fit into the standard CRUD operations, you can create a function import in your data model using Service Builder. These custom operations can then be triggered using either the GET or POST HTTP methods.</SPAN></P><P><SPAN>But first, a small word of caution: these specific function imports are only to be used for actions that cannot be done with standard traditional CRUD operations. If the task can be handled through regular create, read, update, or delete, then a function import is not required. </SPAN></P><P><SPAN>Let’s look at an example to understand.</SPAN></P><P> </P><H3 id="toc-hId-1642700485"><SPAN><STRONG>Example : Flight management system with CRUD and custom operations</STRONG></SPAN></H3><P><U>Core CRUD operations : </U></P><P><I><SPAN>These operations cover the basic data management needs for flight records</SPAN></I></P><UL><LI><SPAN>Create: Add new flight (e.g., POST /flight with origin, destination, departure, arrival..).</SPAN></LI><LI><SPAN>Read: Retrieve existing flight (e.g., GET /flight/{id}).</SPAN></LI><LI><SPAN>Update: Modify flight (e.g., PUT /flight/{id} to adjust departure time).</SPAN></LI><LI><SPAN>Delete: Remove canceled flight (e.g., DELETE /flight/{id}).</SPAN></LI></UL><P><U>Custom operations : </U></P><P><I><SPAN>These are business-specific operations that go beyond standard CRUD</SPAN></I></P><UL><LI><SPAN>Print details: Generate and print comprehensive flight information (e.g., schedule, aircraft, and seating).</SPAN></LI><LI><SPAN>Generate report: Create operational or statistical reports for flights over a specified date range.</SPAN></LI><LI><SPAN>…</SPAN></LI></UL><P><SPAN>Custom operations are separated from CRUD because they encapsulate domain-specific behavior that cannot be addressed by simple data manipulation alone. While CRUD operations focus on creating, reading, updating, or deleting records, custom actions often perform calculations, trigger workflows, or apply business rules across multiple entities. </SPAN></P><P><SPAN>This distinction supports a cleaner and more maintainable architecture—where CRUD handles core data persistence, and custom operations handle the more nuanced logic of the application domain.</SPAN></P><P> </P><H3 id="toc-hId-1446186980"><STRONG>Implementation example </STRONG></H3><P><SPAN>Below is an implementation example of how to call a function import defined in SEGW. </SPAN></P><P><SPAN>On the front-end, the function import is triggered via an OData request using callFunction(), for example: /sap/opu/odata/SERVICE_NAME/FunctionImportName(...). </SPAN></P><P><SPAN>On the back-end, it is handled by redefining the EXECUTE_ACTION method in the *_DPC_EXT class. Inside this method, the iv_action_name parameter is used to identify the specific function being called. Input parameters are accessed through the it_parameter table, and the corresponding backend logic is implemented accordingly.</SPAN></P><P><SPAN>Front-end code: </SPAN></P><pre class="lia-code-sample language-javascript"><code>let oModel = this.getView().getModel();
let mParameters = {
FlightID: "12345"
};
oModel.callFunction("/PrintFlightDetails", {
method: "POST",
urlParameters: mParameters,
success: function(oData, response) {
MessageToast.show(oData.Message);
},
error: function(oError) {
MessageToast.show("Error printing flight details");
}
});</code></pre><P><SPAN>Back-end code : </SPAN><I><SPAN>(Assuming we have previously defined the function import in the SEGW project and an ABAP OO class to manage the business object Flight)</SPAN></I></P><pre class="lia-code-sample language-abap"><code>METHOD execute_action.
" Check if the action name is 'PrintFlightDetails'
IF iv_action_name = 'PrintFlightDetails'.
" Retrieve input parameter
READ TABLE it_parameter INTO DATA(ls_parameter) WITH KEY name = 'FlightID'.
IF sy-subrc = 0.
DATA(lv_flightid) = ls_parameter-value.
ELSE.
" Manage error
ENDIF.
" Instantiate the flight manager class
DATA(lo_flight) = NEW zcl_flight( lv_flightid ).
" Call the method to update the flight status
DATA(lv_message) = lo_flight->print_flight_details( ).
...
ENDIF.
ENDMETHOD.</code></pre><H2 id="toc-hId-1120590756"> </H2><H2 id="toc-hId-924077251"><SPAN><STRONG>Conclusion</STRONG></SPAN></H2><P><SPAN>Function imports are a powerful tool, but like any tool, they must be used wisely. In SEGW, it is best to reserve them for operations that do not fit naturally into the CRUD. Misuse can lead to bloated, unclear services and unnecessary complexity.</SPAN></P><P><SPAN>In the next part of this series, I'll explore how similar use cases are handled in RAP and CAP - with a GitHub project to illustrate it all in action.</SPAN></P><P><SPAN>Stay tuned!</SPAN></P>2025-05-08T09:35:18.963000+02:00https://community.sap.com/t5/technology-blog-posts-by-members/sap-segw-vs-rap-vs-cap-making-the-most-of-function-imports-actions-and/ba-p/14095075SAP SEGW vs RAP vs CAP: Making the most of Function Imports, Actions and Functions (Part 2)2025-05-08T09:36:59.881000+02:00valentincadarthttps://community.sap.com/t5/user/viewprofilepage/user-id/786198<P>After working on several SAP projects, I have noticed a common trend consisting in a plethora of SEGW projects full of function imports that are generally misused or unnecessary. With my experience—and after delving into the SAP documentation—I have decided to write this blog to shed some light on function imports. I will explain what they are, what they are used for, when to use them and when to avoid using them, and will do so not only for SAP SEGW projects, but also for their equivalents within the more recent SAP RAP and CAP frameworks—since I am actively diving into these modern development approaches and working on business projects that leverage them. To make this more concrete, I’ll walk through a practical example, which I’ve made available on GitHub.</P><P>Let's clear up the confusion together. So, grab your coffee, and let’s dive in !</P><UL><LI><A href="https://community.sap.com/t5/technology-blog-posts-by-members/sap-segw-vs-rap-vs-cap-making-the-most-of-function-imports-actions-and/ba-p/14093471" target="_self">Part 1. SEGW Context</A></LI><LI>Part 2. SAP RAP and SAP CAP + github project</LI></UL><P> </P><H2 id="toc-hId-1710187013">SAP’s new frameworks</H2><P><SPAN>SAP RAP (RESTful ABAP Programming Model) and SAP CAP (Cloud Application Programming Model) are the two modern frameworks from SAP designed for building applications. </SPAN></P><P><SPAN>Both frameworks support extending standard CRUD operations by allowing developers to define custom logic—commonly known as actions or functions. In RAP, these are introduced in behavior definitions, while in CAP, they're modeled in the service layer. This functional similarity makes it natural to discuss them together.</SPAN></P><P><SPAN>As a quick note for context: this blog won’t delve into the differences between static and instance-based implementations, bound and unbound actions and functions.. as those topics are beyond the scope of this post — although they might be the subject of a future blog post.</SPAN></P><P> </P><H3 id="toc-hId-1642756227">SAP RAP Context</H3><P><SPAN>SAP RAP is SAP’s modern framework for developing OData services and business applications using ABAP. It serves the same core purpose as SAP SEGW (Service Gateway), which is to expose data and operations from SAP systems via OData. </SPAN></P><P><SPAN>Unlike SEGW, which relies heavily on manual coding and separate models, RAP uses a streamlined, model-driven approach with better integration into the ABAP RESTful environment, leveraging CDS (Core Data Services) to define and manage the data models in a more declarative way.</SPAN></P><H3 id="toc-hId-1446242722"> </H3><H3 id="toc-hId-1249729217">SAP CAP Context</H3><P><SPAN>SAP CAP is SAP’s modern development framework for building services and applications, particularly optimized for the SAP Business Technology Platform (BTP). It provides a streamlined, full-stack development experience with built-in support for defining data models, service APIs, and custom logic using a combination of Core Data Services (CDS), Node.js, or Java.</SPAN></P><P><SPAN>While SAP RAP is more ABAP-centric and suited for on-premise or S/4HANA systems, CAP is cloud-native and ideal for developing applications in the BTP environment.</SPAN></P><P><SPAN>Unlike traditional approaches like SEGW or even ABAP RAP, which are deeply rooted in the ABAP stack, CAP is open and service-oriented by design. It promotes strong integration with SAP HANA, SAP Fiori, and external services through open standards like OData and REST.</SPAN></P><H4 id="toc-hId-1182298431"> </H4><H4 id="toc-hId-985784926">Standard vs Non-Standard Operations in RAP and CAP</H4><P><SPAN>Both SAP RAP and SAP CAP distinguish between standard and non-standard OData operations. Standard operations refer to the CRUD functionalities, which are automatically handled by the frameworks. In addition to CRUD, both frameworks also manage transactional behavior, draft handling, validation, and persistence with minimal configuration. </SPAN></P><P><SPAN>Non-standard operations, on the other hand, are used to implement custom business logic beyond CRUD, following the same conceptual model as Function Imports in the classical SEGW approach. </SPAN></P><H4 id="toc-hId-789271421"> </H4><H4 id="toc-hId-592757916">Actions and Functions in RAP and CAP</H4><P><SPAN>In both RAP and CAP, Actions and Functions represent non-standard operations that integrate custom logic into the application. Actions are used for logic that may change data or cause side effects while Functions are read-only operations that return data.</SPAN></P><P><SPAN>In RAP, these are defined in the behavior definition and implemented in the behavior pool class, ensuring proper transactional and authorization handling. </SPAN></P><P><SPAN>In CAP, they are defined in the CDS service definition, and the implementation resides in service handlers (Node.js or Java). </SPAN></P><P><SPAN>Both frameworks ensure these operations are fully OData V4-compliant and seamlessly consumable by Fiori Elements or other OData clients.</SPAN></P><H3 id="toc-hId-267161692"> </H3><H3 id="toc-hId-70648187">Fundamental difference between SEGW and SAP RAP/CAP</H3><P><SPAN>SAP SEGW (SAP Gateway Service Builder) is based on a flexible approach for managing CRUD operations. When creating or updating a service, the framework generates standard methods such as CREATE_ENTITY, UPDATE_ENTITY, DELETE_ENTITY, etc., which developers can redefine to incorporate more complex business logic tailored to functional requirements.</SPAN></P><P><SPAN>When a batch call is made from the front end, for example via a SubmitChanges operation, the grouped operations (creating entry C, updating entry A, deleting entry B, etc.) are dispatched individually in the backend. In other words, each operation is handled separately by the corresponding method (CREATE_ENTITY, UPDATE_ENTITY, etc.).</SPAN></P><P><SPAN>However, this approach introduces certain limitations, particularly in error handling within batch processing. Since each operation is processed independently, managing scenarios involving partial rollbacks or consistent error propagation across the batch becomes more complex. </SPAN></P><P><SPAN>SAP RAP and SAP CAP adopt a structured, model-based approach for managing data and business logic. Both rely on OData v4 and Core Data Services (CDS) to define entities, their relationships, and their behaviors.</SPAN></P><P><SPAN>CRUD operations such as CREATE and UPDATE are defined at the entity level and are designed to be handled individually, meaning they are executed on a single instance at a time. To manage more complex processing or scenarios involving multiple entities, RAP and CAP recommend the use of actions or functions, which allow business logic to be encapsulated without being directly embedded in the standard operations.</SPAN></P><P><SPAN>However, if no specific logic is required, it is still possible to perform batch processing (bulk update) using standard CRUD operations. That said, this approach is not recommended, as CRUD operations are intended for single-record processing, with validations, lifecycle hooks (such as before, after, check, etc.), and line-by-line error handling. Using batch processing via CRUD can lead to inconsistent behavior, difficult-to-control partial rollbacks, and a loss of control over overall business and transactional logic.</SPAN></P><P><SPAN>In addition, using actions offers many other advantages, such as:</SPAN></P><UL><LI><SPAN>Automatic interface generation: Actions are automatically exposed as buttons or menu items in Fiori Elements interfaces. They can be triggered on multiple selections (multi-select) with consistent UX behavior, and they allow for explicit naming of specific business processes (e.g., "Validate All", "Send Invoices").</SPAN></LI><LI><SPAN>Precise control over business logic: An action encapsulates business logic clearly, separate from generic CRUD operations. You can easily include custom validations, complex rules, calls to other services, and more.</SPAN></LI><LI><SPAN>Robust transaction and error handling: Actions enable centralized exception management, the return of structured user messages, and support for global rollbacks when needed.</SPAN></LI><LI><SPAN>...</SPAN></LI></UL><P><SPAN>A core principle in RAP and CAP is the clear separation between basic CRUD operations and business logic. This distinction enhances data consistency, code readability, and, most importantly, long-term maintainability of applications. Each action represents a clear business intent, integrated within a well-defined service structure.</SPAN></P><P><SPAN>In summary, SAP SEGW offers greater implementation freedom, which can be suitable for simple use cases with minimal business logic. However, it lacks a structured framework for handling complex scenarios or bulk processing. In contrast, SAP RAP and CAP enforce a more rigorous architecture, ensuring more reliable and scalable application management—both on the backend and frontend.</SPAN></P><P><SPAN>Now that we've covered the theory, let's explore some practical examples to see how this approach is implemented in these modern frameworks.</SPAN></P><H3 id="toc-hId--201096687"> </H3><H3 id="toc-hId--397610192"><SPAN><STRONG>RAP implementation example</STRONG></SPAN></H3><P><SPAN>Below is an implementation example of how to call an action and a static function defined in SAP RAP. </SPAN></P><P><SPAN>In the front-end (e.g., Fiori Elements), the action setStatusToCanceled is triggered via the UI using the OData POST call to /EntitySet(...)/setStatusToCanceled. This is handled in the back-end by redefining the setStatusToCanceled method in the behavior implementation class (lhc_ZFM_C_FLIGHTS), where the logic modifies the entity’s status. </SPAN></P><P><SPAN>For the static function GetNumberOfDelayedFlights, it is triggered by a GET call like /EntitySet/GetNumberOfDelayedFlights, and its logic is implemented in the getnumberofdelayedflights method, returning a result structure with the computed data.</SPAN></P><P><I><SPAN>Flight Root Entity CDS View</SPAN></I></P><pre class="lia-code-sample language-abap"><code>define root view entity ZFM_C_FLIGHTS as select from ZFM_I_FLIGHTS
{
key Flight,
Origin,
Destination,
Departure,
Arrival,
Delay,
.lineItem: [{ position: 70 }, { type: #FOR_ACTION, dataAction: 'setStatusToCanceled' , label: 'Cancel flight'}]
Status
}</code></pre><P><I><SPAN>Behavior Definition</SPAN></I></P><pre class="lia-code-sample language-abap"><code>managed implementation in class zbp_fm_c_flights unique;
strict ( 2 );
define behavior for ZFM_C_FLIGHTS
persistent table zfm_flights
lock master
authorization master ( instance )
{
create;
update;
delete;
field ( numbering : managed, readonly ) Flight;
action setStatusToCanceled result [1] $self;
static function GetNumberOfDelayedFlights result [1] ZD_GETDELAYEDFLIGHTS_RESULT;
mapping for zfm_flights {
Flight = flight_id;
Origin = origin_code;
Destination = destination_code;
Departure = departure;
Arrival = arrival;
Delay = delay;
Status = status_code;
}
}</code></pre><P><I><SPAN>Behavior Projection</SPAN></I></P><pre class="lia-code-sample language-abap"><code>projection;
strict ( 2 );
define behavior for ZFM_P_FLIGHTS
{
use create;
use update;
use delete;
use action setStatusToCanceled;
use function GetNumberOfDelayedFlights;
}</code></pre><P><I><SPAN>Behavior Implementation Class (ABAP)</SPAN></I></P><pre class="lia-code-sample language-abap"><code>CLASS lhc_ZFM_C_FLIGHTS DEFINITION INHERITING FROM cl_abap_behavior_handler.
PRIVATE SECTION.
METHODS get_instance_authorizations FOR INSTANCE AUTHORIZATION
IMPORTING keys REQUEST requested_authorizations FOR zfm_c_flights RESULT result.
METHODS setstatustocanceled FOR MODIFY
IMPORTING keys FOR ACTION zfm_c_flights~setstatustocanceled RESULT result.
METHODS getnumberofdelayedflights FOR READ
IMPORTING keys FOR FUNCTION zfm_c_flights~getnumberofdelayedflights RESULT result.
ENDCLASS.
CLASS lhc_ZFM_C_FLIGHTS IMPLEMENTATION.
METHOD get_instance_authorizations.
ENDMETHOD.
METHOD setStatusToCanceled.
MODIFY ENTITIES OF zfm_c_flights IN LOCAL MODE
ENTITY zfm_c_flights
UPDATE FROM VALUE #( FOR key IN keys
( Flight = key-Flight
Status = 'CAN' " Cancelled
%control-Status = if_abap_behv=>mk-on ) )
FAILED failed
REPORTED reported.
"Read changed data for action result
READ ENTITIES OF zfm_c_flights IN LOCAL MODE
ENTITY zfm_c_flights
ALL FIELDS WITH
CORRESPONDING #( keys )
RESULT DATA(flights).
result = VALUE #( FOR flight IN flights
( %tky = flight-%tky
%param = flight ) ).
ENDMETHOD.
METHOD getNumberOfDelayedFlights.
DATA: ls_delayedflights TYPE zd_getdelayedflights_result.
" Read all flights where status_code = 'CAN'
SELECT COUNT( * ) FROM zfm_flights
WHERE delay > 0
INTO _delayedflights .
" Count how many were found
APPEND VALUE #( %param = CORRESPONDING #( ls_delayedflights ) ) TO result.
ENDMETHOD.
ENDCLASS.</code></pre><H3 id="toc-hId--594123697"> </H3><H3 id="toc-hId--790637202">CAP implementation example</H3><P><SPAN>If you’ve made it this far, it means you’re really interested in the topic — great!</SPAN></P><P><SPAN>To illustrate the fundamental differences between SEGW and CAP/RAP, I have implemented a more comprehensive CAP project. In this implementation, the use of an action instead of a batch update clearly proves its value through its seamless integration with Fiori Elements, as well as its ability to encapsulate business logic and handle errors effectively during mass processing.</SPAN></P><P><SPAN>To make things a bit more fun, here are three example use cases that I implemented in the following CAP example. Try to guess for each one whether it should be handled with a function or an action. The detailed answers are provided just below the implementation — but give it a try first!</SPAN></P><OL><LI><SPAN>Add delay to a flight – This updates the flight's delay and adjusts the arrival and/or departure time depending on the flight status.</SPAN><SPAN><BR /><BR /></SPAN></LI><LI><SPAN>Add delay to a list of flights – Same rules apply, but now you're looping through several flights, recalculating times, updating them, and optionally showing success or warning messages.</SPAN><SPAN><BR /><BR /></SPAN></LI><LI><SPAN>Retrieve the number of delayed flights – returns how many flights are currently delayed.</SPAN></LI></OL><P><I><SPAN>CDS Service Definition (srv/service.cds)</SPAN></I></P><pre class="lia-code-sample language-javascript"><code>using { flightManagement as fm } from '../db/schema';
service FlightsService @(path: '/flights') {
.draft.enabled
entity Flights as projection on fm.Flights actions {
action addDelay(
delay: Integer
@label: '{i18n>addDelayAction_delayParameter}' ) returns Flights; };
function getNbOfDelayedFlights() returns Integer;
}</code></pre><P><I><SPAN>Service Implementation (srv/service.js)</SPAN></I></P><pre class="lia-code-sample language-javascript"><code>const cds = require('@sap/cds');
const TextBundle = require('@sap/textbundle').TextBundle;
module.exports = cds.service.impl(srv => {
const { Flights } = srv.entities;
// Validate and adjust flight data before update
srv.before('UPDATE', 'Flights.drafts', async (req) => {
// Recalculate departure/arrival if delay is updated
if ('delay' in req.data) {
try {
let { departure, arrival } = await this._recalculate_departure_arrival(req.data.ID, req.data.delay);
if (departure === undefined && arrival === undefined) {
req.reject(400, 'ERR_UPDATING_CAN_OR_LAN', 'delay');
}
req.data.departure = departure;
req.data.arrival = arrival;
} catch (error) {
req.reject(400, 'ERR_UPDATING_DELAY', 'delay');
}
}
});
srv.on('addDelay', async (req) => {
const locale = req.locale;
const bundle = new TextBundle('./i18n/i18n', locale);
// Loop through all flights
for (let flight of req.params) {
let { departure, arrival } = await this._recalculate_departure_arrival(flight.ID, req.data.delay);
if (departure === undefined && arrival === undefined) {
// If calculation failed, send a failure notification for this flight
req.warn({
message: bundle.getText('WARNING_UPDATING_DELAY_CAN_OR_LAN', [flight.ID])
})
continue; // Skip updating this flight
}
// Update the flight with the new delay, departure, and arrival times
const result = await UPDATE(Flights) .where({ ID: flight.ID }) .set({ delay: req.data.delay, departure, arrival });
if (result === 1) {
// Success: 1 row was affected
req.notify({
code: 1,
message: bundle.getText('SUCCESS_UPDATING_DELAY', [flight.ID, req.data.delay, departure, arrival])
});
} else {
// Failure: no rows were updated
req.error({
message: bundle.getText('FAILURE_UPDATING_DELAY', [flight.ID])
});
}
}
});
// Function: Return the number of delayed flights
srv.on('getNbOfDelayedFlights', async () => {
const result = await SELECT `count(*) as count` .from(Flights) .where `delay > 0`;
return (Array.isArray(result) && result.length > 0) ? result[0].count : 0;
});
};</code></pre><P><SPAN>You’ve probably already figured out the answers by looking at the implementation, but let me walk you through the reasoning behind each choice:</SPAN></P><P><SPAN>For the first use case, “Add delay to a flight”, this one was a bit of a trick — it can be neatly handled within a before UPDATE hook, making it a natural candidate for standard CRUD logic.</SPAN></P><P><SPAN>In contrast, the action “Add delay to a list of flights” introduces more complexity. Since it involves applying business logic across multiple records as well as front-end integration, it is best implemented as a custom action. This approach also enables the generation of a button directly in the table header, along with an input popup, improved error handling, and, at the end of the process, a summary popup listing the operations that were processed in the user interface.</SPAN></P><P class="lia-align-center" style="text-align: center;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="valentincadart_0-1746602434253.png" style="width: 501px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/258300i1A6B66058392B996/image-dimensions/501x213?v=v2" width="501" height="213" role="button" title="valentincadart_0-1746602434253.png" alt="valentincadart_0-1746602434253.png" /></span></P><P class="lia-align-left" style="text-align : left;"><SPAN>It is possible to enable standard bulk deletion management in Fiori Elements, handled by the framework. This is because it can be sent in batch without any business logic, as in the application I developed. We can also see the ease of integrating the action into a Fiori Elements through annotations. Finally, with the business complexity and error handling, we get feedback regardless of whether it's a success or failure, something that would have been complicated with a batch send. This example illustrates why these new frameworks recommend actions for such cases.</SPAN></P><P class="lia-align-center" style="text-align: center;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="valentincadart_1-1746602461077.png" style="width: 500px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/258301i5B939C96B0627D52/image-dimensions/500x332?v=v2" width="500" height="332" role="button" title="valentincadart_1-1746602461077.png" alt="valentincadart_1-1746602461077.png" /></span></P><P><SPAN>Lastly, the most straightforward case, “Retrieve the number of delayed flights”, simply returns data with no side effects. This makes it a perfect fit for a function.</SPAN></P><P class="lia-align-left" style="text-align : left;"><SPAN>The complete project is available on my GitHub repository => </SPAN><A href="https://github.com/ValentinCadart/FlightManagement" target="_blank" rel="noopener nofollow noreferrer"><SPAN>https://github.com/ValentinCadart/FlightManagement</SPAN></A><SPAN>.</SPAN></P><H2 id="toc-hId--693747700"> </H2><H2 id="toc-hId--890261205"><STRONG>Conclusion</STRONG></H2><P>In a nutshell<SPAN>, Function Imports, Actions, and Functions are key components across SAP SEGW, RAP, and CAP that enable you to implement custom business logic, transcending basic CRUD functionality. While each platform offers its unique features and methods of defining and invoking these operations, understanding when and how to use them is essential for building efficient, scalable SAP applications.</SPAN></P><P><SPAN>Sooo.. one more misuse of function imports, actions or functions and I’m calling Basis to revoke your service deployment privileges. You’ve been warned ! </SPAN></P>2025-05-08T09:36:59.881000+02:00https://community.sap.com/t5/enterprise-resource-planning-blog-posts-by-sap/user-experience-overviews-at-sap-sapphire-orlando-amp-madrid/ba-p/14100516User Experience Overviews at SAP Sapphire Orlando & Madrid2025-05-13T18:29:01.995000+02:00ThomasReisshttps://community.sap.com/t5/user/viewprofilepage/user-id/149639<P><STRONG>Join us in Orlando May 20-21 or Madrid May 27-28 to get an overview of the latest user experience innovations along with an outlook on what is planned.</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Figure 1: Alt Text: Image of Arin Bhowmick, Chief Design Officer, SAP, with the title and ID of his talk, along with date and location for Orlando." style="width: 940px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/260744iF29661EA3F0EB8F6/image-size/large?v=v2&px=999" role="button" title="Arin Image for Sapphire Orlando 2025.jpeg" alt="Figure 1: Alt Text: Image of Arin Bhowmick, Chief Design Officer, SAP, with the title and ID of his talk, along with date and location for Orlando." /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Figure 1: Alt Text: Image of Arin Bhowmick, Chief Design Officer, SAP, with the title and ID of his talk, along with date and location for Orlando.</span></span></P><P>Listen to <STRONG>Arin Bhowmick, </STRONG>our<STRONG> Chief Design Officer</STRONG>:</P><P><STRONG>Title</STRONG>: <STRONG>SAP's user-experience strategy to achieve better outcomes</STRONG></P><P><STRONG>Orlando</STRONG>: <A href="https://www.sap.com/events/sapphire/flow/sap/so25/catalog-inperson/page/catalog/session/1742817378926001ob9V" target="_blank" rel="noopener noreferrer">PUX2821</A>, May 20, 2025 3:30 – 3:50 PM EDT</P><P><STRONG>Madrid</STRONG>: <A href="https://www.sap.com/events/sapphire/flow/sap/sm25/catalog-inperson/page/catalog/session/1743615585766001AfIO" target="_blank" rel="noopener noreferrer">PUX1497</A>, May 27, 2025, 1:30 – 1:50 PM CEST</P><P><STRONG>Abstract: </STRONG>Understand how SAP is leading the way to help business users get work done easily and with better outcomes. Our strategy provides a consistent and integrated suite-first experience, infuses AI nearly everywhere, makes it easier for our customers and partners to design and build great UX, and leverages our user research framework to meet your needs.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Figure 2: Alt Text: Image of Thomas Reiss, VP of SAP User Experience Product Management, with the title and ID of his talk, along with date and location for Orlando." style="width: 940px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/260746i2C278FBD57DD739D/image-size/large?v=v2&px=999" role="button" title="Tom Image for Sapphire Orlando 2025.png" alt="Figure 2: Alt Text: Image of Thomas Reiss, VP of SAP User Experience Product Management, with the title and ID of his talk, along with date and location for Orlando." /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Figure 2: Alt Text: Image of Thomas Reiss, VP of SAP User Experience Product Management, with the title and ID of his talk, along with date and location for Orlando.</span></span></P><P>Join me for my road map talk:</P><P><STRONG>Title</STRONG>: <STRONG>User experience innovations in our products: For today and tomorrow</STRONG></P><P><STRONG>Orlando</STRONG>: <A href="https://www.sap.com/events/sapphire/flow/sap/so25/catalog-inperson/page/catalog/session/1742818459404001CLBD" target="_blank" rel="noopener noreferrer">PUX2826</A>, May 20, 2025 4:30 – 4:50 PM EDT</P><P><STRONG>Madrid</STRONG>: <A href="https://www.sap.com/events/sapphire/flow/sap/sm25/catalog-inperson/page/catalog/session/1743615769323001tQ0z" target="_blank" rel="noopener noreferrer">PUX1498</A>, May 28, 2025, 9:00 – 9:20 AM CEST</P><P><STRONG>Abstract: </STRONG>Have a look at the latest UX innovations across our suite of applications, along with cool innovations coming soon. Examine SAP S/4HANA Cloud and SAP S/4HANA, as well as cloud products such as SAP SuccessFactors and SAP Ariba solutions. Also, check out selected highlights from UI technologies.</P><P> </P><H1 id="toc-hId-1601277421"><SPAN>Orlando: Further UX Talks</SPAN></H1><P><SPAN>Let me call out these additional UX specific talks:</SPAN></P><UL><LI><STRONG>Suite-first experience: Seamless, consistent, and integrated</STRONG><BR />PUX2825 Tuesday, 1:00 pm</LI><LI><STRONG>Creating a great UX for your own applications with SAP Design System</STRONG> PUX2827 Tuesday, 1:30 pm</LI><LI><STRONG>AI on the go: Run your business with SAP Mobile Start and Joule</STRONG><BR />PUX2818 Tuesday, 2:00 pm</LI><LI><STRONG>From insights to impact: Elevating product success through your feedback</STRONG> PUX2822 Tuesday, 3:00 pm</LI><LI><STRONG>AI-first user experience: What's in it for you?<BR /></STRONG>PUX2824 Wednesday, 11:00 am</LI><LI><STRONG>An overview of our AI-fueled mobile products across SAP Business Suite</STRONG> PUX2819 Wednesday, 11:30 am</LI><LI><STRONG>Our mobile experiences empowering today’s and tomorrow’s business users</STRONG> PUX3224 Wednesday, 1:00 pm</LI></UL><P>Find out more in the session catalog for Sapphire Orlando, May 19-21: <A href="https://www.sap.com/events/sapphire/flow/sap/so25/catalog-inperson/page/catalog?search.track=1742816906487001Qhf3&tab.sessionplanned=1692641568884001cZ9d" target="_blank" rel="noopener noreferrer">Product and User Experience Track</A>.</P><P>Beyond that, there are a number of interesting UX-related talks in other tracks, have a look here for a nice summary by Peter Spielvogel:</P><UL><LI><SPAN><A href="https://community.sap.com/t5/enterprise-resource-planning-blog-posts-by-sap/ux-ai-sap-s-4hana-transformation-sessions-at-sap-sapphire-and-asug-annual/ba-p/14068806" target="_blank">UX, AI, SAP S/4HANA transformation sessions at SAP Sapphire and ASUG Annual Conference 2025</A></SPAN>.</LI></UL><P> </P><H1 id="toc-hId-1404763916"><SPAN>Madrid: Further UX Talks</SPAN></H1><UL><LI><STRONG>Creating a great UX for your own applications with SAP Design System</STRONG> PUX1499 Wednesday, 11:30 pm</LI><LI><STRONG>From insights to impact: Elevating product success through your feedback</STRONG> PUX1495 Tuesday, 11:00 am</LI><LI><STRONG>An overview of our AI-fueled mobile products across SAP Business Suite</STRONG> PUX1494 Wednesday, 3:30 pm</LI></UL><P>Find out more in the session catalog for Sapphire Madrid, May 26-28: <A href="https://www.sap.com/events/sapphire/flow/sap/sm25/catalog-inperson/page/catalog?tab.sessionplanned=1692641568884001cZ9d&search.track=1742816906487001Qhf3" target="_blank" rel="noopener noreferrer">Product and User Experience Track</A> (6 talks).</P><P> </P><H1 id="toc-hId-1208250411"><SPAN>More Information</SPAN></H1><P><SPAN>I hope to see you either in Orlando or Madrid – feel free to approach me and ask questions!</SPAN></P><P><SPAN>In case you missed my recent series of blog posts about our recent UX innovations, do have a look, it starts with this one, which contains links to all the other six posts in the series:</SPAN></P><P><SPAN><A href="https://community.sap.com/t5/technology-blogs-by-sap/sap-user-experience-q1-2025-update-part-1-many-new-innovations-available-ai/ba-p/14012822" target="_blank">SAP User Experience Q1/2025 Update – Part 1: Many New Innovations Available (AI, Joule and More)</A></SPAN>.</P>2025-05-13T18:29:01.995000+02:00https://community.sap.com/t5/technology-blog-posts-by-sap/sapui5-is-leading-the-way-in-accessibility-with-wcag-2-2/ba-p/14101596SAPUI5 is Leading the Way in Accessibility with WCAG 2.22025-05-15T13:47:07.239000+02:00OliverGraeffhttps://community.sap.com/t5/user/viewprofilepage/user-id/4124<H2 id="toc-hId-1730390179"><STRONG>The WCAG 2.2 Standard</STRONG></H2><P>Accessibility is key to using SAP's business solutions. Adopting the latest standards gives applications a true cutting edge, ensuring that solutions are inclusive and meet the diverse needs of users globally. For meeting the latest Web Content Accessibility Guidelines (WCAG), the UI5 team, designers, and SAP's accessibility experts met the challenge to give us that edge with customers.</P><P>The latest version WCAG 2.2 introduced new criteria which need to be implemented on both, the UI technology side as well as application side. Some of the new requirements are targeting application logic, e.g. to avoid asking the user for redundant data, to use a consistent navigation, or to offer alternatives for drag and drop. Application developers follow updated guidelines, the <SPAN><A href="https://ui5.sap.com/#/topic/ee37fc7138b843c0a66700f0aeaba3fe" target="_blank" rel="noopener noreferrer">UI5 recommendations</A></SPAN> and the <SPAN><A href="https://ui5.sap.com/test-resources/sap/m/demokit/accessibilityGuide/webapp/index.html" target="_blank" rel="noopener noreferrer">UI5 Accessibility guide</A></SPAN>. A big portion of the requirements was handled by the central UI technology SAPUI5.</P><P><STRONG>See two typical new requirements </STRONG>to understand the WCAG benefits:</P><P>1) The standard describes the <A href="https://www.w3.org/TR/WCAG22/#target-size-minimum" target="_self" rel="nofollow noopener noreferrer">minimum target size</A> of 24x24 px for an interactive element, so that users doesn't accidentally activate a different element:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Visualization of the target size of a UI element" style="width: 938px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/261174i35AD7792CDD2DDFA/image-size/large?v=v2&px=999" role="button" title="content24.png" alt="Visualization of the target size of a UI element" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Visualization of the target size of a UI element</span></span></P><P><SPAN>2) Each operation which can be performed by dragging can also be performed by using one pointer actions </SPAN><A href="https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html" target="_self" rel="nofollow noopener noreferrer">without dragging</A><SPAN>: </SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Context menu with option to maximize a section" style="width: 909px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/261176iCE2AEEAF4BDF89BF/image-size/large?v=v2&px=999" role="button" title="content drag.png" alt="Context menu with option to maximize a section" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Context menu with option to maximize a section</span></span></P><H2 id="toc-hId-1533876674">WCAG 2.2 and SAPUI5 / UI5 Web Components</H2><P><STRONG>SAPUI5 1.136 and UI5 Web Components 2.9.0 adjusted their implementation towards the latest WCAG 2.2 standard.</STRONG> This milestone reflects the unwavering commitment to accessibility and ensures that applications built with UI5 can meet the latest industry standards and customer expectations. Accessibility is a key requirement not only for public sector clients but many other customers. Offering implementations towards WCAG 2.2 fulfills customer expectations and strengthens the competitive position of SAP products.</P><P>This is one step in the continuous journey to enhance the user experience and accessibility of SAP solutions. The UI5 team remains dedicated to advancing accessibility features that empower <STRONG>all</STRONG> users.</P><H2 id="toc-hId-1337363169"><STRONG>The ARIA 1.2 Standard</STRONG></H2><P>Supporting WCAG, the Accessible Rich Internet Applications (ARIA) standard is used to make Web applications more accessible: It especially helps with dynamic content and advanced UI controls. ARIA adds role, property, and state information to dynamic Web applications to make UI elements recognizable by assistive technologies such as screen readers.</P><P>SAPUI5 1.136 and UI5 Web Components 2.9.0 are now implemented towards the latest <SPAN><A href="https://www.w3.org/WAI/standards-guidelines/aria/" target="_blank" rel="noopener nofollow noreferrer">ARIA 1.2 specification</A></SPAN>. The UI5 team has worked to ensure these enhancements reflect the best practices for accessible design, thereby helping to improve the overall user experience of consuming applications. This advancement shows how UI5 continues to meet modern standards for accessible user interfaces.</P><H2 id="toc-hId-1140849664"><STRONG>Reference Test Environment</STRONG></H2><P>In this context the UI5 team also updated the reference test environment. This ensures compatibility with new technologies and allows making use of the latest innovations. For details see SAP Note <SPAN><A href="https://me.sap.com/notes/2564165" target="_blank" rel="noopener noreferrer">2564165</A></SPAN>.</P><H2 id="toc-hId-944336159"><STRONG>References</STRONG></H2><UL><LI><P><A href="https://www.w3.org/WAI/standards-guidelines/wcag/new-in-22/" target="_self" rel="nofollow noopener noreferrer">What's New in WCAG 2.2</A></P></LI><LI><A href="https://ui5.sap.com/test-resources/sap/m/demokit/accessibilityGuide/webapp/index.html" target="_self" rel="noopener noreferrer">SAPUI5 Accessibility Guide</A></LI><LI><A href="https://ui5.sap.com/#/topic/ff7cab1f271a4181a86e5aa5c2f8d421" target="_self" rel="noopener noreferrer">Accessibility in Walkthrough tutorial (JavaScript)</A></LI><LI><A href="https://ui5.sap.com/#/topic/5a74cea49f5f446298b85ac248871a0b" target="_self" rel="noopener noreferrer">Accessibility in Walkthrough tutorial (TypeScript)</A></LI><LI><A href="https://ui5.sap.com/#/topic/322f55d0cf1e4b459cc1911c899b7a5f" target="_self" rel="noopener noreferrer">SAPUI5 essentials: Accessibility</A></LI><LI><A href="https://ui5.sap.com/#/topic/03b914b46e624b138a6fb1b7cf2049ae" target="_self" rel="noopener noreferrer">SAPUI5 Accessibility Guide for developing apps</A></LI><LI><A href="https://help.sap.com/docs/SAPUI5/bc5a64aac808463baa95b4230f221716/f562835d0b4e44129aa24a17551a0baa.html?locale=en-US" target="_self" rel="noopener noreferrer">SAPUI5 Accessibility for End Users</A></LI><LI><SPAN><A href="https://sap.github.io/ui5-webcomponents/docs/advanced/accessibility/" target="_blank" rel="noopener nofollow noreferrer">Accessibility in UI5 Web Components</A></SPAN></LI><LI><A href="https://discovery-center.cloud.sap/missiondetail/3530/3571/" target="_self" rel="nofollow noopener noreferrer">Accessibility Mission</A></LI><LI><SPAN><A href="https://me.sap.com/notes/2967114" target="_self" rel="noopener noreferrer">SAP Note 2967114 - Assistive Tool Support of Web-Technology based SAP Products</A></SPAN></LI></UL>2025-05-15T13:47:07.239000+02:00https://community.sap.com/t5/technology-blog-posts-by-sap/new-sap-design-system-portal-for-sap-fiori-design-guidelines-and-new-ui/ba-p/14109558New SAP Design System Portal for SAP Fiori Design Guidelines, and New UI Kits for Designers2025-05-22T18:57:29.433000+02:00ThomasReisshttps://community.sap.com/t5/user/viewprofilepage/user-id/149639<P><STRONG>Good news for creators! The SAP Fiori design guidelines site is now the SAP Design System portal. The new portal is your one-stop-shop to find everything about the design system. And that’s not all: we have released comprehensive new UI Kits for designers in Figma, the tool used by designers around the world.</STRONG></P><P> </P><H1 id="toc-hId-1601545666">SAP Design System Portal</H1><P>The new <SPAN><A href="http://www.sap.com/design-system" target="_blank" rel="noopener noreferrer">SAP Design System portal</A> </SPAN>brings together the product design guidelines SAP Fiori for web, SAP Fiori for iOS, and SAP Fiori for Android, as well as to the new digital design system guidelines. Bringing these all together is not the only improvement we’ve made, we have also:</P><UL><LI><STRONG>Enhanced usability: </STRONG>easier to navigate and find what you need.</LI><LI><STRONG>Improved performance</STRONG>: much faster page load times.</LI><LI><STRONG>Simplified versioning</STRONG>: the 50+ guideline versions of the past for SAP Fiori for web have now been consolidated into six versions, corresponding to the six versions of SAPUI5 which are in long-term maintenance.</LI><LI><STRONG>Product specific content</STRONG>: in addition to content which is applicable everywhere, we now also make it clear when content applies only to specific products, for example due to dependencies to product-specific technologies. At the moment we have one such section in the portal, <SPAN><A href="https://www.sap.com/design-system/fiori-design-web/v1-130/discover/sap-products/?external#sap-s4hana-only" target="_blank" rel="noopener noreferrer">for SAP S/4HANA</A></SPAN> (which also covers SAP Cloud ERP and SAP Cloud ERP Private).</LI><LI><STRONG>Feedback button</STRONG>: you can now give us direct feedback on the content, via the feedback button available on the bottom right of each page (as you can see in Figure 1).</LI></UL><P>SAP’s digital design system reflects our evolved brand and is aligned to our product design system. It serves as a reference for all who contribute content to our public-facing web sites.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Figure 1: The SAP Design System portal start page. Alt Text: Image with header saying “SAP Design System”, with a “See what’s new” button below it, and then four subsections in a horizontal row: SAP Fiori for Web, SAP Fiori for Android, SAP Fiori for iOS and SAP’s Digitial Design System. A “Feedback” button is on the bottom right." style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/265171i95549FCC6CE870CE/image-size/large?v=v2&px=999" role="button" title="Design System Portal (Beta) 2025-05-22.png" alt="Figure 1: The SAP Design System portal start page. Alt Text: Image with header saying “SAP Design System”, with a “See what’s new” button below it, and then four subsections in a horizontal row: SAP Fiori for Web, SAP Fiori for Android, SAP Fiori for iOS and SAP’s Digitial Design System. A “Feedback” button is on the bottom right." /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Figure 1: The SAP Design System portal start page. Alt Text: Image with header saying “SAP Design System”, with a “See what’s new” button below it, and then four subsections in a horizontal row: SAP Fiori for Web, SAP Fiori for Android, SAP Fiori for iOS and SAP’s Digitial Design System. A “Feedback” button is on the bottom right.</span></span></P><P>Have a look at this 45 second video to get an overview:</P><P> </P><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%2FMwh-ZKzKCLA%3Ffeature%3Doembed&display_name=YouTube&url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DMwh-ZKzKCLA&image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FMwh-ZKzKCLA%2Fhqdefault.jpg&type=text%2Fhtml&schema=youtube" width="400" height="225" scrolling="no" title="Portal Video Sapphire 2025" frameborder="0" allow="autoplay; fullscreen; encrypted-media; picture-in-picture;" allowfullscreen="true"></iframe></div></P><P> </P><H1 id="toc-hId-1405032161">UI Kits for Designers</H1><P>The new UI Kits available for designers in Figma make it easy for designers to design accessible UIs at enterprise scale, for web applications, mobile iOS and Android applications as well as wearables. The UI Kits provide reusable components for web and mobile, along with web floorplans, which give you what you need out-of-the-box.</P><P>In addition, we give you design resources for designing for accessibility and for performance.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Figure 2: SAP’s UI Kits for Designers in Figma. Alt-Text: The image shows two rows of three cards representing UI Kits: SAP Fiori for Android, SAP Fiori for Web, Designing for Performance, SAP Fiori for iOS, SAP Fiori for watchOS, and SAP Fiori for Wear OS. On the very left of the image information about SAP is listed, with links to resources such as www.sap.com/design-system." style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/265173i43D2ADE0CE9B1851/image-size/large?v=v2&px=999" role="button" title="UI Kits in Figma 2025-05-22.jpg" alt="Figure 2: SAP’s UI Kits for Designers in Figma. Alt-Text: The image shows two rows of three cards representing UI Kits: SAP Fiori for Android, SAP Fiori for Web, Designing for Performance, SAP Fiori for iOS, SAP Fiori for watchOS, and SAP Fiori for Wear OS. On the very left of the image information about SAP is listed, with links to resources such as www.sap.com/design-system." /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Figure 2: SAP’s UI Kits for Designers in Figma. Alt-Text: The image shows two rows of three cards representing UI Kits: SAP Fiori for Android, SAP Fiori for Web, Designing for Performance, SAP Fiori for iOS, SAP Fiori for watchOS, and SAP Fiori for Wear OS. On the very left of the image information about SAP is listed, with links to resources such as www.sap.com/design-system.</span></span></P><P>Get an overview and see how easy it is for designers to put together a new UI in this 43 second video:</P><P> </P><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%2FpsVAMYqA_k4%3Ffeature%3Doembed&display_name=YouTube&url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DpsVAMYqA_k4&image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FpsVAMYqA_k4%2Fhqdefault.jpg&type=text%2Fhtml&schema=youtube" width="400" height="225" scrolling="no" title="UI Kits Sapphire 2025" frameborder="0" allow="autoplay; fullscreen; encrypted-media; picture-in-picture;" allowfullscreen="true"></iframe></div></P><P> </P><H1 id="toc-hId-1208518656">User Experience in SAP Community</H1><P>I’m looking forward to seeing how you like the new SAP Design System portal and the new UI Kits for Designers. Do use the SAP Community to exchange your ideas and best practices by using the “User Experience” tag.</P><P>Here is a link to the <SPAN><A href="https://community.sap.com/t5/c-khhcw49343/User+Experience/pd-p/4616d815-f39e-45c8-b13b-5a2d6679778f" target="_blank">latest posts for User Experience</A></SPAN>.</P><P>For an overview of design at SAP, check out <A href="https://www.sap.com/design" target="_self" rel="noopener noreferrer">www.sap.com/design</A>.</P><P> </P>2025-05-22T18:57:29.433000+02:00https://community.sap.com/t5/technology-blog-posts-by-members/developing-a-ui5-app-with-value-help-from-csv-charts-with-vizframe-and/ba-p/14110057Developing a UI5 App with Value Help from CSV, Charts with VizFrame, and Excel Upload/Download2025-05-23T08:54:36.478000+02:00maharanahttps://community.sap.com/t5/user/viewprofilepage/user-id/155512<P><STRONG>SAPUI5</STRONG> (SAP User Interface for HTML5) is a <STRONG>JavaScript-based UI framework</STRONG> developed by SAP. It is used for building <STRONG>responsive, cross-platform web applications</STRONG> that run in desktop and mobile browsers. SAPUI5 is the foundation of SAP Fiori, which is SAP’s design language and user experience strategy.</P>
<H3 id="toc-hId-1860361700">Key Features:</H3>
<UL>
<LI>
<P><STRONG>MVC Architecture</STRONG>: Supports the Model-View-Controller pattern for clean code separation.</P>
</LI>
<LI>
<P><STRONG>Rich UI Controls</STRONG>: Includes a comprehensive set of UI controls optimized for business applications.</P>
</LI>
<LI>
<P><STRONG>Data Binding</STRONG>: Supports multiple data models (JSON, XML, OData) for dynamic content rendering.</P>
</LI>
<LI>
<P><STRONG>Responsive Design</STRONG>: Adapts to different screen sizes and devices automatically.</P>
</LI>
<LI>
<P><STRONG>Theming and Customization</STRONG>: Allows theming via the SAP Theme Designer.</P>
</LI>
</UL>
<P> </P>
<H3 id="toc-hId-1663848195">What is BAS (Business Application Studio)?</H3>
<P><STRONG>SAP Business Application Studio (BAS)</STRONG> is a <STRONG>modern development environment</STRONG> provided by SAP. It's designed for building business applications, especially those based on <STRONG>SAP technologies</STRONG> like SAPUI5, SAP Fiori, CAP (Cloud Application Programming model), and more.</P>
<P>Think of BAS as <STRONG>SAP's version of Visual Studio Code</STRONG> — but hosted in the cloud and optimized for enterprise application development.</P>
<P>A <STRONG>Dev Space</STRONG> in <STRONG>SAP Business Application Studio (BAS)</STRONG> is a <STRONG>pre-configured, isolated development environment</STRONG> tailored for specific types of SAP development — like SAPUI5, CAP, or Fiori.</P>
<P> </P>
<H3 id="toc-hId-1467334690"><STRONG>What this app does – simplified scenarios:</STRONG></H3>
<UL>
<LI>
<P><STRONG>Show a page titled "Dummy App"</STRONG> with a clean, centered header.</P>
</LI>
<LI>
<P><STRONG>Collect user input</STRONG> using a form with the following fields:</P>
<UL>
<LI>
<P><STRONG>Name</STRONG> input field with a value help dialog (e.g., a search or selection help).</P>
</LI>
<LI>
<P><STRONG>Age</STRONG> input field, also with value help.</P>
</LI>
<LI>
<P><STRONG>Company</STRONG> input field, again with value help.</P>
</LI>
</UL>
</LI>
<LI>
<P><STRONG>Let users submit the form</STRONG> by clicking the <STRONG>"Submit"</STRONG> button, which likely stores or processes the entered data.</P>
</LI>
<LI>
<P><STRONG>Display a small bar chart</STRONG>:</P>
<UL>
<LI>
<P>Shows the <STRONG>number of entries (Count)</STRONG> grouped by <STRONG>Age</STRONG>.</P>
</LI>
<LI>
<P>Useful for visualizing how many users fall into each age group.</P>
</LI>
</UL>
</LI>
<LI>
<P><STRONG>Provide a results table</STRONG> that displays the submitted data:</P>
<UL>
<LI>
<P>Each row shows a person's <STRONG>Name</STRONG>, <STRONG>Age</STRONG>, and <STRONG>Company</STRONG>.</P>
</LI>
<LI>
<P>Table grows dynamically to show more entries as needed.</P>
</LI>
</UL>
</LI>
<LI>
<P><STRONG>Allow data export and import</STRONG>:</P>
<UL>
<LI>
<P><STRONG>"Download"</STRONG> button lets users export the table data (likely to Excel).</P>
</LI>
<LI>
<P><STRONG>"Upload"</STRONG> button lets users import data from a file (probably Excel or CSV).</P>
</LI>
</UL>
</LI>
</UL>
<P> </P>
<P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="maharana_0-1747980172398.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/265425i2CE0F185D564746D/image-size/medium?v=v2&px=400" role="button" title="maharana_0-1747980172398.png" alt="maharana_0-1747980172398.png" /></span></P>
<P><FONT face="arial black,avant garde"><STRONG>View1.view.xml :</STRONG></FONT></P>
<pre class="lia-code-sample language-markup"><code><mvc:View
controllerName="com.sap.btp.project1.controller.View1"
xmlns:mvc="sap.ui.core.mvc"
xmlns:core="sap.ui.core"
xmlns="sap.m"
xmlns:viz="sap.viz.ui5.controls"
xmlns:viz.data="sap.viz.ui5.data"
xmlns:viz.feeds="sap.viz.ui5.controls.common.feeds"
xmlns:export="sap.ui.export">
<!-- Wrap Page inside App to enable scrolling properly -->
<App>
<Page id="page" showHeader="false">
<ScrollContainer height="100%" vertical="true" focusable="true">
<VBox class="sapUiMediumMargin">
<!-- App Header -->
<VBox class="appHeader sapUiMediumMargin" alignItems="Center">
<Text text="Dummy App" textAlign="Center" class="appTitle" />
</VBox>
<!-- Main Layout -->
<HBox wrap="Wrap">
<!-- Form with Value Help Inputs -->
<VBox class="formContainer sapUiSmallMarginEnd">
<!-- Name Input with Value Help -->
<HBox class="sapUiTinyMarginBottom" alignItems="Center">
<Label text="Name :" width="100px"/>
<Input id="nameInput"
width="300px"
showValueHelp="true"
value="{/name}"
valueHelpRequest="onNameValueHelp" />
</HBox>
<!-- Age -->
<HBox class="sapUiTinyMarginBottom" alignItems="Center">
<Label text="Age :" width="100px"/>
<Input id="ageInput"
width="300px"
showValueHelp="true"
value="{/age}"
valueHelpRequest="onAgeValueHelp" />
</HBox>
<!-- Company -->
<HBox class="sapUiTinyMarginBottom" alignItems="Center">
<Label text="Company :" width="100px"/>
<Input id="companyInput"
width="300px"
showValueHelp="true"
value="{/company}"
valueHelpRequest="onCompanyValueHelp" />
</HBox>
<Button text="Submit" press="onSubmit" type="Emphasized" class="sapUiSmallMarginTop" />
</VBox>
<!-- Smaller Chart -->
<VBox>
<viz:VizFrame id="ageChart"
height="250px"
width="400px"
uiConfig="{applicationSet:'fiori'}"
vizType="column">
<viz:dataset>
<viz.data:FlattenedDataset data="{/ageChartData}">
<viz.data:dimensions>
<viz.data:DimensionDefinition name="Age" value="{age}" />
</viz.data:dimensions>
<viz.data:measures>
<viz.data:MeasureDefinition name="Count" value="{count}" />
</viz.data:measures>
</viz.data:FlattenedDataset>
</viz:dataset>
<viz:feeds>
<viz.feeds:FeedItem uid="valueAxis" type="Measure" values="Count"/>
<viz.feeds:FeedItem uid="categoryAxis" type="Dimension" values="Age"/>
</viz:feeds>
</viz:VizFrame>
</VBox>
</HBox>
<!-- Table & Buttons -->
<VBox class="sapUiLargeMarginTop sapUiResponsiveMargin">
<HBox justifyContent="End">
<Button text="Download"
press="onDownloadExcel"
type="Emphasized"
class="sapUiMediumMarginTop sapUiSmallMarginEnd"/>
<Button text="Upload"
press="onUploadFile"
type="Emphasized"
class="sapUiMediumMarginTop"/>
</HBox>
<Table id="resultTable" items="{/submittedData}" width="100%" growing="true" growingThreshold="20">
<columns>
<Column><Text text="Name" /></Column>
<Column><Text text="Age" /></Column>
<Column><Text text="Company" /></Column>
</columns>
<items>
<ColumnListItem>
<cells>
<Text text="{name}" />
<Text text="{age}" />
<Text text="{company}" />
</cells>
</ColumnListItem>
</items>
</Table>
</VBox>
</VBox>
</ScrollContainer>
</Page>
</App>
</mvc:View></code></pre>
<DIV>
<DIV> </DIV>
<DIV><SPAN><STRONG>XML Namespaces</STRONG> (in SAPUI5, they are often referred to as "UI5 Namespaces").</SPAN></DIV>
<DIV>
<P>In an XML-based SAPUI5 view (like View.xml), <STRONG>XML namespaces</STRONG> define which library or module each tag or control belongs to. They prevent naming conflicts and allow the use of multiple libraries in one file</P>
<P> </P>
<UL>
<LI>
<P><STRONG>xmlns:mvc="sap.ui.core.mvc"</STRONG><BR />Enables use of MVC tags like <mvc:View> for defining views and controllers.</P>
</LI>
<LI>
<P><STRONG>xmlns:core="sap.ui.core"</STRONG><BR />Provides access to core UI5 controls and features like event handling, formatting, etc.</P>
</LI>
<LI>
<P><STRONG>xmlns="sap.m"</STRONG><BR />Default namespace for <STRONG>mobile-ready UI controls</STRONG> like Button, Input, VBox, etc.</P>
</LI>
<LI>
<P><STRONG>xmlns:viz="sap.viz.ui5.controls"</STRONG><BR />Gives access to <STRONG>VizFrame</STRONG> chart controls for data visualization.</P>
</LI>
<LI>
<P><STRONG>xmlns:viz.data="sap.viz.ui5.data"</STRONG><BR />Used to define <STRONG>datasets, dimensions, and measures</STRONG> for VizFrame charts.</P>
</LI>
<LI>
<P><STRONG>xmlns:viz.feeds="sap.viz.ui5.controls.common.feeds"</STRONG><BR />Maps data to chart axes (e.g. valueAxis, categoryAxis) in <STRONG>VizFrame</STRONG>.</P>
</LI>
<LI>
<P><STRONG>xmlns:export="sap.ui.export"</STRONG><BR />Provides access to <STRONG>export utilities</STRONG> like Spreadsheet for downloading Excel files.</P>
</LI>
</UL>
<P> </P>
</DIV>
<DIV> </DIV>
<DIV>
<H3 id="toc-hId-1270821185"><STRONG>Brief Summary of the SAPUI5 View</STRONG></H3>
<P>This SAPUI5 XML View defines a <STRONG>simple Fiori-style web app UI</STRONG> that includes:</P>
<UL>
<LI>
<P><STRONG>Header</STRONG>: Displays the title “Dummy App” at the top.</P>
</LI>
<LI>
<P><STRONG>Form Section</STRONG>: Allows the user to enter <STRONG>Name, Age, and Company</STRONG> using input fields with <STRONG>value help dialogs</STRONG> (for selection support).</P>
</LI>
<LI>
<P><STRONG>Chart</STRONG>: Shows a <STRONG>column chart</STRONG> that visualizes <STRONG>Age-wise count data</STRONG>, using sap.viz.ui5.controls.VizFrame.</P>
</LI>
<LI>
<P><STRONG>Data Table</STRONG>: Displays submitted form entries (Name, Age, Company) in a <STRONG>growing table</STRONG>.</P>
</LI>
<LI>
<P><STRONG>Buttons</STRONG>:</P>
<UL>
<LI>
<P><STRONG>"Submit"</STRONG> to send form data.</P>
</LI>
<LI>
<P><STRONG>"Download"</STRONG> to export the table (e.g., to Excel).</P>
</LI>
<LI>
<P><STRONG>"Upload"</STRONG> to import data (e.g., from a file).</P>
</LI>
</UL>
</LI>
</UL>
<P><FONT face="arial black,avant garde"><STRONG>View1.controller.js:</STRONG></FONT></P>
<P> </P>
<DIV>
<DIV><pre class="lia-code-sample language-javascript"><code>sap.ui.define([
"sap/ui/core/mvc/Controller",
"sap/m/MessageBox",
"sap/viz/ui5/controls/VizFrame",
"sap/viz/ui5/data/FlattenedDataset",
"sap/viz/ui5/data/DimensionDefinition",
"sap/viz/ui5/data/MeasureDefinition",
"sap/ui/model/json/JSONModel",
"sap/ui/export/Spreadsheet",
"sap/m/MessageToast",
"sap/m/SelectDialog",
"sap/m/StandardListItem",
"sap/ui/model/Filter",
"sap/ui/model/FilterOperator"
], function (
Controller,
MessageBox,
VizFrame,
FlattenedDataset,
DimensionDefinition,
MeasureDefinition,
JSONModel,
Spreadsheet,
MessageToast,
SelectDialog,
StandardListItem,
Filter,
FilterOperator
) {
"use strict";
return Controller.extend("com.sap.btp.project1.controller.View1", {
onInit: function () {
var oView = this.getView();
var oModel = new JSONModel({
name: "",
age: "",
company: "",
dropdownData: {
names: [],
ages: [],
companies: []
},
submittedData: [],
ageChartData: []
});
oView.setModel(oModel);
var sCSVPath = jQuery.sap.getModulePath("com.sap.btp.project1", "/model/dropdown_master.csv");
jQuery.ajax({
url: sCSVPath,
dataType: "text",
success: function (data) {
var lines = data.split("\n").filter(Boolean);
var names = [], ages = [], companies = [];
var ageCountMap = {};
for (var i = 1; i < lines.length; i++) {
var values = lines[i].split(",");
if (values.length < 3) continue;
var nameVal = values[0].trim();
var ageVal = values[1].trim();
var companyVal = values[2].trim();
names.push({ key: nameVal, text: nameVal });
ages.push({ key: ageVal, text: ageVal });
companies.push({ key: companyVal, text: companyVal });
if (ageVal) {
ageCountMap[ageVal] = (ageCountMap[ageVal] || 0) + 1;
}
}
var ageChartData = Object.keys(ageCountMap).map(function (age) {
return {
age: age,
count: ageCountMap[age]
};
});
oModel.setProperty("/dropdownData/names", names);
oModel.setProperty("/dropdownData/ages", ages);
oModel.setProperty("/dropdownData/companies", companies);
oModel.setProperty("/ageChartData", ageChartData);
},
error: function () {
MessageToast.show("Failed to load dropdown CSV data.");
}
});
},
// Value Help for Name
onNameValueHelp: function () {
var oModel = this.getView().getModel();
var aNames = oModel.getProperty("/dropdownData/names");
var oDialog = new SelectDialog({
title: "Select Name",
items: aNames.map(function (item) {
return new StandardListItem({ title: item.text });
}),
liveChange: function (oEvent) {
var sValue = oEvent.getParameter("value");
var oFilter = new Filter("title", FilterOperator.Contains, sValue);
oDialog.getBinding("items").filter([oFilter]);
},
confirm: function (oEvent) {
var selected = oEvent.getParameter("selectedItem");
if (selected) {
this.getView().byId("nameInput").setValue(selected.getTitle());
}
}.bind(this)
});
oDialog.open();
},
// Value Help for Age
onAgeValueHelp: function () {
var oModel = this.getView().getModel();
var aAges = oModel.getProperty("/dropdownData/ages");
var oDialog = new SelectDialog({
title: "Select Age",
items: aAges.map(function (item) {
return new StandardListItem({ title: item.text });
}),
liveChange: function (oEvent) {
var sValue = oEvent.getParameter("value");
var oFilter = new Filter("title", FilterOperator.Contains, sValue);
oDialog.getBinding("items").filter([oFilter]);
},
confirm: function (oEvent) {
var selected = oEvent.getParameter("selectedItem");
if (selected) {
this.getView().byId("ageInput").setValue(selected.getTitle());
}
}.bind(this)
});
oDialog.open();
},
// Value Help for Company
onCompanyValueHelp: function () {
var oModel = this.getView().getModel();
var aCompanies = oModel.getProperty("/dropdownData/companies");
var oDialog = new SelectDialog({
title: "Select Company",
items: aCompanies.map(function (item) {
return new StandardListItem({ title: item.text });
}),
liveChange: function (oEvent) {
var sValue = oEvent.getParameter("value");
var oFilter = new Filter("title", FilterOperator.Contains, sValue);
oDialog.getBinding("items").filter([oFilter]);
},
confirm: function (oEvent) {
var selected = oEvent.getParameter("selectedItem");
if (selected) {
this.getView().byId("companyInput").setValue(selected.getTitle());
}
}.bind(this)
});
oDialog.open();
},
onSubmit: function () {
var oView = this.getView();
var name = oView.byId("nameInput").getValue();
var age = oView.byId("ageInput").getValue();
var company = oView.byId("companyInput").getValue();
var oModel = oView.getModel();
// Make sure these values are set to the model
oModel.setProperty("/name", name);
oModel.setProperty("/age", age);
oModel.setProperty("/company", company);
var validAges = oModel.getProperty("/dropdownData/ages").map(a => a.text);
var validCompanies = oModel.getProperty("/dropdownData/companies").map(c => c.text);
if (!age || !validAges.includes(age)) {
MessageBox.error("Please select a valid Age.");
return;
}
if (!company || !validCompanies.includes(company)) {
MessageBox.error("Please select a valid Company.");
return;
}
var message = `Name: ${name}\nAge: ${age}\nCompany: ${company}`;
MessageBox.information(message, { title: "Submitted Details" });
},
onDownloadExcel: function () {
var oModel = this.getView().getModel();
var aData = oModel.getProperty("/submittedData");
var oExportData = aData.map(function (item) {
return {
"Name": item.name,
"Age": item.age,
"Company": item.company
};
});
var oSpreadsheet = new Spreadsheet({
workbook: {
columns: [
{ label: 'Name', property: 'Name' },
{ label: 'Age', property: 'Age' },
{ label: 'Company', property: 'Company' }
]
},
dataSource: oExportData,
fileName: "table_data.xlsx"
});
oSpreadsheet.build().then(function () {
MessageToast.show("Excel file has been downloaded!");
});
},
onUploadFile: function () {
var oInputFile = document.createElement("input");
oInputFile.type = "file";
oInputFile.accept = ".xlsx, .xls";
oInputFile.onchange = this._onFileSelected.bind(this);
oInputFile.click();
},
_onFileSelected: function (oEvent) {
var oFile = oEvent.target.files[0];
if (!oFile) {
MessageToast.show("No file selected.");
return;
}
var loadXLSX = function () {
return new Promise(function (resolve, reject) {
if (typeof XLSX !== "undefined") {
resolve();
return;
}
var script = document.createElement("script");
script.src=jQuery.sap.getModulePath("com.sap.btp.project1") + "/libs/xlsx.full.min.js";
script.onload = resolve;
script.onerror = function () {
reject(new Error("Failed to load XLSX library."));
};
document.head.appendChild(script);
});
};
loadXLSX().then(function () {
var reader = new FileReader();
reader.onload = function (e) {
try {
var data = new Uint8Array(e.target.result);
var workbook = XLSX.read(data, { type: 'array' });
var firstSheetName = workbook.SheetNames[0];
var worksheet = workbook.Sheets[firstSheetName];
var jsonData = XLSX.utils.sheet_to_json(worksheet);
var cleanedData = jsonData.map(function (item) {
return {
name: item.Name || "",
age: item.Age || "",
company: item.Company || ""
};
});
var oModel = this.getView().getModel();
oModel.setProperty("/submittedData", cleanedData);
MessageToast.show("Excel data loaded successfully.");
} catch (err) {
console.error("Excel parsing error:", err);
MessageToast.show("Failed to read Excel file.");
}
}.bind(this);
reader.readAsArrayBuffer(oFile);
}.bind(this)).catch(function (err) {
console.error(err);
MessageToast.show("Could not load XLSX library.");
});
}
});
});</code></pre></DIV>
<DIV> </DIV>
<DIV>
<H3 id="toc-hId-1074307680"><STRONG>SAPUI5 Module Imports & Their Purpose</STRONG></H3>
<DIV class="">
<DIV class=""><SPAN><SPAN class="">"sap/ui/core/mvc/Controller"</SPAN></SPAN></DIV>
<DIV class=""><STRONG>Base class</STRONG><SPAN> for all controllers. Used to define your custom controller logic.</SPAN></DIV>
</DIV>
<DIV class="">
<DIV class=""><SPAN><SPAN class="">"sap/m/MessageBox"</SPAN></SPAN></DIV>
<DIV class=""><SPAN>Used to show </SPAN><STRONG>popup dialog boxes</STRONG><SPAN> (e.g., for errors, confirmations, info messages).</SPAN></DIV>
</DIV>
<DIV class="">
<DIV class=""><SPAN><SPAN class="">"sap/viz/ui5/controls/VizFrame"</SPAN></SPAN></DIV>
<DIV class=""><SPAN>Core control for rendering </SPAN><STRONG>charts</STRONG><SPAN> (bar, pie, line, etc.) in SAPUI5 apps.</SPAN></DIV>
</DIV>
<DIV class="">
<DIV class=""><SPAN><SPAN class="">"sap/viz/ui5/data/FlattenedDataset"</SPAN></SPAN></DIV>
<DIV class=""><SPAN><span class="lia-unicode-emoji" title=":small_blue_diamond:">🔹</span>Defines the </SPAN><STRONG>data format for charts</STRONG><SPAN>, mapping flat JSON data to visual elements.</SPAN></DIV>
</DIV>
<DIV class="">
<DIV class=""><SPAN><SPAN class="">"sap/viz/ui5/data/DimensionDefinition"</SPAN></SPAN></DIV>
<DIV class=""><SPAN>Specifies </SPAN><STRONG>dimensions</STRONG><SPAN> (e.g., Age) used on the x-axis or category axis of the chart.</SPAN></DIV>
</DIV>
<DIV class="">
<DIV class=""><SPAN><SPAN class="">"sap/viz/ui5/data/MeasureDefinition"</SPAN></SPAN></DIV>
<DIV class=""><SPAN>Specifies </SPAN><STRONG>measures</STRONG><SPAN> (e.g., Count) used on the y-axis or value axis of the chart.</SPAN></DIV>
</DIV>
<DIV class="">
<DIV class=""><SPAN><SPAN class="">"sap/ui/model/json/JSONModel"</SPAN></SPAN></DIV>
<DIV class=""><SPAN>Provides a </SPAN><STRONG>client-side data model</STRONG><SPAN> using JSON, used to bind data to the UI.</SPAN></DIV>
</DIV>
<DIV class="">
<DIV class=""><SPAN><SPAN class="">"sap/ui/export/Spreadsheet"</SPAN></SPAN></DIV>
<DIV class=""><SPAN>Used for </SPAN><STRONG>exporting table data to Excel</STRONG><SPAN> (</SPAN>.xlsx<SPAN>) format.</SPAN></DIV>
</DIV>
<DIV class="">
<DIV class=""><SPAN><SPAN class="">"sap/m/MessageToast"</SPAN></SPAN></DIV>
<DIV class=""><SPAN>Displays </SPAN><STRONG>temporary messages</STRONG><SPAN> (toasts) at the bottom of the screen (e.g., “Excel downloaded!”).</SPAN></DIV>
</DIV>
<DIV class="">
<DIV class=""><SPAN><SPAN class="">"sap/m/SelectDialog"</SPAN></SPAN></DIV>
<DIV class=""><SPAN>A </SPAN><STRONG>searchable dialog</STRONG><SPAN> used in value help (dropdown) selections.</SPAN></DIV>
</DIV>
<DIV class="">
<DIV class=""><SPAN><SPAN class="">"sap/m/StandardListItem"</SPAN></SPAN></DIV>
<DIV class=""><SPAN>UI element representing a </SPAN><STRONG>standard item in a list</STRONG><SPAN>, used inside </SPAN>SelectDialog<SPAN>.</SPAN></DIV>
</DIV>
<DIV class="">
<DIV class=""><SPAN class="">"sap/ui/model/Filter"</SPAN></DIV>
<DIV class=""><SPAN>Enables </SPAN><STRONG>filtering</STRONG><SPAN> of items (e.g., in the value help dialog based on user input).</SPAN></DIV>
</DIV>
<DIV class="">
<DIV class=""><SPAN><SPAN class="">"sap/ui/model/FilterOperator"</SPAN></SPAN></DIV>
<DIV class=""><SPAN>Provides </SPAN><STRONG>filter operations</STRONG><SPAN> like </SPAN>Contains<SPAN>, </SPAN>EQ<SPAN>, etc., for filtering logic.</SPAN></DIV>
</DIV>
</DIV>
<DIV> </DIV>
<DIV>
<H3 id="toc-hId-877794175"><STRONG>Key Functionalities Explained Briefly:</STRONG></H3>
<OL>
<LI>
<P><STRONG>onInit() – Load CSV Data:</STRONG></P>
<UL>
<LI>
<P>Loads dropdown_master.csv from the model folder.</P>
</LI>
<LI>
<P>Extracts Name, Age, and Company options.</P>
</LI>
<LI>
<P>Stores the values in a JSON model under /dropdownData.</P>
</LI>
<LI>
<P>Also generates chart data (/ageChartData) based on age counts.</P>
</LI>
</UL>
</LI>
<LI>
<P><STRONG>Value Help (SelectDialog) for Each Field:</STRONG></P>
<UL>
<LI>
<P>onNameValueHelp(), onAgeValueHelp(), onCompanyValueHelp() open a dialog with search.</P>
</LI>
<LI>
<P>Items are fetched from the loaded CSV data (/dropdownData).</P>
</LI>
<LI>
<P>The selected item is set in the respective input field.</P>
</LI>
</UL>
</LI>
<LI>
<P><STRONG>onSubmit() – Handle Form Submission:</STRONG></P>
<UL>
<LI>
<P>Validates that Age and Company are from valid lists.</P>
</LI>
<LI>
<P>Shows a message box with the entered Name, Age, and Company.</P>
</LI>
</UL>
</LI>
<LI>
<P><STRONG>onDownloadExcel() – Export to Excel:</STRONG></P>
<UL>
<LI>
<P>Downloads the /submittedData model (form entries) as an Excel .xlsx file.</P>
</LI>
</UL>
</LI>
<LI>
<P><STRONG>onUploadFile() – Upload Excel File:</STRONG></P>
<UL>
<LI>
<P>Lets the user upload an Excel file.</P>
</LI>
<LI>
<P>Reads and parses it using the XLSX library.</P>
</LI>
<LI>
<P>Updates /submittedData in the model, populating the table in the UI.</P>
</LI>
</UL>
</LI>
</OL>
<P> </P>
<span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="maharana_2-1747980680782.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/265428iA0399ADB26DF89A6/image-size/large?v=v2&px=999" role="button" title="maharana_2-1747980680782.png" alt="maharana_2-1747980680782.png" /></span>
<P> </P>
</DIV>
</DIV>
<P>The data shown in the value help comes from a CSV file named <STRONG>dropdown_master.csv</STRONG>, which is located in the <STRONG>model folder</STRONG> inside the <STRONG>webapp directory</STRONG>. This CSV file is loaded as a model and used to populate the dropdown options in the value help dialog.</P>
<P> </P>
<span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="maharana_1-1747980535257.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/265426iCA0187BF5CDCFF9B/image-size/medium?v=v2&px=400" role="button" title="maharana_1-1747980535257.png" alt="maharana_1-1747980535257.png" /></span></DIV>
<DIV> </DIV>
<DIV>In the app, when you click on the <STRONG>value help icon</STRONG>, a <STRONG>popup dialog</STRONG> opens displaying a list of selectable options. These options—for <STRONG>Name</STRONG>, <STRONG>Age</STRONG>, and <STRONG>Company</STRONG>—are all <STRONG>loaded from a CSV file</STRONG> (dropdown_master.csv) located in the model folder. The same logic applies to each input field.</DIV>
<DIV> </DIV>
<DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="maharana_3-1747981247831.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/265429i79BD3532E1E4FF86/image-size/medium?v=v2&px=400" role="button" title="maharana_3-1747981247831.png" alt="maharana_3-1747981247831.png" /></span></DIV>
<DIV> </DIV>
<DIV> </DIV>
</DIV>
<P> </P>
<P>I’ve included a GIF in the demo to visually showcase how the app functions.</P>
<P> </P>
<P><STRONG>Learning Materials:</STRONG></P>
<P><STRONG><A title="SAP UI5 learning" href="https://learning.sap.com/learning-journeys/develop-sapui5-applications" target="_blank" rel="noopener noreferrer">https://learning.sap.com/learning-journeys/develop-sapui5-applications</A> </STRONG></P>
<P><STRONG><A href="https://community.sap.com/t5/technology-blog-posts-by-sap/learning-sapui5-for-beginners/ba-p/13470938" target="_blank">Learning SAPUI5 for Beginners - SAP Community</A></STRONG></P>
<P><STRONG><A href="https://ui5.sap.com/1.108.26/" target="_blank" rel="noopener noreferrer">Demo Kit - SAPUI5 SDK</A></STRONG></P>
<P><STRONG><A href="https://developers.sap.com/tutorial-navigator.html?tag=programming-tool%3Asapui5" target="_blank" rel="noopener noreferrer">SAP Tutorial Navigator | Tutorials for SAP Developer</A></STRONG></P>
<P> </P>2025-05-23T08:54:36.478000+02:00https://community.sap.com/t5/technology-blog-posts-by-sap/introducing-sapui5-version-preview-in-sap-build-work-zone/ba-p/14117996Introducing SAPUI5 Version Preview in SAP Build Work Zone2025-06-03T16:02:55.953000+02:00Yumnahabbasihttps://community.sap.com/t5/user/viewprofilepage/user-id/5121<P>SAPUI5 is a cornerstone of SAP's user interface technology, providing a robust framework for building responsive and enterprise-ready web applications. Regular updates to SAPUI5 bring innovative features and critical bug fixes, ensuring that applications remain modern and efficient. <SPAN>Until now, the latest SAPUI5 versions were automatically adopted in production environments, which limited opportunities for early evaluation ahead of deployment.</SPAN></P><P>Recognizing the need for controlled testing of SAPUI5 updates, we have introduced a new feature that allows administrators to preview upcoming SAPUI5 versions in non-productive environments within SAP Build Work Zone. This capability was developed in response to customer feedback, aiming to provide a controlled environment for evaluating SAPUI5 updates in SAP Build Work Zone, thereby avoiding immediate changes in production environments.</P><H4 id="toc-hId-1989661728"><FONT color="#3366FF"><STRONG>What's New: SAPUI5 Version Preview Feature in SAP Build Work Zone</STRONG></FONT></H4><P>The new "Preview SAPUI5 Latest Version" feature empowers administrators to test upcoming SAPUI5 versions in designated non-productive environments within SAP Build Work Zone. This proactive approach allows customers to explore upcoming updates in a controlled setting, supporting a smoother and more predictable transition to production environments.</P><P>This feature is available in SAP Build Work Zone, advanced and standard edition and SAP SuccessFactors Work Zone.</P><H4 id="toc-hId-1793148223"><FONT color="#3366FF"><STRONG>Key Benefits:</STRONG></FONT></H4><P><SPAN>This feature offers several advantages.</SPAN><SPAN> </SPAN><SPAN>Administrators can gain early access to the Release to Customer (RTC) version of SAPUI5</SPAN><SPAN>. They have </SPAN><SPAN>two weeks before its general availability, allowing ample time for testing.</SPAN><SPAN> </SPAN><SPAN>By enabling the preview setting on specific non-productive sites, they can assess compatibility and performance with the upcoming version.</SPAN><SPAN> </SPAN><SPAN>This controlled testing environment helps identify and address potential issues, reducing the likelihood of disruptions in production.</SPAN><SPAN> </SPAN><SPAN>After the two-week preview period, the RTC version becomes the default, aligning all sites with the latest stable release.</SPAN></P><H4 id="toc-hId-1596634718"><FONT color="#3366FF"><STRONG>How it works – step by step</STRONG></FONT></H4><P class="lia-indent-padding-left-30px" style="padding-left : 30px;"><SPAN><STRONG>1.</STRONG> <STRONG>Enable Preview</STRONG>:</SPAN></P><P><SPAN>In the site editor, administrators can activate the "Preview SAPUI5 Latest Version" setting for selected non-productive sites. </SPAN></P><P class="lia-align-center" style="text-align: center;"><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="2.jpg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/269034i46531CB693FCAAB0/image-size/large?v=v2&px=999" role="button" title="2.jpg" alt="2.jpg" /></span></SPAN><SPAN><EM>Toggle turned off in site settings</EM></SPAN></P><P class="lia-align-center" style="text-align: center;"><SPAN><EM><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="3.jpg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/269050i0F0CC555B15DF333/image-size/large?v=v2&px=999" role="button" title="3.jpg" alt="3.jpg" /></span>Toggle turned on in site settings</EM></SPAN></P><P class="lia-align-center" style="text-align: center;"><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="4.jpg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/269013i848CF5979FF9AC01/image-size/large?v=v2&px=999" role="button" title="4.jpg" alt="4.jpg" /></span><EM>Warning message while saving the changes</EM><SPAN> </SPAN></P><P class="lia-align-center" style="text-align: center;"><SPAN><EM><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="1.jpg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/269049iD224BDF3AEFBAC64/image-size/large?v=v2&px=999" role="button" title="1.jpg" alt="1.jpg" /></span>Site preview on and further information<BR /></EM></SPAN></P><P class="lia-align-center" style="text-align: center;"><SPAN><EM><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="5.jpg" style="width: 508px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/269016iABDDB92BCEA0E7CE/image-size/large?v=v2&px=999" role="button" title="5.jpg" alt="5.jpg" /></span>Site directory with a site where preview is turned on</EM></SPAN></P><P class="lia-align-left lia-indent-padding-left-30px" style="text-align : left; padding-left : 30px;"><STRONG>2.</STRONG> <STRONG>Testing Period</STRONG></P><P><SPAN>The designated sites will consume the RTC version of SAPUI5 for a two-week period, during which thorough testing and validation can be conducted.</SPAN></P><P><SPAN>To enable this in SAP Build Work Zone, standard edition, customers can create a dedicated site in their existing PROD or PRE-PROD sub-accounts (or QA, if preferred), there is no need to create a new sub-account. The relevant content can be transported to this test site, where the preview option for SAPUI5 can then be enabled. </SPAN><SPAN>In SAP Build Work Zone, advanced edition, customer must setup a new sub-account (pre-prod) to use the UI5 preview feature.</SPAN></P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;"><STRONG>3. Adjustment Option</STRONG></P><P><SPAN>If needed during the preview period, administrators can turn off the preview setting to revert the site back to the previously active version.</SPAN></P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;"><STRONG>4. Automatic Update</STRONG></P><P><SPAN>After the two-week period, the </SPAN><SPAN>RTC version becomes the default </SPAN><SPAN>version for all sites, ensuring consistency across environments.</SPAN></P><H4 id="toc-hId-1400121213"><FONT color="#3366FF"><STRONG>SAPUI5 versions</STRONG></FONT></H4><P>SAPUI5 provides new versions regularly to deliver innovative features and also to provide patches with bug fixes. See <SPAN><A href="https://sapui5.hana.ondemand.com/1.135.0/#/topic/99ac68a5b1c3416ab5c84c99fefa250d" target="_blank" rel="noopener nofollow noreferrer">What's New in SAPUI5</A></SPAN> and the <SPAN><A href="https://help.sap.com/whats-new/67f60363b57f4ac0b23efd17fa192d60?locale=en-US" target="_blank" rel="noopener noreferrer">SAPUI5 What's New Viewer</A></SPAN> to learn about the new features and <SPAN><A href="https://ui5.sap.com/#/topic/91f021426f4d1014b6dd926db0e91070" target="_blank" rel="noopener noreferrer">Versioning and Maintenance of SAPUI5</A></SPAN> to understand the versioning concept. A new version is consumed by default by SAP BTP services like SAP Build Work Zone to have a solid basis for new capabilities and an up-to-date user experience.</P><P>Approximately 2 weeks before a new version is consumed by SAP cloud solutions, it is released to customers (RTC). In this timeframe you may now test a new version with SAP Build Work Zone. Learn about the planned SAPUI5 versions with their planned RTC date in <SPAN><A href="https://me.sap.com/notes/3504933" target="_blank" rel="noopener noreferrer">SAP Note 3504933</A></SPAN>.</P><H4 id="toc-hId-1203607708"><FONT color="#3366FF"><STRONG>Learn More! </STRONG></FONT></H4><P>Important references:</P><UL><LI>See the <STRONG>planned</STRONG> SAPUI5 versions with their planned release date in <A href="https://me.sap.com/notes/3504933" target="_blank" rel="noopener noreferrer">SAP Note 3504933</A>.</LI><LI>See the <STRONG>released</STRONG> SAPUI5 versions in <A href="https://ui5.sap.com/versionoverview.html" target="_blank" rel="noopener noreferrer">SAPUI5 Versions Maintenance Status</A>.</LI></UL><P>For more insights into SAPUI5 and SAP Build Work Zone:</P><UL><LI>Explore the<SPAN> </SPAN><SPAN><A href="https://community.sap.com/t5/technology-blog-posts-by-sap/sapui5-what-s-new-and-when-is-it-coming/ba-p/13550000" target="_blank">SAPUI5: What's New and When Is It Coming?</A></SPAN> blog post on the SAP Community</LI><LI>SAP Build Work Zone on: <SPAN><A href="https://www.sap.com/products/technology-platform/workzone.html" target="_blank" rel="noopener noreferrer">sap.com</A></SPAN> / <SPAN><A href="https://community.sap.com/topics/work-zone" target="_blank">SAP Community</A></SPAN></LI><LI>SAP <SPAN><A href="https://community.sap.com/t5/sap-builders/gh-p/builders" target="_self">Application Development and Automation Community Group</A></SPAN></LI></UL>2025-06-03T16:02:55.953000+02:00https://community.sap.com/t5/technology-blog-posts-by-members/unsafe-eval-error-in-sap-build-work-zone-understanding-and-fixing-a-csp/ba-p/14123035Unsafe-eval error in SAP Build Work Zone: Understanding and fixing a CSP blockage2025-06-10T07:00:00.028000+02:00valentincadarthttps://community.sap.com/t5/user/viewprofilepage/user-id/786198<P>While developing a SAP Fiori application in SAP Business Application Studio (BAS), I embedded an external component within a custom SAPUI5 component. The application worked perfectly in the local development environment, but once deployed into SAP Build Work Zone (BWZ), it no longer loaded as expected.</P><P>The browser console revealed an error related to the Content Security Policy (CSP), specifically due to the indirect use of eval(). This blog post summarizes my learnings about CSP and how I resolved the issue.</P><H2 id="toc-hId-1732291811">What is the Content Security Policy (CSP)?</H2><P>CSP is a web security standard defined by the W3C and enforced by web browsers. It allows developers to control which resources (scripts, images, styles, etc.) a browser is allowed to load and execute, helping to prevent Cross-Site Scripting (XSS) attacks and malicious script injections.</P><P><SPAN>For example, the following directive means that only scripts from the same origin as the application are permitted.</SPAN></P><pre class="lia-code-sample language-javascript"><code>Content-Security-Policy: script-src 'self'</code></pre><P><SPAN>Other common directives include:</SPAN></P><UL><LI><SPAN>style-src: Specifies allowed sources for stylesheets.</SPAN></LI><LI><SPAN>img-src: Limits where images can be loaded from.</SPAN></LI><LI><SPAN>connect-src: Defines allowed sources for fetching resources like APIs.</SPAN></LI><LI><SPAN>default-src: Specifies a fallback for all resource types if not otherwise defined.</SPAN></LI><LI><SPAN>frame-ancestors: Controls which sources can embed the page in an iframe.</SPAN></LI><LI><SPAN>… </SPAN></LI></UL><P><SPAN>To learn more about CSP, refer to the official documentation on MDN: </SPAN><A href="https://developer.mozilla.org/fr/docs/Web/HTTP/CSP](https://developer.mozilla.org/fr/docs/Web/HTTP/CSP)" target="_blank" rel="noopener nofollow noreferrer"><SPAN>https://developer.mozilla.org/fr/docs/Web/HTTP/CSP</SPAN></A></P><H2 id="toc-hId-1535778306">Problem context</H2><P>The application was developed in SAP Business Application Studio and contained an external web component wrapped inside a custom SAPUI5 component.</P><P>Once deployed to SAP Build Work Zone, the interface no longer displayed at all. The browser console then showed the following error:</P><pre class="lia-code-sample language-javascript"><code>Unsafe-eval error (CSP Compliant)
Uncaught (in promise) EvalError:
Refused to evaluate a string as JavaScript because 'unsafe-eval' is not an allowed source of script
in the following Content Security Policy directive: "script-src * data: blob:".</code></pre><H2 id="toc-hId-1339264801">Error Meaning</H2><P>In CSP, dynamic functions like eval() or new Function() are blocked by default because they can introduce serious security risks. These functions allow JavaScript code to be generated and executed at runtime, which can be exploited to inject and run malicious scripts—commonly associated with XSS attacks.</P><P>To protect the application's security, dynamic code execution is blocked by default in the Content Security Policy (CSP). Allowing it would require the inclusion of the unsafe-eval directive in the CSP, but this weakens security and should be avoided in production environments.</P><H2 id="toc-hId-1142751296">Root cause analysis</H2><P>In the external component I used, I was generating an HTML element returned as a string (this is where I messed up). This HTML was then dynamically injected into the component’s DOM. However, the external component was interpreting this string using new Function(), violating CSP rules.</P><P>This behavior went unnoticed locally in Business Application Studio because CSP policies are often disabled or applied more leniently in development environments. However, in SAP Build Work Zone, a strict CSP is enforced, blocking dynamic code evaluation like this.</P><H2 id="toc-hId-946237791">Implemented solution</H2><P>By consulting the official documentation of the component, I found that I could provide a JavaScript function directly instead of passing a returned string containing HTML. This approach enables the component to use a safe rendering function, avoiding reliance on blocked mechanisms like eval() or new Function().</P><P>Here is an example of the new CSP-compliant code:</P><pre class="lia-code-sample language-javascript"><code>const generateDropdown = (aOptions) => {
// Create the select element
const oSelectElement = document.createElement('select');
oSelectElement.classList.add('myCustomSelectClass');
// Loop through the options array and create option elements
aOptions.forEach(oOption => {
const oOptionElement = document.createElement('option');
oOptionElement.value = oOption.value;
oOptionElement.textContent = oOption.label;
// Append the option to the select
oSelectElement.appendChild(oOptionElement);
});
return oSelectElement;
};
// Example usage with an array of options
const options = [
{ value: '1', label: 'Option 1' },
{ value: '2', label: 'Option 2' },
{ value: '3', label: 'Option 3' }
];
// Generate the dropdown dynamically
generateDropdown(options);</code></pre><H2 id="toc-hId-749724286">Lessons learned</H2><P>An application that works correctly in BAS may encounter critical errors in BWZ if it does not comply with the CSP. It is essential to prioritize the use of real JavaScript functions over injecting HTML or JavaScript code as strings. Often, the documentation for external components provides alternative solutions that are CSP-compliant, and these should be carefully considered.</P><H2 id="toc-hId-553210781">Conclusion</H2><P>The Content Security Policy is an essential tool for securing web applications against XSS attacks and the execution of uncontrolled code. In environments like SAP Build Work Zone, CSP is strictly enforced, which can lead to unexpected errors.</P><P>By adapting our implementation to comply with CSP rules, we not only ensure the compatibility of our applications but also enhance their security. I hope this feedback will be useful to you.</P>2025-06-10T07:00:00.028000+02:00https://community.sap.com/t5/technology-blog-posts-by-members/blog-series-on-my-cpi-camel-learning-journey-interlude2-apim-debugging/ba-p/14121949Blog series on my CPI + Camel learning journey - Interlude2 APIM debugging2025-06-15T22:59:37.197000+02:00alex_myakinkiihttps://community.sap.com/t5/user/viewprofilepage/user-id/194559<H3 id="toc-hId-1861323632">Motivation</H3><P>Well, as with MPL you have to start doing some real life debugging to figure out the tools you are provided with "have some space for improvement", to put it mildly.</P><P>And this is what happened to me when I had a weird case for one of my api proxies.</P><H3 id="toc-hId-1664810127">A little bit about Apigee and debug session structure</H3><P>Not a secret that under the hood APIM has apigee platform (that google bought)</P><P><SPAN>So, it turns out it was not SAP to blame for this "debug session" logic, but still the app they made is something special I have to say..</SPAN></P><P>What bothers us is this stuff <SPAN><A href="https://cloud.google.com/apigee/docs/api-platform/debug/trace" target="_blank" rel="noopener nofollow noreferrer">https://cloud.google.com/apigee/docs/api-platform/debug/trace</A> </SPAN></P><P><SPAN>And particularly the structure of session/transactions <A href="https://cloud.google.com/apigee/docs/api-platform/debug/trace#download-structure" target="_blank" rel="noopener nofollow noreferrer">https://cloud.google.com/apigee/docs/api-platform/debug/trace#download-structure</A></SPAN></P><P><SPAN>Without going into details (after all this blog does not aim to provide the full schema details) let's see what could be of our most interest here.</SPAN></P><P><SPAN>First, the whole session is an array of entries (we will call it <STRONG>transactions</STRONG> which are<U> api calls</U>)</SPAN></P><P><SPAN>Below we would see "<STRONG>point</STRONG>" array - kinda <U>Steps</U> of flow execution each having an array of "<STRONG>results</STRONG>" in turn.</SPAN></P><pre class="lia-code-sample language-json"><code>[
{
"completed": true,
"point": [
{
"id": "Paused|Resumed|StateChange|FlowInfo|Condition|Execution|Error",
"results": [
{
"ActionResult": "DebugInfo|RequestMessage|ResponseMessage|ErrorMessage|VariableAccess"
}
]
}
]
}
]</code></pre><P><SPAN>These results contain some more details (which we see in the standard app as lists/forms) of key-value pairs</SPAN></P><P><SPAN>What is different is just name of "aggregation" - path in json to those arrays (eg "properties/property" or "headers" or "accessList")</SPAN></P><pre class="lia-code-sample language-json"><code>{
"ActionResult": "DebugInfo",
"properties": {
"property": [ { "name": "<PROP_NAME>", "value": "<PROP_VALUE>" } ]
},
"timestamp": "04-06-25 13:28:52:904" // yes, not a proper iso8601 timestamp ;(
}
{
"ActionResult": "RequestMessage",
"content": "<REQUEST_BODY_IF_PRESENT>",
"headers": [ { "name": "<HEADER_NAME>", "value": "<HEADER_VALUE>" } ],
"uRI": "<URI>",
"verb": "<VERB>"
}
{
"ActionResult": "ResponseMessage",
"content": "<RESPONSE_BODY_TRIMMED>.....",
"headers": [ { "name": "<HEADER_NAME>", "value": "<HEADER_VALUE>" } ],
"reasonPhrase": "<STATUS_PHRASE>",
"statusCode": "<STATUS_CODE>"
}
{
"ActionResult": "ErrorMessage",
"content": "<APIM_ERR_BODY>",
"headers": [ { "name": "<HEADER_NAME>", "value": "<HEADER_VALUE>" } ],
"reasonPhrase": "<STATUS_PHRASE>",
"statusCode": "<STATUS_CODE>"
}
{
"ActionResult": "VariableAccess",
"accessList": [
{
"Get": { "name": "<VAR>", "value": "<VALUE_IF_GOT>" }
},
{
"Set": { "name": "<VAR>", "success": true, "value": "<VALUE>" }
}
]
}</code></pre><H3 id="toc-hId-1468296622">Api Proxy debug viewer app</H3><P><SPAN>But most important thing is that we DO HAVE Request and Response (and Error) Method, Url, Content and Status!!</SPAN></P><P>And so I decided to make a really simple frontend-only ui5 app based on Flexible Column Layout (which is hidden behind the intent <U>#apim-dbg</U> in capic launchpad)</P><P>For this I just had to figure out the structure of the session and then apply some transformations to display it nicely.</P><P>And while the original app tries to follow "visual approach" apigee had in their app (you could see it following the link above) - using lots of pictograms/icons while doing its best to hide essential information from us like target endpoint http code/status or request/response body - <U>I decided to display our stuff via lists and forms</U>, cuz as a developer I LOVE TEXT (which can even be searchable).</P><P>This image from apigee documentation illustrates it well <A href="https://docs.apigee.com/api-platform/fundamentals/what-are-flows" target="_blank" rel="noopener nofollow noreferrer">https://docs.apigee.com/api-platform/fundamentals/what-are-flows</A> (not 100% percent sure I am right regarding mapping of stages, but it somewhat makes sense to me)</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="0-apigee-flows-stages.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/274243i7FF50C28C8616097/image-size/large?v=v2&px=999" role="button" title="0-apigee-flows-stages.png" alt="0-apigee-flows-stages.png" /></span></P><P>Basically, the app displays our debugging session in the following way (kinda 5 levels):</P><UL><LI>Master - <STRONG>1 Transactions</STRONG> (api calls) as Items <EM>// with objectstatus stuff</EM></LI><LI>Detail - <U>2 Stages</U> (list grouping) + <STRONG>3 points</STRONG> (steps) as Items /<EM>/ also with some color coding</EM></LI><LI>Detail-Detail - <U>4 ActionResults</U> (form container) + <STRONG>5 results</STRONG> params as form elements</LI></UL><P>Some other things to point out here (at Detail screen): </P><DIV><UL><LI><SPAN><STRONG><EM>StateChange</EM></STRONG> typically has <U>RequestMessage|ResponseMessage|ErrorMessage</U> ActionResult object appearing</SPAN></LI></UL><DIV><SPAN>It comes first in group and it is marked with <STRONG>blue</STRONG> highlight (also from this guy I calculated groups for detail list)</SPAN></DIV><UL><LI><SPAN><EM><STRONG>Error</STRONG></EM> has some error information that doesn't help much but is a place in flow where error occured - marked <STRONG>red</STRONG></SPAN></LI><LI><EM><STRONG>Execution</STRONG></EM> - is an interesting step, basically, this is where our policies run - it is marked <STRONG>amber</STRONG></LI></UL><DIV>Properties of DebugInfo action here contain "<U>type</U>" or "<SPAN><SPAN><U>stepDefinition-type</U>" which is policy type (not 100% sure) and "</SPAN></SPAN><DIV><SPAN><SPAN><U>stepDefinition-name</U>" or "</SPAN></SPAN><SPAN><U>stepDefinition-displayName</U>" which is actual policy name as we created it.</SPAN></DIV><DIV><SPAN>I use it as a name for step instead of just "Execution" (this is why you don't see it in UI)</SPAN></DIV><DIV> </DIV><DIV><SPAN>Here are the screenshots of a simple debugging session that hopefully will immediately make sense to you</SPAN></DIV><DIV><TABLE border="1" width="100%"><TBODY><TR><TD width="25%"><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="1-get-service-401-err.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/274244iCF6F1BC73A25E119/image-size/medium?v=v2&px=400" role="button" title="1-get-service-401-err.png" alt="1-get-service-401-err.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="2-get-service-401-res.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/274245i2B2F7A2BE05BD9FE/image-size/medium?v=v2&px=400" role="button" title="2-get-service-401-res.png" alt="2-get-service-401-res.png" /></span></P></TD><TD width="25%"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="3-get-service-200-analytics.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/274246i9484D4C23CAE2E85/image-size/medium?v=v2&px=400" role="button" title="3-get-service-200-analytics.png" alt="3-get-service-200-analytics.png" /></span></TD><TD width="25%"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="4-get-metadata-200-body.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/274247iBE452CBA1CCAB5D5/image-size/medium?v=v2&px=400" role="button" title="4-get-metadata-200-body.png" alt="4-get-metadata-200-body.png" /></span></TD><TD width="25%"><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="5-post-metadata-405-res.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/274249i1E3206198EF5F14A/image-size/medium?v=v2&px=400" role="button" title="5-post-metadata-405-res.png" alt="5-post-metadata-405-res.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="6-post-metadata-405-err.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/274250i15C5692C833A992D/image-size/medium?v=v2&px=400" role="button" title="6-post-metadata-405-err.png" alt="6-post-metadata-405-err.png" /></span></P></TD></TR></TBODY></TABLE></DIV></DIV><DIV> </DIV></DIV><H3 id="toc-hId-1271783117">Some JS magic</H3><P>Ok, this might even look good (or at least better than the original), but how to get the data?</P><P>Well, it turns out, SAP did a great job exposing some global methods (and even <U>oapiproxyData</U> object ) in their app (yes it seems to be a really, really old one), so we can just programmatically create us a session and then fetch data into clipboard.</P><P>And for that I used super old trick: javascript favourites snippets (even had to google they were called "<A href="https://en.wikipedia.org/wiki/Bookmarklet" target="_self" rel="nofollow noopener noreferrer">bookmarklets</A>")</P><P>So, to start session you might want to use something like this:</P><pre class="lia-code-sample language-javascript"><code>sap.apimgmt.commons.ajaxHandler({
data: JSON.stringify({"name": oapiproxyData.name, "version": oapiproxyData.version, "session_id":"pwn3d"}),
headers: {"Content-Type": "application/json", "Accept": 'application/json', "operation": "start"},
url: APIMGMT.TRACE_WORKSPACE_ROOT,
type: APIMGMT.HTTP_METHODS.POST,
success: console.log, error: console.log
})</code></pre><P> And to fetch data into your browser clipboard (and I was surprised I did not need a focusable element when using the bookmarkelt to write to it) you would do this:</P><pre class="lia-code-sample language-javascript"><code>sap.apimgmt.commons.ajaxHandler({
data: JSON.stringify({"name": oapiproxyData.name, "version": oapiproxyData.version, "session_id":"pwn3d"}),
headers: {"Content-Type": "application/json", "Accept": 'application/json', "operation": "get"},
url: APIMGMT.TRACE_WORKSPACE_ROOT,
type: APIMGMT.HTTP_METHODS.POST,
success: function(data){ navigator.clipboard.writeText(JSON.stringify(data))}, error: console.log
})</code></pre><P><EM> And I am not going to teach you how to add that stuff into bookmarks but wiki probably could.</EM></P><H3 id="toc-hId-1075269612">Demo</H3><P>In this demo we are going to reproduce the session from screenshots above.</P><P>For this purpose we use simplest api proxy possible - to anonymous Northwind service <A href="https://services.odata.org/V2/Northwind/Northwind.svc/" target="_blank" rel="noopener nofollow noreferrer">https://services.odata.org/V2/Northwind/Northwind.svc/</A> and protect it with apikey, so you can easily try it yourself in like 10 mins.</P><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%2FZm7ZUKugqBA%3Ffeature%3Doembed&display_name=YouTube&url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DZm7ZUKugqBA&image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FZm7ZUKugqBA%2Fhqdefault.jpg&type=text%2Fhtml&schema=youtube" width="200" height="113" scrolling="no" title="сapic apim dbg demo" frameborder="0" allow="autoplay; fullscreen; encrypted-media; picture-in-picture;" allowfullscreen="true"></iframe></div></P><P><SPAN class=""><A class="" href="https://www.youtube.com/watch?v=Zm7ZUKugqBA" target="" rel="nofollow noopener noreferrer">00:00</A></SPAN><SPAN class=""> Intro and motivation</SPAN></P><P><SPAN class=""><A class="" href="https://www.youtube.com/watch?v=Zm7ZUKugqBA&t=99s" target="" rel="nofollow noopener noreferrer">01:39</A></SPAN><SPAN class=""> Northwind api proxy and debug with standard app (2 positive and 2 negative responses)</SPAN></P><P><SPAN class=""><A class="" href="https://www.youtube.com/watch?v=Zm7ZUKugqBA&t=225s" target="" rel="nofollow noopener noreferrer">03:45</A></SPAN><SPAN class=""> Try interpreting the results</SPAN></P><P><SPAN class=""><A class="" href="https://www.youtube.com/watch?v=Zm7ZUKugqBA&t=298s" target="" rel="nofollow noopener noreferrer">04:58</A></SPAN><SPAN class=""> But actual session data json contains more data and that is what we cover in blog (kind of)</SPAN></P><P><SPAN class=""><A class="" href="https://www.youtube.com/watch?v=Zm7ZUKugqBA&t=366s" target="" rel="nofollow noopener noreferrer">06:06</A></SPAN><SPAN class=""> A little bit about apigee stuff and json structure and corresponding app screens</SPAN></P><P><SPAN class=""><A class="" href="https://www.youtube.com/watch?v=Zm7ZUKugqBA&t=514s" target="" rel="nofollow noopener noreferrer">08:34</A></SPAN><SPAN class=""> How to obtain session data json (other than by copying from network requests)</SPAN></P><P><SPAN class=""><A class="" href="https://www.youtube.com/watch?v=Zm7ZUKugqBA&t=608s" target="" rel="nofollow noopener noreferrer">10:08</A></SPAN><SPAN class=""> Repeat same api test/debug routine with bookmarklets magic</SPAN></P><P><SPAN class=""><A class="" href="https://www.youtube.com/watch?v=Zm7ZUKugqBA&t=696s" target="" rel="nofollow noopener noreferrer">11:36</A></SPAN><SPAN class=""> Fetch session json data to finally see the new app in action (and try to interpret data there)</SPAN></P><P><SPAN class=""><A class="" href="https://www.youtube.com/watch?v=Zm7ZUKugqBA&t=915s" target="" rel="nofollow noopener noreferrer">15:15</A></SPAN><SPAN class=""> Confirm that <U>AnalyticsPublisher</U> policy/step indeed contains response <U>message.status.code</U>, <U>request.path</U> and <U>request.verb</U> as vars (but not body though)</SPAN></P><P><SPAN class=""><A class="" href="https://www.youtube.com/watch?v=Zm7ZUKugqBA&t=970s" target="" rel="nofollow noopener noreferrer">16:10</A></SPAN><SPAN class=""> "<EM>And we do see that we do have body which is very nice</EM>" (in proper place)</SPAN></P><P><SPAN class=""><A class="" href="https://www.youtube.com/watch?v=Zm7ZUKugqBA&t=1027s" target="" rel="nofollow noopener noreferrer">17:07</A></SPAN><SPAN class=""> Final words about app screens and features and outro</SPAN></P><H3 id="toc-hId-878756107">P.S Disclaimer and feature requests/fixes</H3><P>This is the simplest and mot naive implementation of this app made out offrustration, so if for some reason you might want to test it there can (or must) be scenarios it does not support (haven't tried using scripts, conditional flows etc).</P><P>Please feel free to comment here regarding errors/features you might need, but <STRONG>DON'T paste session info here</STRONG> as it contains sensitive information about your apim instance.</P>2025-06-15T22:59:37.197000+02:00