https://raw.githubusercontent.com/ajmaradiaga/feeds/main/scmt/topics/SAP-Build-Apps-blog-posts.xmlSAP Community - SAP Build Apps2026-02-19T18:00:30.713261+00:00python-feedgenSAP Build Apps blog posts in SAP Communityhttps://community.sap.com/t5/technology-blog-posts-by-sap/unlocking-the-power-of-sap-build-sap-build-bootcamp-for-partners/ba-p/14237492Unlocking the Power of SAP Build (SAP Build Bootcamp for Partners)2025-10-09T07:22:45.050000+02:00Oswaldohttps://community.sap.com/t5/user/viewprofilepage/user-id/39194<P>On September 18th, we conducted a session focused on the new SAP Build and how it can be an element of transformation enabeling innovation, automation, and extensibility. From a packed agenda, expert Q&A and networking; the participants had first-hand views on how the new SAP Build (and assets like Joule, ABAP RAP, and BTP AI Core) can be used as a differentiator and how organizations can leverage them to build and extend SAP solutions.</P><H2 id="toc-hId-1761967674"> </H2><H3 id="toc-hId-1694536888">Agenda highlights & session recap:</H3><H4 id="toc-hId-1627106102"><FONT size="4">Welcome & Introduction // SAP Build engagement- Speaker: <U>Luis Felipe Lanz (SAP)</U></FONT></H4><P><FONT size="4"><U><A title="SAP BTP Clean Core - Intro" href="https://dam.sap.com/mac/embed/public/pdf/a/4NMn4dM?rc=10&doi=SAP1244816&includeSapBrandedWraper=true" target="_self" rel="noreferrer noopener"><SPAN> [Link to presentation]</SPAN></A></U></FONT></P><P> </P><H4 id="toc-hId-1430592597"><FONT size="4">The Road to Clean Core - Speaker: <U><FONT size="4">Daniel Alamo (SAP)</FONT></U></FONT></H4><P data-unlink="true"><A title="Clean Core" href="https://d.dam.sap.com/a/18ftSyQ/Partners_-Clean_Core_2.pdf?rc=10&inline=true&doi=SAP1244783" target="_self" rel="noopener noreferrer"><U><FONT size="4"> [Link to presentation] </FONT></U></A></P><P> </P><H4 id="toc-hId-1234079092"><FONT size="4">The New SAP Build and Joule Studio - <FONT size="4">Speaker: </FONT></FONT><U><FONT size="4">Alejandra Gómez y Oswaldo Seara (SAP)</FONT></U></H4><P><U><FONT size="4"><A title="SAP BTP Clean Core - Intro" href="https://dam.sap.com/mac/embed/public/pdf/a/BrX2eJK?rc=10&doi=SAP1244782&includeSapBrandedWraper=true" target="_self" rel="noreferrer noopener"> [Link to presentation]</A></FONT></U></P><P> </P><H4 id="toc-hId-1037565587"><STRONG><FONT size="4">ABAP RAP (RESTful Application Programming) - </FONT></STRONG><FONT size="4">Speaker: <STRONG><FONT size="4"> <U><STRONG><FONT size="4">Daniel Álamo (SAP)</FONT></STRONG></U></FONT></STRONG></FONT></H4><P><U><FONT size="4"><A title="SAP BTP Clean Core - Intro" href="https://dam.sap.com/mac/embed/public/pdf/a/g9i9CF7?rc=10&doi=SAP1244776&includeSapBrandedWraper=true" target="_self" rel="noreferrer noopener"> [Link to presentation]</A></FONT></U></P><P> </P><H4 id="toc-hId-841052082"><STRONG><FONT size="4">SAP BTP AI Core and AI Capabilities - Speaker: <U> Fernando Terry (SAP)</U></FONT></STRONG></H4><P><FONT size="4"><U><A title="SAP BTP Clean Core - Intro" href="https://dam.sap.com/mac/embed/public/pdf/a/PSTMa9Z?rc=10&doi=SAP1244779&includeSapBrandedWraper=true" target="_self" rel="noreferrer noopener"> [Link to presentation]</A></U></FONT></P><P> </P><H3 id="toc-hId-515455858"><STRONG>Key Takeaways</STRONG></H3><UL><LI><P class=""><STRONG>SAP Build Is Empowering a New Era of <U>Business-Led Development</U></STRONG></P></LI><LI><STRONG>ABAP RAP: The Future of <U>Extensibility, Built on Clean Core Principles</U></STRONG></LI><LI><STRONG>Joule Studio: <U>AI with <U>SAP context and Purpose</U></U></STRONG></LI><LI><STRONG><STRONG>Framework Guidance: Building with <U>Governance and Agility in Mind</U></STRONG></STRONG><P> </P><H3 id="toc-hId-318942353"><STRONG>What’s Next?</STRONG></H3><P class="">Here’s how to keep the momentum going:</P><UL><LI><SPAN class="lia-unicode-emoji"><span class="lia-unicode-emoji" title=":speech_balloon:">💬</span>Contact your SAP BTP Customer Success Manager</SPAN></LI><LI><SPAN class="lia-unicode-emoji"><span class="lia-unicode-emoji" title=":graduation_cap:">🎓</span>Visit<SPAN> <A href="https://discovery-center.cloud.sap/index.html" target="_self" rel="nofollow noopener noreferrer">SAP Discovery Center Missions on BTP</A></SPAN></SPAN></LI></UL></LI></UL>2025-10-09T07:22:45.050000+02:00https://community.sap.com/t5/technology-blog-posts-by-sap/frontend-strategies-for-sap-sales-cloud-v2-an-architect-s-perspective-on/ba-p/14252745Frontend Strategies for SAP Sales Cloud V2: An Architect’s Perspective on Modern UI Extensions2025-10-24T17:00:09.113000+02:00showkath_naseemhttps://community.sap.com/t5/user/viewprofilepage/user-id/1529<H2 id="toc-hId-1763668492">Introduction</H2><P>As an<SPAN> </SPAN><STRONG>SAP architect</STRONG>, I’m sharing my perspective on choosing the right frontend technologies and design strategies for<SPAN> </SPAN><STRONG>SAP Sales Cloud V2</STRONG>. Selecting the appropriate frontend is not just about framework preference—it impacts<SPAN> </SPAN><STRONG>user experience, integration, maintainability, performance, scalability, and adherence to SAP’s design principles</STRONG>.</P><P>While<SPAN> </SPAN><STRONG>SAP Fiori</STRONG><SPAN> </SPAN>provides a standardized and proven design framework,<SPAN> </SPAN><STRONG>Sales Cloud V2</STRONG><SPAN> </SPAN>introduces a modern, non-Fiori-based UI. In this article, I’ll provide guidance on balancing<SPAN> </SPAN><STRONG>Fiori compliance, lightweight frontend frameworks like React, seamless backend integration, performance, and scalability</STRONG>, along with best practices for<SPAN> </SPAN><STRONG>extensions, mashups, and side-by-side scenarios with S/4HANA</STRONG>.</P><H2 id="toc-hId-1567154987">Understanding SAP Sales Cloud V2's UI</H2><P>SAP Sales Cloud V2 introduces a modern, intuitive UI designed to enhance user experience and productivity. Unlike traditional SAP Fiori applications, V2's UI is not strictly Fiori-based. It leverages contemporary design principles to provide a seamless and engaging user interface.</P><P>For a visual overview of SAP Sales Cloud V2 UI.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="showkath_naseem_0-1761319548659.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/332098iC0285158106BBD3D/image-size/medium?v=v2&px=400" role="button" title="showkath_naseem_0-1761319548659.png" alt="showkath_naseem_0-1761319548659.png" /></span></P><P> </P><H2 id="toc-hId-1370641482">Frontend Development Considerations</H2><H3 id="toc-hId-1303210696">1. Aligning with SAP Fiori Design Principles</H3><P>SAP Fiori offers a set of design principles aimed at creating consistent and user-friendly interfaces. While V2's UI is not Fiori-based, developers can still adhere to Fiori's design guidelines to ensure a cohesive user experience. Key considerations include:</P><UL><LI><STRONG>Consistency:</STRONG><SPAN> </SPAN>Maintaining uniform design elements across applications.</LI><LI><STRONG>Efficiency:</STRONG><SPAN> </SPAN>Optimizing workflows to reduce user effort.</LI><LI><STRONG>Intuitiveness:</STRONG><SPAN> </SPAN>Designing interfaces that are easy to understand and navigate.</LI><LI><STRONG>Performance:</STRONG><SPAN> </SPAN>Ensuring fast rendering and responsiveness.</LI><LI><STRONG>Scalability:</STRONG><SPAN> </SPAN>Designing the frontend to handle growing user loads and data volumes efficiently.</LI></UL><H3 id="toc-hId-1106697191">2. Choosing the Right Frontend Technology</H3><P>The choice of frontend technology should align with the application's requirements and the desired user experience. Consider:</P><UL><LI><STRONG>Fiori Elements (CAP / UI5):</STRONG><SPAN> </SPAN>Ideal for OData-based applications requiring standardized Fiori UI patterns. Leveraging SAP BTP CAP best practices, Fiori Elements provide:<UL><LI>Metadata-driven UI generation (List Report, Object Page, Analytical List Page)</LI><LI>Out-of-the-box CRUD operations</LI><LI>Automatic audit log and change history of business object tracking.In CAP, with simple annotations and minimal effort, audit logging tracks user and system actions for compliance, while change history tracking records the actual data changes in business objects — capturing before and after field values for complete business transparency.</LI><LI>Attachment management support</LI><LI>Event-driven integration through<SPAN> </SPAN><STRONG>SAP Event Mesh</STRONG></LI><LI>Extensibility for custom fields and actions</LI><LI>Built-in navigation, filtering, and sorting features</LI><LI>Validations and field-level rules defined in CDS models are automatically enforced, ensuring consistent data integrity across UI and backend.</LI><LI>Support for multitenancy, authentication, and authorization using SAP BTP XSUAA.</LI><LI>Integration with OData v4, REST, and messaging-based endpoints.</LI><LI><STRONG>Note:</STRONG><SPAN> </SPAN>If Fiori Elements annotations do not fully meet business requirements, teams should agree with business stakeholders to address those scenarios using custom UI extensions. This is not a limitation of CAP or Fiori Elements but reflects a custom requirement beyond the framework’s standardized scope.</LI></UL></LI><LI><STRONG>UI5 Web Components for React:</STRONG><SPAN> </SPAN>Use Fiori-compliant components within a React app to combine flexibility with consistency.<BR /><A href="https://github.com/UI5/webcomponents-react?utm_source=chatgpt.com" target="_blank" rel="noopener nofollow noreferrer">Documentation</A></LI><LI><STRONG>React with Custom Components:</STRONG><SPAN> </SPAN>For applications requiring highly customized UI aligned with Sales Cloud V2 look & feel.</LI><LI><STRONG>UI5 Freestyle (SAPUI5):</STRONG><SPAN> </SPAN>For deep integration with SAP backend and traditional Fiori look & feel.</LI></UL><H3 id="toc-hId-910183686">When to Choose Fiori Elements for Sales Cloud V2</H3><UL><LI>Backend services are OData-based</LI><LI>Standard UI patterns like List Report, Object Page, or Analytical List Page meet requirements</LI><LI>Minimal custom UI is needed</LI><LI>Out-of-the-box features (CRUD, attachments, audit/change history) are beneficial</LI><LI>Strict adherence to Fiori design guidelines is required</LI><LI>Faster delivery and lower TCO is a priority</LI><LI>Extensibility for custom fields and actions is needed</LI></UL><H3 id="toc-hId-713670181">Balancing Look & Feel vs Out-of-the-Box Fiori</H3><P>When integrating with backend services, consider:</P><UL><LI><STRONG>Use Fiori Elements:</STRONG><SPAN> </SPAN>When OData backend, standard UI patterns suffice, and business prioritizes rapid delivery, TCO, and built-in CAP features.</LI><LI><STRONG>Use Custom / Lightweight Frontend:</STRONG><SPAN> </SPAN>When business requires UI to match Sales Cloud V2 look & feel, heavy customization, or mashups.</LI><LI><STRONG>Hybrid Approach:</STRONG><SPAN> </SPAN>Combine CAP Fiori Elements for standard functionality with custom/lightweight frontends for specialized UI requirements.</LI></UL><H3 id="toc-hId-517156676"><STRONG>Comparison Matrix</STRONG></H3><DIV class=""><DIV class="">Aspect Fiori Elements Freestyle/UI5 Apps <TABLE><TBODY><TR><TD><STRONG>Development Effort</STRONG></TD><TD>Low – uses templates and OData annotations; minimal coding required</TD><TD>High – requires custom coding, UI5 expertise</TD></TR><TR><TD><STRONG>User Experience Consistency</STRONG></TD><TD>High – standard SAP Fiori UX is automatically applied</TD><TD>Variable – depends on developer adherence to guidelines</TD></TR><TR><TD><STRONG>Flexibility / Customization</STRONG></TD><TD>Limited – constrained by templates; complex interactions harder to implement</TD><TD>High – complete control over UI, personas, workflows, and visualizations</TD></TR><TR><TD><STRONG>Time-to-Market</STRONG></TD><TD>Faster – rapid deployment using standard templates</TD><TD>Slower – longer development cycles for custom design</TD></TR><TR><TD><STRONG>Maintenance & Upgrades</STRONG></TD><TD>Easier – standard templates simplify future upgrades</TD><TD>More complex – custom components may require refactoring</TD></TR><TR><TD><STRONG>Performance & Best Practices</STRONG></TD><TD>Optimized – built-in SAP performance standards</TD><TD>Dependent on developer implementation</TD></TR><TR><TD><STRONG>Use Case Suitability</STRONG></TD><TD>Standard CRUD apps, analytical or reporting apps, apps requiring consistent SAP UX</TD><TD>Highly specialized apps, innovative UX, unique workflows, complex integrations</TD></TR><TR><TD><STRONG>TCO Impact</STRONG></TD><TD>Lower – reduces overall Total Cost of Ownership</TD><TD>Higher – more development and maintenance effort</TD></TR></TBODY></TABLE></DIV></DIV><HR /><H3 id="toc-hId-320643171"><STRONG>Guidelines / Recommendations</STRONG></H3><OL><LI><P><STRONG>Follow SAP Standard Fiori Elements wherever possible</STRONG> to ensure consistency, rapid deployment, and reduced TCO.</P></LI><LI><P><STRONG>Adopt low-code/no-code approaches</STRONG> (Fiori Elements, annotations, SAP Business Application Studio templates) to accelerate development and reduce complexity.</P></LI><LI><P><STRONG>Follow central architecture and management directions</STRONG>:</P><UL><LI><P>Align with global architecture standards and SAP Best Practices.</P></LI><LI><P>Ensure compliance with governance, security, and upgrade strategies.</P></LI></UL></LI><LI><P><STRONG>Use Freestyle/UI5 Apps only when necessary</STRONG>:</P><UL><LI><P>For highly customized workflows, innovative UX, or complex integrations that cannot be achieved using standard templates.</P></LI></UL></LI><LI><P><STRONG>Prioritize maintainability and scalability</STRONG>:</P><UL><LI><P>Prefer standard templates and components to simplify future enhancements and upgrades.</P></LI></UL></LI><LI><P><STRONG>Ensure consistent and high-quality user experience</STRONG> across applications.</P></LI></OL><H2 id="toc-hId--4953053">Backend Integration Considerations</H2><UL><LI><STRONG>OData Services:</STRONG><SPAN> </SPAN>Standard SAP protocol for frontend-backend communication</LI><LI><STRONG>GraphQL:</STRONG><SPAN> </SPAN>Flexible alternative to OData</LI><LI><STRONG>REST APIs:</STRONG><SPAN> </SPAN>For external service integration</LI></UL><P>Choose the backend service type that aligns with your frontend framework to ensure seamless integration, optimal performance, and scalability.</P><H2 id="toc-hId-145787799">Extensions, Mashups, and SAP Build Apps</H2><P>SAP Sales Cloud V2 supports extensions and mashups to enhance functionality:</P><UL><LI><STRONG>Sales Cloud Extensions:</STRONG><SPAN> </SPAN>Built on SAP BTP to extend V2 capabilities</LI><LI><STRONG>Mashups:</STRONG><SPAN> </SPAN>Embed external apps or services into Sales Cloud interface</LI></UL><H3 id="toc-hId--344128713">Mashup-Based HTML UI</H3><UL><LI>Work List: Mashup as work center feature</LI><LI>Detail View: Display detailed info in context</LI><LI>Quick View: Summarized data for fast access</LI></UL><H3 id="toc-hId--540642218">Extensibility Using SAP Build Apps</H3><P>SAP Build Apps enables no-code/low-code apps for all form factors. Extensions can be embedded in Sales Cloud V2.</P><UL><LI>Included for tenants with 100+ users</LI><LI>Additional licensing required for fewer than 100 users</LI></UL><H3 id="toc-hId--737155723">References for Mashups and SAP Build Apps</H3><UL><LI><A href="https://help.sap.com/doc/300d71dc3d2141fb8941453f95b85541/CSS_SHIP/en-US/CX_NG_CSS_SalesSolGuide.pdf" target="_blank" rel="noopener noreferrer">SAP Sales Cloud Version 2 Solution Guide (PDF)</A></LI><LI><A href="https://help.sap.com/docs/build-apps/service-guide/setup-sap-build-apps-with-sap-sales-cloud-version-2" target="_blank" rel="noopener noreferrer">SAP Build Apps Setup Guide for Sales Cloud V2</A></LI><LI><A href="http://help.sap.com/disclaimer?site=https%3A%2F%2Fblogs.sap.com%2F2022%2F09%2F19%2Fdesign-and-develop-extensions-on-sap-service-cloud-version-2-using-sap-appgyver%2F" target="_blank" rel="noopener noreferrer">Design and Develop Extensions using SAP AppGyver</A></LI></UL><H2 id="toc-hId--640266221">Recommendations</H2><UL><LI>Use<SPAN> </SPAN><STRONG>Fiori Elements (CAP/UI5)</STRONG><SPAN> </SPAN>for OData-based apps with standard UI patterns and built-in features (CRUD, attachments, audit)</LI><LI>Use<SPAN> </SPAN><STRONG>React / custom frontend</STRONG><SPAN> </SPAN>to match Sales Cloud V2 look & feel when business requires visual consistency or heavy customization</LI><LI>Use<SPAN> </SPAN><STRONG>UI5 Freestyle</STRONG><SPAN> </SPAN>for deep SAP backend integration and traditional Fiori UX</LI><LI>Consider<SPAN> </SPAN><STRONG>hybrid approaches</STRONG><SPAN> </SPAN>combining Fiori Elements and custom/lightweight frontends</LI><LI>Extensions and mashups should prioritize<SPAN> </SPAN><STRONG>performance, consistency, security</STRONG></LI><LI>Side-by-side scenarios with S/4HANA: maintain SAP UI5 for OData backend integration</LI><LI>Backend service type (OData, REST, GraphQL) influences frontend choice and integration approach</LI></UL><H2 id="toc-hId--836779726">References</H2><UL><LI><A href="https://www.sap.com/engage/sscv2.html?utm_source=chatgpt.com" target="_blank" rel="noopener noreferrer">SAP Sales Cloud Version 2 Overview</A></LI><LI><A href="https://github.com/UI5/webcomponents-react?utm_source=chatgpt.com" target="_blank" rel="noopener nofollow noreferrer">UI5 Web Components for React Documentation</A></LI><LI><A href="https://community.sap.com/t5/technology-blog-posts-by-members/comparison-between-sapui5-and-web-components/ba-p/13541904?utm_source=chatgpt.com" target="_blank">Comparison Between SAPUI5 and Web Components</A></LI><LI><A href="https://www.knacksystems.com/blog/sap-sales-and-service-cloud-version-2-new-features-and-roadmap?utm_source=chatgpt.com" target="_blank" rel="noopener nofollow noreferrer">SAP Sales Cloud V2 Features and Roadmap</A></LI><LI><A href="https://www.sap.com/assetdetail/2024/05/b090b0b6-ba7e-0010-bca6-c68f7e60039b.html?utm_source=chatgpt.com" target="_blank" rel="noopener noreferrer">SAP Sales Cloud V2 with S/4HANA in Action</A></LI><LI><A href="https://help.sap.com/doc/300d71dc3d2141fb8941453f95b85541/CSS_SHIP/en-US/CX_NG_CSS_SalesSolGuide.pdf" target="_blank" rel="noopener noreferrer">SAP Sales Cloud V2 Solution Guide (PDF)</A></LI><LI><A href="https://help.sap.com/docs/build-apps/service-guide/setup-sap-build-apps-with-sap-sales-cloud-version-2" target="_blank" rel="noopener noreferrer">SAP Build Apps Setup Guide for Sales Cloud V2</A></LI><LI><A href="http://help.sap.com/disclaimer?site=https%3A%2F%2Fblogs.sap.com%2F2022%2F09%2F19%2Fdesign-and-develop-extensions-on-sap-service-cloud-version-2-using-sap-appgyver%2F" target="_blank" rel="noopener noreferrer">Design and Develop Extensions using SAP AppGyver</A></LI></UL><DIV class=""><H3 id="toc-hId--1326696238">Key Takeaways</H3><UL><LI>Choosing the frontend technology for SAP Sales Cloud V2 requires balancing<SPAN> </SPAN><STRONG>look & feel, performance, scalability, and integration capabilities</STRONG>.</LI><LI>For Fiori-compliant UI,<SPAN> </SPAN><STRONG>Fiori Elements (CAP/UI5)</STRONG><SPAN> </SPAN>or UI5 Freestyle are preferred for OData-based apps.</LI><LI>For customized, lightweight UI aligned with Sales Cloud V2, use<SPAN> </SPAN><STRONG>React or other modern frameworks</STRONG>.</LI><LI>CAP Fiori Elements provide<SPAN> </SPAN><STRONG>out-of-the-box advantages</STRONG>: CRUD, attachments, audit/change history, navigation, filtering, and extensibility.</LI><LI>Hybrid approaches can combine standard Fiori Elements with custom frontends for specialized UX needs.</LI><LI>Backend service type (OData, REST, GraphQL) influences frontend technology choice.</LI><LI>Extensions and mashups should prioritize<SPAN> </SPAN><STRONG>consistency, performance, and security</STRONG>.</LI><LI>Side-by-side scenarios (Sales Cloud V2 & S/4HANA) benefit from using SAP UI5 technologies for OData backend integration.</LI></UL></DIV>2025-10-24T17:00:09.113000+02:00https://community.sap.com/t5/technology-blog-posts-by-sap/sap-teched2025-xp264-explore-how-to-run-cloud-native-applications-on-sap/ba-p/14255917SAP TechEd2025-XP264- Explore how to run cloud-native applications on SAP BTP, Kyma runtime2025-10-29T10:33:13.323000+01:00quovadishttps://community.sap.com/t5/user/viewprofilepage/user-id/743<DIV class=""><DIV class=""><H2 id="toc-hId-1763759696"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="TechEd_2025.jpg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/333750iBE2279AE49FCA51E/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="TechEd_2025.jpg" alt="TechEd_2025.jpg" /></span></H2><H2 id="toc-hId-1567246191">Description</H2></DIV><P>A sneak preview of the material for the SAP TechEd 2025 session catalog number XP264 -<SPAN> </SPAN><A href="https://www.sap.com/events/teched/berlin/flow/sap/te25/catalog-inperson/page/catalog/session/1749035076180001oik0" target="_blank" rel="noopener noreferrer"><STRONG>Explore how to run cloud-native applications on SAP BTP, Kyma runtime.</STRONG></A></P><UL><LI>Day-2 Operations: Management, Maintenance, Monitoring, and Optimization</LI><LI>Technical connectivity to public and private (on-premise) systems</LI></UL><P>The <A title="teched2025-XP264" href="https://github.com/SAP-samples/teched2025-XP264" target="_blank" rel="noopener nofollow noreferrer">repository</A> with the session material has been public since Monday, November 3rd.</P><P>See you there in Bangalore!</P><H2 id="toc-hId-1370732686"> </H2><H2 id="toc-hId-1174219181">Overview</H2></DIV><P>This session introduces attendees to<SPAN> </SPAN><STRONG>Day-2</STRONG><SPAN> </SPAN>operations with SAP BTP, Kyma runtime - a managed kubernetes environment to help connect and extend enterprise applications in the cloud-native world.</P><TABLE border="1"><TBODY><TR><TD><DIV><P>In a nutshell, SAP BTP, Kyma Runtime (SKR) is a managed k8s runtime environment with a kubernetes cluster based on Gardener and a set of building blocks called<SPAN> </SPAN><STRONG>Kyma modules</STRONG>.</P><P>Each instance of SAP BTP Kyma runtime environment is a single k8s gardener cluster with its own set of kyma modules.<BR />Subsequently, all these clusters are managed by a central Kyma Control Plane (KCP) that orchestrates the lifecycle of</P><UL><LI>the underlying hyperscaler project,</LI><LI>the Gardener Cluster,</LI><LI>and the Kyma modules.</LI></UL><HR /><DIV class=""><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="quovadis_0-1761729555717.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/333757iF2BCE03DB4B0E4DD/image-size/large?v=v2&px=999" role="button" title="quovadis_0-1761729555717.png" alt="quovadis_0-1761729555717.png" /></span><P> </P></DIV></DIV><DIV class=""> </DIV></DIV></TD></TR></TBODY></TABLE><DIV class=""><H3 id="toc-hId-1106788395">During the session you will learn</H3></DIV><UL><LI><FONT color="#008080">how to operate applications with SAP BTP, Kyma runtime and discover the power of smooth integration with cloud applications and on-premise systems using the advanced connectivity features.</FONT></LI><LI><FONT color="#008080">to explore operational best practices from mastering troubleshooting techniques and intelligent root-cause analysis to event-driven autoscaling that adapts to your business needs in real time.</FONT></LI><LI><FONT color="#008080">about BTP multitenant applications with SAP BTP, Kyma runtime.</FONT></LI></UL><DIV class=""><H2 id="toc-hId-781192171">Requirements</H2></DIV><P>The requirements to follow the exercises in this repository are...</P><DIV class=""><P class=""><STRONG>Important</STRONG></P><UL><LI><FONT color="#FF6600">You must be able to fork the repository and activate the github actions at the fork. This is mandatory for this session! </FONT></LI><LI><FONT color="#FF6600">Thus, you may need a GitHub user.</FONT><BR /><FONT color="#FF6600">If you haven't got one yet, please<SPAN> </SPAN><A href="https://github.com/SAP-samples/teched2025-XP264/blob/main/exercises/ex0#exercise-00---sign-up-for-a-new-github-account" target="_blank" rel="noopener nofollow noreferrer">sign-up</A><SPAN> </SPAN>on GitHub before the workshop or at the very beginning of the session.</FONT></LI></UL></DIV><DIV class=""><P class=""><STRONG>Important</STRONG></P><P>The session content is provided<SPAN> </SPAN><EM>exclusively</EM><SPAN> </SPAN>on the SAP-Samples github, and many excercises have been implemented as CI/CD<SPAN> </SPAN><A href="https://docs.github.com/en/actions/get-started/understand-github-actions" target="_blank" rel="noopener nofollow noreferrer">Github Actions worflows</A><SPAN> </SPAN>(GHA).</P></DIV><DIV class=""><P>Security is paramount. With the Github Action IDP-delegated flow, there is no more need to provide kubernetes and btp credentials when using<SPAN> </SPAN><A href="https://docs.github.com/en/actions/concepts/security/openid-connect#benefits-of-using-oidc" target="_blank" rel="noopener nofollow noreferrer">github actions</A>.</P></DIV><UL><LI><P><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span>The Github Action workflows acting as the<SPAN> </SPAN><A href="https://docs.github.com/en/actions/concepts/security/openid-connect" target="_blank" rel="noopener nofollow noreferrer">OIDC provider</A>.</P></LI><LI><P><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span>All the kubernetets environments in the landscape are configured to trust GitHub’s token identity provider. They come with the pre-configured OIDC applications leveraging the built-in Gardener OIDC shoot extension.</P></LI><LI><P><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span>SAP Cloud Identity Services acting as a platform IDP on the BTP side of the house has been federated with the Github actions OIDC Provider</P></LI><LI><P><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span>As a result, the very short-lived<SPAN> </SPAN><A href="https://docs.github.com/en/actions/concepts/security/openid-connect#understanding-the-oidc-token" target="_blank" rel="noopener nofollow noreferrer">credentials</A><SPAN> </SPAN>are being fetched and rotated automatically on the behalf of the repository user for both kubernetes and btp platform operations.</P></LI><LI><P>The good news is you may run the<SPAN> </SPAN><STRONG>GHA-based exercises</STRONG><SPAN> </SPAN>directly, from your forked repository, in a browser on the<SPAN> </SPAN><STRONG>provided</STRONG><SPAN> </SPAN>teched laptop.</P></LI></UL><DIV class=""><P class=""><STRONG>Disclaimer</STRONG></P><P>Personal devices should not be used for this session. Hands-on session participants will be using Windows laptops provided by the organizers.</P><P><STRONG>What to expect from this session?</STRONG></P></DIV><UL><LI><P><span class="lia-unicode-emoji" title=":backhand_index_pointing_right:">👉</span>Run and take time to inspect the results of the built-in automations. Ask questions. And if you feel like doing, go ahead and create your own variants as well.</P></LI><LI><P><span class="lia-unicode-emoji" title=":backhand_index_pointing_right:">👉</span>The recommendation is, however, to go with the flow of the exercises, inspect the results, ask questions and leave the rest for the homework.</P></LI><LI><P>For all other exercises which may require a terminal use, you may use the built-in VSCode terminal window.</P></LI><LI><P>As this is a Day-2 operation brief, the entire cloud landscape has been pre-configured with a number of shared components, for instance:</P><UL><LI><span class="lia-unicode-emoji" title=":link:">🔗</span>SAP Cloud Identity Services (SAP IAS)</LI><LI><span class="lia-unicode-emoji" title=":link:">🔗</span>SAP Cloud Logging</LI><LI><span class="lia-unicode-emoji" title=":link:">🔗</span>SAP HANA Cloud</LI><LI><span class="lia-unicode-emoji" title=":link:">🔗</span>ArgoCDaaS</LI><LI><span class="lia-unicode-emoji" title=":link:">🔗</span>SAP BTP Connectivity services - Destination service, Connectivity service, Cloud Connector, Connectivity Proxy and Transparent Proxy</LI><LI><span class="lia-unicode-emoji" title=":link:">🔗</span>S4/HANA On-premise (private cloud) with the Cloud Connector in the private network.</LI></UL></LI><LI><P>All of the SAP Kyma environments have been configured to the same template (via terraform automation).</P></LI><LI><P>Last but not least, you will be able to<SPAN> </SPAN><EM>play</EM><SPAN> </SPAN>with a pre-deployed SAP Build multi-tenant application deployed to one of the kyma clusters.</P></LI><LI>Have fun!</LI></UL><TABLE border="1" width="100%"><TBODY><TR><TD width="100%"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Slide5.jpg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/337581i721F849FDB8982F5/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Slide5.jpg" alt="Slide5.jpg" /></span></TD></TR></TBODY></TABLE><DIV class=""><DIV class=""> </DIV><DIV class=""> </DIV><TABLE border="1" width="100%"><TBODY><TR><TD width="100%"><DIV class=""> </DIV><P>XP264 now travels to Bangalore on Nov 26,2025 (Day 2)</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="teched-bangalore.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/342409i06F22207E206B63B/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="teched-bangalore.png" alt="teched-bangalore.png" /></span> </P></TD></TR></TBODY></TABLE></DIV>2025-10-29T10:33:13.323000+01:00https://community.sap.com/t5/tooling-sap-build-blog-posts/info-links-for-teched-community-talk-ct1293-sap-build-control-tower/ba-p/14257713Info/Links for TechEd Community Talk CT1293 - SAP Build Control Tower2025-10-31T11:42:47.838000+01:00Dan_Wroblewskihttps://community.sap.com/t5/user/viewprofilepage/user-id/72<P>This post is to provide additional reference information and links related to my community talk CT1293 - <SPAN>Get control of the control tower feature in SAP Build solutions. <A href="https://www.sap.com/events/teched/berlin/flow/sap/te25/catalog-inperson/page/catalog/session/1756937550828001FTwe" target="_self" rel="noopener noreferrer">See you there</A>.</SPAN></P><H2 id="toc-hId-1763817352">Control Tower Layout</H2><P>Here's is the current picture of the Control Tower.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Dan_Wroblewski_0-1761903508342.png" style="width: 875px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/334617i1C07A9D9FDE7A6FD/image-dimensions/875x548?v=v2" width="875" height="548" role="button" title="Dan_Wroblewski_0-1761903508342.png" alt="Dan_Wroblewski_0-1761903508342.png" /></span></P><P>I think the layout is simple and clean, though it has evolved with additional tiles over the last 2 years and I don't think it's so clear how everything is inter-related. Here is my annotated version with a few notes. </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Control Tower.jpg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/334616iF2AD7E361CEEC867/image-size/large?v=v2&px=999" role="button" title="Control Tower.jpg" alt="Control Tower.jpg" /></span></P><P>My notes:</P><UL><LI><STRONG>Environments</STRONG>, introduced relatively recently with the public environment deprecated, seems to me the central most-important tile on the page</LI><LI><STRONG>Destinations</STRONG> and API keys are strongly connected to environments</LI><LI>The first 3 tiles are related to <STRONG>transport</STRONG>: The first defines whether the tenant is dev/qa/prod for the sake of transport, and the governance rules (next 2 tiles) in part add an extra layer of approval for transport operations. The rules also affect simply creating a project.</LI></UL><P>More information on the Control Tower: <A href="https://help.sap.com/docs/build-service/build-service-guide/managing-control-tower?locale=en-US" target="_blank" rel="noopener noreferrer">https://help.sap.com/docs/build-service/build-service-guide/managing-control-tower?locale=en-US</A></P><H2 id="toc-hId-1567303847">Permissions</H2><P>There are many layers of permissions within SAP Build. Here they are from highest to lowest level.</P><H3 id="toc-hId-1499873061">IAS</H3><P>Identity Authentication Service (IAS), or perhaps now just Cloud Identity Service, is the very first level and at the most basic level lets you create new users.</P><P>I just want to point out one helpful feature are groups. I can set up a group and then assign that group role connections. When I have a new user I just add them to the group and they inherent all the role collections. </P><P>Here are groups in IAS.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Dan_Wroblewski_0-1761904825573.png" style="width: 872px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/334627i889F027F3A62A0E4/image-dimensions/872x229?v=v2" width="872" height="229" role="button" title="Dan_Wroblewski_0-1761904825573.png" alt="Dan_Wroblewski_0-1761904825573.png" /></span></P><P>Here I assign a group to a role collection. Note that SAP BTP does not have a dropdown of groups so you have to simply type in the name of the group.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Dan_Wroblewski_1-1761904950651.png" style="width: 962px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/334628iCC1A28198B0DAD36/image-dimensions/962x464?v=v2" width="962" height="464" role="button" title="Dan_Wroblewski_1-1761904950651.png" alt="Dan_Wroblewski_1-1761904950651.png" /></span></P><P>YOu can do the same with attributes, for example, assign a role collection based on job function or home country.</P><P>More information: <A href="https://help.sap.com/docs/cloud-identity-services/cloud-identity-services/landing-page?locale=en-US" target="_blank" rel="noopener noreferrer">https://help.sap.com/docs/cloud-identity-services/cloud-identity-services/landing-page?locale=en-US</A></P><H3 id="toc-hId-1303359556">Tenants</H3><P>Once you have a user in IAS, you can assign that user to a tenant and NOT assign them to other tenants. You can look in the <STRONG>Users</STRONG> page to see which users have access to the current tenant.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Dan_Wroblewski_2-1761905258920.png" style="width: 984px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/334629i4B8A9462AAF72C8E/image-dimensions/984x475?v=v2" width="984" height="475" role="button" title="Dan_Wroblewski_2-1761905258920.png" alt="Dan_Wroblewski_2-1761905258920.png" /></span></P><P>More information: <A href="https://help.sap.com/docs/btp/sap-business-technology-platform/business-users?locale=en-US" target="_blank" rel="noopener noreferrer">https://help.sap.com/docs/btp/sap-business-technology-platform/business-users?locale=en-US</A></P><H3 id="toc-hId-1106846051">Roles</H3><P>Once a user has access to the tenant in some way, you determine what they can do on that tenant by assigning them roles, not directly, but through role collections, which are sets of roles that loosely map to a persona (e.g., admin, developer, business user, super user).</P><P>Here's more information on the specific roles/role collections related to the low-code tools of SAP Build:</P><UL><LI><STRONG>SAP Build Apps: </STRONG><A href="https://help.sap.com/docs/build-apps/service-guide/configuring-user-roles?locale=en-US&q=role" target="_blank" rel="noopener noreferrer">https://help.sap.com/docs/build-apps/service-guide/configuring-user-roles?locale=en-US&q=role</A></LI><LI><STRONG>SAP Build Process Automation: </STRONG><A href="https://help.sap.com/docs/build-process-automation/sap-build-process-automation/authorizations?locale=en-US&q=role" target="_blank" rel="noopener noreferrer">https://help.sap.com/docs/build-process-automation/sap-build-process-automation/authorizations?locale=en-US&q=role</A></LI><LI><STRONG>SAP Build Work Zone:</STRONG> <A href="https://help.sap.com/docs/build-work-zone-standard-edition/sap-build-work-zone-standard-edition/about-roles-and-role-assignments?locale=en-US&q=role" target="_blank" rel="noopener noreferrer">https://help.sap.com/docs/build-work-zone-standard-edition/sap-build-work-zone-standard-edition/about-roles-and-role-assignments?locale=en-US&q=role</A></LI></UL><H3 id="toc-hId-910332546">Design-Time Authorizations</H3><P>These authorizations are done on the project level, some know as collaboration authorizations, so you can work with others on specific projects.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Dan_Wroblewski_0-1761905941073.png" style="width: 435px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/334630i2CCEA6BEA5341206/image-dimensions/435x332?v=v2" width="435" height="332" role="button" title="Dan_Wroblewski_0-1761905941073.png" alt="Dan_Wroblewski_0-1761905941073.png" /></span></P><P>For information on the meaning of each role, see <A href="https://help.sap.com/docs/build-service/build-service-guide/managing-project-members?locale=en-US" target="_blank" rel="noopener noreferrer">https://help.sap.com/docs/build-service/build-service-guide/managing-project-members?locale=en-US</A>.</P><H3 id="toc-hId-713819041">Runtime Automarizations</H3><P>Runtime authorizations are the authorizations you have within environments. Environments are separate areas for deploying projects, and each environment can be set up to allow different users to do different activities (e.g., view, deploy, add users).</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Dan_Wroblewski_1-1761906202426.png" style="width: 451px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/334633i48AFE35747253B9B/image-dimensions/451x330?v=v2" width="451" height="330" role="button" title="Dan_Wroblewski_1-1761906202426.png" alt="Dan_Wroblewski_1-1761906202426.png" /></span></P><P>For information on the meaning of each role, see <A href="https://help.sap.com/docs/build-service/build-service-guide/share-environment" target="_blank" rel="noopener noreferrer">https://help.sap.com/docs/build-service/build-service-guide/share-environment</A>.</P><H2 id="toc-hId-388222817">Governance Rules</H2><P>Governance rules let you set up a process to be executed so managers can approve or reject whether another user can create a project or transport a project.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Dan_Wroblewski_2-1761906524918.png" style="width: 887px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/334635i8264B6860208558C/image-dimensions/887x326?v=v2" width="887" height="326" role="button" title="Dan_Wroblewski_2-1761906524918.png" alt="Dan_Wroblewski_2-1761906524918.png" /></span></P><P>If you enable rules for either creation or transport, you are automatically given into the lobby an out-of-the-box process and action. You must deploy the process before the rules can take effect (the action is automatically published). Before deploying, you can modify the process -- you really must since it the process automatically gives the requestor the right to approve his own project.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Dan_Wroblewski_3-1761906605896.png" style="width: 844px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/334637i5D1C82662197AA57/image-dimensions/844x463?v=v2" width="844" height="463" role="button" title="Dan_Wroblewski_3-1761906605896.png" alt="Dan_Wroblewski_3-1761906605896.png" /></span></P><P>For more information, see <A href="https://help.sap.com/docs/build-service/build-service-guide/governance?locale=en-US&q=governance+rules" target="_blank" rel="noopener noreferrer">https://help.sap.com/docs/build-service/build-service-guide/governance?locale=en-US&q=governance+rules</A>.</P><H2 id="toc-hId-191709312">Transport</H2><P>Transport allows you to create formal processes for moving projects from one tenant to another tenant, generally from DEV > QA > PROD. The transport does not deploy projects but simply moves the design-time projects from one SAP Build installation to another. You can only transport a released version.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Dan_Wroblewski_4-1761906997307.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/334646i065CECE5743CA932/image-size/medium?v=v2&px=400" role="button" title="Dan_Wroblewski_4-1761906997307.png" alt="Dan_Wroblewski_4-1761906997307.png" /></span></P><P>You will have to install <STRONG>Cloud Transport Manager Service</STRONG>, and add the <STRONG>Content Agent Service</STRONG> on every tenant to which you want to transport content. </P><P>Once you have everything setup and execute a transport from the SAP Build lobby, the package goes to CTMS, where someone with the import role will need to approve the transport. </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Dan_Wroblewski_5-1761907204488.png" style="width: 955px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/334655i2BD71814FA2F5863/image-dimensions/955x327?v=v2" width="955" height="327" role="button" title="Dan_Wroblewski_5-1761907204488.png" alt="Dan_Wroblewski_5-1761907204488.png" /></span></P><P>For more information on setting up transport, see <A href="https://community.sap.com/t5/application-development-and-automation-blog-posts/transporting-content-in-sap-build-apps-sap-cloud-transport-management/ba-p/13737478" target="_blank">https://community.sap.com/t5/application-development-and-automation-blog-posts/transporting-content-in-sap-build-apps-sap-cloud-transport-management/ba-p/13737478</A>.</P><P>For more information on how to transport and prerequisites, see <A href="https://help.sap.com/docs/build/sap-build-core/transport-project?locale=en-US&q=transport" target="_blank" rel="noopener noreferrer">https://help.sap.com/docs/build/sap-build-core/transport-project?locale=en-US&q=transport</A>.</P><P> </P>2025-10-31T11:42:47.838000+01:00https://community.sap.com/t5/sap-learning-blog-posts/what-tools-and-practices-enable-advanced-app-development-and-sap/ba-p/14262144What tools and practices enable advanced app development and SAP integration?2025-11-06T14:04:12.604000+01:00Margit_Wagnerhttps://community.sap.com/t5/user/viewprofilepage/user-id/491<P data-unlink="true"><FONT size="3"><SPAN>I recommend to access our <A title="Developing with SAP Build – From Apps to Automation" href="https://learning.sap.com/preview/learning-journeys/developing-with-sap-build-from-apps-to-automation" target="_self" rel="noopener noreferrer">Developing with SAP Build – From Apps to Automation</A></SPAN></FONT> learning journey.<SPAN> <BR /></SPAN></P><P>Completing this learning journey will empower you to build advanced applications, automate processes, manage user access, and monitor performance effectively within the SAP ecosystem. These skills are in high demand, positioning you to make a significant impact in your organization and advance your career.</P><P>Start your learning journey today and unlock the full potential of SAP technologies. By mastering these advanced capabilities, you will be well-equipped to drive innovation, improve efficiency, and deliver measurable business value.</P><DIV class=""><DIV class=""><STRONG><BR />Goals</STRONG></DIV></DIV><UL><LI><SPAN>Get started with SAP: Building the basics</SPAN></LI><LI>Develop your expertise: Skill deepening learning</LI><LI>Excel in your expertise: Advanced specialization learning</LI></UL><P><STRONG>Prerequisites</STRONG></P><UL><LI><A class="" title="Exploring SAP Business Technology Platform" href="https://learning.sap.com/courses/exploring-sap-business-technology-platform" target="_blank" rel="noopener noreferrer">Exploring SAP Business Technology Platform</A></LI><LI><A class="" title="Develop and automate with SAP Build" href="https://learning.sap.com/courses/develop-and-automate-with-sap-build" target="_blank" rel="noopener noreferrer">Develop and automate with SAP Build</A></LI><LI><A class="" title="Experiencing End-To-End SAP Build" href="https://learning.sap.com/courses/experiencing-end-to-end-sap-build" target="_blank" rel="noopener noreferrer">Experiencing End-To-End SAP Build</A></LI></UL><P><STRONG>Please post you question related to the digital learning Journey in the </STRONG><A href="https://groups.community.sap.com/t5/sap-learning-q-a/qa-p/learningqanda-board" target="_blank" rel="noopener noreferrer"><STRONG>Q&A area</STRONG></A><STRONG>. </STRONG></P><DIV class=""><DIV class=""><DIV class=""><P>Our SAP Learning Experts will get back to you as soon as possible! <BR />We are here to support you.</P><DIV class=""><DIV class=""><DIV class=""><BR />I appreciate your feedback and we will make sure to continue sharing interesting topics.<BR /><BR />Kind regards<BR />Margit</DIV></DIV></DIV></DIV></DIV></DIV>2025-11-06T14:04:12.604000+01:00https://community.sap.com/t5/technology-blog-posts-by-sap/driving-extensibility-innovation-and-automation-with-sap-build-s-clean-core/ba-p/14271996Driving Extensibility, Innovation and Automation with SAP Build's Clean Core2025-11-21T13:53:48.961000+01:00valeriavlhttps://community.sap.com/t5/user/viewprofilepage/user-id/2041160<P>Below you'll find a summary of what was discussed during our latest Clean Core webinar, led by NTT Data, looking into ways to extend SAP environments and accelerate innovation through SAP Build's Clean Core methodology. </P><P><span class="lia-unicode-emoji" title=":spiral_calendar:">🗓</span><STRONG>Agenda Highlights and session recap</STRONG> <span class="lia-unicode-emoji" title=":spiral_calendar:">🗓</span></P><OL><LI><P><STRONG>Current context: The importance of Clean Core in SAP S/4HANA modernization</STRONG><BR />A Clean Core strategy keeps the SAP S/4HANA system free from heavy customizations that complicate upgrades. By reducing technical debt and streamlining updates, organizations gain more stability and agility. This approach lays the foundation for continuous innovation and smooth cloud adoption.</P></LI><LI><P><STRONG>Overview of SAP’s Side-by-Side extensibility strategy: Pro-Code and Low-Code/No-Code</STRONG><BR />SAP's side-by-side extensibility allows organizations to innovate without modifying the core system. It offers both pro-code development for complex scenarios and low-code/no-code tools for business users. This ensures fast, secure innovation while keeping extensions isolated and easy to maintain.</P></LI><LI><P><STRONG>Tools and frameworks for Pro-Code and Low-Code/No-Code developers</STRONG><BR />SAP BTP provides a unified set of tools supporting both professional developers and low-code/no-code creators. Pro-code users access advanced IDEs and SDKs, while business users work with visual development tools. Together, these frameworks accelerate development, enhance collaboration, and ensure secure, scalable extensions.</P></LI><LI><P><STRONG>Main components: Build Apps, Build Process Automation, and Build Work Zone</STRONG><BR />The SAP Build suite includes three main elements that empower users across the organization. Build Apps enables rapid app creation, Build Process Automation streamlines workflows, and Build Work Zone centralizes access to applications and information. Combined, they create a cohesive digital workplace experience.</P></LI><LI><P><STRONG>Basic principles of SAP Build Apps</STRONG><BR /><SPAN>SAP Build Apps focuses on visual, intuitive development to make app creation accessible to more users. It provides drag-and-drop tools, pre-built templates, and seamless integration with SAP and non-SAP systems. With cloud-native deployment and Fiori-aligned design, it supports user-friendly, governed, enterprise-ready innovation.</SPAN></P></LI></OL><P><SPAN>You can find in the link below the slides shared during the presentation with all of the content presented today by NTT Data. </SPAN></P><P><A href="https://d.dam.sap.com/a/zJ3ezsJ/SAP_BTP_Extensibility.pdf?rc=10&inline=true&doi=SAP1259826" target="_self" rel="noopener noreferrer"><SPAN>Link to presentation</SPAN></A></P><P><STRONG> <span class="lia-unicode-emoji" title=":exclamation_question_mark:">⁉️</span>Still curious about clean core? <span class="lia-unicode-emoji" title=":exclamation_question_mark:">⁉️</span></STRONG></P><P><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span>Contact your BTP Customer Success Manager for further discussion</P><P><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span> <SPAN>Visit </SPAN><A href="https://discovery-center.cloud.sap/index.html" target="_self" rel="nofollow noopener noreferrer">SAP Discovery Center Missions on BTP</A></P><P> </P>2025-11-21T13:53:48.961000+01:00https://community.sap.com/t5/crm-and-cx-blog-posts-by-sap/survey-driven-customer-feedback-with-service-cloud-v2-sap-build-apps/ba-p/14272727Survey-driven Customer Feedback with Service Cloud V2 + SAP Build Apps2025-11-26T07:00:17.236000+01:00SudeshnaShttps://community.sap.com/t5/user/viewprofilepage/user-id/2090615<P>When a case is completed, send a Build Apps survey by email -> customer responses automatically update the V2 case.</P><P><STRONG>Overview</STRONG></P><P>Collecting feedback right after a case is closed or completed is one of the most effective ways to measure customer satisfaction and act on low scores quickly. In this setup :</P><OL><LI>Service Cloud V2 detects when a case moves into the completed status.</LI><LI>Automatically send an email to the customer containing a survey built in SAP Build Apps.</LI><LI>The customer opens the survey, submits a rating and optional comments and he is saves the survey.</LI><LI>Integration maps the submission back to Service Cloud V2 and updates the original case with survey fields.<P>This approach gives you a lightweight, mobile-friendly survey experience (Build Apps) and ties responses directly to the case in V2 for reporting, SLAs, and automated follow-up.</P><P><STRONG>Short story / user scenario</STRONG></P><P>Silla from “FastNet” support resolves a broadband outage and marks the case completed.<BR />Immediately the system triggers a short email: “How was your support experience?”<STRONG><BR /></STRONG>The customer opens the link, gives 4/5 and a short comment. Within minutes the case in Service Cloud V2 shows the information <BR />Survey rating = 4,Survey comments = "Good, but response time could be quicker".</P><P> A business rule checks for low scores (e.g., ≤ 3) and creates a follow-up task(manually or automatically) if needed.</P><P><STRONG>Prerequisites (checklist)</STRONG></P><OL><UL><LI>Access to Service Cloud V2 with admin/developer rights to create custom fields, email templates, and business rules.</LI><LI>SAP Build Apps account (ability to create and publish a small survey app).</LI><LI>Basic knowledge of URL parameters in Build Apps (to pass caseID) and how to configure HTTP action on submit.</LI><LI>Custom fields on Service Cloud V2 Case object to store survey responses. </LI></UL></OL></LI></OL><P> <STRONG>Architecture Diagram<BR /></STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SudeshnaS_0-1764091187340.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/345124iA6D00B5CACE5E426/image-size/medium?v=v2&px=400" role="button" title="SudeshnaS_0-1764091187340.png" alt="SudeshnaS_0-1764091187340.png" /></span></P><P> </P><DIV class=""><STRONG> Implementation — Step by step</STRONG></DIV><DIV class=""> <STRONG>Step 1 - Create survey screen in SAP Build Apps</STRONG><BR /> a. Create a simple app/page with:<BR /><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="SudeshnaS_0-1763726671851.png" style="width: 701px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/343597i9019D177F727EE10/image-dimensions/701x346?v=v2" width="701" height="346" role="button" title="SudeshnaS_0-1763726671851.png" alt="SudeshnaS_0-1763726671851.png" /></span><P> </P><STRONG><BR /></STRONG></DIV><P><BR /> <BR /><BR /><BR /><BR /><BR /> <BR /><BR /><BR /><BR /><BR />b. <SPAN>Configure the page to accept query string:?caseId=<case-Id></SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SudeshnaS_1-1763726814748.png" style="width: 698px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/343599i8686D200FD504235/image-dimensions/698x138?v=v2" width="698" height="138" role="button" title="SudeshnaS_1-1763726814748.png" alt="SudeshnaS_1-1763726814748.png" /></span></P><DIV class=""><STRONG><BR />Step 2 — Add fields to Service Cloud V2 Case</STRONG></DIV><DIV class="">Add custom fields to hold survey data as example</DIV><UL><LI><DIV>ZSurveyRating(Integer)</DIV></LI><LI><DIV>ZSurveycomments (string / long text)</DIV></LI><LI><DIV>ZSurveySatisfiedRating(string)</DIV></LI></UL><DIV class=""><DIV class=""><STRONG>Step 3 — Create the HTML email template in SAP Service Cloud V2</STRONG></DIV><DIV class="">Create an email template used for case closure notification that includes the survey link with a case identifier.</DIV><DIV class=""><STRONG><STRONG>Example template body <BR /></STRONG></STRONG><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SudeshnaS_0-1763727053401.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/343601i48C1F0C37944F700/image-size/medium?v=v2&px=400" role="button" title="SudeshnaS_0-1763727053401.png" alt="SudeshnaS_0-1763727053401.png" /></span><P><SPAN>Replace displayId</SPAN><SPAN> with the actual placeholder your SAP Service Cloud V2.</SPAN></P></DIV></DIV><DIV class=""><STRONG><BR />Step 4 — Autoflow rule : Trigger email when case is completed</STRONG></DIV><DIV class="">Use V2 autoflow rules to send the template:</DIV><OL><LI><DIV>Create a rule :</DIV></LI><UL><LI><DIV class=""><STRONG>Trigger</STRONG>: Case status changes to complete or closed</DIV></LI><LI><DIV><STRONG>Condition</STRONG>: Optional — case type, priority, or customer preference</DIV></LI><LI><DIV><STRONG>Action</STRONG>: Send Email (select the template created)</DIV></LI></UL><LI><DIV>Test by resolving a case and verifying the email is sent to the case contact.</DIV></LI></OL><DIV class=""><STRONG>Step 5 — Build an integration endpoint to accept submissions</STRONG></DIV><DIV class=""><STRONG>Sample Service Cloud V2 API call (generic example):</STRONG></DIV><DIV class=""> </DIV><pre class="lia-code-sample language-json"><code>PATCH https://<your-v2-endpoint>/api/v1/cases/{caseId}
Headers:
Authorization: Bearer <access_token>
Content-Type: application/json
Body:
{
{
"extensions": {
"ZSurveyRating": 5,
"ZSurveyComments": "Satisfied",
"ZSurveySatisfiedRating": "4"
}
}
}</code></pre><P><SPAN>Confirm your SAP Service Cloud V2 API endpoint and payload structure from the Service Cloud API documentation.</SPAN></P><DIV class=""><STRONG><STRONG><BR />The survey data is transmitted from SAP Build Apps to SAP Service Cloud V2.</STRONG></STRONG><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SudeshnaS_1-1763727475642.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/343606i72829D0716275F2F/image-size/large?v=v2&px=999" role="button" title="SudeshnaS_1-1763727475642.png" alt="SudeshnaS_1-1763727475642.png" /></span><P> </P><STRONG><BR />Summary / Benefits</STRONG></DIV><UL><LI><DIV>Fast, lightweight feedback loop right at case closure.</DIV></LI><LI><DIV>Survey hosted in Build Apps gives flexible UI and easy mobile experience.</DIV></LI><LI><DIV>Responses are tied to cases for reporting and targeted follow-up.</DIV></LI><LI><DIV>Low friction for customers: short surveys increase response rate.</DIV></LI></UL><P><BR /><BR /></P>2025-11-26T07:00:17.236000+01:00https://community.sap.com/t5/crm-and-cx-blog-posts-by-sap/delivering-a-360-customer-view-in-sap-sales-cloud-v2-using-sap-cdp-and/ba-p/14278821Delivering a 360° Customer View in SAP Sales Cloud V2 Using SAP CDP and Build Apps2025-11-27T10:29:10.924000+01:00Nilesh_Krhttps://community.sap.com/t5/user/viewprofilepage/user-id/616511<P> </P><P>Today’s sales operations extend far beyond traditional CRM data. To make accurate, timely decisions, sales teams need deeper customer intelligence such as behavioural indicators, marketing engagement metrics, transactional history, digital footprints, sentiment analysis, and segment classifications. SAP Customer Data Platform (CDP) integrates these diverse data points into a single, real-time unified profile.</P><P>This blog explains how to bring a full 360° Customer View into SAP Sales Cloud V2 using:</P><UL><LI>SAP CDP as the unified profile and interaction source</LI><LI>SAP Build Apps to build custom UI extensions</LI><LI>SAP Sales Cloud V2 mashup capabilities to embed the experience seamlessly</LI></UL><P><STRONG> </STRONG></P><P><STRONG>Why a 360° Customer View Matters for Sales Reps</STRONG></P><P>Traditional CRM systems give sales reps only a basic snapshot of customer information, such as:</P><UL><LI>Account and contact details</LI><LI>Open opportunities</LI><LI>Logged activities and visits</LI><LI>Quotes and order history</LI></UL><P>While useful, this limited view often leaves sales reps without the full context they need. In today’s competitive environment, reps must understand how customers think, behave, and engage. This requires deeper insights, including:</P><UL><LI>Email engagement patterns (opens, clicks, conversions)</LI><LI>Website behaviour and product interest</LI><LI>Cross-channel interaction history</LI><LI>Purchase trends and loyalty behaviours</LI><LI>Segment membership and scoring</LI><LI>Predictive signals like propensity to buy or churn risk</LI></UL><P><STRONG> </STRONG></P><P>SAP CDP transforms fragmented data into a unified, real-time Golden Profile. With SAP Build Apps extending Sales Cloud V2, this intelligence flows directly to sales users at the critical moment—when they’re engaging with customers and making key decisions.</P><P><STRONG>High-Level Architecture</STRONG></P><P><STRONG> </STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="nilkumar_22-1764235394974.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/345793i02340483D2F0A53C/image-size/medium?v=v2&px=400" role="button" title="nilkumar_22-1764235394974.png" alt="nilkumar_22-1764235394974.png" /></span></P><P> </P><P><STRONG>Implementation Steps</STRONG></P><P><STRONG>Step 1: Enable CDP API Access</STRONG></P><P>SAP CDP exposes APIs for:</P><UL><LI>Profiles</LI><LI>Interactions</LI><LI>Orders</LI><LI>Calculated attributes</LI></UL><P>Configure OAuth client in CDP and note:</P><UL><LI>Base URL</LI><LI>Client ID</LI><LI>Client Secret</LI></UL><P><STRONG> </STRONG></P><P><STRONG>Step 2: Configure BTP Destination</STRONG></P><P>In SAP BTP:</P><P>Name: CDP</P><P>Type: HTTP</P><P>Proxy Type: Internet</P><P>URL: https://<tenant>. gigya.com</P><P>This is consumed by SAP Build Apps.</P><P><STRONG> </STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="nilkumar_23-1764235394980.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/345794iF803179A0243776C/image-size/medium?v=v2&px=400" role="button" title="nilkumar_23-1764235394980.png" alt="nilkumar_23-1764235394980.png" /></span></P><P> </P><P><STRONG> </STRONG></P><P><STRONG>Step 3: Setup Integration in SAP Build Apps</STRONG></P><P>Create integration for BTP destination created in last step</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="nilkumar_24-1764235394984.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/345795i18D1517A9D5725F8/image-size/medium?v=v2&px=400" role="button" title="nilkumar_24-1764235394984.png" alt="nilkumar_24-1764235394984.png" /></span></P><P> </P><P><STRONG> </STRONG></P><P><STRONG>Create API Data Entity with following information:</STRONG></P><P>Name: Specify the entity name (e.g., ‘Order History’ for this example)</P><P>Path: API Path</P><P>Capabilities: List (multiple record) or retrieve (for single record)</P><P><STRONG> </STRONG></P><P><STRONG> </STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="nilkumar_25-1764235394991.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/345798iA19E291D939F2569/image-size/medium?v=v2&px=400" role="button" title="nilkumar_25-1764235394991.png" alt="nilkumar_25-1764235394991.png" /></span></P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="nilkumar_26-1764235394994.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/345797i5851292A0A829171/image-size/medium?v=v2&px=400" role="button" title="nilkumar_26-1764235394994.png" alt="nilkumar_26-1764235394994.png" /></span></P><P><STRONG>The relative path and query can be made dynamic by using a formula, as shown below:</STRONG></P><P><STRONG> </STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="nilkumar_27-1764235394998.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/345796iD6E172B1E50D46B9/image-size/medium?v=v2&px=400" role="button" title="nilkumar_27-1764235394998.png" alt="nilkumar_27-1764235394998.png" /></span></P><P> </P><P>Next, a Data Variable needs to be created to populate the UI with data based on the integration configured for the entity named ‘Order’:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="nilkumar_28-1764235395004.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/345799iE7BF0F194130AFF3/image-size/medium?v=v2&px=400" role="button" title="nilkumar_28-1764235395004.png" alt="nilkumar_28-1764235395004.png" /></span></P><P> </P><P><STRONG>Step 5: Create Build Apps UI </STRONG></P><P><STRONG> </STRONG></P><P>In this example, the UI is designed to display only the customer’s order history. The UI element is bound to the Data Variable created in the previous step.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="nilkumar_29-1764235395014.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/345800iA7D5EBE37920C676/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="nilkumar_29-1764235395014.png" alt="nilkumar_29-1764235395014.png" /></span></P><P> </P><P><STRONG> </STRONG><STRONG>Build and deploy the app:</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="nilkumar_30-1764235395017.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/345801iF3AB94CF30D41642/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="nilkumar_30-1764235395017.png" alt="nilkumar_30-1764235395017.png" /></span></P><P> </P><P><STRONG> </STRONG><STRONG>Step 4: Embed Build Apps UI into SAP Sales Cloud V2</STRONG></P><P>In Sales Cloud V2:</P><OL><LI>Go to Extensibility → Mashups</LI><LI>Create a URL Mashup</LI><LI>Paste Build App deployed URL</LI><LI>Pass context parameters:</LI></OL><P>https://<build-app-url>?customerId={displayId}</P><OL><LI>Place the mashup in Account Overview tab</LI></OL><P><STRONG> </STRONG></P><P><STRONG>Result: </STRONG>True Customer 360 Experience</P><P>When the sales user opens a Account overview page:</P><UL><LI>They see unified CDP profile</LI><LI> They can view every cross-channel interaction</LI><LI>They know which segments the customer belongs to</LI><LI>They get intelligent scores and signals</LI><LI>They operate inside Sales Cloud V2 with ZERO backend coding</LI></UL><P>This turns Sales Cloud into a smart, intelligence-driven selling platform.</P><P><STRONG> </STRONG></P><P><STRONG>Summary</STRONG></P><P>By combining:</P><UL><LI>SAP CDP for unified customer intelligence</LI><LI>SAP Build Apps for custom UI</LI><LI>SAP Sales Cloud V2 mashups for embedding</LI></UL><P>you deliver a powerful, real-time, 360° customer view directly into the sales workflow.</P><P> </P>2025-11-27T10:29:10.924000+01:00https://community.sap.com/t5/technology-blog-posts-by-sap/sap-build-apps%E3%81%A7%E3%83%AA%E3%82%B9%E3%83%88%E5%9E%8B%E5%A4%89%E6%95%B0%E3%81%AB%E5%AF%BE%E3%81%97%E3%81%A6%E3%81%AE%E5%85%A5%E5%8A%9B%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%82%92%E4%BD%9C%E3%82%8B%E6%96%B9%E6%B3%95/ba-p/14277753SAP Build Appsでリスト型変数に対しての入力フォームを作る方法2025-11-28T03:40:35.124000+01:00NaotoSakaihttps://community.sap.com/t5/user/viewprofilepage/user-id/142482<P>お客様から以下のような質問が有りましたので、SAP Build Appsでのフォームの作り方を解説したいと思います。</P><P><EM>"SAP Build AppsからREST APIを使用して外部システムにデータを送信します。JSONの形式でデータを送らなければならないのですが、JSON内に配列が存在し、何個入力されるかわかりません。このような場合入力フォームはどのように作成すればよいでしょうか?"</EM></P><P>JSONは以下のような形式でした。(注:改変してあります。お客様問い合わせのままでは有りません)</P><pre class="lia-code-sample language-javascript"><code>{
"UserId": "UserID",
"Items": [
{
"ItemCd": "AA0001",
"Quantity": 2
},
{
"ItemCd": "BB0002",
"Quantity": 5
}
]
}</code></pre><P>なるほど、仮に注文データとして解釈すると、Itemsのところが購入物のようですね。たしかにこれは毎回何品注文するのかで変わりますね。<BR /><BR />このようなパターンに対応したデータ入力画面をSAP Build Appsで作ってみたいと思います。</P><H2 id="toc-hId-1765664518">1. このデータを格納する変数を作成する</H2><P>まずはこのJSONに相当する形式でデータを格納できる変数を作成します。</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="NaotoSakai_0-1764138968617.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/345227i5B6C0E51F9B9EBB9/image-size/medium?v=v2&px=400" role="button" title="NaotoSakai_0-1764138968617.png" alt="NaotoSakai_0-1764138968617.png" /></span></P><P>リストの中身はオブジェクト型で、オブジェクトのプロパティとしてItemCdとQuantityがあることに注意してください。</P><P>また、この変数はオブジェクト型ですのでページを開いたときはNullの状態の部分が存在します。例えばリストであるItemsはnullです。これは後続の処理で少々面倒になりますので空文字列を割り当てて置きたいと思います。<BR />PageのロジックでPage mountedにSet app variableの処理を繋げ</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="NaotoSakai_0-1764228276701.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/345690iA8A5B2414076A4F1/image-size/medium?v=v2&px=400" role="button" title="NaotoSakai_0-1764228276701.png" alt="NaotoSakai_0-1764228276701.png" /></span></P><P>variable1に対し</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="NaotoSakai_1-1764228809319.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/345693i57BFE3D274E7FA9C/image-size/medium?v=v2&px=400" role="button" title="NaotoSakai_1-1764228809319.png" alt="NaotoSakai_1-1764228809319.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="NaotoSakai_2-1764228849617.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/345694iAE0F1C9CE1836D33/image-size/medium?v=v2&px=400" role="button" title="NaotoSakai_2-1764228849617.png" alt="NaotoSakai_2-1764228849617.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="NaotoSakai_3-1764228885805.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/345695i85B2897D0A525939/image-size/medium?v=v2&px=400" role="button" title="NaotoSakai_3-1764228885805.png" alt="NaotoSakai_3-1764228885805.png" /></span></P><P>Itemsに最初から要素を1つ入れておくようにします。</P><H2 id="toc-hId-1569151013">2. ページを設計する</H2><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="NaotoSakai_1-1764141495260.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/345240i234B06D9F9898AAB/image-size/medium?v=v2&px=400" role="button" title="NaotoSakai_1-1764141495260.png" alt="NaotoSakai_1-1764141495260.png" /></span></P><P>ページのデザインを行います。TREEの部分も名称を変更してみましたので、どこにどのようなコンポーネントを配置しているか確認してください。<BR />Card Container1はカード型のスタイルを適用し、カード型の表示にしてあります。これはItemCdとQuantityはペアで入力される必要があるためですが、どうでしょうか?(デザインセンスに依存する部分です)</P><H2 id="toc-hId-1372637508">3. 変数をバインドする</H2><P>フィールドに変数をバインドします。</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="NaotoSakai_2-1764142175017.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/345247i89CEEE0125A37730/image-size/medium?v=v2&px=400" role="button" title="NaotoSakai_2-1764142175017.png" alt="NaotoSakai_2-1764142175017.png" /></span></P><P>UserId Input FieldのValueにvariable1.UserIdをバインドします。これでUserId Input Fieldへの入力値がvariable1.UserIdへ代入されます。<BR />ポイントとなるのはCard Container1へのバインドです。</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="NaotoSakai_3-1764142523740.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/345251i21F357A577D2831F/image-size/medium?v=v2&px=400" role="button" title="NaotoSakai_3-1764142523740.png" alt="NaotoSakai_3-1764142523740.png" /></span></P><P>Card Container1のRepeat withにvariable1.Itemsをバインドします。variable1.Itemsはリスト型ですのでRepeat withの効果によりCard Container1が繰り返し表示されます。そしてItemCd Input fieldのValueには</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="NaotoSakai_0-1764142872863.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/345257iA358974A4178D81D/image-size/medium?v=v2&px=400" role="button" title="NaotoSakai_0-1764142872863.png" alt="NaotoSakai_0-1764142872863.png" /></span></P><P>Data Item in repeatからcurrent.ItemCdをバインドします。これはリスト型変数の現在行のItemCdを意味します。<BR />同様にQuantity Input fieldのValueにもcurrent.Quantityをバインドします。</P><H2 id="toc-hId-1176124003">4. +アイコンの処理を作成する</H2><P>+アイコンは機能として「このアイコンがクリックされたらItemCd、Quantityの入力項目の数を増やすという役割をもたせます。前項でRepeat withでリスト型である変数variable1.Itemsをバインドしました。<A href="https://community.sap.com/t5/technology-blog-posts-by-sap/sap-build-apps%E3%81%AE-repeat-with-%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9%E3%81%A8%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88/ba-p/14160877" target="_self">Repeat withの動作は</A>バインドされたリスト型で変数の要素数だけ繰り返すというものです。では入力項目を増やしたい場合は?そうです。配列の要素数を増やせばよいのです。ということで+アイコンをタップしたときの処理としてSet app variableを使用して</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="NaotoSakai_4-1764229015388.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/345697i74B18203D899C558/image-size/medium?v=v2&px=400" role="button" title="NaotoSakai_4-1764229015388.png" alt="NaotoSakai_4-1764229015388.png" /></span></P><P>variable1.Itemsに対し、Formulaで</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="NaotoSakai_5-1764229141894.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/345699i2BBC1D0199273C4C/image-size/medium?v=v2&px=400" role="button" title="NaotoSakai_5-1764229141894.png" alt="NaotoSakai_5-1764229141894.png" /></span></P><P>WITH_ITEM(appVars.variable1.Items, {"ItemCd": "", "Quantity": 0 })<BR />として、variable1.Itemsに配列要素を1つ追加します。これでRepeat withで繰り返される回数が1回増え、入力フィールドが増えるということになります。Previewで実際の動きを見てみましょう。</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="NaotoSakai_6-1764229335090.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/345703i8B83DD943B71B047/image-size/medium?v=v2&px=400" role="button" title="NaotoSakai_6-1764229335090.png" alt="NaotoSakai_6-1764229335090.png" /></span></P><P>+アイコンをタップすると</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="NaotoSakai_7-1764229376508.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/345704i556B802C553F0D06/image-size/medium?v=v2&px=400" role="button" title="NaotoSakai_7-1764229376508.png" alt="NaotoSakai_7-1764229376508.png" /></span></P><P>Itemsの入力フィールドが増えていくのが確認できると思います。</P><H2 id="toc-hId-979610498">5. -アイコンの処理を作成する</H2><P>-アイコンは+アイコンとは逆にItemsの入力フィールドを消すということです。つまりはvariable1.Itemsの配列数を減らすということです。ということで-アイコンをタップしたときの処理としてset app variableを使用し、variable1.Itemsに対し</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="NaotoSakai_9-1764229808252.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/345708iFFC1608B03DC2AE7/image-size/medium?v=v2&px=400" role="button" title="NaotoSakai_9-1764229808252.png" alt="NaotoSakai_9-1764229808252.png" /></span></P><P>Formulaを使用して</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="NaotoSakai_8-1764229782292.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/345707iEDF39D44C613EDEC/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="NaotoSakai_8-1764229782292.png" alt="NaotoSakai_8-1764229782292.png" /></span></P><P>REMOVE_ITEM(appVars.variable1.Items, index==repeatedInfo.current.index)<BR />としてリストから現在行の要素を削除します。<BR />repeatedInfo.current.indexはRepeat with機能を使用したオブジェクトで使用できるシステム変数です。式エディタのRepeat Informationから参照できます。他にも現在行が最初なのか最後なのか、奇数か偶数か、等面白い変数が用意されていますよ。</P><P>Previewで動作を確認すると、-アイコンのタップで入力フィールドが消えることを確認できるはずです。</P><H2 id="toc-hId-783096993">6. フォームへの入力値をJSON形式に直して確認する</H2><P>入力フォームは出来上がりましたので、あとは目的のJSONになるのかを確認します。ボタンを配置して、このボタンをタップしたときの処理を割り当てます。<BR />ここで重要なポイントがあります。まずはENCODE_JSON関数を使用してvariable1の内容を</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="NaotoSakai_10-1764295459685.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/346100iC60B29662D3D906F/image-size/medium?v=v2&px=400" role="button" title="NaotoSakai_10-1764295459685.png" alt="NaotoSakai_10-1764295459685.png" /></span></P><P>そのままAlertダイアログで表示したいと思います。</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="NaotoSakai_11-1764295537381.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/346101i49B3059A4AC65844/image-size/medium?v=v2&px=400" role="button" title="NaotoSakai_11-1764295537381.png" alt="NaotoSakai_11-1764295537381.png" /></span></P><P>データを入力してボタンをクリックします。</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="NaotoSakai_12-1764295628487.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/346102iA50EAC4360CA8AD5/image-size/medium?v=v2&px=400" role="button" title="NaotoSakai_12-1764295628487.png" alt="NaotoSakai_12-1764295628487.png" /></span></P><P>全文が見えませんので、コピー&ペーストしてみてみます。</P><DIV><P>{"Items":[{"ItemCd":"ItemCd1","Quantity":"10"},{"ItemCd":"ItemCd2","Quantity":"20"}],"UserId":"User1"}</P></DIV><P>これはよく見ていただくと解るのですが、Quantityの後の数値がダブルクォートで囲まれて文字列になっています。<BR />このブログの冒頭にありますように、この部分は数値であることがRESTサービス側で要求されています。<BR />なぜこのようになったのかというと、SAP Build Appsで開発したこのアプリケーションはWebアプリケーションであり、Java Scriptに変換されて動作するためです。Java ScriptとHTMLの仕様として以下のものがあります。</P><UL><LI>JavaScriptは「動的型付け言語」なので、変数自体に型は固定されておらず、あとから数値→文字列→オブジェクトというように中身の型を自由に変えることができます。</LI><LI>HTMLの入力フィールドへの入力値(HTMLInputElement.value )はJavaScript では文字列として扱われます。</LI></UL><P>ページ上のQuantity Input fieldのValueにはvariable1のQuantityをバインドしましたが、これはHTMLレベルでは入力フィールドへの入力値です。そしてQuantity自体はNumber型を指定していますが、代入が出来てしまうので文字列型のまま代入されるということになります。バインド時にNUMBER関数を使用するという事ができませんので、表示時に数値型に変換するロジックを挟んで見ましょう。</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="NaotoSakai_13-1764296910340.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/346103i78D5D82AFB80E4F1/image-size/medium?v=v2&px=400" role="button" title="NaotoSakai_13-1764296910340.png" alt="NaotoSakai_13-1764296910340.png" /></span></P><P>variable1.Itemsに対してのset app variableのロジックです。<SPAN>Assigned valueには</SPAN>Formulaとして以下を設定しています。</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="NaotoSakai_14-1764296950063.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/346104iD0B2A05D70A2150B/image-size/medium?v=v2&px=400" role="button" title="NaotoSakai_14-1764296950063.png" alt="NaotoSakai_14-1764296950063.png" /></span></P><P>MAP(appVars.variable1.Items, { "ItemCd": item.ItemCd , "Quantity": NUMBER(item.Quantity)})<BR /><BR />MAP関数を使用してappVars.variable1.Itemsの内容をitemというリスト型変数で取り出せるようにして、オブジェクト型の変数を再定義し、この際にNUMBER関数でQuantityの値を数値型に変換してappVars.variable1.Itemsに再代入という処理です。<BR />動きを見てみましょう。</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="NaotoSakai_15-1764297353024.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/346105i26E4C85CFE14B61B/image-size/medium?v=v2&px=400" role="button" title="NaotoSakai_15-1764297353024.png" alt="NaotoSakai_15-1764297353024.png" /></span></P><P><SPAN>{"Items":[{"ItemCd":"ItemCd1","Quantity":10},{"ItemCd":"ItemCd2","Quantity":20}],"UserId":"User1"}<BR /></SPAN></P><P>これで要求されるJSONの形式になりました。本当はこのあたりもSAP Build Appsでフォローしてくれると良いのですが。現状はこの様なやり方で対処する必要があります。</P><P>Repeat withは配列数分だけ繰り返す処理です。その配列自体の長さの変化にも追随できます。これをうまく利用することで複数項目の入力フィールドを作成することも可能です。実際にあるシチュエーションと思いますので使いこなしてください。</P>2025-11-28T03:40:35.124000+01:00https://community.sap.com/t5/technology-blog-posts-by-sap/how-to-create-an-input-form-for-a-list-type-variable-in-sap-build-apps/ba-p/14279443How to create an input form for a list-type variable in SAP Build Apps2025-11-28T05:55:09.133000+01:00NaotoSakaihttps://community.sap.com/t5/user/viewprofilepage/user-id/142482<P>A customer asked the following question, so I would like to explain how to create a form in SAP Build Apps.<BR /><BR />"I want to send data from SAP Build Apps to an external system using a REST API. The data must be sent in JSON format, but there is an array in the JSON, and we don't know how many items will be entered. In such a case, how should the input form be created?"<BR /><BR />The JSON had the following structure. (Note: It has been modified and is not exactly the same as the customer’s inquiry.)</P><P> </P><pre class="lia-code-sample language-javascript"><code>{
"UserId": "UserID",
"Items": [
{
"ItemCd": "AA0001",
"Quantity": 2
},
{
"ItemCd": "BB0002",
"Quantity": 5
}
]
}</code></pre><P> </P><P>I see; if this is interpreted as order data, the Items section seems to represent the purchased products. Indeed, this will vary depending on how many items are ordered each time.</P><P>I would like to create a data entry screen in SAP Build Apps that can handle this kind of pattern.</P><H2 id="toc-hId-1765721186">1. Create a variable to store this data.</H2><P>First, create a variable that can store data in a format corresponding to this JSON.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="NaotoSakai_0-1764138968617.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/345227i5B6C0E51F9B9EBB9/image-size/medium?v=v2&px=400" role="button" title="NaotoSakai_0-1764138968617.png" alt="NaotoSakai_0-1764138968617.png" /></span></P><P>Note that the contents of the list are objects, and each object has properties ItemCd and Quantity. Also, since this variable is an object type, some parts may be null when the page is first opened. For example, the Items list might be null. This can cause some trouble in later steps.<BR />so I want to assign an empty string instead. In the page logic, connect a Set app variable action to the Page mounted event.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="NaotoSakai_0-1764228276701.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/345690iA8A5B2414076A4F1/image-size/medium?v=v2&px=400" role="button" title="NaotoSakai_0-1764228276701.png" alt="NaotoSakai_0-1764228276701.png" /></span></P><P>For variable1</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="NaotoSakai_1-1764228809319.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/345693i57BFE3D274E7FA9C/image-size/medium?v=v2&px=400" role="button" title="NaotoSakai_1-1764228809319.png" alt="NaotoSakai_1-1764228809319.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="NaotoSakai_2-1764228849617.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/345694iAE0F1C9CE1836D33/image-size/medium?v=v2&px=400" role="button" title="NaotoSakai_2-1764228849617.png" alt="NaotoSakai_2-1764228849617.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="NaotoSakai_3-1764228885805.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/345695i85B2897D0A525939/image-size/medium?v=v2&px=400" role="button" title="NaotoSakai_3-1764228885805.png" alt="NaotoSakai_3-1764228885805.png" /></span></P><P>I will put one element into Items from the beginning , as initial value.</P><H2 id="toc-hId-1569207681">2. Page Design</H2><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="NaotoSakai_1-1764141495260.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/345240i234B06D9F9898AAB/image-size/medium?v=v2&px=400" role="button" title="NaotoSakai_1-1764141495260.png" alt="NaotoSakai_1-1764141495260.png" /></span><BR />I will now design the page. The names of each object have been changed to make them easier to understand, so please check the TREE section in the screenshot to see where and what kind of components are placed.<BR />The "Card Container1" has a card-style layout applied so that it is displayed as a card. This is because ItemCd and Quantity need to be entered as a pair, but what do you think? (This part depends on design sense.))</P><H2 id="toc-hId-1372694176">3. Bind Variables</H2><P>Bind variables to input fields.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="NaotoSakai_2-1764142175017.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/345247i89CEEE0125A37730/image-size/medium?v=v2&px=400" role="button" title="NaotoSakai_2-1764142175017.png" alt="NaotoSakai_2-1764142175017.png" /></span></P><P>Bind variable1.UserId to the Value of the "UserId Input Field". This will assign the value entered in the "UserId Input Field" to variable1.UserId. The key point here is how "Card Container1" is bound.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="NaotoSakai_3-1764142523740.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/345251i21F357A577D2831F/image-size/medium?v=v2&px=400" role="button" title="NaotoSakai_3-1764142523740.png" alt="NaotoSakai_3-1764142523740.png" /></span></P><P>Bind variable1.Items to the "Repeat with" property of "Card Container1". Since variable1.Items is a list type, "Card Container1" will be displayed repeatedly by the effect of Repeat with. Then, for the Value of the "ItemCd Input field",</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="NaotoSakai_0-1764142872863.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/345257iA358974A4178D81D/image-size/medium?v=v2&px=400" role="button" title="NaotoSakai_0-1764142872863.png" alt="NaotoSakai_0-1764142872863.png" /></span></P><P>Bind current.ItemCd from "Data Item in repeat". This refers to the ItemCd of the current row of the list-type variable. Likewise, bind current.Quantity to the Value of the "Quantity Input field".</P><H2 id="toc-hId-1176180671">4. Create logic for plus icon</H2><P>The plus icon will have the role that when it is clicked, it increases the number of ItemCd and Quantity input fields. In the previous section, I bound the list-type variable variable1.Items to "Repeat with". The behavior of Repeat with is to repeat according to the number of elements in the bound list-type variable. So what should I do if I want to increase the number of input fields? Exactly, I just need to increase the number of elements in the array. Therefore, as the action when the plus icon is tapped, I use "Set app variable",</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="NaotoSakai_4-1764229015388.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/345697i74B18203D899C558/image-size/medium?v=v2&px=400" role="button" title="NaotoSakai_4-1764229015388.png" alt="NaotoSakai_4-1764229015388.png" /></span></P><P>For variable1.Items, use Formula</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="NaotoSakai_5-1764229141894.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/345699i2BBC1D0199273C4C/image-size/medium?v=v2&px=400" role="button" title="NaotoSakai_5-1764229141894.png" alt="NaotoSakai_5-1764229141894.png" /></span></P><P>WITH_ITEM(appVars.variable1.Items, {"ItemCd": "", "Quantity": 0 })<BR />Add one array element to variable1.Items with the above settings. This will increase the number of repetitions in "Repeat with" by one and thus increase the number of input fields. Let’s check how it actually works in the Preview.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="NaotoSakai_6-1764229335090.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/345703i8B83DD943B71B047/image-size/medium?v=v2&px=400" role="button" title="NaotoSakai_6-1764229335090.png" alt="NaotoSakai_6-1764229335090.png" /></span></P><P>Tap plus icon ,</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="NaotoSakai_7-1764229376508.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/345704i556B802C553F0D06/image-size/medium?v=v2&px=400" role="button" title="NaotoSakai_7-1764229376508.png" alt="NaotoSakai_7-1764229376508.png" /></span></P><P>you will be able to see increase input fields for items.</P><H2 id="toc-hId-979667166">5. Create logic for minus icon</H2><P>The minus icon does the opposite of the plus icon; it removes an Items input field. In other words, it decreases the number of elements in the variable1.Items array. Therefore, as the action when the minus icon is tapped, use "Set app variable" for variable1.Items.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="NaotoSakai_9-1764229808252.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/345708iFFC1608B03DC2AE7/image-size/medium?v=v2&px=400" role="button" title="NaotoSakai_9-1764229808252.png" alt="NaotoSakai_9-1764229808252.png" /></span></P><P>use Formula</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="NaotoSakai_8-1764229782292.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/345707iEDF39D44C613EDEC/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="NaotoSakai_8-1764229782292.png" alt="NaotoSakai_8-1764229782292.png" /></span></P><P>REMOVE_ITEM(appVars.variable1.Items, index==repeatedInfo.current.index)<BR />Set the above formula to delete the element in the current row.<BR />"repeatedInfo.current.index" is a system variable that can be used with objects that use the "Repeat with" feature. You can reference it from "Repeat Information" in the formula editor, and there are other interesting variables such as whether the current row is the first or last one, or whether it is odd or even. When you check the behavior in the Preview, you should see that tapping the minus icon removes the input field.</P><H2 id="toc-hId-783153661">6. Convert the values entered in the form to JSON format and verify them.</H2><P>The input form is now complete, so the next step is to check whether it becomes the desired JSON. Place a button and assign the processing that will run when this button is tapped.<BR /><BR />There is an important point here: first, use the ENCODE_JSON function on the contents of variable1.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="NaotoSakai_10-1764295459685.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/346100iC60B29662D3D906F/image-size/medium?v=v2&px=400" role="button" title="NaotoSakai_10-1764295459685.png" alt="NaotoSakai_10-1764295459685.png" /></span></P><P>I would like to display it as-is in an Alert dialog.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="NaotoSakai_11-1764295537381.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/346101i49B3059A4AC65844/image-size/medium?v=v2&px=400" role="button" title="NaotoSakai_11-1764295537381.png" alt="NaotoSakai_11-1764295537381.png" /></span></P><P>Enter the data in the Preview and click the button.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="NaotoSakai_12-1764295628487.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/346102iA50EAC4360CA8AD5/image-size/medium?v=v2&px=400" role="button" title="NaotoSakai_12-1764295628487.png" alt="NaotoSakai_12-1764295628487.png" /></span></P><P>I can’t see the entire text, so I’ll copy and paste it to check.</P><DIV><P>{"Items":[{"ItemCd":"ItemCd1","Quantity":"10"},{"ItemCd":"ItemCd2","Quantity":"20"}],"UserId":"User1"}</P></DIV><P>Looking closely, you can see that the value after Quantity is enclosed in double quotes and is therefore a string. As mentioned at the beginning of this blog, the REST service requires this part to be a numeric value. The reason this happens is that the application developed with SAP Build Apps is a web application that runs after being converted to JavaScript. According to the specifications of JavaScript and HTML, the following behavior applies.</P><UL><LI>Because JavaScript is a “dynamically typed language,” variables do not have a fixed type, and the type of their contents can be freely changed later, for example from number -> string -> object.</LI><LI>The value entered into an HTML input field (HTMLInputElement.value) is treated as a string in JavaScript.</LI></UL><P>The Value of the Quantity Input field on the page is bound to variable1.Quantity, but at the HTML level this is the value entered into the input field. Even though Quantity itself is defined as a Number type, the assignment is allowed, so the value is assigned as a string. Since the NUMBER function cannot be used at bind time, let’s insert logic to convert it to a numeric type when displaying it.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="NaotoSakai_13-1764296910340.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/346103i78D5D82AFB80E4F1/image-size/medium?v=v2&px=400" role="button" title="NaotoSakai_13-1764296910340.png" alt="NaotoSakai_13-1764296910340.png" /></span></P><P>Add a Set app variable logic for variable1.Items. For Assigned value, set the following as a formula.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="NaotoSakai_14-1764296950063.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/346104iD0B2A05D70A2150B/image-size/medium?v=v2&px=400" role="button" title="NaotoSakai_14-1764296950063.png" alt="NaotoSakai_14-1764296950063.png" /></span></P><P>MAP(appVars.variable1.Items, { "ItemCd": item.ItemCd , "Quantity": NUMBER(item.Quantity)})<BR /><BR />This process uses the MAP function to read the contents of appVars.variable1.Items into a list-type variable called item, then redefines the object-type variable and, at that time, converts the value of Quantity to a numeric type with the NUMBER function and assigns it back to appVars.variable1.Items. Let’s see how it works.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="NaotoSakai_15-1764297353024.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/346105i26E4C85CFE14B61B/image-size/medium?v=v2&px=400" role="button" title="NaotoSakai_15-1764297353024.png" alt="NaotoSakai_15-1764297353024.png" /></span></P><P><SPAN>{"Items":[{"ItemCd":"ItemCd1","Quantity":10},{"ItemCd":"ItemCd2","Quantity":20}],"UserId":"User1"}<BR /></SPAN></P><P>With this, the JSON now has the required format. Ideally, SAP Build Apps would handle this part automatically, but at present it is necessary to deal with it in this way.<BR /><BR />"Repeat with" is a process that repeats according to the number of elements in an array, and it can also adapt to changes in the length of that array. By making good use of this, it is possible to create input fields for multiple items. This is a situation that will likely occur in practice, so please make full use of it.<BR /><BR />Regards,</P>2025-11-28T05:55:09.133000+01:00https://community.sap.com/t5/tooling-sap-build-blog-posts/integrating-abap-system-with-sap-build-apps/ba-p/14282116Integrating ABAP system with SAP Build Apps2025-12-02T14:46:34.261000+01:00ionutbirescuhttps://community.sap.com/t5/user/viewprofilepage/user-id/2250422<P>Hi! We want to use SAP Build Apps to create a full-stack application using ABAP (ADT-Eclipse) as backend, but we can't create a communication arrangement. We've tried multiple approaches, such as: <SPAN> </SPAN></P><P><SPAN>-Using the shared account provided through the e-learning materials</SPAN></P><P><SPAN>-Using a free trial personal BTP account</SPAN></P><P><SPAN>-Connecting to a private cloud/on-premise system via the Cloud Connector.</SPAN></P><P>Unfortunately, each approach resulted in connection issues that we could not resolve. Given the current circumstances, we presume that regardless of the approach, we need to have access to an ABAP-on-Cloud instance in which admin roles are granted to me. </P><P>This is what our ABAP instance dashboard shows: </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="ionutbirescu_0-1764682152554.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/347583i5E3DE8B20D4E59F6/image-size/medium?v=v2&px=400" role="button" title="ionutbirescu_0-1764682152554.png" alt="ionutbirescu_0-1764682152554.png" /></span></P><P>We've followed several tutorials, and we think we should have an Administrator tile and also, when we search Communication in the app finder, we only get <SPAN>System Outbound Communication as result.<BR /></SPAN></P><P><SPAN>We'd greatly appreciate any tips or guidance. <BR /></SPAN></P><P> </P>2025-12-02T14:46:34.261000+01:00https://community.sap.com/t5/artificial-intelligence-blogs-posts/hands-on-guide-sap-build-joule-skill-for-purchase-order-listing-approval-or/ba-p/14266886Hands-On Guide: SAP Build + Joule Skill for Purchase Order Listing, Approval, or Modification2025-12-22T08:09:03.721000+01:00Batuhannhttps://community.sap.com/t5/user/viewprofilepage/user-id/175881<P><FONT size="6"><STRONG>Introduction</STRONG></FONT></P><P>In this tutorial, we will build an AI powered Purchase Order listing, modification or approval app using SAP Build and Joule. This step by step guide covers everything from OData integration to creating a working Joule Skill.</P><P> </P><P><FONT size="6"><STRONG>Table of Contents</STRONG></FONT></P><P><ul =""><li style="list-style-type:disc; margin-left:30px; margin-bottom:1px;"><a href="https://community.sap.com/t5/artificial-intelligence-blogs-posts/hands-on-guide-sap-build-joule-skill-for-purchase-order-listing-approval-or/ba-p/14266886#toc-hId-1893794982">1. Create an Environment</a></li><li style="list-style-type:disc; margin-left:30px; margin-bottom:1px;"><a href="https://community.sap.com/t5/artificial-intelligence-blogs-posts/hands-on-guide-sap-build-joule-skill-for-purchase-order-listing-approval-or/ba-p/14266886#toc-hId-1697281477">2. Exposing the Destination</a></li><li style="list-style-type:disc; margin-left:30px; margin-bottom:1px;"><a href="https://community.sap.com/t5/artificial-intelligence-blogs-posts/hands-on-guide-sap-build-joule-skill-for-purchase-order-listing-approval-or/ba-p/14266886#toc-hId-1500767972">3. Create a database table to store purchase orders</a></li><li style="list-style-type:disc; margin-left:30px; margin-bottom:1px;"><a href="https://community.sap.com/t5/artificial-intelligence-blogs-posts/hands-on-guide-sap-build-joule-skill-for-purchase-order-listing-approval-or/ba-p/14266886#toc-hId-1304254467">4. Create a CDS from the ZTABLE for Odata</a></li><li style="list-style-type:disc; margin-left:30px; margin-bottom:1px;"><a href="https://community.sap.com/t5/artificial-intelligence-blogs-posts/hands-on-guide-sap-build-joule-skill-for-purchase-order-listing-approval-or/ba-p/14266886#toc-hId-1107740962">5. Create OData service with T-code SEGW</a></li><li style="list-style-type:disc; margin-left:30px; margin-bottom:1px;"><a href="https://community.sap.com/t5/artificial-intelligence-blogs-posts/hands-on-guide-sap-build-joule-skill-for-purchase-order-listing-approval-or/ba-p/14266886#toc-hId-911227457">6. Activate the Odata service via /iwfnd/maint_service T-code</a></li><li style="list-style-type:disc; margin-left:30px; margin-bottom:1px;"><a href="https://community.sap.com/t5/artificial-intelligence-blogs-posts/hands-on-guide-sap-build-joule-skill-for-purchase-order-listing-approval-or/ba-p/14266886#toc-hId-714713952">7. Crete an Action in SAP Build</a></li><li style="list-style-type:disc; margin-left:30px; margin-bottom:1px;"><a href="https://community.sap.com/t5/artificial-intelligence-blogs-posts/hands-on-guide-sap-build-joule-skill-for-purchase-order-listing-approval-or/ba-p/14266886#toc-hId-518200447">8. Create A Joule Skill to Get Purchase Order</a></li><li style="list-style-type:disc; margin-left:30px; margin-bottom:1px;"><a href="https://community.sap.com/t5/artificial-intelligence-blogs-posts/hands-on-guide-sap-build-joule-skill-for-purchase-order-listing-approval-or/ba-p/14266886#toc-hId-321686942">9. Create A Joule Skill to Approve Purchase Order</a></li><li style="list-style-type:disc; margin-left:30px; margin-bottom:1px;"><a href="https://community.sap.com/t5/artificial-intelligence-blogs-posts/hands-on-guide-sap-build-joule-skill-for-purchase-order-listing-approval-or/ba-p/14266886#toc-hId-125173437">10. Launch The Joule and Test The Skills</a></li></ul></P><P> </P><P> </P><P>In today’s SAP ecosystem, intelligent automation is an expectation, not a future goal. SAP Build allows developers to quickly create business applications without extensive coding and SAP Joule brings AI-driven intelligence to these experiences.</P><P>In this hands-on guide, I’ll walk you through the process of building a Joule skill that connects to an OData service, allowing users to list, approve, and update purchase orders directly through SAP Build. ( This guide uses ZTABLE to store purchase order data because the standard SAP tables in the test system I work on don't have enough or the right kind of data. However, you can use the standard tables instead of ZTABLE. )</P><P>This project shows how AI capabilities can seamlessly integrate into SAP’s low-code environment, enabling automation and human decision-making in one interface. Whether you want to enhance your workflow with intelligent actions or explore real-world Joule integration scenarios, this guide will provide a practical starting point.</P><P> </P><H3 id="toc-hId-1893794982"><STRONG>1. Create an Environment</STRONG></H3><P> </P><P>We need to create an environment for testing joule skill.</P><P>Open the SAP Build Lobby, choose Control Tower->Environments and press the Create button.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_0-1762951486194.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339448iE91253DFE78B5C5E/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_0-1762951486194.png" alt="Batuhann_0-1762951486194.png" /></span></P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_1-1762951486194.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339449i8E4F825B4231DE6C/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_1-1762951486194.png" alt="Batuhann_1-1762951486194.png" /></span></P><P> </P><P>Name your environment and add Description.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_2-1762951486194.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339447i02DDA528EE106A2C/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="Batuhann_2-1762951486194.png" alt="Batuhann_2-1762951486194.png" /></span></P><P> </P><H3 id="toc-hId-1697281477"><STRONG>2. Exposing the Destination</STRONG></H3><P> </P><P>Url of the destination on BTP is the url of our SAP system and the destination must have these properties:<SPAN class=""> </SPAN></P><P>sap.applicationdevelopment.actions.enabled -> true</P><P>sap.processautomation.enabled -> true</P><P>sap.build.usage -> odata_gen</P><P> </P><P>Also the destination’s user will be used for set an external break-point for debugging the ABAP code.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_3-1762951486194.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339452i025CC33442B1A0E0/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_3-1762951486194.png" alt="Batuhann_3-1762951486194.png" /></span></P><P> </P><P>Open the SAP Build Lobby, choose Control Tower->Destinations and press the Add button.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_4-1762951486193.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339451iDA52A8ADE7E8B3CE/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_4-1762951486193.png" alt="Batuhann_4-1762951486193.png" /></span></P><P> </P><P>Select the Destination and choose next.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_5-1762951486194.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339450i2A1504F4B8D14CD7/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_5-1762951486194.png" alt="Batuhann_5-1762951486194.png" /></span></P><P> </P><P>Choose the environment in which you want to use the target. For this tutorial you can choose the Test Environment that you create.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_6-1762951486194.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339453i50B41BBA23341F33/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_6-1762951486194.png" alt="Batuhann_6-1762951486194.png" /></span></P><P> </P><H3 id="toc-hId-1500767972">3. Create a database table to store purchase orders</H3><pre class="lia-code-sample language-abap"><code>@EndUserText.label : 'Purchase Order Change With Sap Build'
@AbapCatalog.enhancementCategory : #NOT_CLASSIFIED
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #A
@AbapCatalog.dataMaintenance : #ALLOWED
define table zbg_build_test {
key mandt : mandt not null;
key purchaseorder : ebeln not null;
key purchaseorderitem : ebelp not null;
key reservationitem : ebelp not null;
material : matnr;
materialcompisvariablesized : boolean;
materialcomponentisphantomitem : boolean;
reservation : char10;
@Semantics.quantity.unitOfMeasure : 'zbg_build_test.entryunit'
requiredquantity : menge_d;
requirementdate : dats;
reservationisfinallyissued : boolean;
baseunit : meins;
@Semantics.quantity.unitOfMeasure : 'zbg_build_test.entryunit'
quantityinentryunit : menge_d;
entryunit : meins;
plant : werks_d;
latestrequirementdate : dats;
billofmaterialitemnumber : ebelp;
bomitemcategory : char1;
isbulkmaterialcomponent : boolean;
debitcreditcode : shkzg;
@Semantics.quantity.unitOfMeasure : 'zbg_build_test.entryunit'
withdrawnquantity : menge_d;
approver : uname;
appoved : flag;
}</code></pre><P> </P><P>Fill the table:</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_7-1762951486194.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339455i588019ABAC52100D/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_7-1762951486194.png" alt="Batuhann_7-1762951486194.png" /></span></P><P> </P><H3 id="toc-hId-1304254467"><STRONG>4. Create a CDS from the ZTABLE for Odata</STRONG></H3><P> </P><pre class="lia-code-sample language-abap"><code>@AbapCatalog.sqlViewName: 'ZSLV_BUILD_TST_V'
@AbapCatalog.compiler.compareFilter: true
@AbapCatalog.preserveKey: true
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'Purchasing Document Informations CDS'
@Metadata.ignorePropagatedAnnotations: true
@ObjectModel.deleteEnabled: true
@ObjectModel.createEnabled: true
@ObjectModel.updateEnabled: true
define view ZSLV_V_BUILD_TEST as select from zbg_build_test as z
{ @EndUserText.label: 'Purchase Order'
key purchaseorder,
@EndUserText.label: 'Purchase Order Item'
key purchaseorderitem,
@EndUserText.label: 'Reservation Item'
key reservationitem,
@EndUserText.label: 'Material'
material,
@EndUserText.label: 'Material Size'
materialcompisvariablesized,
@EndUserText.label: 'Material Item'
materialcomponentisphantomitem,
@EndUserText.label: 'Reservation'
reservation,
@EndUserText.label: 'Quantity'
requiredquantity,
@EndUserText.label: 'Date'
requirementdate,
@EndUserText.label: 'Reservation Issue'
reservationisfinallyissued,
@EndUserText.label: 'Unit'
baseunit,
@EndUserText.label: 'Entry Unit'
entryunit,
@EndUserText.label: 'Quantity In Entry Unit'
quantityinentryunit,
@EndUserText.label: 'Plant'
plant,
@EndUserText.label: 'Latest Requirement Date'
latestrequirementdate,
@EndUserText.label: 'Bill Of Material Number'
billofmaterialitemnumber,
@EndUserText.label: 'BOM Item Category'
bomitemcategory,
@EndUserText.label: 'Is Bulk Material'
isbulkmaterialcomponent,
@EndUserText.label: 'Debit Credit Code'
debitcreditcode,
@EndUserText.label: 'With Drawn Quantity'
withdrawnquantity,
@EndUserText.label: 'Approver'
approver,
@EndUserText.label: 'Approved'
appoved
}</code></pre><P> </P><H3 id="toc-hId-1107740962"><STRONG>5. Create OData service with T-code SEGW</STRONG></H3><P>(Because of the version of the system I work on, this guide uses SEGW instead of RAP to create an OData service. However, you can easily create your own OData service with RAP.)</P><P>Press ‘Create Project’ button, fill the fields and assign the package, request (For this tutorial it will be local object).</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_8-1762951486194.png" style="width: 552px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339454iA442249332DC10C3/image-dimensions/552x491/is-moderation-mode/true?v=v2" width="552" height="491" role="button" title="Batuhann_8-1762951486194.png" alt="Batuhann_8-1762951486194.png" /></span></P><P> </P><P>Complete the creation.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_9-1762951486194.png" style="width: 531px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339458i4C371D0DB2FF2A4D/image-dimensions/531x469/is-moderation-mode/true?v=v2" width="531" height="469" role="button" title="Batuhann_9-1762951486194.png" alt="Batuhann_9-1762951486194.png" /></span></P><P> </P><P>Extend the project, right click to ‘Data Model’, select the Reference->Source</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_10-1762951486195.png" style="width: 524px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339456iADCCAF8BCBF3F0F2/image-dimensions/524x205/is-moderation-mode/true?v=v2" width="524" height="205" role="button" title="Batuhann_10-1762951486195.png" alt="Batuhann_10-1762951486195.png" /></span></P><P> </P><P>Fill the CDS name that you created. Choose ‘Next’.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_11-1762951486195.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339457iE178E9FF8808137F/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_11-1762951486195.png" alt="Batuhann_11-1762951486195.png" /></span></P><P> </P><P>Choose ‘Finish’.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_12-1762951486195.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339460i162C954A12A77E87/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_12-1762951486195.png" alt="Batuhann_12-1762951486195.png" /></span></P><P> </P><P>Activate and generate the Service:</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_13-1762951486195.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339462i0C776D5B90B9187A/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_13-1762951486195.png" alt="Batuhann_13-1762951486195.png" /></span></P><P> </P><P>Go to the class ZCL_ZSLV_BUILD_DPC_EXT. At the bottom of the method list redefine the update method ZSLV_V_BUILD_TES_UPDATE_ENTITY.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_14-1762951486195.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339461iFB95781DC614B3CF/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_14-1762951486195.png" alt="Batuhann_14-1762951486195.png" /></span></P><P> </P><P>In the method, update the approved field with the below code and activate it.</P><P> </P><pre class="lia-code-sample language-abap"><code>METHOD zslv_v_build_tes_update_entity.
DATA: lv_ebeln TYPE ebeln,
lv_ebelp TYPE ebelp,
lv_item TYPE ebelp,
ls_entity TYPE zcl_zslv_build_mpc=>ts_zslv_v_build_testtype,
lr_entity TYPE REF TO data,
ls_table TYPE zbg_build_test.
LOOP AT it_key_tab INTO DATA(ls_key).
CASE ls_key-name.
WHEN 'purchaseorder'.
lv_ebeln = ls_key-value.
WHEN 'purchaseorderitem'.
lv_ebelp = ls_key-value.
WHEN 'reservationitem'.
lv_item = ls_key-value.
ENDCASE.
ENDLOOP.
io_data_provider->read_entry_data( IMPORTING es_data = ls_entity ).
MOVE-CORRESPONDING ls_entity TO ls_table.
er_entity = ls_entity.
UPDATE zbg_build_test FROM ls_table.
COMMIT WORK.
ENDMETHOD.</code></pre><P> </P><H3 id="toc-hId-911227457"><STRONG>6. Activate the Odata service via /iwfnd/maint_service T-code</STRONG></H3><P> </P><P>Choose ‘Add Service’</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_15-1762951486195.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339464i247926CE41613662/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_15-1762951486195.png" alt="Batuhann_15-1762951486195.png" /></span></P><P> </P><P>Select the ‘System Alias’, fill the ‘Technical Service Name’ and press ‘Get Services’. Select the service that you create and press ‘Add Selected Services’.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_16-1762951486195.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339463iE26394B5578D33BF/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_16-1762951486195.png" alt="Batuhann_16-1762951486195.png" /></span></P><P> </P><P>Assign the package and continue.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_17-1762951486195.png" style="width: 586px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339465i93701DCF6F84A375/image-dimensions/586x482/is-moderation-mode/true?v=v2" width="586" height="482" role="button" title="Batuhann_17-1762951486195.png" alt="Batuhann_17-1762951486195.png" /></span></P><P> </P><P>We have added the service, which should appear as follows. In the ICF Nodes section, there is a button labeled "SAP Gateway Client" that provides a testing environment for the service. Press that button.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_18-1762951486195.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339466i257E4502887B7CD2/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_18-1762951486195.png" alt="Batuhann_18-1762951486195.png" /></span></P><P> </P><P>Select the HTTP method as ‘GET’. Press ‘EntitySets’ to choose entity set. Choose the one that you created.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_19-1762951486195.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339467iD26BA638EA695D04/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_19-1762951486195.png" alt="Batuhann_19-1762951486195.png" /></span></P><P> </P><P>Press ‘Execute’ button for testing and response should appear as follows.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_20-1762951486196.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339468iB19EEFFE1A96F079/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_20-1762951486196.png" alt="Batuhann_20-1762951486196.png" /></span></P><P> </P><H3 id="toc-hId-714713952"><STRONG>7. Crete an Action in SAP Build</STRONG></H3><P> </P><P>Open the SAP Build Lobby, choose Connectors->Actions and press the ‘Create’ button. Choose ‘OData Destinations’ and select the Destination that we created.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_21-1762951486196.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339469i75D4226E6210AAA0/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_21-1762951486196.png" alt="Batuhann_21-1762951486196.png" /></span></P><P> </P><P>Fill the Resource Path as follows and click ‘Next’.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_22-1762951486196.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339470iC98AD9718467DDBE/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_22-1762951486196.png" alt="Batuhann_22-1762951486196.png" /></span></P><P> </P><P>The available methods are listed in this window. Select ‘Next’.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_23-1762951486196.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339471iB4B087B4930D98F9/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_23-1762951486196.png" alt="Batuhann_23-1762951486196.png" /></span></P><P> </P><P>Fill the name and description for your action and create.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_24-1762951486196.png" style="width: 699px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339472i6C840202272BF07C/image-dimensions/699x517/is-moderation-mode/true?v=v2" width="699" height="517" role="button" title="Batuhann_24-1762951486196.png" alt="Batuhann_24-1762951486196.png" /></span></P><P> </P><P>The action Purchase_Order_Action is created. Click the action and open it.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_25-1762951486196.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339473i36F970231CEAF229/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_25-1762951486196.png" alt="Batuhann_25-1762951486196.png" /></span></P><P> </P><P>Select the methods in the OData Service.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_26-1762951486196.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339474i9B7B2A2ACC5EF572/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_26-1762951486196.png" alt="Batuhann_26-1762951486196.png" /></span></P><P> </P><P>The GET method's input has no required fields, only optional GET parameters.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_27-1762951486196.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339476iF63E82D70E99586D/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_27-1762951486196.png" alt="Batuhann_27-1762951486196.png" /></span></P><P> </P><P>Output parameters are the fields in the CDS that we created.<SPAN class=""> </SPAN></P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_28-1762951486197.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339477i2981064B998D3F65/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_28-1762951486197.png" alt="Batuhann_28-1762951486197.png" /></span></P><P> </P><P>Methods can be tested in the action interface. For the GET method we don’t need to fill any input parameters. Click ‘Test’ button.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_29-1762951486197.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339475iD784417B4363F97F/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_29-1762951486197.png" alt="Batuhann_29-1762951486197.png" /></span></P><P> </P><P>The data appears on the ‘Test Preview’ section.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_30-1762951486197.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339481iF9B10249BA8AE7F3/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_30-1762951486197.png" alt="Batuhann_30-1762951486197.png" /></span></P><P> </P><P>The PATCH method requires purchaseorder, purchaseorderitem and reservationitem, all of which are key fields in our ZTABLE and CDS.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_31-1762951486197.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339480i05AB260CD5D83103/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_31-1762951486197.png" alt="Batuhann_31-1762951486197.png" /></span></P><P> </P><P>There are no standard output in PATCH method.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_32-1762951486197.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339478iA6B33D61E44BFE31/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_32-1762951486197.png" alt="Batuhann_32-1762951486197.png" /></span></P><P> </P><P>In the Test section, all required fields and fields that need to be changed must be filled out. In this scenario these fields are purchaseorder, purchaseorderitem, reservationitem and approved fields.</P><P> </P><P>Also the link on the Test section can be used in the SAP Gateway Client to test the PATCH method.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_33-1762951486197.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339482i07D1694EC91827A8/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_33-1762951486197.png" alt="Batuhann_33-1762951486197.png" /></span></P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_34-1762951486197.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339483iDD0AB9C12A72FCCB/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_34-1762951486197.png" alt="Batuhann_34-1762951486197.png" /></span></P><P> </P><P>PATCH method return “204: NO CONTENT” and empty Response. This means the update is successful and we will use this emptiness in our joule skill.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_35-1762951486197.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339484i698F6AA58FBFF6D2/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_35-1762951486197.png" alt="Batuhann_35-1762951486197.png" /></span></P><P> </P><P>After checking and testing, save the methods using the ‘Save’ button and select ‘Release’. After the release process, the action should appear as shown below. Then, press 'Publish'.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_36-1762951486198.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339486iBE26FA144B5FA082/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_36-1762951486198.png" alt="Batuhann_36-1762951486198.png" /></span></P><P> </P><P>You can debug when testing methods via the SAP Gateway Client or the SAP Build Action. Set an external breakpoint for the user in your destination that we created at the beginning.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_37-1762951486198.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339487i89CC14AD81B73696/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_37-1762951486198.png" alt="Batuhann_37-1762951486198.png" /></span></P><P> </P><P>For the PATCH method, our key fields in the internal table IT_KEY_TAB.<SPAN class=""> </SPAN></P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_38-1762951486198.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339485i6B0D4AB7F117B580/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_38-1762951486198.png" alt="Batuhann_38-1762951486198.png" /></span></P><P> </P><H3 id="toc-hId-518200447"><STRONG>8. Create A Joule Skill to Get Purchase Order</STRONG></H3><P> </P><P>Open the SAP Build Lobby, choose Create->Joule Skill and fill the name and description. Open the created skill.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_39-1762951486198.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339489i6C3CFA0CA8BB54F5/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_39-1762951486198.png" alt="Batuhann_39-1762951486198.png" /></span></P><P> </P><P>Select the ’Trigger’ step. On the ‘General’ tab fill the name and description. Allow Joule to generate a response and skill to be started directly by user.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_40-1762951486198.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339488i8AF6014A0B2D3A60/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_40-1762951486198.png" alt="Batuhann_40-1762951486198.png" /></span></P><P> </P><P>We don't need input, but outputs can vary according to our needs. In this tutorial, the parameters shown below have been added as outputs.</P><P>Choose ‘Configure’ and add parameters you want to show to the user. For this example, all parameters are string except the ‘approved’ which is boolean.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_41-1762951486198.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339490i37CAFB717C9518BB/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_41-1762951486198.png" alt="Batuhann_41-1762951486198.png" /></span></P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_42-1762951486198.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339491i71B08C51F4AFAA8E/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_42-1762951486198.png" alt="Batuhann_42-1762951486198.png" /></span></P><P> </P><P>Press ‘+’ and choose ‘Call Action’, ‘Browse All Actions’.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_43-1762951486199.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339493iD9A8E33D18BB36DC/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_43-1762951486199.png" alt="Batuhann_43-1762951486199.png" /></span></P><P> </P><P>Search for ‘ZSLV_V_BUILD_TEST’ or your Service Name. Add the ‘Get entities from ZSLV_V_BUILD_TEST’.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_44-1762951486199.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339492i29CD84E55DC3D4A0/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_44-1762951486199.png" alt="Batuhann_44-1762951486199.png" /></span></P><P> </P><P>Select the ‘Destination Variable’ as Destination we created.<SPAN class=""> </SPAN></P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_45-1762951486199.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339494i1ADC6AED50920631/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_45-1762951486199.png" alt="Batuhann_45-1762951486199.png" /></span></P><P> </P><P>We can skip the input tab because there are no input for GET method.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_46-1762951486199.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339495iCF826E2C172819B2/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_46-1762951486199.png" alt="Batuhann_46-1762951486199.png" /></span></P><P> </P><P>We can see the output parameters in this tab.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_47-1762951486199.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339496i0D79C6DE47F87320/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_47-1762951486199.png" alt="Batuhann_47-1762951486199.png" /></span></P><P> </P><P>On the "End" step, we need to assign the input and output parameters for the skills. Since we don't have any inputs, let's assign the outputs added in the "Trigger" step as our action's outputs.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_48-1762951486199.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339498iF065B601C1E42425/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_48-1762951486199.png" alt="Batuhann_48-1762951486199.png" /></span></P><P> </P><P>Save the Joule Skill.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_49-1762951486199.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339497i22EAD020264F75C1/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_49-1762951486199.png" alt="Batuhann_49-1762951486199.png" /></span></P><P> </P><P>And Release.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_50-1762951486199.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339499iC941DB003C70EDDF/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_50-1762951486199.png" alt="Batuhann_50-1762951486199.png" /></span></P><P> </P><P>Now Deploy.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_51-1762951486199.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339501i38DBD6FDEEC0D97D/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_51-1762951486199.png" alt="Batuhann_51-1762951486199.png" /></span></P><P> </P><P>Choose the Environment we created and click ‘Upgrade’.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_52-1762951486199.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339503i8DA5330F08DEC060/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_52-1762951486199.png" alt="Batuhann_52-1762951486199.png" /></span></P><P> </P><P>Match the destinations, and the skill will be ready to use by Joule after deployment.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_53-1762951486200.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339502iD7925260EAAA33B7/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_53-1762951486200.png" alt="Batuhann_53-1762951486200.png" /></span></P><P> </P><H3 id="toc-hId-321686942"><STRONG>9. Create A Joule Skill to Approve Purchase Order</STRONG></H3><P> </P><P>On the ‘Trigger’ step, fill the name and description. Deactivate the ‘Allow Joule to generate a response’ feature because in this skill we will create our own messages. The other feature should be active.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_54-1762951486200.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339506iCF2B4B09A81CFE1A/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_54-1762951486200.png" alt="Batuhann_54-1762951486200.png" /></span></P><P> </P><P>Configure the input parameters. Add purchaseorder, purchaseorderitem and reservationitem key fields as string. For approve skill we don’t need any output field.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_55-1762951486200.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339504i795B12BB0A5FDD06/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_55-1762951486200.png" alt="Batuhann_55-1762951486200.png" /></span></P><P> </P><P>Choose ‘+’ and ‘Call Action’.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_56-1762951486200.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339505iF137892C308443DC/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_56-1762951486200.png" alt="Batuhann_56-1762951486200.png" /></span></P><P> </P><P>Browse All Actions.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_57-1762951486200.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339507iCB188F4B80EEF892/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_57-1762951486200.png" alt="Batuhann_57-1762951486200.png" /></span></P><P> </P><P>Search update or the service name. Add the Update entity in ZSLV_V_BUILD_TEST.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_58-1762951486200.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339508i9195BC6AC1EBB8EF/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_58-1762951486200.png" alt="Batuhann_58-1762951486200.png" /></span></P><P> </P><P>On the ‘General’ tab, assign the Destination.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_59-1762951486200.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339509i6AEAF116350A3717/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_59-1762951486200.png" alt="Batuhann_59-1762951486200.png" /></span></P><P> </P><P>On the ‘Inputs’ tab, assign the purchaseorder, purchaseorderitem and reservationitem to the parameters created on the "Trigger" step.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_60-1762951486200.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339510iD7BE5A293F78E88D/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_60-1762951486200.png" alt="Batuhann_60-1762951486200.png" /></span></P><P> </P><P>We only need to fill the fields ‘approved’ from the fields to be updated. We need to configure the ‘approved’ field because action inputs can only be string.<SPAN class=""> </SPAN></P><P> </P><P>Choose ‘approved’ field and ‘Apply a formula’.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_61-1762951486200.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339511i1CC892148E0E938B/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_61-1762951486200.png" alt="Batuhann_61-1762951486200.png" /></span></P><P>Type ‘true’ and click ‘Apply’.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_62-1762951486200.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339512iD53F3F6D975D989B/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_62-1762951486200.png" alt="Batuhann_62-1762951486200.png" /></span></P><P> </P><P>Choose ‘+’ and ‘Check Condition’.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_63-1762951486201.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339513i9D767715D97E0E68/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_63-1762951486201.png" alt="Batuhann_63-1762951486201.png" /></span></P><P> </P><P>Choose the ‘Condition Editor’.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_64-1762951486201.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339514iD1DEADEE783168CA/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_64-1762951486201.png" alt="Batuhann_64-1762951486201.png" /></span></P><P> </P><P>Add the following conditions and Click ‘Apply’. If PATCH method is executed successfully, the result will be empty.<SPAN class=""> </SPAN></P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_65-1762951486201.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339515i1085590800299A9E/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_65-1762951486201.png" alt="Batuhann_65-1762951486201.png" /></span></P><P> </P><P>If the condition is met, the left branch of the condition executes. In the opposite case, the ‘Default’ branch of the condition executes.</P><P> </P><P>Choose the ‘+’ on the left branch and ‘Send Response’.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_66-1762951486201.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339517iEEA27BCE03F23CCC/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_66-1762951486201.png" alt="Batuhann_66-1762951486201.png" /></span></P><P> </P><P>Open Message Editor.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_67-1762951486201.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339518i12FD6CF1135905F9/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_67-1762951486201.png" alt="Batuhann_67-1762951486201.png" /></span></P><P> </P><P>Fill the parameters as shown below and save.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_68-1762951486201.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339516i834CCF9C092AAC55/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_68-1762951486201.png" alt="Batuhann_68-1762951486201.png" /></span></P><P> </P><P>You can add parameters to the title and message with the ‘<>’ button.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_69-1762951486201.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339520i22FFEB9A68D1170B/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_69-1762951486201.png" alt="Batuhann_69-1762951486201.png" /></span></P><P> </P><P>Do the same steps for the right branch of the condition. ‘+’ -> ’Send Response’ -> ‘Open Message Editor’</P><P> </P><P>Fill the parameters as shown below and save.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_70-1762951486201.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339519iB1B455C7EC155E26/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_70-1762951486201.png" alt="Batuhann_70-1762951486201.png" /></span></P><P> </P><P>Save, Release and Deploy just like the previous GET_PURCHASE_ORDER skill.</P><P> </P><H3 id="toc-hId-125173437"><STRONG>10. Launch The Joule and Test The Skills</STRONG></H3><P> </P><P>Open the SAP Build Lobby, choose Control Tower->Environments->Joule</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_71-1762951486201.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339521i4845A290D81D0EBA/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_71-1762951486201.png" alt="Batuhann_71-1762951486201.png" /></span></P><P> </P><P>Launch the joule, ask for Purchase Orders and get the details.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_72-1762951486202.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339522i923E80477DF51C05/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_72-1762951486202.png" alt="Batuhann_72-1762951486202.png" /></span></P><P> </P><P>Ask joule to approve the purchase orders and get the illustrated success message card we create.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Batuhann_73-1762951486202.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/339523iCB0F2C77FC1078DA/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Batuhann_73-1762951486202.png" alt="Batuhann_73-1762951486202.png" /></span></P><P> </P>2025-12-22T08:09:03.721000+01:00https://community.sap.com/t5/technology-blog-posts-by-sap/did-you-know-sap-btp-destination-fragments-and-how-to-consume-to-integrate/ba-p/14294719Did you know SAP BTP Destination Fragments and how to consume to integrate ?2025-12-22T08:22:26.037000+01:00Yoganandahttps://community.sap.com/t5/user/viewprofilepage/user-id/75<P>In the era of hyper-automation and low-code/no-code platforms, seamless connectivity between services is critical. SAP BTP’s <STRONG>Destination Fragments</STRONG> provide a standardized, reusable approach to managing API endpoints, security configurations, and network policies.<BR /><BR /><EM>This blog explores how developers can consume Destination Fragments in <STRONG>SAP Build Apps, Process Automation</STRONG>, and other development contexts to accelerate integration, enhance security, and streamline governance.</EM></P><DIV>Reference : <A href="https://help.sap.com/docs/connectivity/sap-btp-connectivity-cf/extending-destinations-with-fragments" target="_self" rel="noopener noreferrer">SAP Help Documentation - Destinations with Fragments</A></DIV><DIV><H3 id="toc-hId-1896504788"><FONT color="#FF6600">1. What Are Destination Fragments?</FONT></H3><P>Destination Fragments are reusable configuration components in SAP BTP that define:</P><UL><LI>Target endpoints (e.g., SAP S/4HANA, SAP SuccessFactors, or external APIs).</LI><LI>Authentication methods (OAuth, Basic Auth, Client Certificates).</LI><LI>Network policies (e.g., CORS, whitelisting).</LI><LI>Custom headers or query parameters.</LI></UL><P>Fragments are consumed by <STRONG>Destinations</STRONG>, which act as unified gateways for applications to access backend systems securely.</P><H3 id="toc-hId-1699991283"><FONT color="#FF6600">2. Why Consume Destination Fragments?</FONT></H3><UL><LI><STRONG>Reusability</STRONG>: Define once, use across multiple applications.</LI><LI>Security Centralization: Enforce consistent authentication and encryption.</LI><LI>Governance: Ensure compliance with enterprise policies.</LI><LI>Simplicity: Eliminate manual configuration for each service.</LI></UL><H3 id="toc-hId-1503477778"><FONT color="#FF6600">3. How to Consume Destination Fragments</FONT></H3><P>Follow these steps to consume a Destination Fragment in your BTP subaccount:</P><H4 id="toc-hId-1436046992">Step 1: Create a Destination</H4><OL><LI>Navigate to SAP BTP Cockpit > Connectivity > Destinations .</LI><LI>Define properties:<UL><LI>Name: my-fragment.</LI><LI>Type: HTTP.</LI><LI>URL: <A href="https://api.example.com" target="_blank" rel="noopener nofollow noreferrer">https://api.example.com</A>.</LI><LI>Authentication: OAuth2ClientCredentials.</LI><LI>Client ID/Secret: Stored in BTP secrets.</LI></UL></LI></OL><H4 id="toc-hId-1239533487">Step 2: Create a Destination Using the Fragment</H4><OL><LI>you will have to perform API request to create a New Fragment as there is no option of creation via UI in BTP - Destination </LI></OL><H4 id="toc-hId-1043019982"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="2025-12-22_08-02-05.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/354495i32AD73266E59A0D4/image-size/large?v=v2&px=999" role="button" title="2025-12-22_08-02-05.png" alt="2025-12-22_08-02-05.png" /></span></H4><H4 id="toc-hId-846506477">Step 3: Consume in Applications</H4><P>Applications access the destination via the destination service:</P></DIV><pre class="lia-code-sample language-javascript"><code>// Example: Resolve a destination with an optional fragment and call its target URL.
// Requires: axios ^1.x
const axios = require('axios');
async function callViaDestination() {
// Replace with your values
const region = 'eu10'; // e.g., eu10, us10, etc.
const destinationName = 'AVR'; // your destination name
const fragmentName = 'APIKey'; // optional: the name of the destination fragment to apply
const accessToken = process.env.DEST_CONF_ACCESS_TOKEN; // bearer token for Destination Configuration service
const baseUrl = `https://destination-configuration.cfapps.${region}.hana.ondemand.com`;
const destUrl = `${baseUrl}/destination-configuration/v1/destinations/${encodeURIComponent(destinationName)}`;
try {
// 1) Resolve destination (apply fragment via header if provided)
const headers = {
'Authorization': `Bearer ${accessToken}`,
'Accept': 'application/json',
};
if (fragmentName) {
headers['X-Fragment-Name'] = fragmentName; // apply fragment
}
const { data: destination } = await axios.get(destUrl, { headers });
// destination typically includes properties like URL, headers, and possibly Authorization
// depending on the auth type configured in the destination.
const targetUrl = destination.URL;
const targetHeaders = { ...(destination.headers || {}) };
// If the resolved destination returns an Authorization header (e.g., OAuth flow handled by Destination service),
// propagate it to the call below.
if (destination.Authorization) {
targetHeaders['Authorization'] = destination.Authorization;
}
// 2) Call the resolved target URL (GET as example)
const response = await axios.get(targetUrl, {
headers: targetHeaders,
// If your destination requires additional headers like sap-client etc.,
// they may be present in destination.properties or destination.headers.
// You can map them into targetHeaders as needed.
});
console.log('Status:', response.status);
console.log('Data:', response.data);
} catch (err) {
// Helpful diagnostics
if (err.response) {
console.error('Destination/Target call failed:', err.response.status, err.response.data);
} else {
console.error('Error:', err.message);
}
}
}
callViaDestination();</code></pre><H3 id="toc-hId-520910253"><FONT color="#FF6600"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="2025-12-22_08-03-17.png" style="width: 984px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/354496i67E6338D34E5C88A/image-size/large?v=v2&px=999" role="button" title="2025-12-22_08-03-17.png" alt="2025-12-22_08-03-17.png" /></span></FONT></H3><H3 id="toc-hId-324396748"><FONT color="#FF6600">4. Use Cases & Diagrams</FONT></H3><H4 id="toc-hId-256965962">Use Case 1: SAP Build Apps (Low-Code)</H4><P>Scenario: A Build App needs to fetch data from SAP S/4HANA Sales Orders.</P><UL><LI>Fragment: Preconfigured with OAuth2ClientCredentials and S/4HANA endpoint.</LI><LI>Consumption: Drag-and-drop the destination into the app’s data source.</LI></UL><P><STRONG>Diagram:</STRONG><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="diagram (3).svg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/354497i3EE6194D087B3981/image-size/large?v=v2&px=999" role="button" title="diagram (3).svg" alt="diagram (3).svg" /></span></P><H4 id="toc-hId--437264638">Use Case 2: SAP Process Automation</H4><P>Scenario: A workflow triggers an external payment gateway API.</P><UL><LI>Fragment: Includes API URL, Basic Auth, and retry policies.</LI><LI>Consumption: Use the destination name in a REST API step.</LI></UL><P><STRONG>Diagram:</STRONG><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="2025-12-22_08-19-03 (1).gif" style="width: 920px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/354499iFBDEF735CAECEA6F/image-size/large?v=v2&px=999" role="button" title="2025-12-22_08-19-03 (1).gif" alt="2025-12-22_08-19-03 (1).gif" /></span></P><H4 id="toc-hId--633778143">Use Case 3: CAP-Based Applications</H4><P>Scenario: A CAP service reads data from a custom API.</P><UL><LI>Fragment: Configured with JWT Bearer token and CORS settings.</LI><LI>Consumption: Reference the destination in cds.env.</LI></UL><P><STRONG>Diagram:</STRONG><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="2025-12-22_08-21-00 (1).gif" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/354500iCD26EBF12333F54B/image-size/large?v=v2&px=999" role="button" title="2025-12-22_08-21-00 (1).gif" alt="2025-12-22_08-21-00 (1).gif" /></span></P><H3 id="toc-hId--536888641"><FONT color="#FF6600">5. Key Benefits</FONT></H3><UL><LI>Accelerated Development: Reduce integration time by 40%+ using pre-configured fragments.</LI><LI>Consistent Security: Enforce MFA, encryption, and auditing across all apps.</LI><LI>Centralized Control: Update endpoints/authentications once; changes propagate everywhere.</LI><LI>Compliance: Align with ISO 27001, GDPR, and enterprise security policies.</LI></UL><HR /><H3 id="toc-hId--733402146"><FONT color="#FF6600">6. Conclusion</FONT></H3><P><STRONG>Destination Fragments</STRONG> in SAP BTP are a game-changer for developers, enabling secure, reusable, and governance-ready integrations. Whether you’re building low-code apps, automating processes, or developing enterprise services, fragments simplify connectivity while maintaining security and compliance.</P><P><STRONG>Next Steps:</STRONG></P><UL><LI>Explore the <A href="https://help.sap.com/docs/connectivity/sap-btp-connectivity-cf/extending-destinations-with-fragments" target="_blank" rel="noopener noreferrer">SAP BTP Destination Documentation</A>.</LI><LI>Try fragments in the <A href="https://api.sap.com/api/SAP_CP_CF_Connectivity_Destination/path/post_v1_subaccountDestinationFragments" target="_blank" rel="noopener noreferrer">SAP BTP Destination Fragment API Doc</A>.</LI></UL><P>By leveraging <STRONG>Destination Fragments</STRONG>, you future-proof your integrations and focus on innovation—not configuration chaos.</P><DIV> </DIV>2025-12-22T08:22:26.037000+01:00https://community.sap.com/t5/technology-blog-posts-by-members/tribute-to-thomas-volmering/ba-p/14296083Tribute to Thomas Volmering2025-12-23T11:06:24.578000+01:00Pierre_Colhttps://community.sap.com/t5/user/viewprofilepage/user-id/63<P><SPAN class=""><SPAN><span class="lia-unicode-emoji" title=":loudspeaker:">📢</span> <STRONG>Today is <a href="https://community.sap.com/t5/user/viewprofilepage/user-id/189303">@thomas_volmering</a>'s last day at SAP</STRONG>. <BR /><BR /><STRONG><A class="" href="https://www.linkedin.com/in/thomas-volmering-3538b7/" target="_blank" rel="noopener nofollow noreferrer">Thomas</A> joined SAP 26 years ago</STRONG>, and I met him when he was head of Product Management for <A href="https://community.sap.com/t5/c-khhcw49343/SAP+Build+Process+Automation/pd-p/73554900100800003832" target="_self">SAP Build Process Automation</A>, before he became Head of Product for <A class="" href="https://www.linkedin.com/company/sapbuild/" target="_self" rel="nofollow noopener noreferrer">SAP Build</A>. Together we worked on many communication projects for <A class="" href="https://community.sap.com/t5/c-khhcw49343/SAP+Build/pd-p/73555000100700001491" target="_self">SAP Build</A>, including technical blog posts that you can read <A href="https://community.sap.com/t5/user/viewprofilepage/user-id/189303" target="_self">here</A>. <span class="lia-unicode-emoji" title=":newspaper:">📰</span><BR /><BR />Let me just say that it has been a great pleasure and also some fun working with him, and I thank <A class="" href="https://www.linkedin.com/in/thomas-volmering-3538b7/" target="_blank" rel="noopener nofollow noreferrer">Thomas</A> a lot for that. <span class="lia-unicode-emoji" title=":folded_hands:">🙏🏻</span><BR /><BR /><STRONG>Please join me in wishing <A class="" href="https://www.linkedin.com/in/thomas-volmering-3538b7/" target="_blank" rel="noopener nofollow noreferrer">Thomas</A> the very best for what's to come!</STRONG> <span class="lia-unicode-emoji" title=":thumbs_up:">👍🏻</span></SPAN></SPAN></P><P><SPAN class=""><SPAN><A href="https://www.linkedin.com/in/thomas-volmering-3538b7/" target="_self" rel="nofollow noopener noreferrer"><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Thomas Volmering on LinkedIn and SAP Community.jpg" style="width: 676px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/355115iA31A8D7B8FE3ED2A/image-size/large?v=v2&px=999" role="button" title="Thomas Volmering on LinkedIn and SAP Community.jpg" alt="Thomas Volmering on LinkedIn and SAP Community.jpg" /></span></A></SPAN></SPAN></P><P> </P>2025-12-23T11:06:24.578000+01:00https://community.sap.com/t5/tooling-sap-build-blog-posts/improve-build-apps-uis-to-allow-keyboard-click-control-focus/ba-p/14307132Improve Build Apps UIs to Allow Keyboard Click / Control Focus2026-01-15T07:43:49.523000+01:00Dan_Wroblewskihttps://community.sap.com/t5/user/viewprofilepage/user-id/72<P>I was doing this great tutorial by my colleagues <a href="https://community.sap.com/t5/user/viewprofilepage/user-id/156020">@Rekha_DR</a> and <a href="https://community.sap.com/t5/user/viewprofilepage/user-id/148298">@shrinivasan_neelamegam</a> about creating a chatbot using Build Apps and AI Core, a topic they delivered in the SAP TechEd developer keynote in 2024: <A href="https://github.com/SAP-samples/teched2024-developer-keynote/blob/main/topics/DEV100A-build-chatbot-apps-aicore/README.md" target="_blank" rel="noopener nofollow noreferrer">https://github.com/SAP-samples/teched2024-developer-keynote/blob/main/topics/DEV100A-build-chatbot-apps-aicore/README.md</A></P><P>It worked perfectly. </P><P>The tutorial let you create a chatbot where you typed a prompt, got an answer, and then could send a new prompt, like a regular chatbot. (By the way, one of the clever designs of theirs was that the context of the conversation was always sent back to the AI Core with every subsequent prompt.)</P><P>I thought what would make the app even more helpful would be:</P><UL><LI>To be able to press <STRONG>Enter</STRONG> after typing in each prompt.</LI><LI>To place the cursor automatically in the prompt input box so the user could just start typing the next prompt.</LI></UL><H2 id="toc-hId-1787823193"> </H2><H2 id="toc-hId-1591309688">Allow Enter Instead of Button Click</H2><P>To do this, you first want to create a custom event for the logic that you want connected to the button click / Enter press.</P><P>Drag a<STRONG> Receive Event</STRONG> flow function onto the canvas.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Dan_Wroblewski_1-1768379947216.png" style="width: 317px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/361181i03406D3877E2AD51/image-dimensions/317x582/is-moderation-mode/true?v=v2" width="317" height="582" role="button" title="Dan_Wroblewski_1-1768379947216.png" alt="Dan_Wroblewski_1-1768379947216.png" /></span></P><P>Set the <STRONG>Event Source</STRONG> to<EM> Fired from "Trigger Event"</EM>, and give the event a name, like <STRONG>SendChat.</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Dan_Wroblewski_2-1768379995003.png" style="width: 319px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/361182iB8010C924DCA9527/image-dimensions/319x392/is-moderation-mode/true?v=v2" width="319" height="392" role="button" title="Dan_Wroblewski_2-1768379995003.png" alt="Dan_Wroblewski_2-1768379995003.png" /></span></P><P>Attach your logic (in this case the calls to AI Core) to the event.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Dan_Wroblewski_3-1768380119291.png" style="width: 1006px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/361183i164E565D6B95453B/image-dimensions/1006x254/is-moderation-mode/true?v=v2" width="1006" height="254" role="button" title="Dan_Wroblewski_3-1768380119291.png" alt="Dan_Wroblewski_3-1768380119291.png" /></span></P><P>Now all that's left is to trigger this event when the user clicks the button, or presses <STRONG>Enter</STRONG>. </P><P>For the button click, select the button click, drag a <STRONG>Trigger Event</STRONG> flow function, and connect it to your <STRONG>Component Tap</STRONG> event for the button.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Dan_Wroblewski_4-1768380237792.png" style="width: 570px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/361184iA9BCAECF36224D1F/image-dimensions/570x363/is-moderation-mode/true?v=v2" width="570" height="363" role="button" title="Dan_Wroblewski_4-1768380237792.png" alt="Dan_Wroblewski_4-1768380237792.png" /></span></P><P>Configure the <STRONG>Trigger Event</STRONG> flow function by selecting your new event to be triggered.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Dan_Wroblewski_5-1768380305959.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/361185i714B5A8A083AD863/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="Dan_Wroblewski_5-1768380305959.png" alt="Dan_Wroblewski_5-1768380305959.png" /></span></P><P>To enable the logic to be triggered by pressing <STRONG>Enter</STRONG>, highlight your input box, and create the following logic on the input box's <STRONG>onKeyPress</STRONG> event.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Dan_Wroblewski_2-1768380607357.png" style="width: 955px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/361188i205D8F016FEFB2D1/image-dimensions/955x492/is-moderation-mode/true?v=v2" width="955" height="492" role="button" title="Dan_Wroblewski_2-1768380607357.png" alt="Dan_Wroblewski_2-1768380607357.png" /></span></P><P>To the <STRONG>onKeyPress</STRONG> event, add an<STRONG> If Condition</STRONG> flow function with the following formula:</P><pre class="lia-code-sample language-javascript"><code>outputs["Receive event"].eventValue == "Enter"</code></pre><P>And then to the top output add a <STRONG>Trigger Event</STRONG>, configured the same as for the button click logic above.</P><P> </P><H2 id="toc-hId-1394796183">Place Cursor in Input Box</H2><P>Every time I send a prompt, I want the cursor to return to the input box so I can type in the next prompt.</P><P>Install the <STRONG>Focus Input</STRONG> flow function from the Marketplace.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Dan_Wroblewski_3-1768380853145.png" style="width: 1223px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/361189i376DE40DB76D4693/image-dimensions/1223x671/is-moderation-mode/true?v=v2" width="1223" height="671" role="button" title="Dan_Wroblewski_3-1768380853145.png" alt="Dan_Wroblewski_3-1768380853145.png" /></span></P><P>After the logic for sending the prompt and receiving the answer from AI Core, add this flow function and specify the input box.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Dan_Wroblewski_4-1768380997074.png" style="width: 1015px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/361190i4F88764777BE45F4/image-dimensions/1015x297/is-moderation-mode/true?v=v2" width="1015" height="297" role="button" title="Dan_Wroblewski_4-1768380997074.png" alt="Dan_Wroblewski_4-1768380997074.png" /></span></P><P><span class="lia-unicode-emoji" title=":kissing_cat_face:">😽</span></P><P> </P><P> </P><P> </P><P> </P>2026-01-15T07:43:49.523000+01:00https://community.sap.com/t5/technology-blog-posts-by-sap/use-sap-integration-suite-to-connect-sap-and-aws-services/ba-p/14309752Use SAP Integration Suite to connect SAP and AWS services2026-01-20T11:36:09.592000+01:00claudiacsrosalinohttps://community.sap.com/t5/user/viewprofilepage/user-id/869685<H2 id="toc-hId-1787888603">Bridging the gap between SAP and 3rd party systems </H2><P>Everyone already knows that SAP Integration Suite is the election tool to connect your SAP services. But did you know that it is also your tool to integrate <EM>Everything, Everywhere, All</EM> in One Place? (yes, almost like the Oscar award winning movie <span class="lia-unicode-emoji" title=":trophy:">🏆</span>)<STRONG><BR /><BR /><A href="https://discovery-center.cloud.sap/missiondetail/4667/4956/" target="_self" rel="nofollow noopener noreferrer">Use SAP Integration Suite to connect SAP and AWS services</A> </STRONG>is a <STRONG>new official SAP Discovery Center Mission</STRONG> that focus on showcasing how easy it is to integrate not only SAP systems but also <STRONG>non-SAP systems</STRONG> using <STRONG>SAP Integration Suite.</STRONG> <BR /><BR />For this mission, we decided to use the <STRONG>AWS platform</STRONG> as the example of third-party cloud services provider, but the same rational with this set of best practices and capabilities can be used to integrate with other cloud providers. By following the cards provided in the mission, you will see <STRONG>step-by-step</STRONG> how you can start to integrate an application developed with SAP BTP development tools with AWS services, such as <STRONG>S3</STRONG> for image storage and <STRONG>Rekognition</STRONG> for image identification.<BR />You can even use a <STRONG>SAP BTP Trial</STRONG> account to perform the SAP BTP parts of the mission, even though you will always still require also an <STRONG>AWS account</STRONG> to connect with the S3 and Rekognition services (and IAM for user and roles management on the AWS side). Either if you are a <STRONG>technical</STRONG> user or more of a <STRONG>business user</STRONG> interested in rapid application development, cloud integration strategies and/or AI-powered business solution, this mission is for you!<BR /><BR />The following architecture shows the big picture of what the final result of the mission should look like, seamlessly combining the best of both SAP BTP and AWS platforms:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="BTP x AWS - Architecture.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/362734iA7AC31636E4F17BC/image-size/large?v=v2&px=999" role="button" title="BTP x AWS - Architecture.png" alt="BTP x AWS - Architecture.png" /></span></P><P> </P><H2 id="toc-hId-1591375098">Use Case Description</H2><P><SPAN>The use case followed trough out the mission focuses in <STRONG>enabling a Supplier to donate surplus food ingredients</STRONG> through an <STRONG>AI-powered mobile and web application</STRONG> built using <STRONG>SAP Build Apps</STRONG>, a low-code/no-code solution within SAP Business Technology Platform (SAP BTP), seamlessly integrated with AWS capabilities for storage and artificial intelligence–based image recognition. For the integration part, you will leverage and combine different <STRONG>integration capabilities</STRONG> that are part of the <STRONG>SAP Integration Suite</STRONG>. The intended outcome of the use case is to minimize food waste while simplifying the donation process and facilitating redistribution to organizations in need.</SPAN></P><H3 id="toc-hId-1523944312">Solution Components:</H3><UL><LI><STRONG>SAP Build Apps</STRONG>: The low-code/no-code application development service used to create the application (frontend and logic) where the Supplier can donate the surplus ingredients by taking or uploading photos </LI><LI><STRONG>SAP Integration Suite</STRONG>: The secure and centralized integration management service for <STRONG>all</STRONG> your integrations, <SPAN>making them easier to manage, monitor and troubleshoot</SPAN></LI><LI><STRONG>Amazon S3</STRONG>: The Amazon service for simplified and cost-effective image storage capabilities</LI><LI><STRONG>Amazon Rekognition</STRONG>: The Amazon service for AI-powered identification and categorization, in this case used to identify the ingredients in the images taken or uploaded from the application to a S3 bucket</LI></UL><H3 id="toc-hId-1327430807">The Use Case Flow:</H3><OL><LI>A Supplier captures or uploads an image of surplus ingredients through the mobile/web app (developed with <STRONG>SAP Build Apps</STRONG>)</LI><LI>The image is securely stored in <STRONG>Amazon S3</STRONG> via <STRONG>SAP Integration Suite</STRONG> (using <STRONG>Cloud Integration</STRONG>, <STRONG>Pre-built Open Connector</STRONG> and <STRONG>API Management</STRONG> capabilities)</LI><LI>Also via <STRONG>SAP Integration Suite</STRONG>, the app then calls <STRONG>Amazon Rekognition</STRONG> to automatically identify and categorize the ingredient present in the image (using <STRONG>Cloud Integration</STRONG>, <STRONG>Custom Open Connector</STRONG> and <STRONG>API Management</STRONG> capabilities)</LI><LI>The results are sent back to the app and ready for further processing</LI></OL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="app-preview.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/362711iEE1F86C89248AD57/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="app-preview.png" alt="app-preview.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="sap-integration-suite-open-connectors.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/362707iD7BD30FB2957BF43/image-size/medium?v=v2&px=400" role="button" title="sap-integration-suite-open-connectors.png" alt="sap-integration-suite-open-connectors.png" /></span> <span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="sap-is-integration-flow.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/362708i83FD4E1B09A2A96E/image-size/medium?v=v2&px=400" role="button" title="sap-is-integration-flow.png" alt="sap-is-integration-flow.png" /></span></P><H2 id="toc-hId-1001834583">Learning Outcomes</H2><P>By completing this Discovery Center Mission, you'll gain practical experience in:</P><UL><LI>Building low-code applications with SAP Build Apps</LI><LI>Configuring SAP Integration Suite for AWS connectivity</LI><LI>Implementing secure cloud-to-cloud integrations</LI><LI>Leveraging AI services for business process automation</LI><LI>Managing integration flows and monitoring capabilities</LI></UL><H2 id="toc-hId-805321078">Getting Started</H2><P>Once you open and start the <A href="https://discovery-center.cloud.sap/missiondetail/4667/4956/" target="_self" rel="nofollow noopener noreferrer">Mission</A>, you will see in the <STRONG>Project Board</STRONG> the different cards that will guide you step-by-step, divided in 7 columns.<BR /><BR />Make sure you fullfill all the requirements indicated in the <STRONG>SET UP</STRONG> and <STRONG>PREPARE</STRONG> columns. After that, you can start with the <STRONG>EXECUTE</STRONG> columns. You will first explore the Open Connectors capability of SAP Integration Suite (in the <STRONG>Execute - OpenConnectors</STRONG>), followed by the Cloud Integration and API Management capabilities of SAP Integration Suite (in the <STRONG>Execute - Security Material and Integration Flow</STRONG>) and lastly you will get to visually create a simple app screen with SAP Build Apps (in <STRONG>Execute - Build app</STRONG>) .<BR />After finishing the mission, don't forget to <STRONG>mark all the cards as completed</STRONG> and we encourage you to leave your feedback and share your experiences with the rest of the SAP Community. <BR /><BR />And now, for those who saw the movie <EM>Everything Everywhere All at Once</EM>, <STRONG>DON'T</STRONG> "Just be a rock" and start the mission here! -> <EM><A href="https://discovery-center.cloud.sap/missiondetail/4667/4956/" target="_self" rel="nofollow noopener noreferrer">SAP Discovery Center Missions - Use SAP Integration Suite to connect SAP and AWS services </A><BR /></EM></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="rocks scene.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/363350i5B616CE0996574A0/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="rocks scene.jpg" alt="rocks scene.jpg" /></span><EM><BR /></EM></P>2026-01-20T11:36:09.592000+01:00https://community.sap.com/t5/technology-blog-posts-by-members/sapui5-pagination-in-table-on-button-click-using-s-4-hana-cloud-odata/ba-p/14303575SAPUI5 – Pagination in Table on button click using S/4 Hana cloud oData service2026-01-29T05:36:26.980000+01:00VenkateshMundruhttps://community.sap.com/t5/user/viewprofilepage/user-id/44269<P>Hi, in this blog I’m going to explain the pagination in Table with S/4 Hana cloud oData service with<SPAN> flexibility to control number of visible rows per page</SPAN>. </P><P> </P><P>In this example, I am using S/4 Hana cloud oData service through destination. I have 621 records in Product entity set and by default, I have to display 10 records per click and user can change number of visible rows. So, I have placed four nav buttons for First page, Previous page, Next page and Last page with page count information and drop down for number of visible rows and then some magical code.</P><P> </P><P>Firstly, create new front end web and mobile application with zproducts name.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="create project gif.gif" style="width: 940px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/360493i1B9B014E14FBDE50/image-size/large?v=v2&px=999" role="button" title="create project gif.gif" alt="create project gif.gif" /></span></P><P> </P><P>In the canvas, give title as Products and remove bottom text.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="VenkateshMundru_0-1768222074831.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/360494i311F697EA988441D/image-size/medium?v=v2&px=400" role="button" title="VenkateshMundru_0-1768222074831.png" alt="VenkateshMundru_0-1768222074831.png" /></span></P><P> </P><P><STRONG>Add Integration:</STRONG></P><P>Go to Integrations tab and select add integration and then select BTP destinations under sap systems.</P><P>In BTP destinations, select our S/4 Hana cloud service destination i.e., <STRONG>S4HANA_Joule_Product</STRONG> and select <STRONG>A_Product</STRONG> entityset. Now Select install integration and enable data entity. You can browse real data by selecting browse real data. Click on save at top right corner.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Integration.gif" style="width: 800px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/360499i17528D365F6DE4FA/image-size/large?v=v2&px=999" role="button" title="Integration.gif" alt="Integration.gif" /></span></P><P> </P><P><STRONG>Add Variables:</STRONG></P><P>Now go to Variables tab and go to page variables and select add page variable and choose from scratch.</P><P>Add variable noOfVisibleRows with value type Number with initial value 10.</P><P>Similarly add variables totalNoOfRows with value type Number,</P><P>Variable currentPage with value type Number with initial value 1,</P><P>totalPages with value type Number with initial value 1 and</P><P>variable isRefresh with value type true/false with initial value false and Click on save at top right corner.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Page Variables.gif" style="width: 940px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/360507iEDB6CE9C8D5FA149/image-size/large?v=v2&px=999" role="button" title="Page Variables.gif" alt="Page Variables.gif" /></span></P><P><STRONG>User Interface</STRONG>:</P><P>In User Interface, we install table with data adaptor from marketplace and assign our entity set to it to fetch the data and we will add new property to make table to load the data at each time when user clicks on nav buttons or change number of visible rows.</P><P>Go to User Interface tab and select marketplace and search for basic table with data adapter and install it. Drag and drop the basic table with data adapter to canvas and select configure and select A_product and add the required columns and in properties tab, at pagination in Object with properties, assign noOfVisibleRows page variable to page size, assign currentPage page variable to Page Number and click on save. Click on save and exit and save at top right corner.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Add Table.gif" style="width: 940px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/360530i62FC50D0820553DE/image-size/large?v=v2&px=999" role="button" title="Add Table.gif" alt="Add Table.gif" /></span></P><P>Go to open in component template editor at bottom in properties tab and select properties and in properties, add new property Refresh of type true/false. Go to view and select add logic to Basic table with data adapter at bottom right corner. Drag and drop Receive event and select <STRONG>Internal property 'Refresh' changed</STRONG> and connect end of the receive event to start of get record collection. Click on save and exit. You can see Refresh property in properties tab.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Refresh to table.gif" style="width: 940px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/360531i08EE78FC927D7216/image-size/large?v=v2&px=999" role="button" title="Refresh to table.gif" alt="Refresh to table.gif" /></span></P><P> </P><P>Assign Refresh property with isRefresh page variable</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Refresh mapping.gif" style="width: 800px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/360532i0F96117398F43C7A/image-size/large?v=v2&px=999" role="button" title="Refresh mapping.gif" alt="Refresh mapping.gif" /></span></P><P> </P><P>Now select at page level and open logic canvas. Drag and drop record collection and connect to Page Mounted and assign A_Product to resource and for pagination make Include total count as true by selecting binding type as static values true/false.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Get Record collection.gif" style="width: 940px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/360535i7B7A39606728537D/image-size/large?v=v2&px=999" role="button" title="Get Record collection.gif" alt="Get Record collection.gif" /></span></P><P> </P><P>Now drag and drop set page variable and select variable name as totalNoOfRows and assign formula outputs["Get record collection"].totalCount for value and connect end of get Record Collection top node to start of Set Page Variable node.</P><P>Similarly, drag and drop another set page variable for totalPages and assign formula CEIL(outputs["Get record collection"].totalCount / pageVars.noOfVisibleRows).</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Set Page Variable at page level.gif" style="width: 940px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/361383i999ECD036943F5C1/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Set Page Variable at page level.gif" alt="Set Page Variable at page level.gif" /></span></P><P><STRONG>Add Nav Buttons:</STRONG></P><P>Now drag and drop container at bottom of table and select layout as horizontal.</P><P>Drag and drop button inside the container and name it as First. For disabled, add formula IF(pageVars.currentPage > 1, false, true) and in logic convas, add two set page variables. One for currentPage and set the value to 1 and another for isRefresh and assign formula NOT(pageVars.isRefresh).</P><P>Similarly add another button inside the container and name it as Previous. For disabled, add formula IF(pageVars.currentPage > 1, false, true) and in logic convas, add two set page variables. One for currentPage and assign formula pageVars.currentPage – 1 and another for isRefresh and assign formula NOT(pageVars.isRefresh).</P><P>Add another button inside the container and name it as Next. For disabled, add formula IF(pageVars.currentPage < pageVars.totalPages, false, true) and in logic convas, add two set page variables. One for currentPage and assign formula pageVars.currentPage + 1 and another for isRefresh and assign formula NOT(pageVars.isRefresh).</P><P>Add another button inside the container and name it as Last. For disabled, add formula IF(pageVars.currentPage < pageVars.totalPages, false, true) and in logic convas, add two set page variables. One for currentPage and assign formula pageVars. totalPages and another for isRefresh and assign formula NOT(pageVars.isRefresh).</P><P>Drag and drop text after Previous button and for content add formula pageVars.currentPage + " / " + pageVars.totalPages.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Nav Buttons.gif" style="width: 940px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/361384i5FC9EF97A651D52D/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Nav Buttons.gif" alt="Nav Buttons.gif" /></span></P><P>Drag and drop Dropdown and give label text as No of Rows and select option list -> List of values and add value and give values 10, 25, 50, 100 and save. Make Placeholder text as empty.</P><P>In Logic pane of dropdown field, drag and drop set page variable and assign variable name to noOfVisibleRows and add formula IF(self.value, NUMBER(self.value), pageVars.noOfVisibleRows ) for value.</P><P>Similarly, drag and drop another page variable and assign currentpageno to it and value as 1.</P><P>Another page variable with totalpages and formula for value is CEIL(pageVars.totalNoOfRows / pageVars.noOfVisibleRows) and save at the top right corner.</P><P>Add another page variable with isRefresh with formula for value NOT(pageVars.isRefresh).</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="DropDown.gif" style="width: 940px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/361385iFE8B03C54EDFEAA0/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="DropDown.gif" alt="DropDown.gif" /></span></P><P><STRONG>Preview Application:</STRONG></P><P>Save at top right corner and click on preview and select open web preview. Now, you can see our application with pagination and flexibility to control number of visible rows per page.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Preview.gif" style="width: 940px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/361386i8A9B3F21D632D3CD/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Preview.gif" alt="Preview.gif" /></span></P><P> </P><P> </P><P>By doing this, we can easily add pagination in Table on button click by consuming S/4 Hana cloud oData service with<SPAN> flexibility to control number of visible rows per page</SPAN>. </P><P> </P><P><SPAN>That’s it!!!</SPAN></P><P> </P>2026-01-29T05:36:26.980000+01:00https://community.sap.com/t5/crm-and-cx-blog-posts-by-members/enhancing-customer-data-accuracy-with-sap-dqm-address-validation-in-cx/ba-p/14313467Enhancing Customer Data Accuracy with SAP DQM Address Validation in CX Sales and Service Cloud V22026-02-02T06:29:43.494000+01:00pvsbprasadhttps://community.sap.com/t5/user/viewprofilepage/user-id/7820<H2 id="toc-hId-1788630531">Why Address Quality Matters in Customer Experience</H2><P class="lia-align-justify" style="text-align : justify;">In today’s customer-centric world, <STRONG>accurate address data</STRONG> is far more than a backend requirement — it directly impacts customer satisfaction, operational efficiency, and compliance. Invalid or inconsistent addresses lead to failed deliveries, delayed services, poor agent productivity, and frustrated customers.</P><P class="lia-align-justify" style="text-align : justify;">With <STRONG>SAP CX Service Cloud V2</STRONG>, organizations can significantly improve data quality by integrating <STRONG>SAP Data Quality Management (DQM) – Address Validation Service</STRONG>, ensuring that customer addresses are accurate, standardized, and validated in real time.</P><H2 id="toc-hId-1592117026">What is SAP DQM – Address Validation?</H2><P>SAP DQM Address Validation is a cloud-based service that helps organizations:</P><UL><LI>Validate postal addresses in real time</LI><LI>Standardize address formats based on country-specific rules</LI><LI>Enrich address data with missing components</LI><LI>Reduce duplicates and incorrect records</LI></UL><P>The service supports <STRONG>global address validation</STRONG> across multiple countries, making it ideal for enterprises operating at scale.</P><H2 id="toc-hId-1395603521">Why Integrate DQM with CX Service Cloud V2?</H2><P>CX Service Cloud V2 acts as the <STRONG>single source of truth for customer interactions</STRONG>. Ensuring clean address data at this layer brings several benefits:</P><H3 id="toc-hId-1328172735">Key Business Benefits</H3><UL><LI><span class="lia-unicode-emoji" title=":rocket:">🚀</span>Faster case handling with fewer address-related corrections</LI><LI><span class="lia-unicode-emoji" title=":package:">📦</span>Reduced delivery failures and service disruptions</LI><LI><span class="lia-unicode-emoji" title=":smiling_face_with_smiling_eyes:">😊</span>Improved customer trust and experience</LI><LI><span class="lia-unicode-emoji" title=":bar_chart:">📊</span>Better reporting, analytics, and segmentation</LI></UL><H3 id="toc-hId-1131659230">Key Technical Benefits</H3><UL><LI>Real-time validation during data entry</LI><LI>API-based integration aligned with SAP BTP standards</LI><LI>Reusable validation logic across multiple CX touchpoints</LI></UL><H2 id="toc-hId-806063006">Prerequisites</H2><P>Before enabling the DQM service, ensure the following are in place:</P><UL><LI>SAP BTP account (Cloud Foundry environment)</LI><LI>Entitlement to <STRONG>SAP Data Quality Management, microservices for location data</STRONG></LI><LI>CX Service Cloud V2 tenant</LI><LI>Basic understanding of SAP BTP Destinations and API consumption</LI><LI>SAP Build Apps</LI></UL><P><STRONG><FONT size="4">Enable DQM Service in SAP BTP</FONT></STRONG></P><UL><LI>Navigate to <STRONG>SAP BTP Cockpit</STRONG></LI><LI>Go to <STRONG>Entitlements → Entity Assignments</STRONG></LI><LI>Add entitlement for <STRONG>SAP Data Quality Management</STRONG></LI><LI>Create a <STRONG>Service Instance</STRONG> for Address Validation</LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="pvsbprasad_0-1769168228716.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/364515iA5BE79097C0DA32B/image-size/large?v=v2&px=999" role="button" title="pvsbprasad_0-1769168228716.png" alt="pvsbprasad_0-1769168228716.png" /></span></P><P><STRONG><FONT size="4">Configure Authentication & Access</FONT></STRONG></P><P>DQM services are secured using <STRONG>OAuth 2.0</STRONG>:</P><UL><LI>Create a <STRONG>Service Key</STRONG> for the DQM instance</LI><LI>Capture:<UL><LI>Client ID</LI><LI>Client Secret</LI><LI>Token URL</LI><LI>API endpoint</LI></UL></LI></UL><P>These credentials are used by CX extensions or middleware to securely call the DQM API.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="pvsbprasad_1-1769168384285.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/364517iEE471CDB7C432F44/image-size/large?v=v2&px=999" role="button" title="pvsbprasad_1-1769168384285.png" alt="pvsbprasad_1-1769168384285.png" /></span></P><H2 id="toc-hId-609549501"><FONT size="4">Create Destination in SAP BTP</FONT></H2><P>Create an HTTP destination to consume the DQM service:</P><UL><LI><STRONG>Authentication Type</STRONG>: OAuth2ClientCredentials</LI><LI><STRONG>Token Service URL</STRONG>: From service key</LI><LI><STRONG>Client ID / Secret</STRONG>: From service key</LI><LI><STRONG>Target URL</STRONG>: DQM Address Validation endpoint</LI></UL><P>This destination enables secure and reusable connectivity from:</P><UL><LI>SAP Build Apps</LI><LI>SAP Build Process Automation</LI><LI>Custom CX extensions</LI></UL><P>Similarly create for SAP Service Cloud V2</P><H3 id="toc-hId-542118715"><FONT size="4">Create SAP Build Apps Project</FONT></H3><UL><LI>Open <STRONG>SAP Build Apps</STRONG></LI><LI>Create a new project (Web or Responsive App)</LI><LI>Choose <STRONG>Blank App</STRONG> or <STRONG>Master-Detail template</STRONG></LI><LI>Name it: <CODE>CX_Address_Validation_App</CODE></LI><LI>Design your site as per you requirement </LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="pvsbprasad_0-1769169028679.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/364550iA6620ADB4FAEA443/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="pvsbprasad_0-1769169028679.png" alt="pvsbprasad_0-1769169028679.png" /></span></P><H2 id="toc-hId-216522491">Create Mashup in CX Service Cloud V2</H2><UL><LI>Log in to <STRONG>CX Service Cloud V2</STRONG></LI><LI>Navigate to:<BR /><STRONG>Administrator → Mashup Authoring</STRONG></LI><LI>Click <STRONG>New Mashup</STRONG></LI><LI>Provide:<UL><LI>Name: <CODE>Address Validation – DQM</CODE></LI><LI>Type: URL Mashup</LI><LI>URL: Build Apps deployed URL</LI></UL></LI></UL><P>✔ Save the mashup.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="pvsbprasad_1-1769169232278.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/364551iD84B47AF8011C9D9/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="pvsbprasad_1-1769169232278.png" alt="pvsbprasad_1-1769169232278.png" /></span></P><H2 id="toc-hId-20008986">Embedded Mashup in Account - CX Service Cloud V2</H2><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="pvsbprasad_2-1769169426425.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/364555iFD09312F83310751/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="pvsbprasad_2-1769169426425.png" alt="pvsbprasad_2-1769169426425.png" /></span></P><P>For a detailed walkthrough of the functionality, please refer to the video.<BR />It showcases the embedded address validation experience in CX Service Cloud V2.</P><P><div class="video-embed-left video-embed"><iframe class="embedly-embed" src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FL5ZJDoyK3_k%3Ffeature%3Doembed&display_name=YouTube&url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DL5ZJDoyK3_k&image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FL5ZJDoyK3_k%2Fhqdefault.jpg&type=text%2Fhtml&schema=youtube" width="600" height="337" scrolling="no" title="Enhancing Customer Data Accuracy with SAP DQM Address Validation in CX Service Cloud V2" frameborder="0" allow="autoplay; fullscreen; encrypted-media; picture-in-picture;" allowfullscreen="true"></iframe></div></P>2026-02-02T06:29:43.494000+01:00https://community.sap.com/t5/supply-chain-management-blog-posts-by-sap/build-custom-joule-agent-to-analyze-blocked-freight-order-in-s-4hana-tm/ba-p/14323546Build custom Joule Agent to analyze blocked freight order in S/4HANA TM2026-02-08T01:49:35.777000+01:00HariPanakkalhttps://community.sap.com/t5/user/viewprofilepage/user-id/162762<P>In this blog, the objective is to build a custom Joule agent with multiple skills that analyzes a blocked freight order in the S/4HANA Transportation Management (TM) solution.</P><P>To keep the scenario simple, the agent analyzes blocks caused by time conflicts and explains them in simple business language.</P><P><STRONG>What you will learn</STRONG></P><P>By the end of this blog, you will understand:</P><UL><LI>The prerequisites for building this use case</LI><LI>How to expose TM documents as OData services consumable by Joule</LI><LI>How to create Build Actions, Joule Skills, and a Joule Agent</LI><LI>How to write basic instructions for the Joule Agent</LI><LI>How to test and fine-tune the agent</LI></UL><P>All of this can be done with <STRONG>minimal or no coding</STRONG>. With the right access and setup, even a business user can follow these steps and build a basic scenario in about 30 minutes. The approach is similar across S/4HANA solutions, with different OData services used to fetch backend data.</P><P>Let’s look at the high-level steps</P><OL><LI>Pre-requisites</LI><LI>Identify available CDS views in S/4HANA TM and wrap it with an OData service</LI><LI>Configure SAP Cloud Connector – Joule (from public internet) needs secure communication channel to connect your ERP environment</LI><LI>Define Destinations on your BTP subaccount - connect to the OData service via cloud connector</LI><LI>Define Actions in Joule Studio</LI><LI>Define Joule Skills</LI><LI>Define Joule Agent</LI><LI>Test!</LI></OL><P>Let’s look at the steps in detail.</P><OL><LI><STRONG>STEP 1: Pre-requisites</STRONG></LI></OL><P> You need the following to run this scenario,</P><UL><LI>An S/4HANA private or on-premise environment</LI><LI>Eclipse IDE with ABAP Development Toolkit (ADT) – <A href="https://developers.sap.com/tutorials/abap-install-adt..html" target="_blank" rel="noopener noreferrer">see the tutorial</A> if you haven’t done</LI><LI>SAP Cloud Connector installed in your landscape – <A href="https://learning.sap.com/courses/connecting-sap-btp-with-on-premise-via-cloud-connector/installing-the-cloud-connector_cf9917b4-da92-4ef3-aee1-3f43c4690de6" target="_blank" rel="noopener noreferrer">follow this</A> if haven’t done</LI><LI>An SAP BTP subaccount with Joule Studio (Joule studio is one of the components of SAP Build) – follow <A href="https://discovery-center.cloud.sap/missiondetail/4651/4940/" target="_blank" rel="noopener nofollow noreferrer">SAP Discovery Center Mission</A> for steps to do that.</LI></UL><P><STRONG>STEP 2: Identify available CDS views in S/4HANA TM and wrap it with an OData service</STRONG></P><P> Look at the SAP documentation for all <A href="https://help.sap.com/docs/SAP_S4HANA_ON-PREMISE/ee6ff9b281d8448f96b4fe6c89f2bdc8/8573b810511948c8a99c0672abc159aa.html" target="_blank" rel="noopener noreferrer">available standard S/4HANA CDS views</A>. For S/4HANA TM, <A href="https://help.sap.com/docs/SAP_S4HANA_ON-PREMISE/ee6ff9b281d8448f96b4fe6c89f2bdc8/612fca192298463c8012feeef8b84de5.html" target="_blank" rel="noopener noreferrer">see here</A>. In this use case, we require data from Freight Order, its item and stop nodes. So, let’s login to S/4HANA system and create an OData service for the three CDS views.</P><P>Select a package and create a service definition</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="HariPanakkal_0-1770511371724.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369872i37481BD972D5FCEA/image-size/medium?v=v2&px=400" role="button" title="HariPanakkal_0-1770511371724.png" alt="HariPanakkal_0-1770511371724.png" /></span></P><P> </P><P>Select referenced object as the respective CDS view and create and activate the service definition for the three CDS views.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="HariPanakkal_1-1770511371726.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369871iE9A2C97E299B5C59/image-size/medium?v=v2&px=400" role="button" title="HariPanakkal_1-1770511371726.png" alt="HariPanakkal_1-1770511371726.png" /></span></P><P> </P><P>Once created the definition, create a service binding by right click on each definition. Follow the wizard and after creation, activate the binding and then publish it. You can see the service URL and note that down. You can as well test the service now.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="HariPanakkal_2-1770511371743.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369873iA34C05F690F2584D/image-size/medium?v=v2&px=400" role="button" title="HariPanakkal_2-1770511371743.png" alt="HariPanakkal_2-1770511371743.png" /></span></P><P> </P><P><STRONG>STEP 3: Configure Cloud Connector</STRONG></P><P>Login to your SAP Cloud connector and Configure cloud to On-premise for the subaccount you are going to use for Joule. ‘/’ expose all which is not ideal, but fine for testing environments.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="HariPanakkal_3-1770511371752.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369875i0F5E362C02AA29CF/image-size/medium?v=v2&px=400" role="button" title="HariPanakkal_3-1770511371752.png" alt="HariPanakkal_3-1770511371752.png" /></span></P><P> </P><P><STRONG>STEP 4: Define Destinations on your BTP subaccount</STRONG></P><P>Now login to your BTP sub-account and navigate to ConnectivityDestinations and create a destination of type ‘HTTP,’ proxytype ‘OnPremise’.</P><P>The URL must be constructed by combining virtual host URL in cloud connector with service end point. Also add additional properties as shown in the screenshot.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="HariPanakkal_4-1770511371768.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369876i2CBEC03B93D37014/image-size/medium?v=v2&px=400" role="button" title="HariPanakkal_4-1770511371768.png" alt="HariPanakkal_4-1770511371768.png" /></span></P><P> </P><P><STRONG>STEP 5: Define Build Actions</STRONG></P><P>Now navigate to your Joule Studio (SAP Build) environment.</P><P>Navigate to the ConnectorsActions and create an action to fetch freight orders which are blocked.</P><P>Once you click create, select OData Destinations as API source. It will display all OData destinations defined in the subaccount. Pick the destination created in step 4.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="HariPanakkal_5-1770511371774.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369874i480261DDCBA0B3F5/image-size/medium?v=v2&px=400" role="button" title="HariPanakkal_5-1770511371774.png" alt="HariPanakkal_5-1770511371774.png" /></span></P><P> </P><P>It displays the available services in the underlying CDS view. Select Next and provide a meaningful name and description. Then navigate to the created action project.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="HariPanakkal_6-1770511371780.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369878iC7F3066AEB354569/image-size/medium?v=v2&px=400" role="button" title="HariPanakkal_6-1770511371780.png" alt="HariPanakkal_6-1770511371780.png" /></span></P><P> </P><P>Initially, the OData service will be with its basic definition. We need to add filter to fetch only filter blocked freight order (just pick execution blocked).</P><P>For this, click $filter parameter and then click Value F4 help in the popup. You can use condition editor or Text Expression.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="HariPanakkal_7-1770511371782.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369877iEEC304DDB212EC5B/image-size/medium?v=v2&px=400" role="button" title="HariPanakkal_7-1770511371782.png" alt="HariPanakkal_7-1770511371782.png" /></span></P><P> </P><P><STRONG>Reduce output fields</STRONG></P><P>In the <STRONG>Output</STRONG> tab:</P><OL><LI>Select the <STRONG>Body</STRONG> parameter.</LI><LI>Remove unnecessary fields.</LI></OL><P>For this scenario, keep only:</P><UL><LI>Order number</LI><LI>Description</LI><LI>UUID</LI></UL><P>You can test the action under the <STRONG>Test</STRONG> tab by selecting the destination and clicking <STRONG>Test</STRONG>.</P><P>If destination is not visible, Go to Control Tower view of Build and select Destinations and add the destination you created before.</P><P>Do these steps to create three actions to fetch root, item and stop information. Idea here is, first fetch root and then PRD item. From item node, get the FU and go to FU stop to get acceptable and planned dates. Provide all this information to Joule for analysis.</P><P>While creating action for item,</P><UL><LI>add a filter to restrict only PRD items.</LI><LI>Reduce the Output to have only freightUnitUUID field.</LI></UL><P>While creating action for stop,</P><UL><LI>Reduce output to pick only location, stoprole, stopcategory,acceptable start and end time and planned time.</LI></UL><P><STRONG>STEP 6: Define Joule Skill</STRONG></P><P>Navigate to Build Lobby and click create and select Joule Agent and skill. Once the project is created, click create and select Joule Skill. Provide a clear name and description of the skill.</P><P>Click on conversation starter and provide the prompt. Example ‘get execution blocked freight order with stop details and analyze the reason for block’</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="HariPanakkal_8-1770511371792.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369879i56532CABECD1E634/image-size/medium?v=v2&px=400" role="button" title="HariPanakkal_8-1770511371792.png" alt="HariPanakkal_8-1770511371792.png" /></span></P><P> </P><P>You don’t need any other input from user as we already did filter in our action to pick execution blocked freight orders.</P><P>Add the action by clicking the ‘+’ button and select our action to fetch freight order root.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="HariPanakkal_9-1770511371796.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369882i81E8836B047A1B1B/image-size/medium?v=v2&px=400" role="button" title="HariPanakkal_9-1770511371796.png" alt="HariPanakkal_9-1770511371796.png" /></span></P><P> </P><P>Navigate to skill parameter (select anywhere in the editor and click >> button to view skill parameter). Select the output for http 200 code as shown below.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="HariPanakkal_10-1770511371801.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369881i732A369B5BF1255B/image-size/medium?v=v2&px=400" role="button" title="HariPanakkal_10-1770511371801.png" alt="HariPanakkal_10-1770511371801.png" /></span></P><P> </P><P>Finally bind the skill output to the trigger end of action.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="HariPanakkal_11-1770511371806.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369880i2D2A36440E32E587/image-size/medium?v=v2&px=400" role="button" title="HariPanakkal_11-1770511371806.png" alt="HariPanakkal_11-1770511371806.png" /></span></P><P> </P><P>Likewise create other skills to fetch item and stop nodes.</P><P>For item skill,</P><UL><LI>Skill input must be TransportationOrderUUID</LI><LI>Map skill input to action input as shown below</LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="HariPanakkal_12-1770511371809.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369883i789C04192FD30EED/image-size/medium?v=v2&px=400" role="button" title="HariPanakkal_12-1770511371809.png" alt="HariPanakkal_12-1770511371809.png" /></span></P><P> </P><UL><LI>Finally map skill output to trigger end.</LI></UL><P>For stop skill,</P><UL><LI>Skill input must be FreightUnitUUID</LI><LI>Map skill input to action inputs shown below</LI><LI><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="HariPanakkal_13-1770511371812.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369884iF9EEAD8F9CF7FC91/image-size/medium?v=v2&px=400" role="button" title="HariPanakkal_13-1770511371812.png" alt="HariPanakkal_13-1770511371812.png" /></span><P> </P></LI></UL><P><STRONG>STEP 7 – Create Joule Agent</STRONG></P><P>In the project, create ‘Joule Agent’ and navigate to agent definition screen.</P><P>Define ‘Expertise’ which provides the persona of the agent and ‘Instructions’ as system prompt on how to analyze reason for blocked freight order. Write that in plain, simple English. An example as shown below.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="HariPanakkal_14-1770511371822.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369885i7A5CD1505AC5EF4B/image-size/medium?v=v2&px=400" role="button" title="HariPanakkal_14-1770511371822.png" alt="HariPanakkal_14-1770511371822.png" /></span></P><P> </P><P>Provide some few-shot learnings to the agent as part of instructions. Example below</P><P><EM>##Example 1 (case with date 'TranspOrdStopPlanTranspDteTme' is before date 'TranspOrdStopAccptblStrtDteTme') </EM></P><P><EM>Given the following Freight unit stop details:</EM></P><P><EM>- Transportation stop acceptable start date: 10-January-2026</EM></P><P><EM>- Transportation stop acceptable end date: 12-January-2026</EM></P><P><EM>- Transportation stop planned date: 8-January-2026</EM></P><P><EM>// Business Rule: date 'TranspOrdStopPlanTranspDteTme' must be after date 'TranspOrdStopAccptblStrtDteTme' </EM></P><P><EM>// Analysis: 8-January-2026 is NOT after 10-January-2026</EM></P><P><EM>// Expected blocked freight order Analysis result: Since planned date is not after acceptable start dates, freight order is blocked</EM></P><P>Select your desired LLM provider, base and advanced model. Example OpenAI, GPT-4o Mini and GPT-4o. Save the agent definition.</P><P>Navigate to the Tools tab and add the three skills to the Agent you created before,</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="HariPanakkal_1-1770649728827.png" style="width: 608px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/370522i1A7B12DED8151A66/image-dimensions/608x266?v=v2" width="608" height="266" role="button" title="HariPanakkal_1-1770649728827.png" alt="HariPanakkal_1-1770649728827.png" /></span></P><P> </P><P>At the end, your project will have one Joule Agent and three Joule Skills.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="HariPanakkal_0-1770649597577.png" style="width: 686px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/370521i98A5ED93D81473D5/image-dimensions/686x348?v=v2" width="686" height="348" role="button" title="HariPanakkal_0-1770649597577.png" alt="HariPanakkal_0-1770649597577.png" /></span></P><P> </P><P><STRONG>STEP 8: Testing!</STRONG></P><P>Click on the Test icon at the top of the project. Select the actual destinations within BTP to be used at runtime.</P><P>The conversation starter will appear and click that.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="HariPanakkal_15-1770511371826.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369886i4AD250553E4FA5E4/image-size/medium?v=v2&px=400" role="button" title="HariPanakkal_15-1770511371826.png" alt="HariPanakkal_15-1770511371826.png" /></span></P><P> </P><P>The agent will:</P><UL><LI>Select the required skills</LI><LI>Execute them in the appropriate sequence</LI><LI>Map parameters between skills</LI><LI>Evaluate the data</LI><LI>Return a business-friendly analysis using the selected LLM</LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="HariPanakkal_16-1770511371837.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369887i4297F8147340863B/image-size/medium?v=v2&px=400" role="button" title="HariPanakkal_16-1770511371837.png" alt="HariPanakkal_16-1770511371837.png" /></span></P><P> </P><P> </P><P><STRONG>Summary:</STRONG></P><P>This example demonstrates how easy it is to build custom Joule agents and skills.<BR />The same approach can be applied to other S/4HANA solutions and a wide range of use cases.</P><P>This blog should help anyone new to Joule get started and build a simple proof of concept.</P>2026-02-08T01:49:35.777000+01:00https://community.sap.com/t5/artificial-intelligence-blogs-posts/creating-a-hello-world-joule-agent/ba-p/14326323Creating a ‘Hello World’ Joule Agent2026-02-11T11:55:37.566000+01:00chrwittmhttps://community.sap.com/t5/user/viewprofilepage/user-id/47150<DIV class=""><DIV class=""><DIV class=""><DIV class=""><P>Building on Michael Ameling's excellent<SPAN> </SPAN><A href="https://community.sap.com/t5/artificial-intelligence-blogs-posts/agent-builder-in-joule-studio-is-now-generally-available-build-your-own/ba-p/14289282" target="_blank">Agent Builder in Joule Studio announcement</A><SPAN> </SPAN>and<SPAN> </SPAN><A href="https://community.sap.com/t5/technology-blog-posts-by-sap/the-joule-studio-learning-series-lead-agentic-development-with-confidence/ba-p/14258233" target="_blank">The Joule Studio Learning Series</A>, this post will guide you through building your first Joule Agent.</P><P>I'll walk you through the steps to build a "Hello, World" agent. Along the way, you'll get familiar with the basic workflow in SAP Build, explore the UI, avoid at least one common pitfall, and have your agent up and running in just a few minutes. By building the simplest possible agent, you'll gain the confidence that building agents is easy, and creating more sophisticated ones will feel like a natural next step. Let's get started.<BR /><BR /></P></DIV></DIV></DIV></DIV><DIV class=""><DIV class=""><DIV class=""><SPAN>Setup and Prerequisites</SPAN></DIV><DIV class=""><SPAN>The setup of</SPAN><SPAN> </SPAN><A href="https://discovery-center.cloud.sap/serviceCatalog/sap-build-apps" target="_blank" rel="noopener nofollow noreferrer">SAP Build Apps</A><SPAN>, the activation of Joule, and the</SPAN><SPAN> </SPAN><A href="https://discovery-center.cloud.sap/ai-feature/c95490eb-95c3-4b0a-b9ea-08144355d482/" target="_blank" rel="noopener nofollow noreferrer">SAP Agent Builder</A><SPAN> </SPAN><SPAN>are described in these two blog posts:</SPAN></DIV><DIV class=""><DIV class=""><UL><LI><A href="https://community.sap.com/t5/tooling-sap-build-blog-posts/how-to-get-started-with-joule-studio/ba-p/14152855" target="_blank">How to Get Started with Joule Studio</A></LI><LI><A href="https://community.sap.com/t5/technology-blog-posts-by-sap/activate-joule-studio-in-5-simple-steps/ba-p/14252945" target="_blank">Activate Joule Studio in 5 Simple Steps</A></LI></UL><P>I'll assume that's done, and we'll start our journey in the lobby of SAP Build Apps.<BR /><BR /></P></DIV></DIV></DIV></DIV><DIV class=""><DIV class=""><DIV class=""><SPAN>Creating a Project</SPAN></DIV><DIV class=""><SPAN>Click on the "Create" button, and select "Joule Skill":</SPAN></DIV><DIV class=""> </DIV></DIV></DIV><DIV class=""><DIV class=""><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="chrwittm_0-1770806611874.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/371494i7BB92533F1AB12F0/image-size/medium?v=v2&px=400" role="button" title="chrwittm_0-1770806611874.png" alt="chrwittm_0-1770806611874.png" /></span></DIV></DIV></DIV><DIV class=""><DIV class=""><DIV class=""><DIV class=""> </DIV><DIV class=""><SPAN>Enter a name and a description:</SPAN></DIV></DIV></DIV></DIV><DIV class=""><DIV class=""><DIV class=""><DIV class=""> </DIV><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="chrwittm_1-1770806612204.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/371492i13D65C943F8CEFF0/image-size/medium?v=v2&px=400" role="button" title="chrwittm_1-1770806612204.png" alt="chrwittm_1-1770806612204.png" /></span></DIV></DIV></DIV></DIV><DIV class=""><DIV class=""><DIV class=""><DIV class=""><H2 id="Creating-the-Joule-Agent" id="toc-hId-1789642336">Creating the Joule Agent</H2><P>You'll be forwarded to the overview of your project where you can create the Joule Agent:<BR /><BR /></P></DIV></DIV></DIV></DIV><DIV class=""><DIV class=""><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="chrwittm_2-1770806612038.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/371493i0DC1DEDBDDA5DC8C/image-size/medium?v=v2&px=400" role="button" title="chrwittm_2-1770806612038.png" alt="chrwittm_2-1770806612038.png" /></span></DIV><DIV class=""><DIV class=""> </DIV></DIV></DIV></DIV><DIV class=""><DIV class=""><DIV class=""><DIV class=""><P>Again, enter a name and a description. A proposal for the identifier will be generated automatically:<BR /><BR /></P></DIV></DIV></DIV></DIV><DIV class=""><DIV class=""><DIV class=""><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="chrwittm_3-1770806612201.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/371496iE40AB3F5ABD663F1/image-size/medium?v=v2&px=400" role="button" title="chrwittm_3-1770806612201.png" alt="chrwittm_3-1770806612201.png" /></span></DIV></DIV></DIV></DIV><DIV class=""><DIV class=""><DIV class=""><DIV class=""> </DIV><DIV class=""><SPAN>On the details page of your Hello World Agent, you could fill in the fields manually, but let's use Joule to create a proposal. In the top left, click on the Joule icon to open the Joule sidebar. Enter a prompt like this:</SPAN></DIV><DIV class=""><P><EM>"Can you please update our existing Hello World agent by filling in the expertise, instructions and additional context? The agent should respond to every prompt with "Hello, World!"."</EM></P></DIV></DIV></DIV></DIV><DIV class=""><DIV class=""><DIV class=""> </DIV><DIV class=""><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="chrwittm_4-1770806612211.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/371497iF7862246BF4E20FD/image-size/medium?v=v2&px=400" role="button" title="chrwittm_4-1770806612211.png" alt="chrwittm_4-1770806612211.png" /></span></DIV></DIV></DIV></DIV><DIV class=""><DIV class=""><DIV class=""><DIV class=""> </DIV><DIV class=""><SPAN>As a result, Joule updates the agent, and we're almost done. We just need to add a placeholder tool, for example the calculator, because Joule Studio does not allow an agent to be saved without a tool assignment:<BR /><BR /></SPAN></DIV></DIV></DIV></DIV><DIV class=""><DIV class=""><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="chrwittm_5-1770806611734.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/371495i3018B85974D57BBE/image-size/medium?v=v2&px=400" role="button" title="chrwittm_5-1770806611734.png" alt="chrwittm_5-1770806611734.png" /></span></DIV><DIV class=""><DIV class=""> </DIV></DIV></DIV></DIV><DIV class=""><DIV class=""><DIV class=""><DIV class=""><SPAN>Now you can save the agent, and we can move on to testing the functionality we've just implemented.<BR /><BR /></SPAN></DIV></DIV></DIV></DIV><DIV class=""><DIV class=""><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="chrwittm_6-1770806611749.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/371499i661DA330B91E76B3/image-size/medium?v=v2&px=400" role="button" title="chrwittm_6-1770806611749.png" alt="chrwittm_6-1770806611749.png" /></span></DIV><DIV class=""><DIV class=""> </DIV></DIV></DIV></DIV><DIV class=""><DIV class=""><DIV class=""><DIV class=""><H2 id="Testing-the-Joule-Agent" id="toc-hId-1593128831">Testing the Joule Agent</H2><P>When you click on the "Test" button (just above the "Save" button), you'll be asked which environment you'd like to test in. Select the environment associated with your email address.<BR /><BR /></P></DIV></DIV></DIV></DIV><DIV class=""><DIV class=""><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="chrwittm_7-1770806611729.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/371498i1927DE974F995B2B/image-size/medium?v=v2&px=400" role="button" title="chrwittm_7-1770806611729.png" alt="chrwittm_7-1770806611729.png" /></span></DIV></DIV></DIV><DIV class=""><DIV class=""><DIV class=""><DIV class=""><P>If your email address doesn't appear in the dropdown, you need to activate your private environment first. To do so, click on the SAP Build icon in the top left corner, click on "Control Tower" in the left-hand menu, and then click on the "Environments" tile:<BR /><BR /></P></DIV></DIV></DIV></DIV><DIV class=""><DIV class=""><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="chrwittm_8-1770806611809.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/371500i42888685C81F20CD/image-size/medium?v=v2&px=400" role="button" title="chrwittm_8-1770806611809.png" alt="chrwittm_8-1770806611809.png" /></span></DIV><DIV class=""><DIV class=""><P><SPAN>On the Environments screen, click the button to activate your private environment:<BR /><BR /></SPAN></P></DIV></DIV></DIV></DIV><DIV class=""><DIV class=""><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="chrwittm_9-1770806611844.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/371501iD09BC46B0E250602/image-size/medium?v=v2&px=400" role="button" title="chrwittm_9-1770806611844.png" alt="chrwittm_9-1770806611844.png" /></span></DIV><DIV class=""><DIV class=""><P><SPAN>Afterwards, you can resume testing and your private environment should appear in the dropdown as described above.</SPAN></P></DIV></DIV></DIV></DIV><DIV class=""><DIV class=""><DIV class=""><DIV class=""><P>Now we're ready to test the agent, for example with a prompt like<SPAN> </SPAN><EM>"Let's test the agent"</EM>.<BR /><BR /></P></DIV></DIV></DIV></DIV><DIV class=""><DIV class=""><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="chrwittm_10-1770806611885.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/371502iE5B6A3D5B02BB0E7/image-size/medium?v=v2&px=400" role="button" title="chrwittm_10-1770806611885.png" alt="chrwittm_10-1770806611885.png" /></span></DIV><DIV class=""><DIV class=""> </DIV></DIV></DIV></DIV><DIV class=""><DIV class=""><DIV class=""><DIV class=""> </DIV><DIV class=""><SPAN>As we can see, the agent correctly responds with</SPAN><SPAN> </SPAN><EM>"Hello, World!"</EM><SPAN> </SPAN><SPAN><span class="lia-unicode-emoji" title=":grinning_face_with_sweat:">😅</span></SPAN></DIV><DIV class=""><P>To end the test session, just click on the "Stop Testing" button.<BR /><BR /><SPAN>Deploying the Joule Agent</SPAN></P></DIV></DIV></DIV></DIV><DIV class=""><DIV class=""><DIV class=""><DIV class=""><P>To get our agent out of the testing environment, we need to deploy it to a real environment.</P><P>Let's create a Hello World environment. Navigate to the Control Tower, select the Environments tile, and click on "Create". Enter a name and description for the environment. The proposal for the identifier will be generated automatically.</P></DIV></DIV></DIV></DIV><DIV class=""><DIV class=""><DIV class=""> </DIV><DIV class=""><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="chrwittm_11-1770806612002.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/371503i43EFFA12B2A40822/image-size/medium?v=v2&px=400" role="button" title="chrwittm_11-1770806612002.png" alt="chrwittm_11-1770806612002.png" /></span></DIV></DIV></DIV></DIV><DIV class=""><DIV class=""><DIV class=""><DIV class=""><P>Your user will be automatically added to this new environment. If you see a blank screen when you want to view the environment details, just try refreshing the page in the browser. It may take a little while to generate.</P></DIV></DIV></DIV></DIV><DIV class=""><DIV class=""><DIV class=""><DIV class=""><P>Once the environment is active, we can deploy our agent. Click on the "Release" button in the agent overview.</P></DIV></DIV></DIV></DIV><DIV class=""><DIV class=""><DIV class=""><DIV class=""> </DIV><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="chrwittm_12-1770806611901.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/371505i85EB18CF0CA8821B/image-size/medium?v=v2&px=400" role="button" title="chrwittm_12-1770806611901.png" alt="chrwittm_12-1770806611901.png" /></span></DIV></DIV></DIV></DIV><DIV class=""><DIV class=""><DIV class=""><DIV class=""><P>In the subsequent pop-up, enter a release note and click on "Release".</P></DIV></DIV></DIV></DIV><DIV class=""><DIV class=""><DIV class=""> </DIV><DIV class=""><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="chrwittm_13-1770806611903.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/371504i6AF016A57C5075A3/image-size/medium?v=v2&px=400" role="button" title="chrwittm_13-1770806611903.png" alt="chrwittm_13-1770806611903.png" /></span></DIV></DIV></DIV></DIV><DIV class=""><DIV class=""><DIV class=""><DIV class=""><P>Once released, switch to version 1.0.0 at the top of the screen by clicking on the dropdown next to the title.</P></DIV></DIV></DIV></DIV><DIV class=""><DIV class=""><DIV class=""> </DIV><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="chrwittm_14-1770806611940.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/371506iEB216D4CB76BC446/image-size/medium?v=v2&px=400" role="button" title="chrwittm_14-1770806611940.png" alt="chrwittm_14-1770806611940.png" /></span></DIV><DIV class=""><DIV class=""> </DIV></DIV></DIV></DIV><DIV class=""><DIV class=""><DIV class=""><DIV class=""><P>In the released version, there is a "Deploy" button instead of the "Test" and "Release" buttons. Click on the "Deploy" button, select the Hello World environment, and click on "Deploy".</P></DIV></DIV></DIV></DIV><DIV class=""><DIV class=""><DIV class=""> </DIV><DIV class=""><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="chrwittm_15-1770806612028.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/371509i4CF5DB08C5A2B376/image-size/medium?v=v2&px=400" role="button" title="chrwittm_15-1770806612028.png" alt="chrwittm_15-1770806612028.png" /></span></DIV></DIV></DIV></DIV><DIV class=""><DIV class=""><DIV class=""><DIV class=""> </DIV><DIV class=""><SPAN>After a few moments, the status of agent version 1.0.0 will change to "Deployed and Active".<BR /><BR /></SPAN></DIV></DIV></DIV></DIV><DIV class=""><DIV class=""><DIV class=""><DIV class=""><H2 id="Testing-the-Deployment" id="toc-hId-1396615326">Testing the Deployment</H2><P>As a final step in this tutorial, let's test our deployed agent in the Hello World environment.</P><P>Open the Hello World environment via the Control Tower and view the environment details by clicking on it in the list. There, you will see the deployment of the Hello World agent we just made.</P><P>To test it, open the Joule tab for this environment. Depending on your screen resolution, this may be hidden in the "More" drop-down. On this tab, click the "Launch" button.</P></DIV></DIV></DIV></DIV><DIV class=""><DIV class=""><DIV class=""> </DIV><DIV class=""><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="chrwittm_16-1770806612062.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/371508i6EA613C347A86FFA/image-size/medium?v=v2&px=400" role="button" title="chrwittm_16-1770806612062.png" alt="chrwittm_16-1770806612062.png" /></span></DIV></DIV></DIV></DIV><DIV class=""><DIV class=""><DIV class=""><DIV class=""><P>Joule will open in a new tab and we can prompt it to test the agent, for example like this:<SPAN> </SPAN><EM>"Run the Hello World agent."<BR /><BR /></EM></P></DIV></DIV></DIV></DIV><DIV class=""><DIV class=""><DIV class=""><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="chrwittm_17-1770806612064.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/371507i3D70E7329DA310C6/image-size/medium?v=v2&px=400" role="button" title="chrwittm_17-1770806612064.png" alt="chrwittm_17-1770806612064.png" /></span></DIV></DIV></DIV></DIV><DIV class=""><DIV class=""><DIV class=""><DIV class=""><P>To confirm that Joule actually called the agent, you can investigate the log by clicking on the icon in the top right of the title bar.</P></DIV></DIV></DIV></DIV><DIV class=""><DIV class=""><DIV class=""> </DIV><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="chrwittm_18-1770806612206.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/371510i61BCDE0134BB0937/image-size/medium?v=v2&px=400" role="button" title="chrwittm_18-1770806612206.png" alt="chrwittm_18-1770806612206.png" /></span></DIV><DIV class=""><DIV class=""> </DIV></DIV></DIV></DIV><DIV class=""><DIV class=""><DIV class=""><DIV class=""><H2 id="Conclusion" id="toc-hId-1200101821">Conclusion</H2><P>Congratulations, you just implemented your first Joule agent! As intended, the overall result is "just" a Hello World agent, but this is an important first step in your journey to becoming a Joule agent builder. You familiarized yourself with the UI and performed the full workflow from start to finish, including creating a project, creating an agent, testing, and deploying it. Along the way, we also used Joule itself to fill in the agent's configuration details.</P><P>From here, there are many more topics worth exploring, like Joule skills, MCP integration, or agent-to-agent communication. However, for me, it's always important to build a Hello World example first without getting lost in the details. With more complex starter scenarios, it's easy to get stuck on technical details and lose sight of the big picture. Now that you've completed your "Hello World", you can iteratively add more features and build more sophisticated agents. What's the first use case you're going to tackle?</P></DIV></DIV></DIV></DIV>2026-02-11T11:55:37.566000+01:00