https://raw.githubusercontent.com/ajmaradiaga/feeds/main/scmt/topics/ABAP-Cloud-blog-posts.xmlSAP Community - ABAP Cloud2024-09-01T02:00:01.212342+00:00python-feedgenABAP Cloud blog posts in SAP Communityhttps://community.sap.com/t5/technology-blogs-by-members/upload-and-modify-openxml-documents-via-rap-app-in-sap-btp-abap-environment/ba-p/13725740Upload and modify OpenXML documents via RAP App in SAP BTP ABAP Environment2024-06-12T21:50:36.096000+02:00ReinertMhttps://community.sap.com/t5/user/viewprofilepage/user-id/175444<H1 id="toc-hId-887546652">Introduction</H1><P>In this blog post, I would like to share some insights for generating OpenXML documents by use of the RESTful Application Programming Model with Cloud-released development objects. With this app, you will be able to upload .docx templates and fill them with information from you CDS view (could be used for generating invoices, business documents and so on...). </P><H1 id="toc-hId-691033147">Prerequesites</H1><UL><LI>SAP BTP ABAP environment or an S/4 system to your disposal. </LI><LI>Eclipse IDE installed on your local machine with the ABAP Development Tools.</LI></UL><H1 id="toc-hId-494519642">Shortcut with abapGit:</H1><P>For those who are using abapGit, feel free to check out the code from my <A href="https://github.com/cnbscorp/InvoiceGenerator.git" target="_self" rel="nofollow noopener noreferrer">GitHub repo</A>!</P><H1 id="toc-hId-298006137">Step 1:</H1><P>Create a database table with the following config (hint: do not forget to generate custom domains for mime type and attachment type, information on how to do this can be found <A href="https://community.sap.com/t5/technology-blogs-by-sap/streams-in-rap-uploading-pdf-excel-and-other-files-in-rap-application/ba-p/13526891" target="_self">here</A>.</P><P> </P><pre class="lia-code-sample language-abap"><code>@EndUserText.label : 'Invoice for document generation'
@AbapCatalog.enhancement.category : #EXTENSIBLE_ANY
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #A
@AbapCatalog.dataMaintenance : #RESTRICTED
define table zmri_invoice {
key client : abap.clnt not null;
key invoice : ebeln not null;
comments : abap.char(30);
attachment : zmriattachment;
mimetype : zmimetype;
filename : zfilename;
purchaseorder : abap.char(30);
price : abap.dec(8,2);
local_created_by : abp_creation_user;
local_created_at : abp_creation_tstmpl;
local_last_changed_by : abp_locinst_lastchange_user;
local_last_changed_at : abp_locinst_lastchange_tstmpl;
last_changed_at : abp_lastchange_tstmpl;
}</code></pre><P> </P><H1 id="toc-hId-101492632">Step 2: </H1><P>Generate ABAP repository objects by right-clicking on the previously created database table. <BR />Choose the ABAP RESTful Application Programming Model (OData UI Service) variant.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="ABAP repository objects.PNG" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/121410i26541C33D447E274/image-size/medium?v=v2&px=400" role="button" title="ABAP repository objects.PNG" alt="ABAP repository objects.PNG" /></span></P><H1 id="toc-hId--95020873">Step 3</H1><P>Create a custom action in your Behavior Definition: </P><P> </P><pre class="lia-code-sample language-abap"><code>managed implementation in class ZBP_R_MRI_INVOICE unique;
strict ( 2 );
with draft;
define behavior for ZR_MRI_INVOICE alias ZrMriInvoice
persistent table ZMRI_INVOICE
draft table ZMRI_INVOIC000_D
etag master LocalLastChangedAt
lock master total etag LastChangedAt
authorization master( global )
{
field ( mandatory : create )
Invoice;
field ( readonly )
LocalCreatedBy,
LocalCreatedAt,
LocalLastChangedBy,
LocalLastChangedAt,
LastChangedAt;
field ( readonly : update )
Invoice;
create;
update;
delete;
action ( features : global ) createMSWordInvoice ;
draft action Activate optimized;
draft action Discard;
draft action Edit;
draft action Resume;
draft determine action Prepare;
mapping for ZMRI_INVOICE
{
Invoice = invoice;
Comments = comments;
Attachment = attachment;
Mimetype = mimetype;
Filename = filename;
PurchaseOrder = purchaseOrder;
Price = price;
LocalCreatedBy = local_created_by;
LocalCreatedAt = local_created_at;
LocalLastChangedBy = local_last_changed_by;
LocalLastChangedAt = local_last_changed_at;
LastChangedAt = last_changed_at;
}
}</code></pre><P> </P><H1 id="toc-hId--291534378">Step 4:</H1><P>Implement the custom action in your behaviour implementation class:</P><P> </P><P> </P><pre class="lia-code-sample language-abap"><code>CLASS lhc_zr_mri_invoice DEFINITION INHERITING FROM cl_abap_behavior_handler.
PRIVATE SECTION.
CLASS-DATA: mt_data TYPE zmri_invoice.
DATA:
lv_content TYPE xstring,
lo_zip TYPE REF TO cl_abap_zip.
METHODS:
get_global_authorizations FOR GLOBAL AUTHORIZATION
IMPORTING
REQUEST requested_authorizations FOR ZrMriInvoice
RESULT result,
get_global_features FOR GLOBAL FEATURES
IMPORTING
REQUEST requested_features FOR ZrMriInvoice
RESULT result,
createMSWordInvoice FOR MODIFY
IMPORTING keys FOR ACTION ZrMriInvoice~createMSWordInvoice.
ENDCLASS.
CLASS lhc_zr_mri_invoice IMPLEMENTATION.
METHOD get_global_authorizations.
* This method does not need an implementation
ENDMETHOD.
METHOD createMSWordInvoice.
* Select document to be filled
SELECT * FROM zc_mri_invoice
FOR ALL ENTRIES IN @keys
WHERE invoice = @keys-invoice
INTO CORRESPONDING FIELDS OF <a href="https://community.sap.com/t5/user/viewprofilepage/user-id/2891">@MT</a>_data.
ENDSELECT.
* Create zip class instance
lo_zip = NEW cl_abap_zip( ).
* Search for main document part
DATA lv_index TYPE string VALUE 'word/document.xml'.
* Load attachment into zip class object
lo_zip->load( zip = mt_data-attachment check_header = abap_false ).
* Fetch the binaries of the XML part in the attachment
lo_zip->get(
EXPORTING
name = lv_index
IMPORTING
content = lv_content
).
* Convert the binaries of the xml into a string
DATA(lv_string) = xco_cp=>xstring( lv_content
)->as_string( xco_cp_character=>code_page->utf_8
)->value.
* Search for the text to be replaced and fill with the information in your data set
REPLACE FIRST OCCURRENCE OF '&lt;InvoiceNumber&gt;' IN lv_string
WITH mt_data-Invoice.
REPLACE FIRST OCCURRENCE OF '&lt;Purchase Order&gt;' IN lv_string
WITH mt_data-PurchaseOrder.
REPLACE FIRST OCCURRENCE OF '&lt;Comments&gt;' IN lv_string
WITH mt_data-Comments.
DATA lv_price TYPE string.
lv_price = mt_data-Price.
REPLACE FIRST OCCURRENCE OF '&lt;Price&gt;' IN lv_string
WITH lv_price.
* Convert the changed XML string into binaries
DATA(lv_new_content) = xco_cp=>string( lv_string )->as_xstring( xco_cp_character=>code_page->utf_8
)->value.
* Delete "old" main document part from the zip file
lo_zip->delete(
EXPORTING
name = lv_index
).
* Add "new" main document part to the zip file
lo_zip->add(
EXPORTING
name = lv_index
content = lv_new_content
).
* Save the new zip file
DATA(lv_new_file) = lo_zip->save( ).
* Upload changed docx file
MODIFY ENTITIES OF zr_mri_invoice IN LOCAL MODE ENTITY ZrMriInvoice
UPDATE SET FIELDS WITH
VALUE #( (
Invoice = mt_data-Invoice
Attachment = lv_new_file
) )
FAILED failed.
APPEND VALUE #( %msg = new_message_with_text( severity = if_abap_behv_message=>severity-success text = 'Template successfully filled...' ) ) TO reported-ZrMriInvoice.
ENDMETHOD.
METHOD get_global_features.
* This method does not need to be implemented
ENDMETHOD.
ENDCLASS.</code></pre><P>Explanation: In this implementation class, the cl_abap_zip class (which is released for cloud development) is used to load the .docx template. If you didn't already know, a .docx file is basically a ZIP-file. In order to get the main document part, we need to fetch the "word/document.xml" file within the zip object by applying the lo_zip->get() method. This method returns an XSTRING which has to be converted into an UTF-8 encoded string, for us to modify the content of the main document part. For the binary-to-string conversions the xco_cp class is used, which is part of the XCO library (I can only recommend using this library as it has some great features). Afterwards the converted XML-string has to be modified with the invoice details from your CDS view. The modified XML-string has to be converted back into binaries, by use of the same class. The last step is to delete the "old" main document part from the zip object and add the new document content to the zip object. Now update the attachment field in your CDS entity and that's it. Your app should now be able to populate a .docx-file with information from your CDS view. </P><H1 id="toc-hId--488047883">Step 5:</H1><P>Create a metadata extension and a service binding for your Fiori Frontend and test the application: </P><P> </P><pre class="lia-code-sample language-abap"><code>@Metadata.layer: #CORE
@UI: { headerInfo: {
typeName: 'Invoice',
typeNamePlural: 'Invoices',
title: { type: #STANDARD, value: 'Invoice' },
description: { type: #STANDARD, value: 'Invoice' } },
presentationVariant: [{
sortOrder: [{ by: 'Invoice', direction: #ASC }],
visualizations: [{type: #AS_LINEITEM}] }] }
annotate view ZC_MRI_INVOICE with
{
.facet: [ {
label: 'General Information',
id: 'GeneralInfo',
type: #COLLECTION,
position: 10
},
{ id: 'Invoicedet',
purpose: #STANDARD,
type: #IDENTIFICATION_REFERENCE,
label: 'Invoice Details',
parentId: 'GeneralInfo',
position: 10 } ]
: { lineItem: [ { position: 10, importance: #HIGH , label: 'Invoice Number'} ] ,
identification: [ { position: 10 , label: 'Invoice Number' } ] }
Invoice;
: { lineItem: [ { position: 20, importance: #HIGH , label: 'Purchase Order'} ] ,
identification: [ { position: 20 , label: 'Purchase Order Number' } ] }
PurchaseOrder;
: { lineItem: [ { position: 20, importance: #HIGH , label: 'Price'} ] ,
identification: [ { position: 20 , label: 'Price' } ] }
Price;
: { lineItem: [ { position: 20, importance: #HIGH , label: 'Comments'} ] ,
identification: [ { position: 20 , label: 'Comments' } ] }
Comments;
:
{ lineItem: [ { position: 30, importance: #HIGH , label: 'Attachment'}, { type: #FOR_ACTION, dataAction: 'createMSWordInvoice' , label: 'Create Invoice' } ],
identification: [ { position: 20 , label: 'Attachment' }]
}
Attachment;
.hidden: true
MimeType;
.hidden: true
Filename;
}</code></pre><P> </P><P>Test the application by creating an entry and uploading a docx-template.</P><P>The template could look something like this: </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="invoice_before.PNG" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/121747i9DE59A7A02E3BC27/image-size/medium?v=v2&px=400" role="button" title="invoice_before.PNG" alt="invoice_before.PNG" /></span></P><P>Now select the entry and use the custom action to fill the template with your data: </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="RAP_FIORI_APP_Success.PNG" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/121746i3F85D766EB96E3DB/image-size/medium?v=v2&px=400" role="button" title="RAP_FIORI_APP_Success.PNG" alt="RAP_FIORI_APP_Success.PNG" /></span></P><P>After the success message, click on the attachment (template.docx) and verify that the placeholders have been filled: <BR /><BR /></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="invoice_after.PNG" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/121749iF743B070524AACAE/image-size/medium?v=v2&px=400" role="button" title="invoice_after.PNG" alt="invoice_after.PNG" /></span></P><H1 id="toc-hId--684561388">Addition: </H1><P>For those of you who want to populate tables in MS word, you can have a look at <A href="https://community.sap.com/t5/application-development-blog-posts/best-way-to-generate-microsoft-word-docx-from-abap/ba-p/13430350" target="_self">this blog post</A>, which uses text and row fragments for placeholders in the docx-template.</P><H1 id="toc-hId--881074893">Conclusion:</H1><P>In this blog post, you learned how to upload and modify OpenXML documents by use of the <SPAN>cl_abap_zip class and the XCO library. This code is consists of cloud-released code only and should give you a good starting point to start handling your documents with a clean core approach. </SPAN></P>2024-06-12T21:50:36.096000+02:00https://community.sap.com/t5/enterprise-resource-planning-blogs-by-sap/replacing-a-wrapped-bapi-with-a-released-business-object-interface/ba-p/13729947Replacing a wrapped BAPI with a released business object interface2024-06-13T15:11:13.346000+02:00kaidehmannhttps://community.sap.com/t5/user/viewprofilepage/user-id/14159<P>Last year, I announced the release of the <A href="https://developers.sap.com/group.sap-s4hana-extensibility-wrap-api.html" target="_self" rel="noopener noreferrer">Mitigate Missing Released SAP API in the 3-tier Extensibility Model</A> tutorial group via the <A href="https://community.sap.com/t5/enterprise-resource-planning-blogs-by-sap/abap-cloud-mitigate-missing-released-sap-apis-in-the-3-tier-extensibility/ba-p/13580268" target="_self">ABAP Cloud – Mitigate missing released SAP APIs in the 3-tier extensibility model: a tutorial how to wrap a BAPI and integrate it into a custom RAP business object</A> blog. The tutorial group shows how to wrap the BAPI_PR_CREATE function module (BAPI) in tier 2, how to release it for consumption in tier 1, and then how to consume it from a shopping cart RAP business object in tier 1.</P><P>We have just extended the tutorial group with the <A href="https://developers.sap.com/tutorials/abap-s4hanacloud-purchasereq-replace-wrapper.html" target="_self" rel="noopener noreferrer">Replace Wrapper by Released API</A> tutorial. As the name suggests, this tutorial shows how to replace the wrapper once a released API is available. That is, the wrapper for the BAPI_PR_CREATE function module is replaced by the released I_PurchaseRequisitionTP business object interface. Since the business object interface is already available, you can try it out immediately. So, don't hesitate and get your hands dirty <span class="lia-unicode-emoji" title=":winking_face:">😉</span></P>2024-06-13T15:11:13.346000+02:00https://community.sap.com/t5/application-development-blog-posts/sap-developer-news-june-20th-2024/ba-p/13738211SAP Developer News, June 20th, 20242024-06-20T21:10:00.081000+02:00thomas_junghttps://community.sap.com/t5/user/viewprofilepage/user-id/139<P><div class="video-embed-center video-embed"><iframe class="embedly-embed" src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2F8zC6l1_jFmg&display_name=YouTube&url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D8zC6l1_jFmg&image=http%3A%2F%2Fi.ytimg.com%2Fvi%2F8zC6l1_jFmg%2Fhqdefault.jpg&key=b0d40caa4f094c68be7c29880b16f56e&type=text%2Fhtml&schema=youtube" width="400" height="225" scrolling="no" title="YouTube embed" frameborder="0" allow="autoplay; fullscreen; encrypted-media; picture-in-picture;" allowfullscreen="true"></iframe></div></P><H3 id="toc-hId-1146720087">DESCRIPTION</H3><P><STRONG>Generate your own custom UI Service based on a Business Object Interface</STRONG></P><UL><LI>Tutorial to generate Custom UI Service based on a C1-released Business Object Interface: <A href="https://developers.sap.com/tutorials/abap-cloud-ui-from-interface.html" target="_blank" rel="noopener noreferrer">https://developers.sap.com/tutorials/abap-cloud-ui-from-interface.html</A></LI></UL><P><STRONG>SAP Open Source Webinar “How to fight the dependency hell”</STRONG></P><UL><LI>Renovate <A href="https://github.com/renovatebot/renovate" target="_blank" rel="nofollow noopener noreferrer">https://github.com/renovatebot/renovate</A></LI><LI>Webinar details & registration: <A href="https://events.sap.com/how-to-fight-dependency-hell/en/registration.aspx" target="_blank" rel="noopener noreferrer">https://events.sap.com/how-to-fight-dependency-hell/en/registration.aspx</A></LI><LI>OSPO Webinars home page <A href="https://events.sap.com/ospo-webinars/en/home" target="_blank" rel="noopener noreferrer">https://events.sap.com/ospo-webinars/en/home</A></LI></UL><P><STRONG>Collaborate on your SAP Build Code project with your teammates!</STRONG></P><UL><LI>Tutorial to set up Build Code on BTP: <A href="https://developers.sap.com/tutorials/build-code-setup..html" target="_blank" rel="noopener noreferrer">https://developers.sap.com/tutorials/build-code-setup..html</A></LI><LI>Help Portal - Managing Members : <A href="https://help.sap.com/docs/SAP%20Build/9d385a1842594230993661ca78dce150/1ae0d5af7a9946cc96936bd175041148.html" target="_blank" rel="noopener noreferrer">https://help.sap.com/docs/SAP%20Build/9d385a1842594230993661ca78dce150/1ae0d5af7a9946cc96936bd175041148.html</A></LI><LI>Blog post on Collaborate on your Build Code project by Rupa Maity: <A href="https://community.sap.com/t5/technology-blogs-by-sap/collaborate-on-your-sap-build-code-project-with-your-teammates/ba-p/13720813" target="_blank">https://community.sap.com/t5/technology-blogs-by-sap/collaborate-on-your-sap-build-code-project-with-your-teammates/ba-p/13720813</A></LI></UL><P><STRONG>API anomaly detection and Event Mesh capability of SAP Integration Suite</STRONG></P><UL><LI>API Anomaly Detection in SAP Integration Suite: <A href="https://community.sap.com/t5/technology-blogs-by-sap/api-anomaly-detection-in-sap-integration-suite/ba-p/13726636" target="_blank">https://community.sap.com/t5/technology-blogs-by-sap/api-anomaly-detection-in-sap-integration-suite/ba-p/13726636</A></LI><LI>API Anomaly Detection infographic: <A href="https://community.sap.com/t5/technology-blogs-by-sap/use-the-api-anomaly-detection-feature-in-sap-integration-suite-to-detect/ba-p/13733045" target="_blank">https://community.sap.com/t5/technology-blogs-by-sap/use-the-api-anomaly-detection-feature-in-sap-integration-suite-to-detect/ba-p/13733045</A></LI><LI>Meet your new friend EMIS: Event Mesh in SAP Integration Suite: <A href="https://community.sap.com/t5/technology-blogs-by-sap/meet-your-new-friend-emis-event-mesh-in-sap-integration-suite/ba-p/13731129" target="_blank">https://community.sap.com/t5/technology-blogs-by-sap/meet-your-new-friend-emis-event-mesh-in-sap-integration-suite/ba-p/13731129</A></LI><LI>Event-driven integrations: Exploring the Event Mesh capability of SAP Integration Suite: <A href="https://youtube.com/live/tUIG34xT3oo" target="_blank" rel="nofollow noopener noreferrer">https://youtube.com/live/tUIG34xT3oo</A></LI></UL><H3 id="toc-hId-950206582">CHAPTER TITLES</H3><P>0:00 Intro<BR />0:10 Generate your own custom UI Service based on a Business Object Interface<BR /><SPAN>1:30 SAP Open Source Webinar “How to fight the dependency hell”<BR /></SPAN>2:50 Collaborate on your SAP Build Code project with your teammates!<BR />4:13 API anomaly detection and Event Mesh capability of SAP Integration Suite</P><H3 id="toc-hId-753693077">TRANSCRIPT</H3><P>This is the SAP Developer News for June 20th, 2024.</P><P><STRONG>[Shilpa]</STRONG> Hello, ABAP developers. We all know business objects are the building blocks for modeling data. Well, business object interfaces are provided by SAP in order to release business objects so that it can be used or extended by customers using the ABAP Cloud development model. Now, by defining the stability contracts, it is possible to use such C1-released business object within other software components. Now, once you have used these business objects, you might want to create your own custom UI. In order to make it easier for customers to build custom UIs on top of the released business objects, SAP has provided a new wizard as part of the ABAP Development Tools in the latest series of SAP BTP, ABAP environment. Now, in this tutorial, our friend Andre Fischer shows how you can use this wizard to generate your own custom UI on top of the SAP C1 released business object interface, a ILSK bank TP. In this way, you can leverage growing number of released business objects that are based on ABAP RESTful application programming model to create your own UI on top as extension in ABAP Cloud. The link to this tutorial is in the description below. And we'll check it out.</P><P><STRONG>[DJ]</STRONG> Making sure you're running the correct versions of software with the latest book fixes and features is a pretty important task. Scale this up to an enterprise the size of SAP, a producer and consumer of many, many open source libraries and packages, and this becomes a mammoth undertaking with those libraries, packages, and dependencies that are involved. There are many teams internally at SAP who have turned to the open source tool, Renovate, and use it at scale for this dependency management work. If this sounds interesting to you and you want to find out more, then we've got an upcoming SAP open-source webinar just for you. On the 25th of June, join Tobias Gabriel, a senior developer in the open source program office who will explain how SAP uses Renovate at scale, and also will talk about the shift, the paradigm shift towards the automation of dependency management in enterprises like SAP. All the details about this webinar and how to register are in the description.</P><P><STRONG>[Shrini]</STRONG> Hello, SAP community. Would it be fun to share your code with your teammates? That's exactly what you can do with a build code project from the SAP Build Lobby. If you're interested in learning how to enable SAP Build Code in your BTP account, check out this tutorial. When you create a new full-stack project from the Build Lobby, you'll provide a project name, description, and select a dev space. If a dev space doesn't already exist, a new one will be created for you. Once your project is open, you can add any Git-based repository as a remote repo using the simplified Git panel. To share the project with your team members, we'll also need to add them as collaborators in the GitHub settings. In the SAP Build Lobby, you will find an option called Manage Members for your build code project. This feature allows you to authorize your team members to access the project as long as they have access to the same sub-account. Your team members can then access the project by selecting a dev space and providing their credentials. The repository will be cloned onto their dev space. If you need more guidance, Rupa has written a fantastic blog with step-by-step instructions. You can find the link in the description below.</P><P><STRONG>[Antonio]</STRONG> Hola, SAP Developer. As part of the announcements that we had for SAP Sapphire, it was announced that there will be a new functionality in API management called the API anomaly detection. Now my colleague Shruthi recently published a blog post which shows you how to enable the functionality and lso what should you expect from this new functionality. There is also a very nice infographic that my colleague Kasturi created, which really distills what the functionality is. So make sure to check that out as well. There is now a new capability in SAP Integration Suite, which is the Event Mesh capability. So now Event Mesh is within the different capabilities that are part of SAP Integration Suite. Check out the blog post by Karsten, where he basically shares with us what you should expect from this new capability. And if you want to see the capability in action, this week I had the opportunity to do a livestream, where I basically go through the entire process of activating the new capability. Also, I connected to a CAP application, consume messages from Cloud Integration. We also connected to an S/4HANA Cloud. So make sure to check that out so that you can see the capability in action.</P>2024-06-20T21:10:00.081000+02:00https://community.sap.com/t5/technology-blogs-by-sap/customer-amp-partner-roundtable-for-sap-btp-abap-environment-14/ba-p/13741880Customer & Partner Roundtable for SAP BTP ABAP Environment #142024-06-25T11:16:39.932000+02:00iwona_hahnhttps://community.sap.com/t5/user/viewprofilepage/user-id/4326<DIV class=""><DIV class=""><DIV class=""><H3 id="toc-hId-1147441053"><STRONG><SPAN class="lia-unicode-emoji"><span class="lia-unicode-emoji" title=":backhand_index_pointing_right:">👉</span></SPAN> The call for contributions for one of the upcoming roundtables is open! </STRONG></H3><P> </P><DIV><TABLE><TBODY><TR><TD>If you want to show a demo or share a use case scenario for SAP BTP ABAP Environment send us an<SPAN> </SPAN><A href="mailto:sap_btp_abap_environment@sap.com" target="_blank" rel="noopener nofollow noreferrer">email</A> and we will get back to you.</TD></TR></TBODY></TABLE><SPAN> </SPAN></DIV><H2 id="toc-hId-821844829">Introduction</H2><P> </P><DIV><SPAN class="">A</SPAN><SPAN class="">s<SPAN> </SPAN></SPAN><A class="" href="https://www.sap.com/products/technology-platform/abap.html" target="_blank" rel="noreferrer noopener"><SPAN class="">SAP BTP ABAP environment (aka Steampunk)</SPAN></A><SPAN> </SPAN>and ABAP Cloud<SPAN> </SPAN><SPAN class="">became more </SPAN><SPAN class="">and more popular</SPAN><SPAN class=""><SPAN> </SPAN>inside and outside of SAP, there is a high demand for rolling out the latest product news and updates, asking questions, and of course showing demos. </SPAN><BR /><BR /><SPAN class="lia-unicode-emoji"><span class="lia-unicode-emoji" title=":light_bulb:">💡</span></SPAN> If you weren’t able to join one of our previous roundtables, you can find the slides presented, recordings, and further references in this<SPAN> </SPAN><A href="https://github.com/iwonahahn/SAP-BTP-ABAP-Environment-Roundtable/tree/main" target="_blank" rel="noopener nofollow noreferrer">GitHub repository</A>.<BR /><BR /></DIV><DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="iwona_hahn_1-1711369871866.jpeg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/85948i899EEF37EF74A54C/image-size/medium?v=v2&px=400" role="button" title="iwona_hahn_1-1711369871866.jpeg" alt="iwona_hahn_1-1711369871866.jpeg" /></span><H2 id="toc-hId-625331324"><BR />Meeting Information<BR /><BR /></H2><STRONG>When: </STRONG><BR /><UL><LI><STRONG><SPAN class="">July 30th</SPAN></STRONG>, 10:00 - 11:00 AM CET –<SPAN> </SPAN><A href="https://sap-se.zoom.us/meeting/register/tJIsdOGgpjsiH9IDXq_yv4ZPu87bQILQ4ZKW" target="_blank" rel="nofollow noopener noreferrer">Zoom Meeting</A> (<STRONG>please register</STRONG><SPAN> </SPAN>in advance) </LI></UL></DIV><DIV> </DIV><DIV><STRONG>Who:</STRONG><UL><LI>All interested <STRONG>customers, partners,</STRONG> and <STRONG>stakeholders</STRONG> are invited to join and exchange ideas and feedback with others and the product team</LI><LI><STRONG>Steampunk team</STRONG>: <STRONG><A href="https://community.sap.com/t5/user/viewprofilepage/user-id/4296" target="_blank">Frank Jentsch</A></STRONG><SPAN> </SPAN><SPAN class="">(Product Lead for SAP BTP ABAP Environment), <STRONG>Daniela Fenderl</STRONG>, <STRONG>Chris Swanepoel</STRONG>, </SPAN><STRONG><A href="https://community.sap.com/t5/user/viewprofilepage/user-id/4326" target="_self"><SPAN class="">Iwona Hahn</SPAN></A></STRONG> & <STRONG><A href="https://community.sap.com/t5/user/viewprofilepage/user-id/151005" target="_self">Burcu Karlidag</A></STRONG><SPAN class=""> </SPAN><BR /><BR /></LI></UL></DIV><DIV><STRONG>Preliminary Agenda:</STRONG><BR /><UL><LI>Product news and outlook</LI><LI>Hello, ABAP Cloud! Landing Page</LI><LI>Q&A</LI></UL><SPAN>Looking forward to meeting you!</SPAN></DIV><DIV> </DIV><DIV><A href="https://sap-se.zoom.us/meeting/register/tJIsdOGgpjsiH9IDXq_yv4ZPu87bQILQ4ZKW" target="_blank" rel="noopener nofollow noreferrer"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="iwona_hahn_2-1711369871851.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/85947i01677A9AE51AAC1D/image-size/medium?v=v2&px=400" role="button" title="iwona_hahn_2-1711369871851.png" alt="iwona_hahn_2-1711369871851.png" /></span></A><BR /><BR /><SPAN>Check out our</SPAN><SPAN> </SPAN><A href="https://pages.community.sap.com/topics/btp-abap-environment" target="_blank" rel="noopener noreferrer">SAP Business Technology ABAP Environment</A><SPAN> page in SAP Community </SPAN><SPAN>for </SPAN><SPAN>product </SPAN><SPAN>updates </SPAN><SPAN>and </SPAN><SPAN>upcoming events.</SPAN><P> </P></DIV></DIV></DIV></DIV><DIV class=""> </DIV>2024-06-25T11:16:39.932000+02:00https://community.sap.com/t5/technology-blogs-by-members/abap-restful-application-programming-model-rap/ba-p/13743339ABAP RESTful Application Programming Model (RAP)2024-06-28T16:07:38.695000+02:00Rijul_VNhttps://community.sap.com/t5/user/viewprofilepage/user-id/1457629<P><STRONG><U>Introduction</U></STRONG></P><P>The SAP landscape has evolved significantly, with businesses seeking simpler, more efficient solutions that offer excellent user experiences. Many organizations remain deeply embedded in the SAP ecosystem, primarily focusing on ABAP over other languages. So, is it possible to develop feature-rich applications without other frontend languages? Yes, leveraging ABAP with RAP (ABAP Restful Application Programming) makes it possible.</P><P>Restful Application Programming is an ABAP programming model for creating business applications and services in an AS ABAP or BTP ABAP environment. RAP offers a standardized way of developing applications using Core Data Services (CDS), the modernized extended ABAP language, OData protocol, and the concept of business objects and services. RAP applications can only be created through ABAP development tools (ADT) and it’s available in SAP BTP ABAP Environment, SAP S/4 HANA Cloud, and AS ABAP >=7.56.</P><P>Before digging deeper into RAP, let’s explore CDS, annotations, and business services. To illustrate these concepts, let’s create a simple read-only list report application.</P><P><STRONG><U>Developing an OData Service for simple list reporting</U></STRONG></P><P>An OData service follows the best practices for developing and consuming RESTful APIs. This service can be used in SAP Fiori applications and can also be exposed as Web APIs. Below are the steps for creating a simple list report application:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rijul_Haridasan_0-1719405864152.png" style="width: 568px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/128959i0D0B7F884BD841E5/image-dimensions/568x199?v=v2" width="568" height="199" role="button" title="Rijul_Haridasan_0-1719405864152.png" alt="Rijul_Haridasan_0-1719405864152.png" /></span></P><P>Let’s explore each step in detail by creating the application.</P><P>Sample requirement: Create a read-only list report application which shows purchase order information.</P><UL><LI>Create an interface CDS view which takes data from Purchase Order Header (EKKO) and Item (EKPO).</LI></UL><P> <span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Rijul_Haridasan_2-1719405962814.png" style="width: 469px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/128963i723AA4D2D8A8EEC6/image-dimensions/469x156?v=v2" width="469" height="156" role="button" title="Rijul_Haridasan_2-1719405962814.png" alt="Rijul_Haridasan_2-1719405962814.png" /></span></P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Rijul_Haridasan_5-1719406138616.png" style="width: 483px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/128967iC713BC2798FA1AEC/image-dimensions/483x250?v=v2" width="483" height="250" role="button" title="Rijul_Haridasan_5-1719406138616.png" alt="Rijul_Haridasan_5-1719406138616.png" /></span></P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Rijul_Haridasan_6-1719406201461.png" style="width: 480px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/128968iF82725627F783085/image-dimensions/480x186?v=v2" width="480" height="186" role="button" title="Rijul_Haridasan_6-1719406201461.png" alt="Rijul_Haridasan_6-1719406201461.png" /></span></P><P> </P><UL><LI>Create two interface CDS views for showing master data of purchase order type and material details.</LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Rijul_Haridasan_7-1719406268505.png" style="width: 479px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/128969iA2BC3F4D3689D062/image-dimensions/479x219?v=v2" width="479" height="219" role="button" title="Rijul_Haridasan_7-1719406268505.png" alt="Rijul_Haridasan_7-1719406268505.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Rijul_Haridasan_8-1719406312400.png" style="width: 476px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/128970i4188CFAC4C729F7A/image-dimensions/476x207?v=v2" width="476" height="207" role="button" title="Rijul_Haridasan_8-1719406312400.png" alt="Rijul_Haridasan_8-1719406312400.png" /></span></P><DIV class=""> </DIV><P> </P><UL><LI>Make an association between the purchase order type CDS view and material details CDS view from the purchase order header/item CDS view. The associated views will act as Search Help in the list report after applying the annotations.<span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Rijul_Haridasan_9-1719406407548.png" style="width: 521px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/128971i1A435154E00D5269/image-dimensions/521x250?v=v2" width="521" height="250" role="button" title="Rijul_Haridasan_9-1719406407548.png" alt="Rijul_Haridasan_9-1719406407548.png" /></span><P> </P><UL><LI>Create a consumption view on top of the Purchase Order Header/Item interface view (<STRONG>ZI_PURCHASE_ORDER_RVN</STRONG>).</LI></UL><P>The UI annotations needed for the application are written in the consumption CDS View or Metadata Extensions.</P><P> </P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Rijul_Haridasan_10-1719406543553.png" style="width: 474px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/128973i36191613A1DC5757/image-dimensions/474x270?v=v2" width="474" height="270" role="button" title="Rijul_Haridasan_10-1719406543553.png" alt="Rijul_Haridasan_10-1719406543553.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Rijul_Haridasan_11-1719406620405.png" style="width: 473px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/128974iC736122CB48DEA97/image-dimensions/473x115?v=v2" width="473" height="115" role="button" title="Rijul_Haridasan_11-1719406620405.png" alt="Rijul_Haridasan_11-1719406620405.png" /></span><P> </P><P>Now, we have the data model and the required annotations to manifest semantics for it. The next step is to create the OData service and binding the service.</P><P>To define a service, we first need to create a service definition. In service definition, we specify the CDS entities that need to be exposed. In this example, the gateway client is replaced by the service definition and service binding.</P><P> </P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Rijul_Haridasan_13-1719406801073.png" style="width: 500px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/128977iC1F52E86F3513638/image-dimensions/500x244?v=v2" width="500" height="244" role="button" title="Rijul_Haridasan_13-1719406801073.png" alt="Rijul_Haridasan_13-1719406801073.png" /></span><P> </P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Rijul_Haridasan_14-1719406869451.png" style="width: 501px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/128978iAC5327643E120712/image-dimensions/501x262?v=v2" width="501" height="262" role="button" title="Rijul_Haridasan_14-1719406869451.png" alt="Rijul_Haridasan_14-1719406869451.png" /></span><P> </P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Rijul_Haridasan_1-1719407201734.png" style="width: 498px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/128984i973606333B8DF392/image-dimensions/498x96?v=v2" width="498" height="96" role="button" title="Rijul_Haridasan_1-1719407201734.png" alt="Rijul_Haridasan_1-1719407201734.png" /></span><P>As a last step, create the service binding for service definition.</P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Rijul_Haridasan_2-1719407258464.png" style="width: 500px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/128985i1E9B8BB0FC5542D6/image-dimensions/500x191?v=v2" width="500" height="191" role="button" title="Rijul_Haridasan_2-1719407258464.png" alt="Rijul_Haridasan_2-1719407258464.png" /></span><P> </P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Rijul_Haridasan_4-1719407352780.png" style="width: 497px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/128987i0620E0281B5907F6/image-dimensions/497x302?v=v2" width="497" height="302" role="button" title="Rijul_Haridasan_4-1719407352780.png" alt="Rijul_Haridasan_4-1719407352780.png" /></span><P>Set the binding type as OData V2 – UI, since this is an OData V2 service.</P><P> </P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Rijul_Haridasan_8-1719407475099.png" style="width: 499px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/128991iA07EFAFB74BEF9F8/image-dimensions/499x175?v=v2" width="499" height="175" role="button" title="Rijul_Haridasan_8-1719407475099.png" alt="Rijul_Haridasan_8-1719407475099.png" /></span><P>After publishing the service, the exposed entity and associated entities will be visible. Click on the entity and click the preview button to see the preview of the application.</P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Rijul_Haridasan_9-1719407529639.png" style="width: 508px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/128992iFD1B3C8B4A9F982A/image-dimensions/508x232?v=v2" width="508" height="232" role="button" title="Rijul_Haridasan_9-1719407529639.png" alt="Rijul_Haridasan_9-1719407529639.png" /></span><P> </P><P>Purchasing Doc Type Search Help</P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Rijul_Haridasan_10-1719407587236.png" style="width: 489px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/128993iB4FFF6C23B36146B/image-dimensions/489x298?v=v2" width="489" height="298" role="button" title="Rijul_Haridasan_10-1719407587236.png" alt="Rijul_Haridasan_10-1719407587236.png" /></span><P> </P></LI></UL><P> Material Search Help</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Rijul_Haridasan_11-1719407636266.png" style="width: 431px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/128994i9F9D6E0E816D6BCC/image-dimensions/431x265?v=v2" width="431" height="265" role="button" title="Rijul_Haridasan_11-1719407636266.png" alt="Rijul_Haridasan_11-1719407636266.png" /></span></P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Rijul_Haridasan_12-1719407740867.png" style="width: 517px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/128995i45168752B35931F6/image-dimensions/517x225?v=v2" width="517" height="225" role="button" title="Rijul_Haridasan_12-1719407740867.png" alt="Rijul_Haridasan_12-1719407740867.png" /></span></P><P> </P><P><STRONG><U>Conclusion</U></STRONG></P><P>This blog serves as an introduction to developing OData services for simple list reporting using the ABAP Restful Application Programming (RAP) model. By following the steps outlined, you can create a read-only list report application that showcases purchase order information. We have covered the basics of creating CDS views, defining and binding OData services, and incorporating annotations for enhanced functionality.</P><P>This is just the beginning of what you can achieve with RAP. As you explore further, you will discover more advanced features and capabilities that can help you build robust, scalable, and user-friendly applications within the SAP ecosystem.</P><P>Happy Learning and exploring the vast possibilities with RAP!</P><P> </P><P><EM>References</EM></P><P><A href="https://help.sap.com/docs/abap-cloud/abap-rap/abap-restful-application-programming-model" target="_blank" rel="noopener noreferrer"><EM>https://help.sap.com/docs/abap-cloud/abap-rap/abap-restful-application-programming-model</EM></A></P><P><A href="https://help.sap.com/docs/abap-cloud/abap-rap/cds-annotations" target="_blank" rel="noopener noreferrer"><EM>https://help.sap.com/docs/abap-cloud/abap-rap/cds-annotations</EM></A></P><P> </P><P> </P><P> </P>2024-06-28T16:07:38.695000+02:00https://community.sap.com/t5/technology-blogs-by-sap/cds-how-to-define-hierarchy-view/ba-p/13758059CDS : How to define Hierarchy View2024-07-17T14:18:20.286000+02:00LinaRauthttps://community.sap.com/t5/user/viewprofilepage/user-id/179963<P><FONT size="4"><SPAN>This blog is about how to define Hierarchy View</SPAN><SPAN> in CDS</SPAN><SPAN>.</SPAN><SPAN> </SPAN><SPAN> </SPAN></FONT></P><P><FONT size="4"><SPAN>There are two types of </SPAN><SPAN>hierarch</SPAN><SPAN>ies – '</SPAN><SPAN>Leveled</SPAN><SPAN> Hierarchy' and '</SPAN><SPAN>Parent-Chil</SPAN><SPAN>d Hierarchy'</SPAN><SPAN> </SPAN><SPAN>In Analytics, only a Parent-Child hierarchy is supported.</SPAN><SPAN> </SPAN></FONT></P><P><FONT size="4"><SPAN>In CDS, Hierarchy can be defined in two ways:</SPAN><SPAN> </SPAN></FONT></P><UL><LI><FONT size="4"><SPAN>Inline Hierarchy: where the hierarchy definition is modelled in the dimension view.</SPAN><SPAN> </SPAN></FONT></LI></UL><UL><LI><FONT size="4"><SPAN>External Hierarchy: where there is a separate CDS view to model the definition of the hierarchy.</SPAN><SPAN> </SPAN></FONT></LI></UL><P><FONT size="4"><SPAN>In the past, External hierarchy was defined using the annotation '</SPAN><SPAN>@ObjectModel.dataCategory:</SPAN> <SPAN>#HIERARCHY'.</SPAN><SPAN> </SPAN><SPAN>Now, in CDS it is allowed to define new type of CDS view called as Hierarchy CDS, which is defined using</SPAN> <SPAN>syntax </SPAN><SPAN>define hierarchy</SPAN><STRONG><SPAN>, </SPAN></STRONG><SPAN>which create a hierarchical view.</SPAN><SPAN> </SPAN><SPAN> </SPAN><SPAN> </SPAN></FONT></P><P><FONT size="4"><SPAN>A CDS hierarchy represents a HANA hierarchy, created when the CDS hierarchy is activated.</SPAN><SPAN> </SPAN><SPAN> </SPAN></FONT></P><P><FONT size="4"><SPAN>Normally the hierarchy contains headers and nodes. The header data of the hierarchy is coming from the directory view and the nodes data is coming from the hierarchy view itself. </SPAN><SPAN> </SPAN></FONT></P><P><FONT size="4" color="#0000FF"><SPAN> </SPAN><STRONG><SPAN>Hierarchy Directory</SPAN></STRONG><SPAN> </SPAN></FONT></P><P><FONT size="4"><SPAN>The directory of the </SPAN><SPAN>h</SPAN><SPAN>ierarchy provides the header information of the </SPAN><SPAN>h</SPAN><SPAN>ierarchy</SPAN><SPAN>.</SPAN> <SPAN>A hierarchy view might </SPAN><SPAN>contain</SPAN><SPAN> more than one hierarchy. Information about each hierarchy (</SPAN><SPAN>e.g.</SPAN><SPAN> text</SPAN><SPAN>)</SPAN> <SPAN>is</SPAN><SPAN> provided by a hierarchy directory</SPAN><SPAN>. More</SPAN><SPAN> information can be found in </SPAN><A href="https://community.sap.com/t5/technology-blogs-by-sap/cds-hierarchy-directory-how-to-use-notassignednode-annotation-to-suppress/ba-p/13576317" target="_blank"><SPAN>blog</SPAN></A><SPAN>.</SPAN><SPAN> </SPAN></FONT></P><P><FONT size="4"><SPAN>Typically, the directory view is defined as follows:</SPAN><SPAN> </SPAN></FONT></P><P> </P><pre class="lia-code-sample language-abap"><code>@EndUserText.label: 'Connection Hierarchy Directory View'
@Analytics : { dataCategory: #DIMENSION, dataExtraction.enabled: true }
@ObjectModel.representativeKey: 'hieid'
define view entity ZLR_CONNECTION_HIERARCHY_DIR
as select from zoq_connid_hd
{
@ObjectModel.text.element: [ 'hiertxt' ]
key hieid,
@Semantics.text: true
hiertxt,
@Semantics.systemDate.lastChangedAt: true
last_changed,
}</code></pre><P> </P><P><FONT size="4" color="#0000FF"><STRONG><SPAN class=""><SPAN class="">Output</SPAN></SPAN></STRONG></FONT></P><P><FONT size="4"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="LinaRaut_0-1720985264075.png" style="width: 457px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/136485i2087A99928F26B22/image-dimensions/457x361?v=v2" width="457" height="361" role="button" title="LinaRaut_0-1720985264075.png" alt="LinaRaut_0-1720985264075.png" /></span></FONT></P><P> </P><P><FONT size="5" color="#0000FF"><STRONG><SPAN class=""><SPAN class="">Hierarchy View </SPAN><SPAN class="">using </SPAN></SPAN><SPAN class=""><SPAN class="">d</SPAN></SPAN><SPAN class=""><SPAN class="">efine</SPAN><SPAN class=""> hierarchy <NAME></SPAN></SPAN></STRONG></FONT></P><P><FONT size="4"><SPAN>This is the new way of defining hierarchy and it is available </SPAN><SPAN>from 2023 on Prem and 2308 Cloud</SPAN><SPAN>. </SPAN><SPAN>For defining hierarchy, prerequisite is having a source view, which is mentioned in the definition as parent child hierarchy source.</SPAN><SPAN> </SPAN><SPAN> </SPAN></FONT></P><P><FONT size="4" color="#0000FF"><STRONG><SPAN>Source View</SPAN></STRONG></FONT></P><P><FONT size="4"><SPAN>In view definition parent child association is define along with that following associations:</SPAN><SPAN> </SPAN></FONT></P><UL><LI><FONT size="4"><SPAN>Association to hierarchy view itself- It defines parent child relationship</SPAN></FONT></LI><LI><FONT size="4"><SPAN>Association to hierarchy directory - It contains all the header information- hierarchy ids.</SPAN><SPAN> </SPAN></FONT></LI><LI><FONT size="4"><SPAN>A</SPAN><SPAN>ssociation to different dimension/text views –</SPAN><SPAN> I</SPAN><SPAN>t is a relation from the nodes and leaves to dimension and text views</SPAN><SPAN>.</SPAN><SPAN> Via this </SPAN><SPAN>association the</SPAN><SPAN> text of a node/leaf is derived. In the foll</SPAN><SPAN>owing e</SPAN><SPAN>xample '_</SPAN><SPAN>node' is</SPAN><SPAN> first level node. '_airline' acts as se</SPAN><SPAN>cond </SPAN><SPAN>level node </SPAN><SPAN>and '</SPAN><SPAN>_connection' is leaf and pointing to dimension</SPAN><SPAN>.</SPAN><SPAN> </SPAN></FONT></LI><LI><FONT size="4">Extra conditions like 'carrid = "" ' are not necessary and the order of the associations is not relevant. Instead in this case a separate field is needed, which returns the fieldname of the records, which should be used. In the example it is field 'nodetype'</FONT></LI></UL><P> </P><pre class="lia-code-sample language-abap"><code>@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'Base for : New Way of defining Hierarchy'
define view entity ZLR_CONN_HIERARCHY_BASE
as select from zoq_connid_h
//association to itself.
association [0..1] to ZLR_CONN_HIERARCHY_BASE as _parent on $projection.hieid = _parent.hieid
and $projection.parentid = _parent.nodeid
// association with hierarchy directory
association [1] to ZLR_CONNECTION_HIERARCHY_DIR as _dir on $projection.hieid = _dir.hieid
// associations to the different node types
// evalulated at runtime for each record in the order given here
// first hit of ON-condition is followed
// Differnce to old way of Hierarchy ZLR_CONNECTION_HIERARCHY - here no $projection.carrid = '' and $projection.connid = '0000'
association [1] to ZOQ_CONNECTION_NODENAME as _node on $projection.hieid = _node.hieid
and $projection.nodename = _node.nodeName
// "nodatetype" Airline
// Differnce to old way of Hierarchy ZLR_CONNECTION_HIERARCHY - here no and $projection.connid = '0000'
association [1] to ZOQ_AIRLINE as _airline on $projection.carrid = _airline.carrid
// association to dimension view
association [1] to ZLR_CONN as _connection on $projection.carrid = _connection.carrid
and $projection.connid = _connection.connid
{
@Consumption.filter: { mandatory : true, selectionType : #SINGLE, multipleSelections : false }
@ObjectModel.foreignKey.association: '_dir'
key hieid,
key nodeid,
parentid,
seqno,
// three different node types possible in this example
// here CONNID is leaf (can not be derived from this view)
@ObjectModel.foreignKey.association: '_airline'
carrid,
@ObjectModel.foreignKey.association: '_connection'
connid,
@ObjectModel.foreignKey.association: '_node'
nodename,
cast(
case when carrid is initial and connid is initial then 'NODENAME'
when connid is initial then 'CARRID'
else 'CONNID' end as fieldname ) as nodetype,
// associations defined above have to be exposed here
// otherwise they will not be available
_parent,
_dir,
_node,
_airline,
_connection
}</code></pre><P> </P><P><FONT size="4" color="#0000FF"><STRONG><SPAN>Hierarchy View </SPAN></STRONG><SPAN> </SPAN></FONT></P><P><FONT size="4"><SPAN>Hierarchy view can be defined using the following syntax.</SPAN><SPAN> </SPAN><SPAN> </SPAN></FONT></P><P><FONT size="4"><STRONG><SPAN>Syntax:</SPAN></STRONG><SPAN> </SPAN></FONT></P><OL><LI><FONT size="4"><SPAN>... </SPAN><SPAN> <BR /></SPAN><SPAN>[DEFINE] HIERARCHY hierarchy </SPAN><SPAN> <BR /></SPAN><SPAN> [parameter_list] </SPAN><SPAN> <BR /></SPAN><SPAN> AS PARENT CHILD HIERARCHY( </SPAN><SPAN> <BR /></SPAN><SPAN> SOURCE cds_view </SPAN><SPAN> <BR /></SPAN><SPAN> CHILD TO PARENT ASSOCIATION _hierarchy_assoc </SPAN><SPAN> <BR /></SPAN><SPAN> [PERIOD FROM field1 TO field2 VALID FROM from TO to] </SPAN><SPAN> <BR /></SPAN><SPAN> [DIRECTORY _directory_assoc FILTER BY cds_cond] </SPAN><SPAN> <BR /></SPAN><SPAN> [START WHERE cds_cond] </SPAN><SPAN> <BR /></SPAN><SPAN> SIBLINGS ORDER BY field1 [ASCENDING|DESCENDING][, </SPAN><SPAN> <BR /></SPAN><SPAN> field2 [ASCENDING|DESCENDING], ...] </SPAN><SPAN> <BR /></SPAN><SPAN> [DEPTH depth] </SPAN><SPAN> <BR /></SPAN><SPAN> [NODETYPE node_type] </SPAN><SPAN> <BR /></SPAN><SPAN> [LOAD BULK|INCREMENTAL|load_option] </SPAN><SPAN> <BR /></SPAN><SPAN> [MULTIPLE PARENTS {NOT ALLOWED}|LEAVES|ALLOWED] </SPAN><SPAN> <BR /></SPAN><SPAN> [ORPHANS IGNORE|ERROR|ROOT] </SPAN><SPAN> <BR /></SPAN><SPAN> [CYCLES ERROR|BREAKUP] </SPAN><SPAN> <BR /></SPAN><SPAN> [GENERATE SPANTREE] </SPAN><SPAN> <BR /></SPAN><SPAN> [CACHE ON|OFF|FORCE]) </SPAN><SPAN> <BR /></SPAN><SPAN> { element_list }</SPAN><SPAN> </SPAN></FONT></LI></OL><P><FONT size="4"><STRONG><SPAN>In Syntax</SPAN></STRONG><SPAN> </SPAN></FONT></P><UL><LI><FONT size="4"><STRONG><SPAN>SOURCE</SPAN></STRONG><SPAN> – Name of Source view. The mandatory addition SOURCE specifies a CDS view entity. This source must expose the hierarchy association specified after CHILD TO PARENT ASSOCIATION in its SELECT list.</SPAN><SPAN> </SPAN></FONT></LI></UL><P><FONT size="4"><SPAN> </SPAN><SPAN> </SPAN><STRONG><SPAN>source</SPAN></STRONG><SPAN> </SPAN></FONT></P><P><FONT size="4"><SPAN> </SPAN><SPAN> </SPAN><SPAN>ZLR_CONN_HIERARCHY_BASE</SPAN><SPAN> </SPAN><SPAN> </SPAN></FONT></P><UL><LI><FONT size="4"><STRONG><SPAN>CHILD TO PARENT ASSOCIATION</SPAN></STRONG><SPAN>: The mandatory addition CHILD TO PARENT ASSOCIATION specifies the hierarchy association who’s ON condition selects the descendant nodes of the root node set.</SPAN><SPAN> </SPAN></FONT></LI></UL><P><FONT size="4"><STRONG><SPAN> </SPAN></STRONG><SPAN> </SPAN><STRONG><SPAN>child</SPAN></STRONG> <STRONG><SPAN>to</SPAN></STRONG> <STRONG><SPAN>parent</SPAN></STRONG> <STRONG><SPAN>association</SPAN></STRONG><SPAN> </SPAN></FONT></P><P><FONT size="4"><SPAN> </SPAN><SPAN> </SPAN><SPAN> _parent</SPAN><SPAN> </SPAN><SPAN> </SPAN></FONT></P><UL><LI><FONT size="4"><STRONG><SPAN>PERIOD FROM</SPAN></STRONG><SPAN> field1 </SPAN><STRONG><SPAN>TO</SPAN></STRONG><SPAN> field2 </SPAN><STRONG><SPAN>VALID FROM</SPAN></STRONG><SPAN> from </SPAN><STRONG><SPAN>TO</SPAN></STRONG><SPAN> to: The optional addition PERIOD defines the hierarchy as a temporal SQL hierarchy in which the hierarchy nodes are limited by an adjustment of time intervals.</SPAN><SPAN> In case</SPAN><SPAN> of </SPAN><SPAN>parameter, they </SPAN><SPAN>can be </SPAN><SPAN>different but value must be same when used in a query. </SPAN></FONT><FONT size="4"><SPAN> </SPAN><STRONG><SPAN>period</SPAN></STRONG> <STRONG><SPAN>from</SPAN></STRONG><SPAN> datefrom </SPAN><STRONG><SPAN>to</SPAN></STRONG><SPAN> dateto </SPAN><STRONG><SPAN>valid</SPAN></STRONG> <STRONG><SPAN>from</SPAN></STRONG> <STRONG><SPAN>$parameters.</SPAN></STRONG><SPAN>p_date </SPAN><STRONG><SPAN>to</SPAN></STRONG> <STRONG><SPAN>$parameters.</SPAN></STRONG><SPAN>p_date </SPAN><SPAN> </SPAN></FONT></LI></UL><P><FONT size="4"><SPAN> OR</SPAN><SPAN> </SPAN></FONT></P><P><FONT size="4"><STRONG><SPAN> period</SPAN></STRONG> <STRONG><SPAN>from</SPAN></STRONG><SPAN> datefrom </SPAN><STRONG><SPAN>to</SPAN></STRONG><SPAN> dateto </SPAN><STRONG><SPAN>valid</SPAN></STRONG> <STRONG><SPAN>from</SPAN></STRONG> <SPAN>'20230425'</SPAN> <STRONG><SPAN>to</SPAN></STRONG> <SPAN>'20230425'</SPAN><SPAN> </SPAN><SPAN> </SPAN></FONT></P><UL><LI><FONT size="4"><STRONG><SPAN>DIRECTORY</SPAN></STRONG><SPAN>: Hierarchy directory name. The optional addition DIRECTORY defines a filter condition cds_cond for the rows of the source of the hierarchy specified after SOURCE. It defines association to the header/ directory view. Filter can be defined on hierarchy directory, based on parameter. In case of time dependent hierarchy date parameters can be used to filter out the hierarchy.</SPAN><SPAN> </SPAN></FONT></LI></UL><P><FONT size="4"><SPAN> </SPAN><STRONG><SPAN> </SPAN></STRONG><SPAN>_dir </SPAN><STRONG><SPAN>filter</SPAN></STRONG> <STRONG><SPAN>by</SPAN></STRONG><SPAN> hienm </SPAN><STRONG><SPAN>=</SPAN></STRONG> <STRONG><SPAN>$parameters.</SPAN></STRONG><SPAN>p_hienm1</SPAN><SPAN> </SPAN><SPAN> </SPAN></FONT></P><P><FONT size="4"><STRONG><SPAN> </SPAN></STRONG><STRONG><SPAN>and</SPAN></STRONG><SPAN> keydate </SPAN><STRONG><SPAN>=</SPAN></STRONG> <STRONG><SPAN>$parameters.</SPAN></STRONG><SPAN>p_keydate</SPAN><SPAN> </SPAN><SPAN> </SPAN><SPAN> </SPAN></FONT></P><UL><LI><FONT size="4"><STRONG><SPAN>START WHERE</SPAN></STRONG><SPAN>: The optional addition START WHERE specifies the start condition for creating the hierarchy. START WHERE can be followed by a logical expression cds_cond that selects rows from the source cds_view.</SPAN><SPAN> </SPAN></FONT></LI></UL><P><FONT size="4"><SPAN> </SPAN><SPAN> </SPAN><STRONG><SPAN>start</SPAN></STRONG> <STRONG><SPAN>where</SPAN></STRONG><SPAN> </SPAN></FONT></P><P><FONT size="4"><SPAN> </SPAN><SPAN> </SPAN><SPAN> parentid </SPAN><STRONG><SPAN>is</SPAN></STRONG> <STRONG><SPAN>initial</SPAN></STRONG><SPAN> </SPAN><SPAN> </SPAN></FONT></P><UL><LI><FONT size="4"><STRONG><SPAN>SIBLINGS ORDER BY</SPAN></STRONG><SPAN> field1 [ASCENDING|DESCENDING]: The mandatory addition SIBLINGS ORDER BY sorts sibling nodes in the hierarchy. Default is Ascending.</SPAN><SPAN> </SPAN> </FONT></LI></UL><P><FONT size="4"><SPAN> </SPAN><STRONG><SPAN>siblings</SPAN></STRONG> <STRONG><SPAN>order</SPAN></STRONG> <STRONG><SPAN>by</SPAN></STRONG><SPAN> </SPAN></FONT></P><P><FONT size="4"><SPAN> seqno</SPAN><SPAN> </SPAN><SPAN> </SPAN></FONT></P><UL><LI><FONT size="4"><STRONG><SPAN>NODETYPE </SPAN></STRONG><SPAN>node_type: The NODETYPE identifies an element of the CDS hierarchy that can be used to determine the type of the hierarchy node. The values of this element must be element names, which must </SPAN><SPAN>also</SPAN><SPAN> be contained in the element list of the CDS hierarchy.</SPAN><SPAN> </SPAN></FONT></LI></UL><P><FONT size="4"><SPAN>In context of Analytics, it is mandatory to define the nodetype field in the source view of the hierarchy and also in the hierarchy view using key word '</SPAN><SPAN>nodetype'</SPAN></FONT></P><P><FONT size="4"><SPAN>For example, in the Source view </SPAN><SPAN> </SPAN></FONT></P><P><FONT size="4"><SPAN> </SPAN><SPAN> </SPAN><STRONG><SPAN>cast(</SPAN></STRONG><SPAN> </SPAN><SPAN> </SPAN></FONT></P><P><FONT size="4"><SPAN> </SPAN> <SPAN> </SPAN><STRONG><SPAN>case</SPAN></STRONG> <STRONG><SPAN>when</SPAN></STRONG> <SPAN>carrid</SPAN> <STRONG><SPAN>is</SPAN></STRONG> <STRONG><SPAN>initial</SPAN></STRONG> <STRONG><SPAN>and</SPAN></STRONG><SPAN> connid </SPAN><STRONG><SPAN>is</SPAN></STRONG> <STRONG><SPAN>initial</SPAN></STRONG> <STRONG><SPAN>then</SPAN></STRONG> <SPAN>'NODENAME'</SPAN><SPAN> </SPAN></FONT></P><P><FONT size="4"><SPAN> </SPAN><SPAN> </SPAN><STRONG><SPAN>when</SPAN></STRONG><SPAN> connid </SPAN><STRONG><SPAN>is</SPAN></STRONG> <STRONG><SPAN>initial</SPAN></STRONG><SPAN> </SPAN><STRONG><SPAN>then</SPAN></STRONG> <SPAN>'CARRID'</SPAN><SPAN> </SPAN></FONT></P><P><FONT size="4"><SPAN> </SPAN><SPAN> </SPAN><STRONG><SPAN>else</SPAN></STRONG> <SPAN>'CONNID'</SPAN> <STRONG><SPAN>end</SPAN></STRONG> <STRONG><SPAN>as</SPAN></STRONG> <I><SPAN>fieldname</SPAN></I> <STRONG><SPAN>)</SPAN></STRONG> <STRONG><SPAN>as</SPAN></STRONG><SPAN> nodetype</SPAN><STRONG><SPAN>,</SPAN></STRONG><SPAN> </SPAN><SPAN> </SPAN></FONT></P><P><FONT size="4"><SPAN>In the Hierarchy view </SPAN><SPAN> </SPAN></FONT></P><P><FONT size="4"><SPAN> </SPAN><STRONG><SPAN>nodetype</SPAN></STRONG><SPAN> </SPAN></FONT></P><P><FONT size="4"><SPAN> </SPAN><SPAN> nodetype</SPAN><SPAN> </SPAN></FONT></P><P><FONT size="4"><SPAN> </SPAN><SPAN>More detailed information can be found here </SPAN><A href="https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/index.htm?file=abencds_f1_define_hierarchy.htm" target="_blank" rel="noopener noreferrer"><SPAN>ABAP Keyword Documentation (sap.com)</SPAN></A><SPAN>.</SPAN><SPAN> </SPAN></FONT></P><P><FONT size="4" color="#0000FF"><STRONG><SPAN><SPAN class="">Example of </SPAN><SPAN class="">Hierarchy View</SPAN></SPAN></STRONG></FONT></P><P> </P><pre class="lia-code-sample language-abap"><code>define hierarchy ZLR_CONN_HIERARCHY
with parameters
@Consumption.defaultValue: 'CNTRY'
p_hieid : zoq_conhieid
as parent child hierarchy(
source ZLR_CONN_HIERARCHY_BASE
child to parent association _parent
directory _dir filter by
hieid = $parameters.p_hieid
start where
parentid is initial
siblings order by
seqno
nodetype nodetype
)
{
@ObjectModel.foreignKey.association: '_dir'
key hieid,
key nodeid,
parentid,
seqno,
@ObjectModel.foreignKey.association: '_airline'
carrid,
@ObjectModel.foreignKey.association: '_connection'
connid,
@ObjectModel.foreignKey.association: '_node'
nodename,
nodetype,
// associations defined above have to be exposed here
// otherwise they will not be available
_parent,
_dir,
_node,
_airline,
_connection
}</code></pre><P> </P><P><FONT size="4" color="#0000FF"><STRONG><SPAN><SPAN class="">Out</SPAN><SPAN class="">put</SPAN></SPAN></STRONG></FONT></P><P><FONT size="4"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="LinaRaut_0-1720989908770.png" style="width: 607px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/136487iB83682D5BB21AF35/image-dimensions/607x432?v=v2" width="607" height="432" role="button" title="LinaRaut_0-1720989908770.png" alt="LinaRaut_0-1720989908770.png" /></span></FONT></P><P><FONT size="4"><FONT color="#FF0000"><SPAN>Red:</SPAN></FONT><SPAN> association _node </SPAN><SPAN> </SPAN><SPAN> </SPAN><SPAN> </SPAN></FONT></P><P><FONT size="4"><FONT color="#339966"><SPAN>Green</SPAN></FONT><SPAN><FONT color="#339966">:</FONT> association _airline</SPAN><SPAN> </SPAN><SPAN> </SPAN><SPAN> </SPAN></FONT></P><P><FONT size="4"><FONT color="#0000FF"><SPAN>Blue</SPAN></FONT><SPAN><FONT color="#0000FF">:</FONT> association _connection,</SPAN> <SPAN>the blue marked records are leaves</SPAN><SPAN> </SPAN></FONT></P><P><FONT size="4"><STRONG><FONT color="#0000FF"><SPAN class=""><SPAN class=""><SPAN class="">Example o</SPAN></SPAN></SPAN><SPAN class=""><SPAN class=""><SPAN class="">f Query using Hierarchy</SPAN></SPAN></SPAN></FONT></STRONG></FONT></P><P> </P><pre class="lia-code-sample language-abap"><code>@AccessControl.authorizationCheck: #NOT_ALLOWED
@EndUserText.label: 'ZLR_CONN - query'
@Metadata.ignorePropagatedAnnotations: true
define transient view entity ZLR_CONN_QUERY
provider contract analytical_query
as projection on ZLR_CONN
{
@AnalyticsDetails.query:{
axis:#ROWS,
displayHierarchy: #ON ,
hierarchyBinding: [{ type: #CONSTANT, value: 'CNTRY' }]
}
connid
}</code></pre><P> </P><P><FONT size="4" color="#0000FF"><STRONG><SPAN><SPAN class=""><SPAN class="">Output</SPAN></SPAN></SPAN></STRONG></FONT></P><P><FONT size="4"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="LinaRaut_1-1720990617543.png" style="width: 462px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/136488iDCC79DDE37ADBC00/image-dimensions/462x488?v=v2" width="462" height="488" role="button" title="LinaRaut_1-1720990617543.png" alt="LinaRaut_1-1720990617543.png" /></span></FONT></P><P><FONT size="5" color="#0000FF"><STRONG><SPAN>Hierarchy View Using @ObjectModel.dataCategory: #HIERARCHY Annotation </SPAN></STRONG><SPAN>(OLD way)</SPAN></FONT></P><P><FONT size="4"><SPAN>In View </SPAN><SPAN>definition the annotation </SPAN><A href="mailto:%E2%80%98@Hierarchy.parentChild%E2%80%99" target="_blank" rel="noopener nofollow noreferrer"><SPAN>@Hierarchy.parentChild </SPAN></A><SPAN>provides the information about the parent child hierarchy. It has hierarchy name, </SPAN><SPAN>multiple parents, recursion by, ordering of siblings, root node visibility, orphaned node handling, etc. along with </SPAN><SPAN>that, following association</SPAN><SPAN>s need to be defined. </SPAN><SPAN> </SPAN><SPAN> </SPAN></FONT></P><UL><LI><FONT size="4"><SPAN>Association to hierarchy view itself</SPAN> <SPAN>- </SPAN><SPAN>I</SPAN><SPAN>t defines parent child relationship.</SPAN><SPAN> </SPAN> </FONT></LI><LI><FONT size="4"><SPAN>Association to hierarchy directory</SPAN><SPAN> view</SPAN> <SPAN>-</SPAN><SPAN> I</SPAN><SPAN>t </SPAN><SPAN>contains</SPAN><SPAN> all the header information</SPAN><SPAN>, </SPAN><SPAN>hierarchy</SPAN><SPAN> Ids and the </SPAN><SPAN>descriptions</SPAN><SPAN>.</SPAN><SPAN> </SPAN></FONT></LI><LI><FONT size="4"><SPAN>Association to different</SPAN><SPAN> dimension/text views</SPAN> <SPAN>–</SPAN> <SPAN>I</SPAN><SPAN>t is a relation from the nodes and leaves to dimension and text views</SPAN><SPAN>.</SPAN><SPAN> Via this association </SPAN><SPAN>the text of a node/leaf is derived.</SPAN><SPAN> In the following example '</SPAN><SPAN>_</SPAN><SPAN>node'</SPAN> <SPAN>is</SPAN> <SPAN>first</SPAN><SPAN> level node</SPAN><SPAN>,</SPAN><SPAN> '_airline' acts as </SPAN><SPAN>second</SPAN><SPAN> level node </SPAN><SPAN>and '</SPAN><SPAN>_connection'</SPAN><SPAN> is leaf and pointing to dimension. </SPAN><SPAN> </SPAN></FONT></LI></UL><P><FONT size="4">Important is the order of the associations listed in the element-list and the '<SPAN>extra-condition'</SPAN><SPAN> in the ON-clause. For each record of the hierarchy the ON condition of the associations is checked - the first association which meets the ON condition is used to get text and attributes for the hierarchy node/leaf</SPAN><SPAN>.</SPAN><SPAN> </SPAN></FONT></P><P><FONT size="4"><SPAN>One association is mandatory - its target must be the dimension view which has a </SPAN><SPAN>ObjectModel.hierarchy.association</SPAN><SPAN> to the hierarchy view. These objects in the hierarchy represent the </SPAN><SPAN>leave</SPAN><SPAN>s</SPAN><SPAN>.</SPAN><SPAN> </SPAN></FONT></P><P><FONT size="4" color="#0000FF"><STRONG><SPAN>Example</SPAN></STRONG></FONT></P><P> </P><pre class="lia-code-sample language-abap"><code>@EndUserText.label: 'Connection Hierarchy View'
@ObjectModel.dataCategory: #HIERARCHY
@Hierarchy.parentChild: [{
name : 'ConnectionHierarchy',
label : 'Connection',
siblingsOrder: [{ by: 'seqno' }] ,
recurseBy : '_parent',
directory: '_dir'
}]
define view entity ZLR_CONNECTION_HIERARCHY
as select from zoq_connid_h
// basic parent child relation inside one hierarchy
// hierarchy uniquely selected (see @Filter for field HIEID
association [0..1] to ZLR_CONNECTION_HIERARCHY as _parent on $projection.parentid = _parent.nodeid
// necessary if view represents several hierarchies
// association to the hierarchy directory
association [1] to ZLR_CONNECTION_HIERARCHY_DIR as _dir on $projection.hieid = _dir.hieid
// associations to the different node types
// evalulated at runtime for each record in the order given here
// first hit of ON-condition is followed
association [1] to ZOQ_CONNECTION_NODENAME as _node on $projection.hieid = _node.hieid
and $projection.nodename = _node.nodeName
and $projection.carrid = ''
and $projection.connid = '0000'
// "nodatetype" Airline
association [1] to ZOQ_AIRLINE as _airline on $projection.carrid = _airline.carrid
and $projection.connid = '0000'
// For which dimension this hierarchy belongs
association [1] to ZLR_CONNECTION as _connection on $projection.carrid = _connection.carrid
and $projection.connid = _connection.connid
{
@Consumption.filter: { mandatory : true, selectionType : #SINGLE, multipleSelections : false }
@ObjectModel.foreignKey.association: '_dir'
key hieid,
key nodeid,
parentid,
seqno,
// three different node types possible in this example
// here CONNID is leaf (can not be derived from this view)
@ObjectModel.foreignKey.association: '_airline'
carrid,
@ObjectModel.foreignKey.association: '_connection'
connid,
@ObjectModel.foreignKey.association: '_node'
nodename,
// associations defined above have to be exposed here
// otherwise they will not be available
_parent,
_dir,
_node,
_airline,
_connection
} </code></pre><P> </P><P> </P><P><FONT size="4" color="#0000FF"><STRONG><SPAN class=""><SPAN class="">Output</SPAN></SPAN></STRONG></FONT></P><P><FONT size="4"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="LinaRaut_1-1720985929330.png" style="width: 613px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/136486iE4D5634C7709FE25/image-dimensions/613x544?v=v2" width="613" height="544" role="button" title="LinaRaut_1-1720985929330.png" alt="LinaRaut_1-1720985929330.png" /></span></FONT></P><P><FONT size="4"><FONT color="#FF0000"><SPAN>Red:</SPAN></FONT><SPAN> association _node </SPAN><SPAN> </SPAN><SPAN> </SPAN><SPAN> </SPAN></FONT></P><P><FONT size="4"><FONT color="#008080"><SPAN>Green</SPAN></FONT><SPAN><FONT color="#008080">: </FONT>association _airline</SPAN><SPAN> </SPAN><SPAN> </SPAN><SPAN> </SPAN></FONT></P><P><FONT size="4"><FONT color="#0000FF"><SPAN>Blue</SPAN></FONT><SPAN><FONT color="#0000FF">:</FONT> association _connection, the blue marked records are leaves</SPAN><SPAN> </SPAN></FONT></P><P> </P><P><FONT size="4"><FONT color="#0000FF"><STRONG><SPAN>Reference</SPAN></STRONG></FONT><SPAN> </SPAN></FONT></P><P><FONT size="4">More information on @Semantics.signReversalIndicator can be found in the <A href="https://community.sap.com/t5/technology-blogs-by-sap/cds-view-hierarchy-node-sign-reversal/ba-p/13599337" target="_blank">blog.</A> </FONT></P><P><FONT size="4"><SPAN> </SPAN></FONT></P><P> </P><P> </P>2024-07-17T14:18:20.286000+02:00https://community.sap.com/t5/application-development-blog-posts/sap-developer-news-july-25th-2024/ba-p/13772205SAP Developer News, July 25th, 20242024-07-25T21:10:00.054000+02:00thomas_junghttps://community.sap.com/t5/user/viewprofilepage/user-id/139<P><div class="video-embed-center video-embed"><iframe class="embedly-embed" src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FvmCGBiY07Do&display_name=YouTube&url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DvmCGBiY07Do&image=http%3A%2F%2Fi.ytimg.com%2Fvi%2FvmCGBiY07Do%2Fhqdefault.jpg&key=b0d40caa4f094c68be7c29880b16f56e&type=text%2Fhtml&schema=youtube" width="400" height="225" scrolling="no" title="YouTube embed" frameborder="0" allow="autoplay; fullscreen; encrypted-media; picture-in-picture;" allowfullscreen="true"></iframe></div></P><P>Podcast Version: <A href="https://podcast.opensap.info/sap-developers/2024/07/25/sap-developer-news-july-25th-2024/" target="_blank" rel="nofollow noopener noreferrer">https://podcast.opensap.info/sap-developers/2024/07/25/sap-developer-news-july-25th-2024/</A></P><H3 id="toc-hId-1150235398">DESCRIPTION</H3><P><STRONG>ABAP CDS TechByte Series</STRONG></P><UL><LI>ABAP CDS TechBytes – <A href="https://www.youtube.com/playlist?list=PL6RpkC85SLQC3HBShmlMaPu_nL--4f20z" target="_blank" rel="nofollow noopener noreferrer">https://www.youtube.com/playlist?list=PL6RpkC85SLQC3HBShmlMaPu_nL--4f20z</A></LI></UL><P><STRONG>SAP Build Code July Updates</STRONG></P><UL><LI>Product Updates for SAP Build Code – July 2024 Edition <A href="https://community.sap.com/t5/technology-blogs-by-sap/product-updates-for-sap-build-code-july-2024-edition/ba-p/13764559" target="_blank">https://community.sap.com/t5/technology-blogs-by-sap/product-updates-for-sap-build-code-july-2024-edition/ba-p/13764559</A></LI></UL><P><STRONG>July Developer Challenge reminder</STRONG></P><UL><LI>Blog post (containing links to each of the tasks) <A href="https://community.sap.com/t5/application-development-blog-posts/july-developer-challenge-quot-reverse-apis-quot/ba-p/13749653" target="_blank">https://community.sap.com/t5/application-development-blog-posts/july-developer-challenge-quot-reverse-apis-quot/ba-p/13749653</A></LI></UL><P><STRONG>UI5 Tooling 4.0 and Code Connect recordings:</STRONG></P><UL><LI>UI5 Tooling 4.0: <A href="https://community.sap.com/t5/technology-blogs-by-sap/ui5-tooling-4-0/ba-p/13769578" target="_blank">https://community.sap.com/t5/technology-blogs-by-sap/ui5-tooling-4-0/ba-p/13769578</A></LI><LI>reCAP Recordings: <A href="https://recap-conf.dev/" target="_blank" rel="nofollow noopener noreferrer">https://recap-conf.dev/</A></LI><LI>ui5Con Recordings: <A href="https://openui5.org/ui5con/germany2024/" target="_blank" rel="nofollow noopener noreferrer">https://openui5.org/ui5con/germany2024/</A></LI><LI>ABAPConf Recordings: <A href="https://abapconf.org/abapconfeurope2024/" target="_blank" rel="nofollow noopener noreferrer">https://abapconf.org/abapconfeurope2024/</A></LI></UL><P><STRONG>CAP #GoodToKnow Shorts Series</STRONG></P><UL><LI>Modeling many-to-many associations #SAPCAP #GoodToKnow – YouTube <A href="https://www.youtube.com/shorts/yGg3YD1weIA" target="_blank" rel="nofollow noopener noreferrer">https://www.youtube.com/shorts/yGg3YD1weIA</A></LI><LI>Series Playlist: <A href="https://www.youtube.com/playlist?list=PL6RpkC85SLQDZ18v94otZSJJrpcNkPPV9" target="_blank" rel="nofollow noopener noreferrer">https://www.youtube.com/playlist?list=PL6RpkC85SLQDZ18v94otZSJJrpcNkPPV9</A></LI></UL><P>================================================</P><H3 id="toc-hId-953721893">CHAPTER TITLES</H3><P>0:00 Intro</P><P>0:10 ABAP CDS TechByte Series</P><P>1:01 SAP Build Code July Updates</P><P>2:48 July Developer Challenge reminder</P><P>3:58 UI5 Tooling 4.0 and Code Connect recordings</P><P>4:55 CAP #GoodToKnow Shorts Series </P><H3 id="toc-hId-757208388">TRANSCRIPTION</H3><P><STRONG>[Shilpa]</STRONG> Hello SAP developers, I'm sure by now you would have seen the new TechByte series on ABAP Core Data Services. If not, here's a quick recap. Myself and developer advocate Sheena will walk you through the basics of ABAP CDS, covering the overview and key functionality, how a virtual element with complex logic can be created, extend a CDS View Entity, restrict the data authorizations using CDS Access Control, govern the quality of CDS Views using unit test, and troubleshooting tools available to analyze the data of CDS Views. I will leave the link to the ten-part videos in the description. Not just that, the advanced features of ABAP CDS will be coming up, so stay tuned.</P><P><STRONG>[Thomas]</STRONG> First shipped earlier this year, we have the introduction of SAP Build Code. This is the AI-powered latest version of SAP's development environment based upon the SAP Business Application Studio. This month we see enhancements to SAP Build Code, many of which are based right upon your feedback from initial use of Build Code. Most of the enhancements focus on the Joule AI integration.</P><P>First of all, we've made it easier to get to the Joule Assistant from within the storyboard and the graphical navigation tools of the CAP designer itself. The part that I'm most excited about is originally Joule integration in SAP Build Code was really focused on creating new CAP entities. So very useful when you're first starting your project. But we've heard your feedback and we've added a lot of new functionality that also lets you alter an existing CAP data model. So you can add new entities, add or remove associations, and make these changes to an existing model all using the same AI assistant that you've been using to start your projects. In addition to this major enhancement for the AI capabilities, we also see the addition of a guided assistant for Fiori development as well as a new graphical HDBGrants editor as well. So be sure to check out all the latest enhancements to SAP Build Code with the link in the show notes to the blog post that details them.</P><P><STRONG>[DJ]</STRONG> The SAP Developer Challenge this month is well on the way. The challenge is called Reverse APIs, and it's all about you creating, creating CAP-based services and API endpoints for us to call and validate. We're about three quarters of the way through the challenge. There are 12 tasks altogether. So it sounds about right for this time of the month. So far, we've been digging into defining and implementing actions and functions in a couple of simple services across the REST protocol and the OData protocol adapters. And now we're moving more into a sort of Northwind-based service scenario, where we can try and flex our Odata muscles a bit more. It's not too late to get started. There's plenty of discussion and help in the SAP Community Platform for each of the tasks. So what are you waiting for? Head over to the SAP Community. The blog post link is in the description and get going.</P><P><STRONG>[Nico]</STRONG> Hi everyone, and welcome to the SAP Developer News. The UI5 team just released version four of the UI5 tooling, which comes with some handy new features as well as paving the road for UI5 version 2.x, which is still in the works, but hopefully available soon. One of the new features is that the tooling can now generate the supported locales property of the manifest.json. So no more ugly 404s in production. Check out the blog post linked in the description for more information. On a related note, we would like to point our attention to the recordings of {CodeConnect}. They're now available on YouTube. So for UI5Con, reCAP, and ABAPConf, there are a lot of recordings available so you can check out the sessions on YouTube in your own time. Use the summer break wisely. All right, hope to see you soon, and bye.</P><P><STRONG>[Thomas]</STRONG> I wanted to draw your attention to the recent series of YouTube Shorts, all with the tag #GoodToKnow. These are created by our fellow developer advocate, DJ Adams, and look at the basics of the SAP Cloud Application Programming Model. They do it in short 60-second chunks, and all formatted for easy consumption on a mobile device. This makes it easy to learn on the go, or just for those of you looking for some basic, but great CAP knowledge that you can consume in small, bite-sized chunks. In the most recent episode, DJ talks about many-to-many associations in the Cloud Application Programming Model. It's a concept that I thought would be difficult to explain and understand in 60 seconds, but DJ does a perfect job of it. So be sure to check out that latest video and the entire Good to Know series if you wanna learn more about the SAP Cloud Application Programming Model.</P>2024-07-25T21:10:00.054000+02:00https://community.sap.com/t5/technology-blogs-by-sap/customer-amp-partner-roundtable-for-sap-btp-abap-environment-15/ba-p/13777883Customer & Partner Roundtable for SAP BTP ABAP Environment #152024-07-31T08:16:04.315000+02:00iwona_hahnhttps://community.sap.com/t5/user/viewprofilepage/user-id/4326<H3 id="toc-hId-1150390365"><STRONG><SPAN class="lia-unicode-emoji"><span class="lia-unicode-emoji" title=":backhand_index_pointing_right:">👉</span></SPAN> The call for contributions for one of the upcoming roundtables is open! </STRONG></H3><P> </P><DIV><TABLE><TBODY><TR><TD>If you want to show a demo or share a use case scenario for SAP BTP ABAP Environment send us an<SPAN> </SPAN><A href="mailto:sap_btp_abap_environment@sap.com" target="_blank" rel="noopener nofollow noreferrer">email</A> and we will get back to you.</TD></TR></TBODY></TABLE><SPAN> </SPAN></DIV><H2 id="toc-hId-824794141">Introduction</H2><P> </P><DIV><SPAN class="">A</SPAN><SPAN class="">s<SPAN> </SPAN></SPAN><A class="" href="https://www.sap.com/products/technology-platform/abap.html" target="_blank" rel="noreferrer noopener"><SPAN class="">SAP BTP ABAP environment (aka Steampunk)</SPAN></A><SPAN> </SPAN>and ABAP Cloud<SPAN> </SPAN><SPAN class="">became more </SPAN><SPAN class="">and more popular</SPAN><SPAN class=""><SPAN> </SPAN>inside and outside of SAP, there is a high demand for rolling out the latest product news and updates, asking questions, and of course showing demos. </SPAN><BR /><BR /><SPAN class="lia-unicode-emoji"><span class="lia-unicode-emoji" title=":light_bulb:">💡</span></SPAN> If you weren’t able to join one of our previous roundtables, you can find the slides presented, recordings, and further references in this<SPAN> </SPAN><A href="https://github.com/iwonahahn/SAP-BTP-ABAP-Environment-Roundtable/tree/main" target="_blank" rel="noopener nofollow noreferrer">GitHub repository</A>.<BR /><BR /></DIV><DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="iwona_hahn_1-1711369871866.jpeg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/85948i899EEF37EF74A54C/image-size/medium?v=v2&px=400" role="button" title="iwona_hahn_1-1711369871866.jpeg" alt="iwona_hahn_1-1711369871866.jpeg" /></span><H2 id="toc-hId-628280636"><BR />Meeting Information<BR /><BR /></H2><STRONG>When: </STRONG><BR /><UL><LI><STRONG><SPAN class="">August 22nd</SPAN></STRONG>, 10:00 - 11:00 AM CET –<SPAN> </SPAN><A href="https://sap-se.zoom.us/meeting/register/tJ0sdu2trzkuE9fo6aGj2nLsK9YQPOShJgwd" target="_blank" rel="nofollow noopener noreferrer">Zoom Meeting</A> (<STRONG>please register</STRONG><SPAN> </SPAN>in advance) </LI></UL></DIV><DIV> </DIV><DIV><STRONG>Who:</STRONG><UL><LI>All interested <STRONG>customers, partners,</STRONG> and <STRONG>stakeholders</STRONG> are invited to join and exchange ideas and feedback with others and the product team</LI><LI><STRONG>Steampunk team</STRONG>: <STRONG><A href="https://community.sap.com/t5/user/viewprofilepage/user-id/4296" target="_blank">Frank Jentsch</A></STRONG><SPAN> </SPAN><SPAN class="">(Product Lead for SAP BTP ABAP Environment), </SPAN><STRONG><A href="https://community.sap.com/t5/user/viewprofilepage/user-id/4326" target="_self"><SPAN class="">Iwona Hahn</SPAN></A></STRONG> & <STRONG><A href="https://community.sap.com/t5/user/viewprofilepage/user-id/151005" target="_self">Burcu Karlidag</A></STRONG><SPAN class=""> (Product Management),<STRONG> <A href="https://community.sap.com/t5/user/viewprofilepage/user-id/15175" target="_blank">Daniel Wachs</A></STRONG> (<SPAN><SPAN class="">Development Architect for Extensibility in BTP ABAP)</SPAN></SPAN></SPAN><BR /><BR /></LI></UL></DIV><DIV><STRONG>Preliminary Agenda:</STRONG><BR /><UL><LI>Product news</LI><LI><SPAN class="">New features of 2408 release</SPAN></LI><LI><SPAN class=""><SPAN>Developer and Key User Extensibility incl. demo</SPAN></SPAN></LI><LI>Q&A</LI></UL><SPAN>Looking forward to meeting you!</SPAN></DIV><DIV> </DIV><DIV><A href="https://sap-se.zoom.us/meeting/register/tJ0sdu2trzkuE9fo6aGj2nLsK9YQPOShJgwd" target="_blank" rel="noopener nofollow noreferrer"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="iwona_hahn_2-1711369871851.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/85947i01677A9AE51AAC1D/image-size/medium?v=v2&px=400" role="button" title="iwona_hahn_2-1711369871851.png" alt="iwona_hahn_2-1711369871851.png" /></span></A><BR /><BR /><SPAN>Check out our</SPAN><SPAN> </SPAN><A href="https://pages.community.sap.com/topics/btp-abap-environment" target="_blank" rel="noopener noreferrer">SAP Business Technology ABAP Environment</A><SPAN> page in SAP Community </SPAN><SPAN>for </SPAN><SPAN>product </SPAN><SPAN>updates </SPAN><SPAN>and </SPAN><SPAN>upcoming events.</SPAN></DIV>2024-07-31T08:16:04.315000+02:00https://community.sap.com/t5/application-development-blog-posts/sap-developer-news-august-1st-2024/ba-p/13780326SAP Developer News, August 1st, 20242024-08-01T21:10:00.034000+02:00thomas_junghttps://community.sap.com/t5/user/viewprofilepage/user-id/139<P><div class="video-embed-center video-embed"><iframe class="embedly-embed" src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2Fm0tChLZuWiM%3Ffeature%3Doembed&display_name=YouTube&url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3Dm0tChLZuWiM&image=https%3A%2F%2Fi.ytimg.com%2Fvi%2Fm0tChLZuWiM%2Fhqdefault.jpg&key=b0d40caa4f094c68be7c29880b16f56e&type=text%2Fhtml&schema=youtube" width="400" height="225" scrolling="no" title="BTP Innobytes July, Aug Dev Challenge - ABAP CDS, TechEd Registration | SAP Developer News" frameborder="0" allow="autoplay; fullscreen; encrypted-media; picture-in-picture;" allowfullscreen="true"></iframe></div></P><P><STRONG>Podcast Version:</STRONG> <A href="https://podcast.opensap.info/sap-developers/2024/08/01/sap-developer-news-august-1st-2024/" target="_blank" rel="nofollow noopener noreferrer">https://podcast.opensap.info/sap-developers/2024/08/01/sap-developer-news-august-1st-2024/</A></P><H3 id="toc-hId-1151100361">DESCRIPTION</H3><P><STRONG>SAP BTP Innobytes July edition</STRONG></P><UL><LI>Video <A href="https://www.youtube.com/watch?v=CAVl-_HWHg8" target="_blank" rel="nofollow noopener noreferrer">https://www.youtube.com/watch?v=CAVl-_HWHg8</A></LI></UL><P><STRONG>August Developer Challenge</STRONG></P><UL><LI>Blog Post: <A href="https://community.sap.com/t5/application-development-blog-posts/sap-developer-challenge-abap-core-data-services/ba-p/13778288" target="_blank">https://community.sap.com/t5/application-development-blog-posts/sap-developer-challenge-abap-core-data-services/ba-p/13778288</A></LI></UL><P><STRONG>SAP TechEd Virtual Registration is Open!</STRONG>!</P><UL><LI>Registration Site: <A href="https://www.sap.com/events/teched.html" target="_blank" rel="noopener noreferrer">https://www.sap.com/events/teched.html</A></LI></UL><P><STRONG>Major UX Update of Joule in SAP Build Code</STRONG></P><UL><LI>Blog Post with Details: <A href="https://community.sap.com/t5/technology-blogs-by-sap/major-ux-update-of-joule-in-sap-build-code/ba-p/13770686" target="_blank">https://community.sap.com/t5/technology-blogs-by-sap/major-ux-update-of-joule-in-sap-build-code/ba-p/13770686</A></LI></UL><H3 id="toc-hId-954586856">CHAPTER TITLES</H3><P>0:00 Intro</P><P>0:10 SAP BTP Innobytes July edition</P><P>2:09 August Developer Challenge</P><P>3:04 SAP TechEd Virtual Registration is Open!!</P><P>4:33 Major UX Update of Joule in SAP Build Code</P><H3 id="toc-hId-758073351">TRANSCRIPT</H3><P><STRONG>[DJ]</STRONG> The July edition of SAP BTP InnoBytes is out now. If you didn't know already, you should know SAP BTP InnoBytes is a monthly series of videos bringing you snackable, up-to-date information about innovations on SAP BTP. This month we see items on security and identity and also on the SAP Task Center. So first of all the SAP Secure Login Service for SAPGUI has some enhancements allowing you to connect to and use customer managed certificate authorities. There's support already for AWS private CAs with more options in the roadmap. With SAP Cloud Identity Services, there are some enhancements to allow you to define user group assignments at the application level on top of the already existing user profile and tenant balance. And finally, with the SAP Task Center there are some innovations allowing you now to bring in and use task providers from non-SAP and legacy systems, bringing a much asked for unified task view. Find out more about these innovations in the InnoBytes July edition. Link is in the description. And, by the way, it's the end of July, just starting August, which means that the Reverse APIs challenge is now coming to an end. You can still work through the tasks, but we've got an amazing challenge coming up for you for the month of August, and I'm going to hand over to my lovely friend and colleague Shilpa to tell you all about it. Shilpa, over to you.</P><P><STRONG>[Shilpa]</STRONG> Thanks, DJ, in passing the SAP Developer Challenge. I must admit, you kept the SAP Community hungry in releasing eleven tasks in your challenge. Me and Sheena will try to keep up the legacy in making an interesting August Developer Challenge. So with that, hello, everyone. you might have seen the ongoing SAP TechByte series on ABAP Core Data Services. So with that, it's a good idea to have the developer challenge related to ABAP CDS. Watch out for every Wednesday where a new task will be released. There's a prerequisite which will help you to get started with this challenge. Now this blog post gives the information about the challenge, quick links, health document, and the timeline as and when the task is updated. Check out the blog post, make sure to complete the prerequisite, and be ready for the challenge.</P><P><STRONG>[Rich]</STRONG> Hey folks, Rich Heilman here. Have you heard? Registration for SAP TechEd Virtua 2024 is now open, and I'm not the only one that gets excited about this time of year. My best friend Sully also loves TechEd time, and he's gearing up as well. SAP TechEd Virtual 2024 will be packed with a ton of information for architects and developers, ranging from lectures and jumpstart sessions, from voice of the partner sessions to keynotes, and of course your very own developer keynote, which we are changing up a bit this year and having more of a deconstructed approach to the developer keynote. So stay tuned for more details on that. So make sure to sign up for SAP TechEd Virtual which takes place on October 8th and 9th and also stay tuned for more information around the SAP TechEd on tour stops starting in November. And lastly don't forget about Devtoberfest which starts two weeks prior to the start of SAP TechEd Virtual and picks up or picks back up for an additional two weeks after the SAP TechEd virtual event and as always your Developer Advocate team will be playing a huge role in both Devtoberfest and SAP TechEd in general and we are all really excited to see all of you soon bye for now</P><P><STRONG>[Shrini]</STRONG> Hello SAP developers we are happy to announce some major UX announcements on Joule within SAP Build Code. The new design brings a more intuitive user interface which enhances usability and brings in streamlined workflows. Before the update, triggering Joule required navigating through specific entry points like the Guide Center or the Enhance button in the Data Editor. It also meant switching between separate chats for different tasks. With a new design, Joule has a single interface for all functionalities, making it easy to switch between tasks. There are some great new features to make all of this possible. Slash Commands lets you generate a Fiori limits application, get help on SAPUI5 topics, generate a CAP application, add sample data and logic to it. Context variables allows you to use hash symbol in combination with slash commands to reference existing project files. The dynamic suggestion feature shows developers' previous actions automatically. A new file management feature allows you to see which files Joule is using for code generation both during and after the process. A new file list block component allows developers to check the quality of the generated code in the files when multiple files are generated. Custom action buttons allows you to quickly navigate to various interfaces of base code and edit the generated results. If you want to dig deeper into these features, our design lead of SAP Build Code, Ivan, has written this blog post about it. We would love to hear your feedback on these topics.</P>2024-08-01T21:10:00.034000+02:00https://community.sap.com/t5/technology-blogs-by-sap/how-to-perform-mass-upload-from-an-excel-file-in-a-fiori-app-in-sap-btp/ba-p/13785946How to perform mass upload from an Excel file in a FIORI App in SAP BTP ABAP Environment - Part 12024-08-08T16:12:39.606000+02:00DebrajManna87https://community.sap.com/t5/user/viewprofilepage/user-id/787851<H6 id="toc-hId-1538503301">Link to other blogs of this series</H6><P><A title="How to perform mass upload from an Excel file in a FIORI App in SAP BTP ABAP Environment - Part 2" href="https://community.sap.com/t5/technology-blogs-by-sap/how-to-perform-mass-upload-from-an-excel-file-in-a-fiori-app-in-sap-btp/ba-p/13800792" target="_self">How to perform mass upload from an Excel file in a FIORI App in SAP BTP ABAP Environment - Part 2</A> </P><P> </P><H2 id="toc-hId-825658920">Application Preview</H2><P>A custom action button 'upload' allows users to perform mass uploads.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="manndb_87_2-1723125276071.png" style="width: 700px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/148867i6A28EC3F6D49FCCC/image-dimensions/700x133?v=v2" width="700" height="133" role="button" title="manndb_87_2-1723125276071.png" alt="manndb_87_2-1723125276071.png" /></span></P><P>Download a template based on the file structure defined in the backend. It generates the text in all languages based on the translation maintained.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="manndb_87_1-1723125161348.png" style="width: 732px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/148865iA663BC813119F6ED/image-dimensions/732x238?v=v2" width="732" height="238" role="button" title="manndb_87_1-1723125161348.png" alt="manndb_87_1-1723125161348.png" /></span></P><P>Template in English:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="DebrajManna87_1-1723185632096.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/149303i9F4385AD7E5B25AB/image-size/medium?v=v2&px=400" role="button" title="DebrajManna87_1-1723185632096.png" alt="DebrajManna87_1-1723185632096.png" /></span></P><P>Template in Spanish:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="DebrajManna87_2-1723185763373.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/149304i4F26840A9AEE49C0/image-size/medium?v=v2&px=400" role="button" title="DebrajManna87_2-1723185763373.png" alt="DebrajManna87_2-1723185763373.png" /></span></P><P>Sample Data.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="manndb_87_4-1723125816933.png" style="width: 560px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/148871i42F66F14183FA844/image-dimensions/560x112?v=v2" width="560" height="112" role="button" title="manndb_87_4-1723125816933.png" alt="manndb_87_4-1723125816933.png" /></span></P><P>Records created..</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="manndb_87_3-1723125700624.png" style="width: 744px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/148870iDD49F3EB944F4F01/image-dimensions/744x264?v=v2" width="744" height="264" role="button" title="manndb_87_3-1723125700624.png" alt="manndb_87_3-1723125700624.png" /></span></P><P>Validation and error handling:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="DebrajManna87_0-1723185514196.png" style="width: 396px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/149301iDDBB601E720996CE/image-dimensions/396x280?v=v2" width="396" height="280" role="button" title="DebrajManna87_0-1723185514196.png" alt="DebrajManna87_0-1723185514196.png" /></span></P><P> </P><H2 id="toc-hId-629145415">Introduction</H2><P>In this blog series, I will showcase a business use case of performing mass upload using an Excel file to create/update entries in a RAP BO in the SAP BTP ABAP Environment. A FIORI App provides the user interface to perform mass upload and display error messages validating file records. A couple of open-source libraries are already available to integrate into your FIORI application to parse the base64 Excel data to a human-readable JSON format. You may refer to a wonderful similar blog series mentioned below.</P><P><A title="Excel Upload using RAP: Part -1" href="https://community.sap.com/t5/technology-blogs-by-members/excel-upload-using-rap-part-1/ba-p/13545399" target="_self">Excel Upload using RAP: Part -1</A> </P><P>But, We will use the XCO library to parse the Excel file. From release 2208 onwards in SAP BTP ABAP Environment, XCO library offers a new X<SPAN>LSX module including abstractions and APIs to programmatically work with XLSX workbooks and their worksheets (e.g. coming form an uploaded Microsoft Excel .XLSX file).</SPAN></P><H5 id="toc-hId-819880067"><SPAN>Reference:</SPAN></H5><P><SPAN><A title="SAP BTP ABAP Environment - Release 2208" href="https://community.sap.com/t5/technology-blogs-by-sap/sap-btp-abap-environment-release-2208/ba-p/13524729" target="_self">SAP BTP ABAP Environment - Release 2208</A> </SPAN></P><P><SPAN><A title="SAP Help Documentation on XCO XLSX Module" href="https://help.sap.com/docs/SAP_S4HANA_CLOUD/6aa39f1ac05441e5a23f484f31e477e7/9b7a0d1e35524abba3b6fcb206851b95.html?version=2402.501" target="_self" rel="noopener noreferrer">SAP Help Documentation on XCO XLSX Module </A> </SPAN></P><P>Hence, going forward in BTP ABAP Environment, an Excel file can be uploaded and parsed into a readable format in a RAP based FIORI app without using an open-source library.</P><P>Please note that XCO library is available in S/4 HANA Cloud and on-premise edition 2020 onwards.</P><P>However, this blog post also offers an easy way of performing controller extension in a FIORI Elements for OData V4 app using flexible programming model. So, it is divided in 3 parts as follows.</P><P><STRONG>Part 1: Upload Part</STRONG> - </P><OL class="lia-list-style-type-lower-alpha"><LI>Talks about XCO XLSX module integrated into a RAP BO to read from an Excel file and create/update records in a RAP BO.</LI><LI>File validation while reading records.</LI></OL><P><STRONG>Part 2:</STRONG> <STRONG>FIORI App extension</STRONG> -</P><OL class="lia-list-style-type-lower-alpha"><LI>We will learn an easy way of performing controller extension in an FIORI Elements for OData V4 based app and adding a custom action to the list report table without creating a custom JS file.</LI><LI>We will learn to trigger oData V4 operations from UI.</LI></OL><P><STRONG>Part 3:</STRONG> <STRONG>Download Part</STRONG> -</P><OL class="lia-list-style-type-lower-alpha"><LI>Talks about XCO XLSX module to write data into an Excel file and download a template file.</LI><LI>Generate template dynamically based on the file structure defined.</LI><LI>Use case of XCO I18N API to read the translated text from a Data Element and create a language specific template.</LI></OL><H2 id="toc-hId-236118405">Prerequisites</H2><UL class="lia-list-style-type-disc"><LI>Knowledge of ABAP Restful Programming Model.</LI><LI>SAP BTP ABAP Environment Release 2208.</LI><LI>Basic knowledge of FIORI Elements based extension and SAPUI5.</LI></UL><H2 id="toc-hId-39604900">Background</H2><P>Generally,it is a very common requirement to allow users to perform mass upload to create multiple entries at one go. In a classical SAP Gateway based project, we used to create a media type entity earlier and read or write the file using GET_STREAM or CREATE_STREAM methods. RAP does not support media type entity, though from release 2208 onwards, it supports stream operations using @Semantics.largeObject annotation but it has some limitations. This works only on the object page where it allows to attach files and all such attachments will be stored in a BTP table. Hence, to read the file records there were no other option than to use open source libraries to parse the excel file in a JSON format and trigger create operation in backend. </P><H2 id="toc-hId--156908605">How do we solve this problem?</H2><P>Well, the trick is to define a static action in the RAP BO and pass the file content, mime type, and file name as the input parameter. The action will utilize the XCO XLSX module to parse the base64 Excel file content to a human-readable format in an internal table based on the selection pattern defined. Now, you can use the internal table to perform validation and trigger error messages. Upon successful validation, the records can be used to create entries in the RAP BO entity using the EML statement.</P><H2 id="toc-hId--353422110">Let's get started</H2><P>I am not showing all the steps to create a RAP BO entity and perform the managed implementation. But, these are the basic steps explained in many blog posts and SAP tutorials. So, you may refer them. Let me directly jump to the problem statement.</P><P>As mentioned, we will define an action in the RAP BO and define its input parameters using an abstract entity as follows.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="manndb_87_0-1723114901642.png" style="width: 455px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/148597i5538849F27AF668C/image-dimensions/455x170?v=v2" width="455" height="170" role="button" title="manndb_87_0-1723114901642.png" alt="manndb_87_0-1723114901642.png" /></span></P><P>'fileUpload' action needs to be explicitly triggered from the UI. I will talk about it later.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="manndb_87_1-1723114948609.png" style="width: 490px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/148598iA21AC367FFE1100B/image-dimensions/490x42?v=v2" width="490" height="42" role="button" title="manndb_87_1-1723114948609.png" alt="manndb_87_1-1723114948609.png" /></span></P><P>Within the 'fileUpload' action following code sample can be used to parse the file base64 content.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="manndb_87_2-1723115119142.png" style="width: 506px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/148602iD434734EB9A4E816/image-dimensions/506x165?v=v2" width="506" height="165" role="button" title="manndb_87_2-1723115119142.png" alt="manndb_87_2-1723115119142.png" /></span></P><P>1. First, get the read access of the document using the file content.</P><P>2. Get the worksheet reference using the position number or the worksheet name using at_position or for_name methods.</P><PRE><SPAN class="">" Read access for the worksheet with name INVOICES.</SPAN>
<SPAN class="">DATA</SPAN><SPAN class="">(</SPAN><SPAN class="">lo_invoices_worksheet</SPAN><SPAN class="">)</SPAN> <SPAN class="">=</SPAN><SPAN class=""> lo_read_access</SPAN><SPAN class="">-></SPAN><SPAN class="">get_workbook</SPAN><SPAN class="">(</SPAN>
<SPAN class="">)-></SPAN><SPAN class="">worksheet</SPAN><SPAN class="">-></SPAN><SPAN class="">for_name</SPAN><SPAN class="">(</SPAN> <SPAN class="">'INVOICES'</SPAN> <SPAN class="">).</SPAN></PRE><P>Hence, if your excel contains multiple sheets, the same can also be read and uploaded at one go. For example, both the header and the item records, maintained in two different sheets can be uploaded using this option.</P><P>3. Use the pattern builder to define a pattern based on the file template defined. Within the XCO XLSX module, a worksheet is represented as a space with two dimensions, with the first dimension being the column and the second dimension being the row. <SPAN> So, a cell in a worksheet is identified by its column and row values. A coordinate (an object of type CL_XCO_XLSX_COORDINATE) fixes a value for a given dimension, either for a row or column. In Microsoft Excel, alphabetic values are used to identify columns and numeric values are used to identify rows. The XCO XLSX module provides support for both variants so that alphabetic as well as numeric values can be used freely to determine a cell in a worksheet.</SPAN></P><UL class=""><LI><P class="">Alphabetic coordinates: A, B, C, … Z, AA, AB, ...ZZ, AAA, AAB, ...</P></LI><LI><P class="">Numeric coordinates: 1, 2, 3, ...</P></LI></UL><P>Hence, if your template contains 7 columns, the first column becomes A and the last column becomes G. This is represented using the below code section.</P><DIV><DIV><P><SPAN>from_column</SPAN><SPAN>( </SPAN><SPAN>xco_cp_xlsx</SPAN><SPAN>=></SPAN><SPAN>coordinate</SPAN><SPAN>-></SPAN><SPAN>for_alphabetic_value</SPAN><SPAN>( </SPAN><SPAN>'A'</SPAN><SPAN> )</SPAN></P><P><SPAN>to_column</SPAN><SPAN>( </SPAN><SPAN>xco_cp_xlsx</SPAN><SPAN>=></SPAN><SPAN>coordinate</SPAN><SPAN>-></SPAN><SPAN>for_alphabetic_value</SPAN><SPAN>( </SPAN><SPAN>'G'</SPAN><SPAN> )</SPAN></P></DIV></DIV><P>Also, as you would like to read the records from the second row onwards, skipping the header row, you need to define it using the following code section.</P><P><SPAN>from_row( xco_cp_xlsx=>coordinate->for_numeric_value( 2 ).</SPAN></P><P><SPAN>Note, to_row( ) method is not used as the number of rows is not known. Hence, we would like to read all the records present in the excel sheet.</SPAN></P><P>4. There are two ways of accessing data. First via a stream and second via a cursor. We read the data using stream approach as we have a structured data statically known to read. So, row stream approach is best suitable for this scenario. You may refer to SAP official documentation to explore more. Reference link is already given.</P><P>So, finally using the row stream approach and with a defined pattern you can read the data and populate it an internal table.</P><P><SPAN>lo_worksheet->select( lo_selection_pattern )->row_stream( )->operation->write_to( REF #( lt_vendor_email ) )->if_xco_xlsx_ra_operation~execute( ).</SPAN></P><P><SPAN><STRONG>Note</STRONG>: the structure of the internal table needs to be defined explicitly when using row stream approach. For dynamic reading scenarios, use the cell stream approach to process each cell individually.</SPAN></P><P>Once the data is read we can use ABAP logic to validate each record and display error messages. Otherwise, value transformation is also possible while writing the records in an internal table in row stream approach or reading individual cell in cell stream approach.</P><P>Default value transformation is 'best effort' which can be changed to other types like 'string value' and 'identity' using <SPAN>SET_VALUE_TRANSFORMATION method of IF_XCO_XLSX_RA_RS_OP_WRITE_TO when row values are read and written to an internal table as part of the write to row stream operation. </SPAN></P><P><SPAN>But, none of the approach performs validation and display an error message when the value is wrong, example supplier number. </SPAN></P><P><SPAN>Finally, when the validation done, you can use EML statement MODIFY ENTITIES to create or update records. So, using this approach you can perform both mass create and update.</SPAN></P><P>To create:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="manndb_87_3-1723120812146.png" style="width: 515px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/148731iFBE4D0695DB15BB8/image-dimensions/515x102?v=v2" width="515" height="102" role="button" title="manndb_87_3-1723120812146.png" alt="manndb_87_3-1723120812146.png" /></span></P><P>To update:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="manndb_87_4-1723120884552.png" style="width: 467px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/148733i8067CA586FF8C04D/image-dimensions/467x95?v=v2" width="467" height="95" role="button" title="manndb_87_4-1723120884552.png" alt="manndb_87_4-1723120884552.png" /></span></P><P>Stay tuned, for the next blog post..</P><P> </P><P> </P>2024-08-08T16:12:39.606000+02:00https://community.sap.com/t5/application-development-blog-posts/sap-developer-news-august-8th-2024/ba-p/13789579SAP Developer News, August 8th, 20242024-08-09T15:27:18.125000+02:00thomas_junghttps://community.sap.com/t5/user/viewprofilepage/user-id/139<P><div class="video-embed-center video-embed"><iframe class="embedly-embed" src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FPVj1gc1nInE%3Ffeature%3Doembed&display_name=YouTube&url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DPVj1gc1nInE&image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FPVj1gc1nInE%2Fhqdefault.jpg&key=b0d40caa4f094c68be7c29880b16f56e&type=text%2Fhtml&schema=youtube" width="400" height="225" scrolling="no" title="LATAM CodeJam Roadshow, ABAP Open Source Namespaces, CAP July , SAC Q3 2024 | SAP Developer News" frameborder="0" allow="autoplay; fullscreen; encrypted-media; picture-in-picture;" allowfullscreen="true"></iframe></div></P><P><STRONG>Podcast URL:</STRONG> <A href="https://podcast.opensap.info/sap-developers/2024/08/08/sap-developer-news-august-8th-2024/" target="_blank" rel="nofollow noopener noreferrer">https://podcast.opensap.info/sap-developers/2024/08/08/sap-developer-news-august-8th-2024/</A></P><H3 id="toc-hId-1151370560">DESCRIPTION</H3><P><STRONG>Kick-off LATAM SAP CodeJam roadshow and SAP Stammtisch</STRONG></P><UL><LI>SAP CodeJam Roadshow 2024 - Latin America edition <span class="lia-unicode-emoji" title=":brazil:">🇧🇷</span> <span class="lia-unicode-emoji" title=":chile:">🇨🇱</span> <span class="lia-unicode-emoji" title=":argentina:">🇦🇷</span> <span class="lia-unicode-emoji" title=":colombia:">🇨🇴</span> (August 8th - 21st 2024): <A href="https://community.sap.com/t5/sap-codejam-blog-posts/sap-codejam-roadshow-2024-latin-america-edition-august-8th-21st-2024/ba-p/13710015" target="_blank">https://community.sap.com/t5/sap-codejam-blog-posts/sap-codejam-roadshow-2024-latin-america-edition-august-8th-21st-2024/ba-p/13710015</A></LI><LI>SAP Stammtisch: <A href="https://community.sap.com/t5/sap-stammtisch/eb-p/stammtisch" target="_blank">https://community.sap.com/t5/sap-stammtisch/eb-p/stammtisch</A></LI></UL><P><STRONG>ABAP Open Source Namespaces</STRONG></P><UL><LI><A href="https://community.sap.com/t5/technology-blogs-by-sap/introducing-abap-open-source-namespaces/ba-p/13779488" target="_blank">https://community.sap.com/t5/technology-blogs-by-sap/introducing-abap-open-source-namespaces/ba-p/13779488</A></LI></UL><P><STRONG>July 2024 | CAP</STRONG></P><UL><LI>SAP Cloud Application Programming Model release for July 2024: <A href="https://cap.cloud.sap/docs/releases/jul24" target="_blank" rel="nofollow noopener noreferrer">https://cap.cloud.sap/docs/releases/jul24</A></LI></UL><P><STRONG>What’s New in SAP Analytics Cloud Q3 2024</STRONG></P><UL><LI>Harmonized release calendar for SAP Cloud products: <A href="https://me.sap.com/notes/2888562" target="_blank" rel="noopener noreferrer">https://me.sap.com/notes/2888562</A></LI><LI>SAP Analytics Cloud (SAC) Release & Delivery Schedule: <A href="https://me.sap.com/notes/2728183" target="_blank" rel="noopener noreferrer">https://me.sap.com/notes/2728183</A></LI><LI>What’s New in SAP Analytics Cloud Q3 2024: <A href="https://community.sap.com/t5/technology-blogs-by-sap/what-s-new-in-sap-analytics-cloud-q3-2024/ba-p/13777526" target="_blank">https://community.sap.com/t5/technology-blogs-by-sap/what-s-new-in-sap-analytics-cloud-q3-2024/ba-p/13777526</A></LI><LI>SAP Analytics Cloud Q3 2024 Release's Features with Experts & Demos: <A href="https://youtu.be/zgtutlXkd9c?si=e6Ej01woxhig7z8f" target="_blank" rel="nofollow noopener noreferrer">https://youtu.be/zgtutlXkd9c?si=e6Ej01woxhig7z8f</A></LI></UL><H3 id="toc-hId-954857055">CHAPTER TITLES</H3><P>0:00 Intro</P><P>0:10 Kick-off LATAM SAP CodeJam roadshow and SAP Stammtisch</P><P>1:16 ABAP Open Source Namespaces</P><P>2:05 CAP July Release</P><P>3:32 What’s New in SAP Analytics Cloud Q3 2024</P><H3 id="toc-hId-758343550">TRANSCRIPT</H3><P><STRONG>[Josh and Antonio] H</STRONG>ola, SAP developers. We made it as promised to Latin America. The first of our 12 events over the next two weeks. That's right. We have two CodeJams and one Stammtisch per city. And you can't wait to start today with the Event Driven Integrations with SAP Integration Suite CodeJam. And then a great Stammtisch this evening, followed by an SAP Build Apps CodeJam on Friday, before we head out to Santiago, Chile and our other stops on the road show. Now, when it comes to these coding events, we want to make sure that we are all learning. That's you, our audience, learning about Asset and Technologies. And that's us, the Developer Advocates. We are learning from you, the audience, our community, what the CodeJam means to you as an attendee. So be ready to answer these kind of questions from us at the CodeJam so that we can ensure these are the best events possible. And of course, be ready to go. Ciao from Sao Paulo.</P><P><STRONG>[Rich]</STRONG> Hey, folks. Rich Heilman here. Last week, Sebastian Wolf introduced ABAP Open Source Namespaces. And traditionally, ABAP open source artifacts are published with names belonging in the customer namespace, so beginning with Y or Z, but of course this leads to naming collisions and all other challenges. Now with ABAP open source namespaces, developers can apply for their very own custom namespace to use for their open source ABAP projects. Sebastian has all of the details in his blog post with links to just about everything you would need to get started with your very own namespace. Taking a look at the list so far, and I see a few out there already, so make sure to grab your namespace today.</P><P><STRONG>[Ajay]</STRONG> Hello, developers. We saw a major release for Cloud Application Programming Model in June. As of July, 2024, a CAP release is now available. In CDS language updates, the is-active entity in the context of Draft-enabled entities can now be used in expression annotations. New updates on Node.js include a global configuration, cds.server.body.parser.limit, which allows restrictions on the accepted request body size for all endpoints of the server. In addition to this global configuration, there is a server-specific annotation at the rate cds.server.body.parser.limit that can be used to specify different payload sizes for different services within the application. Java updates include the provision for avoiding transactions or select queries, and the additional search.ranking annotation now enables specifying the relevance or weight for the entity elements. This enables weighted fuzzy search on HANA. Finally, in tools updates, we have two new commands to easily set up SAP Cloud Portal configuration via "cds add portal" command, and to add configuration for SAP BTP Work Zone Standard Edition via "cds add workzone- standard" command. Please visit Caphire documentation links in description for further details.</P><P><STRONG>[Witalij]</STRONG> With the vision of the Intelligent Enterprise Suite, SAP aligns the release dates of new innovations, enhancements, and corrections for associated products to ensure they function as integrated solutions. The harmonized release calendar of the SAP Cloud products, which are part of the SAP Intelligent Enterprise Suite, also includes SAP Analytics Cloud. For the upcoming Q3 release, the SAC product team has published a detailed blog post outlining all the new features and enhancements included in that release. For example, a prompt guide will now be available to provide guidance on the best usage of just Ask AI features. Additionally, as a data analyzer user, you can now utilize the report-to-report interface, or RRI, in SAP BW Live Connections to jump from executed query to another report. To help you understand all the new features, the product experts have recorded as well a video demonstrating all the new major capabilities. Enjoy!</P>2024-08-09T15:27:18.125000+02:00https://community.sap.com/t5/application-development-blog-posts/sap-developer-news-august-15th-2024/ba-p/13796464SAP Developer News, August 15th, 20242024-08-15T21:10:00.040000+02:00thomas_junghttps://community.sap.com/t5/user/viewprofilepage/user-id/139<P><div class="video-embed-center video-embed"><iframe class="embedly-embed" src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2F4aoU3rU7XgU%3Ffeature%3Doembed&display_name=YouTube&url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D4aoU3rU7XgU&image=https%3A%2F%2Fi.ytimg.com%2Fvi%2F4aoU3rU7XgU%2Fhqdefault.jpg&key=b0d40caa4f094c68be7c29880b16f56e&type=text%2Fhtml&schema=youtube" width="400" height="225" scrolling="no" title="Devtoberfest, AI based Integration Flows, CAP AI CodeJam, ABAP Dev Challenge | SAP Developer News" frameborder="0" allow="autoplay; fullscreen; encrypted-media; picture-in-picture;" allowfullscreen="true"></iframe></div></P><P><STRONG>Podcast Version:</STRONG> <A href="https://podcast.opensap.info/sap-developers/2024/08/15/sap-developer-news-august-15th-2024/" target="_blank" rel="nofollow noopener noreferrer">https://podcast.opensap.info/sap-developers/2024/08/15/sap-developer-news-august-15th-2024/</A></P><H3 id="toc-hId-1152203711">DESCRIPTION</H3><P><STRONG>Devtoberfest by SAP TechEd</STRONG></P><UL><LI>Devtoberfest group: <A href="https://community.sap.com/t5/devtoberfest/gh-p/Devtoberfest" target="_blank">https://community.sap.com/t5/devtoberfest/gh-p/Devtoberfest</A></LI><LI>Devtoberfest sessions: <A href="https://community.sap.com/t5/devtoberfest/eb-p/devtoberfest-events" target="_blank">https://community.sap.com/t5/devtoberfest/eb-p/devtoberfest-events</A></LI></UL><P><STRONG>Generative AI based Integration Flows and expose events via AIF</STRONG></P><UL><LI>Generative AI based Integration Flow Generation: <A href="https://community.sap.com/t5/technology-blogs-by-sap/sap-integration-suite-generative-ai-based-integration-flow-generation/ba-p/13761166" target="_blank">https://community.sap.com/t5/technology-blogs-by-sap/sap-integration-suite-generative-ai-based-integration-flow-generation/ba-p/13761166</A> </LI><LI>SAP AIF can now expose events to Advanced Event Mesh to power your EDA: <A href="https://community.sap.com/t5/technology-blogs-by-sap/a-natural-choice-sap-aif-can-now-expose-events-to-advanced-event-mesh-to/ba-p/13773758" target="_blank">https://community.sap.com/t5/technology-blogs-by-sap/a-natural-choice-sap-aif-can-now-expose-events-to-advanced-event-mesh-to/ba-p/13773758</A></LI><LI>SAP Note 3474406 - AIFAEM integration: <A href="https://me.sap.com/notes/3474406/E" target="_blank" rel="noopener noreferrer">https://me.sap.com/notes/3474406/E</A></LI></UL><P><STRONG>CodeJam Release: CAP AI CodeJam - </STRONG><STRONG>Expose capabilities of SAP AI Core with the SAP Cloud Application Programming Model</STRONG></P><UL><LI>CAP AI CodeJam GitHub repository: <A href="https://github.com/SAP-samples/codejam-cap-llm" target="_blank" rel="nofollow noopener noreferrer">https://github.com/SAP-samples/codejam-cap-llm</A></LI><LI>Overview SAP CodeJams: <A href="https://community.sap.com/t5/sap-codejam-blog-posts/sap-codejam-topics/ba-p/221407" target="_blank">https://community.sap.com/t5/sap-codejam-blog-posts/sap-codejam-topics/ba-p/221407</A></LI><LI>RAG with SAP HANA Cloud Vector Engine, GenAI Hub & CAP Live Stream: <A href="https://www.youtube.com/live/EkEbUYTfa6Q?si=LLS_EHRCW2AimvxO" target="_blank" rel="nofollow noopener noreferrer">https://www.youtube.com/live/EkEbUYTfa6Q?si=LLS_EHRCW2AimvxO</A></LI></UL><P><STRONG>ABAP Developer Challenge Week 2</STRONG></P><UL><LI><A href="https://community.sap.com/t5/application-development-discussions/task-2-cds-view-entity-associations-august-developer-challenge/m-p/13794132" target="_blank">https://community.sap.com/t5/application-development-discussions/task-2-cds-view-entity-associations-august-developer-challenge/m-p/13794132</A></LI></UL><H3 id="toc-hId-955690206">CHAPTER TITLES</H3><P>0:00 Intro</P><P>0:10 Devtoberfest by SAP TechEd</P><P>0:41 Generative AI based Integration Flows and expose events via AIF</P><P>1:29 CAP AI CodeJam - Expose capabilities of SAP AI Core with the SAP Cloud Application Programming Model</P><P>2:04 ABAP Developer Challenge Week 2</P><H3 id="toc-hId-759176701">Transcript</H3><P><STRONG>[Nico]</STRONG> Hi everyone, and welcome to the SAP Developer News. Devtoberfest is just around the corner, starting on September 23rd, and the Devtoberfest group in the SAP community is already live. Go there to read about the official contest and its rules, and also about the grand prize. Devtoberfest sessions are already being scheduled in the SAP Community as well, so go there to check them out, and hope to see you there. Bye!</P><P><STRONG>[Antonio]</STRONG> Hola, SAP developers. In case you missed it, it is now possible to generate Integration Flows in Cloud Integration. You will just need to describe your integration scenario, and based on that description, you will create an Integration Flow. It is a new feature in Cloud Integration, which you will need to enable in the settings of your tenant. Check out Deepak's blog post for more information.</P><P>Also, you can now expose events to SAP Integration Suite Advanced Event Mesh by using the Application Interface Framework. What's cool about this is that you can even enable your on-premises ERP, for example, an ECC or an SAP S/4HANA. It is easy to create custom events by leveraging AIF. Check out Kosta's blog post for more details.</P><P><STRONG>[Kevin]</STRONG> I'm really excited to announce a brand new CodeJam evolving around the SAP Cloud Application Programming Model and the CAP LLM Plugin. This CodeJam will teach you how to build services on top of SAP AI Core and the SAP Generative AI Hub capabilities. So if you want to learn more about AI and how to build services on top of AI, follow the links in the description below to check out the CodeJam content on GitHub and check out all the additional information on our community platform. So see you in the next CodeJam.</P><P><STRONG>[Rich]</STRONG> Hey folks, Rich Heilman here. I hope you're all having a great summer and I also hope that everyone is having a little fun with this month's Developer Challenge. Sheena and Shilpa kicked off your ABAP Developer Challenge last week with Task 1 and there was a huge response. Of course there was. It's ABAP and who doesn't love ABAP, right? I even found some time to complete Task 1 myself and I had a lot of fun doing it. This week's task was just released yesterday and already we have over 50 submissions out there. So I guess I better catch up and get going with Task 2 myself which is on the topic of CDS associations. So that's it for now. If you have a couple minutes for fun learning and a little challenge, check out the Developer Advocates ABAP Developer Challenge which is running now till the end of August. I'll put a link in the show notes. Bye for now!</P>2024-08-15T21:10:00.040000+02:00https://community.sap.com/t5/technology-blogs-by-sap/abap-cds-release-news-2408-external-entities/ba-p/13784415ABAP CDS Release News 2408 – External Entities2024-08-16T08:54:34.068000+02:00AndreaUShttps://community.sap.com/t5/user/viewprofilepage/user-id/163332<P>CDS external entities provide a modern way to handle secondary database connections in ABAP Cloud. They allow ABAP programs to retrieve data from other databases using SQL. Sounds interesting? Read this blog post for further details.</P><P>The standard database of AS ABAP is the SAP HANA database. Until now, if an ABAP program wanted to access a database system other than the standard database, the developer could configure a <STRONG>secondary connection </STRONG>in transaction <STRONG>DBCON </STRONG>and use this connection in ABAP SQL (addition <STRONG>CONNECTION)</STRONG>, native SQL, or AMDP. Now, ABAP CDS provides <STRONG>CDS external entities </STRONG>for retrieving data from other database systems. The remote connection is managed using the data federation approach of the <STRONG>SAP HANA Smart Data Access </STRONG>technology.</P><H2 id="toc-hId-1022137735">Comparing secondary connections and external entities</H2><TABLE border="1" width="100%"><TBODY><TR><TD width="33.333333333333336%" height="30px"> </TD><TD width="33.333333333333336%" height="30px"><STRONG>Secondary connection</STRONG></TD><TD width="33.333333333333336%" height="30px"><STRONG>External entity</STRONG></TD></TR><TR><TD width="33.333333333333336%" height="30px"><STRONG>Possible secondary database</STRONG></TD><TD width="33.333333333333336%" height="30px">Only to other SAP HANA databases.</TD><TD width="33.333333333333336%" height="30px">SAP-HANA databases, non-SAP-HANA databases, other AS ABAP (for a full list of possible connection targets, see <A href="https://me.sap.com/notes/2600176" target="_blank" rel="noopener noreferrer">2600176 - SAP HANA Smart Data Access Supported Remote Sources - SAP for Me</A>)).</TD></TR><TR><TD width="33.333333333333336%" height="30px"><STRONG>Remote object</STRONG></TD><TD width="33.333333333333336%" height="30px">Remote object name, field names, and types need to match local ABAP objects.</TD><TD width="33.333333333333336%" height="30px">External entity represents remote object. Object name and field names in ABAP and of the external object can differ.</TD></TR><TR><TD width="33.333333333333336%" height="57px"><STRONG>Number of connections in a single SELECT</STRONG></TD><TD width="33.333333333333336%" height="57px">Only one connection per statement.</TD><TD width="33.333333333333336%" height="57px">A single select statement can retrieve data from multiple remote sources.</TD></TR><TR><TD width="33.333333333333336%" height="30px"><STRONG>Technology</STRONG></TD><TD width="33.333333333333336%" height="30px">ABAP database connections</TD><TD width="33.333333333333336%" height="30px">SAP HANA Smart Data Access</TD></TR></TBODY></TABLE><H2 id="toc-hId-825624230"><STRONG>Accessing data in ABAP SQL using a secondary connection</STRONG></H2><P>Here’s an example for an ABAP SQL SELECT statement using a secondary connection.</P><UL><LI>The connection <STRONG>my_conn </STRONG>is a secondary connection defined and configured in the database table DBCON.</LI><LI><STRONG>Scarr</STRONG> and <STRONG>spfli</STRONG> are data sources in the remote database system. The names of the remote data sources, the field names, and the data types must match those of local repository object on AS ABAP for a successful data access.</LI><LI>Only one connection per statement is possible. In this case, all data sources (here <STRONG>spfli</STRONG> and <STRONG>scarr</STRONG>) must be available in the connection defined via <STRONG>my_conn.</STRONG></LI></UL><P> </P><P> </P><P> </P><pre class="lia-code-sample language-abap"><code>SELECT
FROM scarr
LEFT OUTER JOIN spfli ON scarr~carrid = spfli~carrid
FIELDS scarr~carrid, scarr~carrname, spfli~connid
INTO TABLE @FINAL(lt_data)
OPTIONS CONNECTION my_conn.</code></pre><P> </P><P> </P><P> </P><H2 id="toc-hId-629110725"><STRONG>Accessing data in ABAP SQL using a CDS external entity</STRONG></H2><P>Here’s an example of an ABAP SQL SELECT statement that uses a CDS external entity.</P><UL><LI>A CDS external entity is a design-time CDS object that represents a specific data source in another system. The names of the remote data source don’t have to match the local ABAP objects, they don’t even have to follow the ABAP naming rules – the addition <STRONG>EXTERNAL NAME </STRONG>can specify HANA full names, it can even specify Unicode characters that are not supported by ABAP at all.</LI><LI>The remote connection is configured using a <STRONG>logical external schema</STRONG> that is specified after <STRONG>PROVIDED BY</STRONG> in the ABAP SQL statement<STRONG>.</STRONG> </LI><LI>Multiple remote data sources can be used in a single SQL statement, even if these data sources reside in different remote systems. In this example, the data sources scarr and spfli are addressed by different connections.</LI></UL><P><STRONG>CDS external entity: design time object that represents a remote data source</STRONG><STRONG> </STRONG></P><P> </P><P> </P><P> </P><pre class="lia-code-sample language-abap"><code>define external entity as_external_scarr
external name VIEW_ON_SCARR
{
key carrid : s_carr_id external name ...;
carrname : s_carrname external name ...;
...
}
with federated data
provided at runtime</code></pre><P> </P><P> </P><P> </P><P><STRONG>ABAP SQL SELECT statement retrieving data from a remote data source using an external entity and a logical external schema</STRONG></P><P> </P><P> </P><P> </P><pre class="lia-code-sample language-abap"><code>SELECT
FROM demo_cds_external_entity AS scarr
PROVIDED BY les_scarr
LEFT OUTER JOIN external_spfli AS spfli
PROVIDED BY les_spfli
ON scarr~carrid = spfli~carrid
FIELDS scarr~carrid, scarr~carrname, spfli~connid
INTO TABLE @FINAL(lt_data).</code></pre><P> </P><P> </P><P> </P><H2 id="toc-hId-432597220">How to establish outbound SQL access using an external entity</H2><P>AS an ABAP developer, here’s what you need to do to establish outbound SQL access using a CDS external entity:</P><OL><LI>Define and activate an <STRONG>external entity</STRONG> that represents the external database object.</LI><LI>Define and activate a <STRONG>logical external schema </STRONG>whose configuration specifies the connection details for the outbound communication.</LI><LI>Create a <STRONG>Communication Scenario.</STRONG></LI><LI>Create an <STRONG>Outbound Service </STRONG>of the type <STRONG>Outbound SQL Access </STRONG>for your logical external schema.</LI><LI>Include the outbound service in the communication scenario.</LI><LI>Retrieve data from a remote source using an <STRONG>ABAP SQL Statement </STRONG>that binds the external entity to your logical external schema using a <STRONG>PROVIDED BY </STRONG>clause.</LI></OL><P>These are the steps performed by an ABAP developer in ABAP Development Tools for Eclipse. For the remote connection to work, a system administrator must configure the logical external schema with all the details required to establish the communication between the local system and the remote system.</P><P>The <STRONG>system administrator </STRONG>must perform the following steps using the SAP Fiori application <STRONG>Communication Arrangement:</STRONG></P><OL><LI>Create a <STRONG>Communication Arrangement.</STRONG></LI><LI>Create a <STRONG>Communication System.</STRONG></LI><LI>Create a new <STRONG>Outbound User</STRONG>.</LI></OL><P>Here’s an example:</P><H3 id="toc-hId-365166434">ABAP Development</H3><P><STRONG>CDS external entity </STRONG></P><P>A CDS external entity is a CDS artifact that represents an external database object. It specifies ABAP names and, optionally, the original field names of the remote data source are specified after <STRONG>EXTERNAL NAME.</STRONG></P><P> </P><P> </P><P> </P><pre class="lia-code-sample language-abap"><code>@EndUserText.label: 'Demo CDS external entity'
define external entity demo_cds_external_entity
external name DATATYPES
{
key charField : abap.char(10) external name K_CHAR;
F_INT1 : abap.int1;
F_INT2 : abap.int2;
}
with federated data
provided at runtime</code></pre><P> </P><P> </P><P> </P><P><STRONG>Logical external schema</STRONG></P><P>A logical external schema is created in a form-based editor in the ABAP development tools for Eclipse. It is a CDS proxy artifact whose configuration specifies the connection details required to connect to an external system. It has only one field – <EM>Default Remote Schema </EM>– that can be left empty.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="AndreaUS_0-1722948154416.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/147198i1D2F5DA8490BE4B5/image-size/large?v=v2&px=999" role="button" title="AndreaUS_0-1722948154416.png" alt="AndreaUS_0-1722948154416.png" /></span></P><P><STRONG>Communication scenario with outbound service</STRONG></P><P>A communication scenario is a design-time description of how two communication partners communicate with each other. It consists of inbound and/or outbound services and supported authentication methods. A logical external schema must be included as an outbound service in a communication scenario. This is done in a form-based editor in the ABAP development tools for Eclipse.</P><P><STRONG>Outbound service referring to a logical external schema</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="AndreaUS_1-1722948178382.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/147204i2D0390A56E931D6E/image-size/large?v=v2&px=999" role="button" title="AndreaUS_1-1722948178382.png" alt="AndreaUS_1-1722948178382.png" /></span></P><P><STRONG>Communication Scenario with outbound service</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="AndreaUS_2-1722948222088.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/147211i2F7B3A360C571D6D/image-size/large?v=v2&px=999" role="button" title="AndreaUS_2-1722948222088.png" alt="AndreaUS_2-1722948222088.png" /></span></P><P><STRONG>ABAP SQL Access:</STRONG></P><P> </P><P> </P><P> </P><pre class="lia-code-sample language-abap"><code> select
from demo_cds_external_entity
provided by demo_cds_logicl_externl_schema
fields *
order by charField
into table @final(lt_federated_data).</code></pre><P> </P><P> </P><P> </P><P><STRONG>Result: </STRONG>(Data fetched from an SAP HANA system in the Canary landscape).</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="AndreaUS_3-1722948257028.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/147212i6017F343F96BA448/image-size/medium?v=v2&px=400" role="button" title="AndreaUS_3-1722948257028.png" alt="AndreaUS_3-1722948257028.png" /></span></P><H3 id="toc-hId-168652929">Administration</H3><P>A system administrator creates a new <STRONG>Communication Arrangement, Communication System, </STRONG>and <STRONG>Outbound User</STRONG> in the SAP Fiori Application <STRONG>Communication Arrangement</STRONG>. The following screenshots show all the relevant fields that must be entered.</P><P><STRONG>Communication Arrangement</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="AndreaUS_4-1722948297011.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/147214i8786D9E72C0767E4/image-size/large?v=v2&px=999" role="button" title="AndreaUS_4-1722948297011.png" alt="AndreaUS_4-1722948297011.png" /></span></P><P><STRONG>Communication System</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="AndreaUS_5-1722948312236.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/147215i7E8EA24509E72F3B/image-size/large?v=v2&px=999" role="button" title="AndreaUS_5-1722948312236.png" alt="AndreaUS_5-1722948312236.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="AndreaUS_6-1722948319438.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/147216i572C5164022569D3/image-size/large?v=v2&px=999" role="button" title="AndreaUS_6-1722948319438.png" alt="AndreaUS_6-1722948319438.png" /></span></P><P><STRONG>Outbound User</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="AndreaUS_7-1722948333252.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/147217i2F1F00FF17BA827F/image-size/large?v=v2&px=999" role="button" title="AndreaUS_7-1722948333252.png" alt="AndreaUS_7-1722948333252.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="AndreaUS_8-1722948339703.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/147218i8EE8EB9C9828548A/image-size/large?v=v2&px=999" role="button" title="AndreaUS_8-1722948339703.png" alt="AndreaUS_8-1722948339703.png" /></span></P><H2 id="toc-hId--156943295">Outlook</H2><P>This blog post describes the 2408 scope of CDS external entities for outbound SQL access. Currently, only <STRONG>dynamic external entities </STRONG>are supported. This kind of external entity does not specify a logical external schema in its data definition, but uses the addition PROVIDED AT RUNTIME. Dynamic external entities can only be accessed using ABAP SQL. They cannot be used as a data source for other CDS entities.</P><P>It is planned to provide <STRONG>static external entities </STRONG>in one of the future releases. A static external entity defines a logical external schema directly in its data definition. Static external entities can be used as data sources in ABAP SQL SELECT statements, in other CDS entities, and in ABAP Managed Database Procedures (AMDP).</P><P>In addition, dynamic external entities allow only <STRONG>read access</STRONG>. Write access is not supported. <STRONG>Writable external entities</STRONG> are planned for one of the upcoming releases.</P><H2 id="toc-hId--353456800">Further info</H2><UL><LI><A href="https://help.sap.com/docs/abap-cloud/abap-data-models/cds-external-entities?version=s4hana_cloud" target="_self" rel="noopener noreferrer">External Entities | SAP Help Portal</A></LI><LI><A href="https://help.sap.com/docs/abap-cloud/abap-development-tools-user-guide/outbound-services?version=s4hana_cloud" target="_blank" rel="noopener noreferrer">Working with Outbound Services | SAP Help Portal</A></LI><LI><A href="https://help.sap.com/docs/sap-btp-abap-environment/abap-environment/about-communication-management?version=Cloud" target="_self" rel="noopener noreferrer">Communication Management | SAP Help Portal</A></LI></UL><P>Feedback and questions are welcome!</P>2024-08-16T08:54:34.068000+02:00https://community.sap.com/t5/technology-blogs-by-sap/abap-cloud-sessions-at-sap-teched-in-2024/ba-p/13783420ABAP Cloud Sessions at SAP TechEd in 20242024-08-20T20:42:55.415000+02:00CarineTchoutouohttps://community.sap.com/t5/user/viewprofilepage/user-id/1462<P>Hey Everyone!</P><P>That time of year is here again,<FONT color="#000000"> <STRONG>SAP TechEd 2024 is just around the corner!</STRONG> </FONT></P><P>SAP TechEd is the leading tech conference for all developers, IT professionals, business experts, tech visionaries, innovators, and leaders eager to gain in-depth knowledge of SAP’s solutions, platforms, and technologies, along with insights into their future direction. It also offer an opportunity to network and connect with peers and SAP experts. </P><P><A href="https://www.sap.com/events/teched.html" target="_blank" rel="noopener noreferrer">SAP TechEd in 2024</A> will kick off with a <STRONG><FONT color="#000000">free, engaging virtual event accessible to everyone,</FONT> </STRONG>followed by SAP TechEd on Tour stops all around the world for a unique opportunity for more in-depth, in-person learning experiences. The series of local on-site events will be organized in partnership with and hosted by SAP User Groups and SAPinsider. Learn more about the virtual experience <A href="https://www.sap.com/events/teched/virtual.html" target="_blank" rel="noopener noreferrer">here</A>.</P><P data-unlink="true">The choice is yours: <STRONG><FONT color="#000000">Join us virtually for the first event in the series, SAP TechEd Virtual 2024! </FONT></STRONG></P><TABLE border="0" width="50%"><TBODY><TR><TD width="100%"><P style=" text-align: center; "><span class="lia-unicode-emoji" title=":pushpin:">📌</span>Save the date and <STRONG><A href="https://www.sap.com/events/teched.html" target="_self" rel="noopener noreferrer">register now</A></STRONG>!<BR /><span class="lia-unicode-emoji" title=":calendar:">📅</span>October 8 - 9, 2024</P></TD></TR></TBODY></TABLE><P data-unlink="true"><A href="https://www.sap.com/events/teched/virtual.html" target="_blank" rel="noopener noreferrer">At this year's SAP TechEd</A>, you will have the opportunity to attend a <FONT color="#000000">variety of sessions and formats</FONT> - such as lectures, jumpstarts, and roadmaps - organized into <FONT color="#000000">six (6) content tracks</FONT> that are aligned with your business needs, covering SAP technologies, products, and solutions:</P><UL><LI><SPAN>Digital Transformation with Cloud ERP (<STRONG>DT</STRONG>)</SPAN></LI><LI><SPAN>SAP Business Technology Platform – General (<STRONG>XP</STRONG>)</SPAN></LI><LI><SPAN>Application Development and Automation (<STRONG>AD</STRONG>)</SPAN></LI><LI><SPAN>Data and Analytics (<STRONG>DA</STRONG>)</SPAN></LI><LI><SPAN>Integration (<STRONG>IN</STRONG>)</SPAN></LI><LI><SPAN>Artificial Intelligence (<STRONG>AI</STRONG>)</SPAN></LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="CarineTchoutouo_0-1724083802886.png" style="width: 99px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/154220i8D5DE05AF92FC992/image-dimensions/99x43?v=v2" width="99" height="43" role="button" title="CarineTchoutouo_0-1724083802886.png" alt="CarineTchoutouo_0-1724083802886.png" /></span> The ABAP sessions at this year's SAP TechEd event will be centered around "<EM><STRONG>Clean Core Extensibility powered by ABAP Cloud and Generative AI</STRONG></EM>". Attendees can look forward to a range of lectures (incl. roadmaps) and jump-starts on clean core development and transformation with ABAP Cloud and GenAI for all SAP S/4HANA editions, both cloud and on-premise. Below is an overview of the SAP TechEd Virtual 2024 sessions related to clean core extensibility and ABAP Cloud. </P><P><span class="lia-unicode-emoji" title=":books:">📚</span><STRONG><A href="https://www.sap.com/events/teched/virtual/flow/sap/te24/catalog/page/catalog" target="_blank" rel="noopener noreferrer">Access the full session catalog of SAP TechEd Virtual 2024</A></STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="CarineTchoutouo_0-1724072266436.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/154153i9862EB2CA166B6DD/image-size/medium?v=v2&px=400" role="button" title="CarineTchoutouo_0-1724072266436.png" alt="CarineTchoutouo_0-1724072266436.png" /></span><BR /><BR /></P><H1 id="toc-hId-893025251"><FONT color="#0000FF">Keynotes</FONT></H1><P><STRONG><A href="https://www.sap.com/events/teched/virtual/flow/sap/te24/catalog/page/catalog/session/1723236414921001GwvX" target="_blank" rel="noopener noreferrer">KEY100CEST</A> & <A href="https://www.sap.com/events/teched/virtual/flow/sap/te24/catalog/page/catalog/session/1723503433936001SJ7h" target="_blank" rel="noopener noreferrer">KEY100EDT</A> | SAP TechEd in 2024 Launch - Where ideas get real</STRONG><BR /><FONT color="#000080">[Executive Keynote]</FONT> At SAP TechEd, experts, developers, IT leaders, and our SAP Community gather to learn, share, and build together. Hear firsthand from SAP Board Members Juergen Mueller and Muhammad Alam how innovations in SAP Build solutions, SAP Business AI, SAP BTP, and other solutions across our end-to-end portfolio are revolutionizing the tech world.´<BR /><U>Speakers</U>: <BR /> • Juergen Mueller, Chief Technology Officer, SAP<BR /> • Muhammad Alam, SAP Product Engineering, SAP<BR /><U>Schedule</U>: <BR /> • <span class="lia-unicode-emoji" title=":calendar:">📅</span> <SPAN>Tuesday, Oct 8 | </SPAN><span class="lia-unicode-emoji" title=":twelve_o_clock:">🕛</span><SPAN> 9:00 AM - 10:30 AM CEST [<A href="https://www.sap.com/events/teched/virtual/flow/sap/te24/catalog/page/catalog/session/1723236414921001GwvX" target="_self" rel="noopener noreferrer">KEY100CEST</A>]<BR /> • </SPAN><span class="lia-unicode-emoji" title=":calendar:">📅</span><SPAN> Tuesday, Oct 8 | </SPAN><span class="lia-unicode-emoji" title=":twelve_o_clock:">🕛</span><SPAN> 4:00 PM - 5:30 PM CEST [<A href="https://www.sap.com/events/teched/virtual/flow/sap/te24/catalog/page/catalog/session/1723503433936001SJ7h" target="_self" rel="noopener noreferrer">KEY100EDT</A>]</SPAN></P><P><STRONG><A href="https://www.sap.com/events/teched/virtual/flow/sap/te24/catalog/page/catalog/session/1723237330354001PDnG" target="_blank" rel="noopener noreferrer">DEV101A</A> & <A href="https://www.sap.com/events/teched/virtual/flow/sap/te24/catalog/page/catalog/session/1723583643244001gcRD" target="_blank" rel="noopener noreferrer">DEV101B</A> | Keynote recap + Community welcome</STRONG><BR /><FONT color="#000080">[Developer Keynote] </FONT>Join the Developer Advocates as they welcome the SAP Community to SAP TechEd, provide a short recap of the key announcements, and share insights into what it means for developers. <BR /><U>Speakers</U>: Developer Advocates, SAP <BR /><U>Schedule</U>: <BR /> • <span class="lia-unicode-emoji" title=":calendar:">📅</span><SPAN>Tuesday, Oct 8 | </SPAN><span class="lia-unicode-emoji" title=":twelve_o_clock:">🕛</span><SPAN> 10:30 AM - 10:55 AM CEST [<A href="https://www.sap.com/events/teched/virtual/flow/sap/te24/catalog/page/catalog/session/1723237330354001PDnG" target="_self" rel="noopener noreferrer">DEV101A</A>]<BR /> • </SPAN><span class="lia-unicode-emoji" title=":calendar:">📅</span><SPAN>Tuesday, Oct 8 | </SPAN><span class="lia-unicode-emoji" title=":twelve_o_clock:">🕛</span><SPAN> 5:30 PM - 5:55 PM CEST [<A href="https://www.sap.com/events/teched/virtual/flow/sap/te24/catalog/page/catalog/session/1723583643244001gcRD" target="_self" rel="noopener noreferrer">DEV101B</A>]</SPAN></P><P data-unlink="true"><STRONG><A href="https://www.sap.com/events/teched/virtual/flow/sap/te24/catalog/page/catalog/session/1723227572954001ZlyL" target="_self" rel="noopener noreferrer">DEV100A</A> & <A href="https://www.sap.com/events/teched/virtual/flow/sap/te24/catalog/page/catalog/session/1723584532995001g7Xm" target="_self" rel="noopener noreferrer">DEV100B</A> | Developer keynote [deconstructed]: Keeping the promise</STRONG><BR /><FONT color="#000080">[Developer Keynote Deconstructed] </FONT>Hear from the developer advocates for a quick injection of news, recaps, and deep-dive demos covering various announcements from the event as well as other fun stuff. <BR /><U>Speakers</U>: Developer Advocates, SAP <BR /><U>Schedule</U>: <BR /> • <span class="lia-unicode-emoji" title=":calendar:">📅</span><SPAN>Tuesday, Oct 8 | </SPAN><span class="lia-unicode-emoji" title=":twelve_o_clock:">🕛</span><SPAN>3:30 PM - 3:55 PM CEST [<A href="https://www.sap.com/events/teched/virtual/flow/sap/te24/catalog/page/catalog/session/1723227572954001ZlyL" target="_self" rel="noopener noreferrer">DEV100A</A>]<BR /> • </SPAN><span class="lia-unicode-emoji" title=":calendar:">📅</span><SPAN>Tuesday, Oct 8 | </SPAN><span class="lia-unicode-emoji" title=":twelve_o_clock:">🕛</span><SPAN>9:00 PM - 9:25 PM CEST [<A href="https://www.sap.com/events/teched/virtual/flow/sap/te24/catalog/page/catalog/session/1723584532995001g7Xm" target="_self" rel="noopener noreferrer">DEV100B</A>]<BR /><BR /></SPAN></P><H1 id="toc-hId-696511746"><FONT color="#0000FF">Track Overviews </FONT></H1><P><STRONG><A href="https://www.sap.com/events/teched/virtual/flow/sap/te24/catalog/page/catalog/session/1722007820912001eKHP" target="_self" rel="noopener noreferrer">AD100 – Unlock SAP Build and ABAP Cloud interoperability to elevate your extensions</A><BR /></STRONG><FONT color="#000080">[Track Overview, 45 min]</FONT> Discover a new approach to building extensions while keeping your core clean. Learn how SAP Build and ABAP Cloud interoperability work together to foster fusion development. Whether you prefer pro-code or low-code tools, discover how to seamlessly integrate them to build extensions tailored to your needs. Learn from experts about best practices, innovative solutions, and practical applications that can enhance your development processes and drive business growth. <BR /><U>Speakers</U>: Dr Alexander Rother (SAP), Thomas Volmering (SAP), Björn Schulz (REWE digital GmbH)<BR /><U>Schedule</U>: <span class="lia-unicode-emoji" title=":calendar:">📅</span> Tuesday, Oct 8 | <span class="lia-unicode-emoji" title=":twelve_o_clock:">🕛</span> 6:00 PM - 6:45 PM CEST</P><P><STRONG><A href="https://www.sap.com/events/teched/virtual/flow/sap/te24/catalog/page/catalog/session/1721792859465001Vn9t" target="_self" rel="noopener noreferrer">DT100 – Unlocking the intelligent enterprise: Cloud ERP innovations for the future</A><BR /></STRONG><FONT color="#000080">[Track Overview, 45 min]</FONT> Explore the future of cloud ERP, focusing on the latest innovations and strategies driving digital transformation. Delve into the technological backbone of SAP's vision for cloud ERP, covering in-app extensibility, integration with SAP Business Technology Platform, AI-powered automation, and the "suite-first" approach. Learn the benefits of a clean core and its role in enabling composability, empowering businesses to adapt and evolve, and get insights into this year’s cloud ERP track sessions.<BR /><U>Speakers</U>: Jan Gilg (SAP)<BR /><U>Schedule</U>: <span class="lia-unicode-emoji" title=":calendar:">📅</span> Tuesday, Oct 8 | <span class="lia-unicode-emoji" title=":twelve_o_clock:">🕛</span> 10:30 AM - 11:15 AM CEST<BR /><BR /></P><H1 id="toc-hId-499998241"><FONT color="#0000FF">Lectures</FONT></H1><P><STRONG><FONT color="#0000FF"><span class="lia-unicode-emoji" title=":calendar:">📅</span>Tuesday, Oct 8</FONT></STRONG></P><P><STRONG><A href="https://www.sap.com/events/teched/virtual/flow/sap/te24/catalog/page/catalog/session/1721791179884001rYRe" target="_self" rel="noopener noreferrer">AD105 – Enhance your fusion team collaboration with ABAP Cloud and SAP Build</A> </STRONG><STRONG><BR /></STRONG><FONT color="#000080">[Lecture, 25 min]</FONT> Learn how to take advantage of interoperability between SAP’s low-code and pro-code solutions. Discover how you can use the graphical modeler in the development environment of SAP Build Code for the ABAP Cloud development model and how your ABAP Cloud projects can be integrated into the lobby of SAP Build solutions. <BR /><U>Speakers</U>: Dr. Anne Keller (SAP), Tim Back (SAP)<BR /><U>Schedule</U>: <span class="lia-unicode-emoji" title=":calendar:">📅</span> Tuesday, Oct 8 | <span class="lia-unicode-emoji" title=":twelve_o_clock:">🕛</span> 7:00 PM - 7:25 PM CEST</P><P><A href="https://www.sap.com/events/teched/virtual/flow/sap/te24/catalog/page/catalog/session/1721791180078001r9wP" target="_self" rel="noopener noreferrer"><STRONG>AD107 – Boost your coding efficiency: Explore Joule’s ABAP Developer capabilities</STRONG></A><STRONG><BR /></STRONG><FONT color="#000080">[Lecture, 25 min]</FONT> Discover Joule's ABAP developer capabilities. Hear about detailed use cases, the generative AI road map, and insights on how these advancements can boost your productivity as a developer in your daily tasks. <BR /><U>Speakers</U>: Dr. Jasmin Gruschke (SAP), Sebastian Baskovich (SAP)<BR /><U>Schedule</U>: <span class="lia-unicode-emoji" title=":calendar:">📅</span> Tuesday, Oct 8 | <span class="lia-unicode-emoji" title=":twelve_o_clock:">🕛</span> 7:30 PM - 7:55 PM CEST</P><P><STRONG><FONT color="#0000FF"><span class="lia-unicode-emoji" title=":calendar:">📅</span>Wednesday, Oct 9</FONT></STRONG></P><P><A href="https://www.sap.com/events/teched/virtual/flow/sap/te24/catalog/page/catalog/session/1721791179982001rM76" target="_self" rel="noopener noreferrer"><STRONG>AD106 – Clean core extension of SAP S/4HANA with the latest ABAP Cloud features</STRONG></A><STRONG><BR /></STRONG><FONT color="#000080">[Lecture, 25 min]</FONT> ABAP Cloud is the comprehensive development model for building cloud-ready business applications, services, and extensions on both SAP Business Technology Platform, SAP S/4HANA Cloud, and SAP S/4HANA, helping ensure clean core compliance by definition. Learn about the latest features offered in ABAP Cloud and how generative AI can boost the development efficiency. <BR /><U>Speaker</U>: Volker Drees (SAP)<BR /><U>Schedule</U>: <span class="lia-unicode-emoji" title=":calendar:">📅</span> Wednesday, Oct 9 | <span class="lia-unicode-emoji" title=":twelve_o_clock:">🕛</span> 7:00 PM - 7:25 PM CEST</P><P><A href="https://www.sap.com/events/teched/virtual/flow/sap/te24/catalog/page/catalog/session/1721791179486001r363" target="_self" rel="noopener noreferrer"><STRONG>DT201 – Extensibility for SAP S/4HANA Cloud Public Edition</STRONG></A><STRONG><BR /></STRONG><FONT color="#000080">[Lecture, 25 min]</FONT> The extensibility portfolio for SAP S/4HANA Cloud Public Edition consist both on-stack and side-by-side extension techniques. In this lecture you will learn how on-stack key user extensibility can be used to develop a custom business object together with an application in SAP Build Apps. <BR /><U>Speaker</U>: Dr. Thomas Schneider (SAP), Alda Dollani (SAP)<BR /><U>Schedule</U>: <span class="lia-unicode-emoji" title=":calendar:">📅</span> Wednesday, Oct 9 | <span class="lia-unicode-emoji" title=":twelve_o_clock:">🕛</span> 2:30 PM - 2:55 PM CEST</P><P><STRONG><A href="https://www.sap.com/events/teched/virtual/flow/sap/te24/catalog/page/catalog/session/1721792860413001V4Ea" target="_self" rel="noopener noreferrer">DT200 – Clean Core Extensibility for SAP S/4HANA Cloud Private Edition</A><BR /></STRONG><FONT color="#000080">[Lecture, 25 min]</FONT> Learn how to manage your custom, on-stack extensions in SAP S/4HANA Cloud Private Edition with the ABAP Cloud development model following clean core principles. Find out about the new guidelines for clean core ABAP development in a well-known, three-tier extensibility model and how to handle transformation options for existing custom code to ABAP Cloud. Get an outlook of upcoming generative AI support and hear our plans for ABAP test cockpit to support governance of your clean core developments.<BR /><U>Speaker</U>: Olga Dolinskaja (SAP), Thomas Fiedler (SAP)<BR /><U>Schedule</U>: <span class="lia-unicode-emoji" title=":calendar:">📅</span> Wednesday, Oct 9 | <span class="lia-unicode-emoji" title=":twelve_o_clock:">🕛</span> 3:00 PM - 3:25 PM CEST<BR /><BR /></P><H1 id="toc-hId-303484736"><FONT color="#0000FF">Jump-Starts<BR /></FONT></H1><P><A href="https://www.sap.com/events/teched/virtual/flow/sap/te24/catalog/page/catalog/session/1722394882075001dE44" target="_self" rel="noopener noreferrer"><STRONG>AD180 – Build SAP Fiori Apps with ABAP Cloud powered by Joule's ABAP Developer capabilities</STRONG></A><STRONG><BR /></STRONG><FONT color="#000080">[Jump-Start, 25 min]</FONT> Learn how to develop transactional SAP Fiori apps in ABAP Cloud using the ABAP RESTful Application Programming Model supported by generative AI. You will also learn about features such as business events for loosely coupled integration scenarios and read-only treeviews for displaying hierarchical data. <BR />ABAP Cloud is the comprehensive development model for building clean core compliant apps, services, and extensions on SAP Business Technology Platform and SAP S/4HANA, in the cloud and on-premise. <BR /><U>Speaker</U>: Carine Tchoutouo Djomo (SAP)<BR /><U>Schedule</U>: <span class="lia-unicode-emoji" title=":calendar:">📅</span> Tuesday, Oct 8 | <span class="lia-unicode-emoji" title=":twelve_o_clock:">🕛</span> 7:30 PM - 7:55 PM CEST</P><P><A href="https://www.sap.com/events/teched/virtual/flow/sap/te24/catalog/page/catalog/session/1721792860609001VgRw" target="_self" rel="noopener noreferrer"><STRONG>DT280 – Building Clean Core Extensions with ABAP Cloud for SAP S/4HANA Cloud</STRONG></A><STRONG><BR /></STRONG><FONT color="#000080">[Jump-Start, 25 min]</FONT> Learn how to speed up the implementation of SAP S/4HANA Cloud extensions with ABAP Cloud using two new ABAP Development Tools (ADT) based generators for adding extension fields and for building custom UI services on top of business objects that have been released by SAP. <BR /><U>Speaker</U>: Andre Fischer (SAP)<BR /><U>Schedule</U>: <SPAN><span class="lia-unicode-emoji" title=":calendar:">📅</span> Wednesday, Oct 9 | <span class="lia-unicode-emoji" title=":twelve_o_clock:">🕛</span> 3:30 PM - 3:55 PM CEST</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="CarineTchoutouo_0-1724072266436.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/154153i9862EB2CA166B6DD/image-size/medium?v=v2&px=400" role="button" title="CarineTchoutouo_0-1724072266436.png" alt="CarineTchoutouo_0-1724072266436.png" /></span></P><P>I hope this overview gives you a few more reasons to join us at SAP TechEd 2024.</P><P>We look forward to meeting and interacting with you virtually at SAP TechEd Virtual and in person at the local events in West Palm Beach (US), Melbourne (AUS), Copenhagen (DK), Birmingham (UK), and Wiesbaden (DE).</P><P>In the meantime, you can check out <A href="https://developers.sap.com/devtoberfest.html" target="_self" rel="noopener noreferrer">Devtoberfest by SAP TechEd 2024</A> and watch the replays of last year's events, <A href="https://community.sap.com/t5/technology-blogs-by-sap/abap-cloud-at-sap-teched-in-2023/ba-p/13579096" target="_blank">SAP TechEd Virtual in 2023</A> and <A href="https://community.sap.com/t5/technology-blogs-by-sap/abap-cloud-at-devtoberfest-2023/ba-p/13579737" target="_self">SAP's Devtoberfest in 2023</A>.</P><P>Stay tuned - and see you there! </P>2024-08-20T20:42:55.415000+02:00https://community.sap.com/t5/technology-blogs-by-sap/sap-btp-abap-environment-release-2408/ba-p/13801154SAP BTP ABAP Environment – Release 24082024-08-21T15:49:54.990000+02:00Burcu_Karlidaghttps://community.sap.com/t5/user/viewprofilepage/user-id/151005<H1 id="toc-hId-914203866"><STRONG>SAP BTP ABAP Environment – Release 2</STRONG><STRONG>408</STRONG></H1><P>As follow-up to our previous release <A href="https://community.sap.com/t5/technology-blogs-by-sap/sap-btp-abap-environment-release-2405/ba-p/13705247" target="_blank">2405</A>, this blog post provides an update concerning our most recent release <STRONG>2408</STRONG>, which is available for customers and partners since August 18th. This particular release features highlights such as a <STRONG>Secondary DB Connections</STRONG>, <STRONG>Wizard for Developer Extensibility</STRONG>, and <STRONG>Integration of SolMan/ChaRM and Cloud TMS</STRONG>.</P><P>All available new features can be found on the <A href="https://help.sap.com/whats-new/7a822d3bcaa74f31b98fa315601e9c96?Version=ABAP%20Environment%202408&locale=en-US" target="_blank" rel="noopener noreferrer">What's New for SAP BTP ABAP Environment</A> page.</P><H4 id="toc-hId-1104938518"><STRONG>ABAP</STRONG></H4><UL><LI>Support for creating custom <STRONG>background processing contexts</STRONG> for asynchronous tasks (<A href="https://help.sap.com/docs/abap-cloud/abap-development-tools-user-guide/working-with-background-queue-contexts" target="_blank" rel="noopener noreferrer">details</A>)</LI><LI>Support for <STRONG>specifying "Empty Key" as a primary key definition</STRONG> for table types (<A href="https://help.sap.com/docs/abap-cloud/abap-development-tools-user-guide/working-with-table-types?version=sap_btp" target="_blank" rel="noopener noreferrer">details</A>)</LI></UL><H4 id="toc-hId-908425013"><STRONG>ABAP Development Tools</STRONG></H4><UL><LI>Support for <STRONG>opening non-native-integrated ABAP development objects</STRONG> in a new fallback editor in ADT, displaying information and read-only source code (<A href="https://help.sap.com/docs/abap-cloud/abap-development-tools-user-guide/opening-non-native-integrated-development-objects?version=sap_btp" target="_blank" rel="noopener noreferrer">details</A>)</LI><LI>Support for displaying <STRONG>planned decommissioning dates for deprecated local APIs</STRONG> to help prioritize rework of custom objects (<A href="https://help.sap.com/docs/abap-cloud/abap-development-tools-user-guide/deprecation" target="_blank" rel="noopener noreferrer">details</A>)</LI><LI>Support for <STRONG>hidden values</STRONG> in ABAP Debugger (<A href="https://help.sap.com/docs/abap-cloud/abap-development-tools-user-guide/symbols-with-hidden-content?version=sap_btp" target="_blank" rel="noopener noreferrer">details</A>)</LI><LI>Support for <STRONG>displaying SAP HANA warnings</STRONG> in AMDP Debugger while debugging nested AMDPs (<A href="https://help.sap.com/docs/abap-cloud/abap-development-tools-user-guide/stepping-in-amdp-debugger?version=sap_btp" target="_blank" rel="noopener noreferrer">details</A>)</LI><LI>Support for <STRONG>exposing APIs via UCL</STRONG> for use in BAS and SAP Build by creating and assigning packages in ABAP Development Tools for Eclipse (<A href="https://help.sap.com/docs/abap-cloud/abap-development-tools-user-guide/working-with-api-packages" target="_blank" rel="noopener noreferrer">details</A>)</LI></UL><H4 id="toc-hId-711911508"><STRONG>Core Data Services</STRONG></H4><UL><LI>Support for accessing <STRONG>external databases via ABAP CDS and ABAP SQL</STRONG> using CDS external entities and logical external schemas, integrated with SAP HANA federation capabilities (<A href="https://help.sap.com/docs/abap-cloud/abap-data-models/cds-external-entities?locale=en-US&version=sap_btp" target="_blank" rel="noopener noreferrer">details</A>)</LI><LI>Support for creating <STRONG>logical external schemas </STRONG>for outbound SQL access with external entities (<A href="https://help.sap.com/docs/abap-cloud/abap-development-tools-user-guide/working-with-logical-external-schemas" target="_blank" rel="noopener noreferrer">details</A>)</LI><LI>Support for <STRONG>generating ABAP CDS provider models</STRONG>, including DDIC tables, CDS views, metadata extensions, and service definitions with the Generate ABAP Repository Objects Wizard (<A href="https://help.sap.com/docs/abap-cloud/abap-development-tools-user-guide/working-with-csn-abap-cds-generator-wizard" target="_blank" rel="noopener noreferrer">details</A>)</LI><LI>Support for <STRONG>creating CDS aspects in ABAP CDS syntax</STRONG> to store and reuse field definitions and calculations (<A href="https://help.sap.com/docs/abap-cloud/abap-cds-tools-user-guide/creating-cds-aspects?version=sap_btp" target="_blank" rel="noopener noreferrer">details</A>)</LI><LI>Support for working with the <STRONG>Core Schema Notation Model</STRONG> object type to import and manage CSN documents (<A href="https://help.sap.com/docs/abap-cloud/abap-development-tools-user-guide/working-with-core-schema-notation-model-csnm-object-type" target="_blank" rel="noopener noreferrer">details</A>)</LI><LI>Support for importing external CDS models and <STRONG>creating local ABAP CDS </STRONG>data models from them in ABAP Cloud (details)</LI><LI>Support for defining<STRONG> reusable measures and filters in CDS for centralized key figures</STRONG>, formulas, and filters, ensuring consistency in complex business reporting</LI><LI>Support for <STRONG>improved CDS buffering</STRONG> with buffer propagation, allowing ASQL runtime to read denormalized elements from the ABAP buffer, optimizing memory usage and reducing database joins</LI></UL><H4 id="toc-hId-515398003"><STRONG>ABAP RESTful Application Programming Model</STRONG></H4><UL><LI>Support for a new <STRONG>RAP BO tools tour in the Feature Explorer</STRONG> to explore RAP BO development features (<A href="https://help.sap.com/docs/abap-cloud/abap-development-tools-user-guide/feature-explorer" target="_blank" rel="noopener noreferrer">details</A>)</LI><LI>Support for adding parameters to modify runtime parameters in <STRONG>RAP Data Services for print forms, including draft functionality </STRONG>(<A href="https://help.sap.com/docs/PRODUCTS/36609a00dcea4e6fa7c4ca2f2868e972/a104660468324090b601ee2969a54d99.html?locale=en-US&version=Cloud" target="_blank" rel="noopener noreferrer">details</A>)</LI></UL><H4 id="toc-hId-318884498"><STRONG>Annotations</STRONG></H4><UL><LI>Support for using the <STRONG>"ObjectModel.supportedCapabilities" annotation to verify UI</STRONG> use case support, enabling UI projections or direct consumption in a UI service binding (details)</LI><LI>Support for using the <STRONG>"Semantics.valueRange"</STRONG> annotation to specify and inform consumers about the value range of a CDS element, applicable to fully ordered data types (details).</LI><LI>Support for using the <STRONG>"UI.dataPoint.title"</STRONG> annotation to define the title of a data point (details)</LI></UL><H4 id="toc-hId-122370993"><STRONG>ABAP Test Cockpit (ATC)</STRONG></H4><UL><LI>Support for <STRONG>classic APIs in ATC checks</STRONG></LI></UL><H4 id="toc-hId--74142512"><STRONG>Custom Code Migration</STRONG></H4><UL><LI>Support for browsing <STRONG>Cloudification Repository content on GitHub</STRONG> (<A href="https://help.sap.com/docs/link-disclaimer?site=https%3A%2F%2Fsap.github.io%2Fabap-atc-cr-cv-s4hc%2F" target="_blank" rel="noopener noreferrer">details</A>)</LI><LI>Support for adding findings to the <STRONG>baseline in the Custom Code Migration app</STRONG> (<A href="https://help.sap.com/docs/sap-btp-abap-environment/abap-environment/custom-code-migration?" target="_blank" rel="noopener noreferrer">details</A>)</LI><LI>Support for <STRONG>scheduling custom code analysis</STRONG> as application jobs in the Schedule Custom Code Analysis app (<A href="https://help.sap.com/docs/sap-btp-abap-environment/abap-environment/schedule-custom-code-analysis" target="_blank" rel="noopener noreferrer">details</A>)</LI></UL><H4 id="toc-hId--270656017"><STRONG>Business Configuration</STRONG></H4><UL><LI>Support for recreating variants in the <STRONG>Custom Business Configurations</STRONG> Fiori app due to a persistence key change (<A href="https://help.sap.com/docs/link-disclaimer?site=https://me.sap.com/notes/3486327" target="_blank" rel="noopener noreferrer">details</A>)</LI><LI>Support for selecting "<STRONG>No Transport" in the Business Configuration</STRONG> app and enabling a transport request selection bar in the header toolbar (<A href="https://help.sap.com/docs/PRODUCTS/36609a00dcea4e6fa7c4ca2f2868e972/047e01c3bcdd4303a60b61364bd5b31d.html?locale=en-US&version=Cloud" target="_blank" rel="noopener noreferrer">details</A>)</LI></UL><H4 id="toc-hId--467169522"><STRONG>Reuse Services and Libraries</STRONG></H4><UL><LI>Support for <STRONG>maintaining units and dimensions</STRONG> using released ABAP Cloud APIs (CL_UOM*) without namespace restrictions (<A href="https://help.sap.com/docs/PRODUCTS/36609a00dcea4e6fa7c4ca2f2868e972/8961c2c4cebf457f95fb080a736babdc.html?locale=en-US&version=Cloud" target="_blank" rel="noopener noreferrer">details</A>)</LI><LI>Support for source templates in DDLX and SQL - Web API bindings in the XCO Library. Longtext reading not supported (<A href="https://help.sap.com/docs/PRODUCTS/36609a00dcea4e6fa7c4ca2f2868e972/c154dffe892b4d9ea4566722f0bcd5f1.html?locale=en-US&version=Cloud" target="_blank" rel="noopener noreferrer">details</A>)</LI></UL><H4 id="toc-hId--1161400122"><STRONG>UI Services and SAP Fiori Launchpad</STRONG></H4><UL><LI>Support for adding a <STRONG>custom logo to the Fiori Launchpad</STRONG> by replacing the SAP logo using the COMPANY_LOGO_URL parameter in the Manage Launchpad Settings app (<A href="https://help.sap.com/docs/btp/user-interface-configurations/manage-launchpad-settings?version=Cloud" target="_blank" rel="noopener noreferrer">details</A>)</LI><LI>Support for specifying an alternative text for the <STRONG>Home title in the SAP Fiori Launchpad shell bar</STRONG> (<A href="https://help.sap.com/docs/btp/user-interface-configurations/manage-launchpad-settings?version=Cloud" target="_blank" rel="noopener noreferrer">details</A>)</LI><LI>Support for <STRONG>customizing the browser window and tab title in SAP Fiori Launchpad</STRONG> with additional text options (<A href="https://help.sap.com/docs/btp/user-interface-configurations/manage-launchpad-settings?version=Cloud" target="_blank" rel="noopener noreferrer">details</A>)</LI><LI>Support for <STRONG>assigning Fiori Space templates to business role templates</STRONG>. Spaces are automatically assigned when creating roles from templates (<A href="https://help.sap.com/docs/abap-cloud/abap-development-tools-user-guide/working-with-business-role-template-launchpad-space-template-assignments?" target="_blank" rel="noopener noreferrer">details</A>)</LI><LI>Support for assigning <STRONG>space and page templates to business role templates</STRONG>, with automatic default scoping in test and production systems (<A href="https://help.sap.com/docs/abap-cloud/abap-development-tools-user-guide/working-with-business-role-template-launchpad-space-template-assignments" target="_blank" rel="noopener noreferrer">details</A>, <A href="https://help.sap.com/docs/btp/sap-business-technology-platform/scoping-space-and-page-templates?version=Cloud" target="_blank" rel="noopener noreferrer">details</A>)</LI><LI>Support for <STRONG>uploading and downloading SAP Fiori Launchpad pages</STRONG> in the Manage Launchpad Pages app, enabling backups and system exchanges (<A href="https://help.sap.com/docs/PRODUCTS/36609a00dcea4e6fa7c4ca2f2868e972/e2151022e2e94d8eb86b744f3fadbb25.html?locale=en-US&version=Cloud" target="_blank" rel="noopener noreferrer">details</A>)</LI></UL><H4 id="toc-hId--1357913627"><STRONG>Integration</STRONG></H4><UL><LI>Support for <STRONG>direct push-based integration</STRONG> to enable data exchange between neighboring ABAP Systems via RFC (<A href="https://help.sap.com/docs/btp/sap-business-technology-platform/direct-push-based-integration" target="_blank" rel="noopener noreferrer">details</A>)</LI><LI>Support for using dynamic topics in <STRONG>Advanced Event Mesh</STRONG> for routing and filtering outbound events, improving efficiency and targeted event delivery (<A href="https://help.sap.com/docs/btp/sap-business-technology-platform/using-dynamic-topics-in-advanced-event-mesh" target="_blank" rel="noopener noreferrer">details</A>)</LI><LI>Support for retrieving <STRONG>ABAP-based data via SQL service and ODBC driver</STRONG> using CDS SQL-based scalar functions (<A href="https://help.sap.com/docs/PRODUCTS/36609a00dcea4e6fa7c4ca2f2868e972/532dbeb42d074c53a255192c6567cc75.html?locale=en-US&version=Cloud" target="_blank" rel="noopener noreferrer">details</A>)</LI><LI>Support for using the <STRONG>Mass Change Wizard</STRONG> with derived business roles (details)</LI><LI>Support for <STRONG>displaying IAM apps</STRONG> of all types, including external apps with related authorizations, to manage assigned business roles (<A href="https://help.sap.com/docs/PRODUCTS/36609a00dcea4e6fa7c4ca2f2868e972/2cabad5cf4c649e5a1115f91a8f8e48c.html?locale=en-US&version=Cloud" target="_blank" rel="noopener noreferrer">details</A>)</LI><LI>Support for using new <STRONG>communication targets for HTTP outbound services</STRONG> in ABAP Development Tools for Eclipse (<A href="https://help.sap.com/docs/abap-cloud/abap-development-tools-user-guide/working-with-communication-targets" target="_blank" rel="noopener noreferrer"><SPAN>details</SPAN></A>)</LI><LI>Support for <STRONG>Communication Targets and Logical External Schema</STRONG> in Communication Arrangements</LI><LI>Support for <STRONG>assigning APIs to API packages</STRONG>, defining the relationship between packages and API objects (<A href="https://help.sap.com/docs/abap-cloud/abap-development-tools-user-guide/working-with-api-package-assignments" target="_blank" rel="noopener noreferrer"><SPAN>details</SPAN></A>)</LI><LI>Support for <STRONG>creating API packages</STRONG> to hold various types of APIs (<A href="https://help.sap.com/docs/abap-cloud/abap-development-tools-user-guide/working-with-api-packages" target="_blank" rel="noopener noreferrer"><SPAN>details</SPAN></A>)</LI><LI>Support for <STRONG>Communication Management data via OData APIs</STRONG> (<A href="https://help.sap.com/docs/PRODUCTS/36609a00dcea4e6fa7c4ca2f2868e972/9f76a684aaac4bddbe0da4f9c682df14.html?locale=en-US&version=Cloud" target="_blank" rel="noopener noreferrer">details</A>)</LI><LI>Support for retrieving support user data via the "<STRONG>Support User – Read Integration</STRONG>" API and corresponding communication scenario (SAP_COM_0347) (<A href="https://help.sap.com/docs/PRODUCTS/36609a00dcea4e6fa7c4ca2f2868e972/72ed0fede8b5409d977491c392742a65.html?locale=en-US&version=Cloud" target="_blank" rel="noopener noreferrer">details</A>)</LI></UL><H4 id="toc-hId--1554427132"><STRONG>Extensibility</STRONG></H4><UL><LI>Support for using the <STRONG>field extension wizard</STRONG> to create extension fields (<A href="https://help.sap.com/docs/abap-cloud/abap-development-tools-user-guide/generating-extension-fields?" target="_blank" rel="noopener noreferrer">details</A>)</LI></UL><H4 id="toc-hId--1750940637"><STRONG>Administration</STRONG><STRONG> & Operations</STRONG></H4><UL><LI>Support for monitoring the status of <STRONG>asynchronous emails</STRONG> (<A href="https://help.sap.com/docs/PRODUCTS/36609a00dcea4e6fa7c4ca2f2868e972/8d1f989deca1455dabc3d81b433fbdaf.html?locale=en-US&version=Cloud" target="_blank" rel="noopener noreferrer">details</A>)</LI><LI>Support for monitoring HANA CPU usage of custom applications with the <STRONG>HANA Thread</STRONG> <STRONG>Samples</STRONG> app, allowing detailed analysis of top workloads and related SQL statements (<A href="https://help.sap.com/docs/PRODUCTS/36609a00dcea4e6fa7c4ca2f2868e972/92ba2fe488e54f15aee1c25c1d059ef5.html?locale=en-US&version=Cloud" target="_blank" rel="noopener noreferrer">details</A>)</LI><LI>Support for <STRONG>configuring application server sizes as 0.5 or 2 ACUs</STRONG> in SAP BTP, ABAP environment systems with elastic scaling</LI></UL><P> </P><H1 id="toc-hId--1067245121"><STRONG>Additional Information</STRONG></H1><P>You can find the product page on <A href="https://help.sap.com/docs/sap-btp-abap-environment" target="_blank" rel="noopener noreferrer">SAP BTP, ABAP Environment | SAP Help Portal</A></P><P>For technical documentation, please refer to our <A href="https://help.sap.com/docs/sap-btp-abap-environment/abap-environment/abap-environment" target="_blank" rel="noopener noreferrer">documentation</A>.</P><P>Please refer to <A href="https://help.sap.com/docs/abap-cross-product/roadmap-info/abap-platform-roadmap-information?locale=en-US&source=redirect" target="_blank" rel="noopener noreferrer">SAP BTP, ABAP environment Roadmap</A> for more details about planned features as part of the product roadmap.</P><P>As always, please let us know if you have questions.</P><P> </P>2024-08-21T15:49:54.990000+02:00https://community.sap.com/t5/technology-blogs-by-sap/how-to-perform-mass-upload-from-an-excel-file-in-a-fiori-app-in-sap-btp/ba-p/13800792How to perform mass upload from an Excel file in a FIORI App in SAP BTP ABAP Environment - Part 22024-08-21T16:06:02.643000+02:00DebrajManna87https://community.sap.com/t5/user/viewprofilepage/user-id/787851<H2 id="toc-hId-1043262682">Introduction</H2><P><SPAN>In continuation to my previous blog post (<A class="" href="https://community.sap.com/t5/technology-blogs-by-sap/how-to-perform-mass-upload-from-an-excel-file-in-a-fiori-app-in-sap-btp/ba-p/13785946" target="_blank">How to perform mass upload from an Excel file in a FIORI App in SAP BTP ABAP Environment - Part 1</A></SPAN><SPAN>), in this blog post, I will showcase an easy way to extend a FIORI Elements-based OData V4 application in Business Application Studio (BAS) to add a custom action on the responsive table header of the list report page. This custom action will allow the user to open a dialog to browse local files and upload an Excel file. </SPAN><BR /><BR /><SPAN>In this blog post, I will be creating a Fiori Elements-based application using the tools provided in SAP Business Application Studio (BAS) and will be extending generated apps using App Extensions to trigger OData V4 operations (in this example, RAP Static Action '<STRONG>fileUpload</STRONG>' to upload an Excel file and RAP Static Function '<STRONG>downloadFile</STRONG>' to download an Excel template).</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="DebrajManna87_0-1724222562064.png" style="width: 494px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/155159i19F3BAA9944DA406/image-dimensions/494x41?v=v2" width="494" height="41" role="button" title="DebrajManna87_0-1724222562064.png" alt="DebrajManna87_0-1724222562064.png" /></span></P><H2 id="toc-hId-846749177">Prerequisites</H2><UL class="lia-list-style-type-disc"><LI>SAP Business Application Studio (BAS) subscription and developer role in your respective BTP Subaccount.</LI><LI>Basic knowledge of performing App Extensions to extend generated FIORI Elements based apps.</LI><LI>Basic UI5 skill.</LI><LI>Use of <A href="http://sap.ui.unified.fileuploader/" target="_blank" rel="nofollow noopener noreferrer">File Uploader</A> control.</LI></UL><H2 id="toc-hId-650235672">Basic of OData V4 Operation</H2><P><STRONG>Function - </STRONG>Functions are operations exposed by an OData service that don't have side effects. Functions must return data and can include additional path segments. Functions are invoked using HTTP method GET.</P><P><STRONG>Action - </STRONG>Actions are operation exposed by an OData service that can have side effects. Actions can return data but must not be composed with additional path segments. Actions are invoked using HTTP method POST.</P><P><STRONG>Operation - </STRONG>Both <SPAN>Functions and Actions are operations that can return data. Operations are either </SPAN><STRONG><SPAN class="">bound</SPAN></STRONG><SPAN> to a resource (for example, an entity type), that makes them members of that instance type. Operations can also be </SPAN><STRONG><SPAN class="">unbound</SPAN></STRONG><SPAN>. Unbound operations are called as static operations (using “action imports” or “function imports”) since a static (unbound) operation can't be called directly.</SPAN></P><P><SPAN>The OData V4 model supports OData operations (<STRONG>Action Import</STRONG></SPAN><SPAN>, <STRONG>Function Import</STRONG></SPAN><SPAN>, <STRONG>Bound Actions</STRONG></SPAN><SPAN> and <STRONG>Bound Functions)</STRONG>.</SPAN></P><H2 id="toc-hId-453722167">RAP - Non-Standard Operations</H2><P>Non-standard operations are RAP BO Operations that provide transactional behavior and that are user defined and implemented. There are two kinds of non-standard operations.</P><OL><LI><STRONG>Action: </STRONG>User-implemented operations that change the data of a BO instance. <SPAN>They are self-implemented operations. </SPAN><SPAN>Two main categories of actions can be implemented in RAP:</SPAN><OL class="lia-list-style-type-lower-alpha"><LI><P><STRONG>Non-factory actions</STRONG>: Defines a RAP action which offers non-standard behavior. The custom logic must be implemented in the RAP handler method<SPAN> </SPAN>FOR MODIFY. An action per default relates to a RAP BO entity instance and changes the state of the instance. An action is related to an instance by default. If the optional keyword<SPAN> </SPAN>static<SPAN> </SPAN>is used, the action is defined as static action. Static actions are not bound to any instance of a RAP BO entity but relate to the complete entity.</P></LI><LI><P><STRONG>Factory actions</STRONG>: Factory actions are used to create RAP BO entity instances. Factory actions can be instance-bound (default) or static. Instance-bound factory actions can copy specific values of an instance. Static factory actions can be used to create instances with<SPAN> </SPAN>prefilled<SPAN> </SPAN>default values.</P></LI></OL></LI><LI><STRONG>Function: </STRONG>User-implemented operations that return data without any side effects.<OL class="lia-list-style-type-lower-alpha"><LI><STRONG>Instance Function: </STRONG>Bound to an instance of a RAP BO Entity which can have input parameters.</LI><LI><STRONG>Static Function: </STRONG>Not bound to any instance of a RAP BO Entity but relate to the complete entity. It can also have input parameters.</LI></OL></LI></OL><H2 id="toc-hId-257208662">Can we create unbound OData V4 operations "Action Import" or "Function Import" in RAP?</H2><P>At this moment, we cannot implement unbound function and action in RAP. Both the static action and functions are related to the complete entity. But it is supported in CAP.</P><P>Code sample:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="DebrajManna87_0-1724239190468.png" style="width: 447px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/155382iC6767733FC2AC0BC/image-dimensions/447x231?v=v2" width="447" height="231" role="button" title="DebrajManna87_0-1724239190468.png" alt="DebrajManna87_0-1724239190468.png" /></span></P><H2 id="toc-hId-60695157">How RAP Static Action and Functions are related to the complete entity?</H2><P>Let's understand from the metadata itself.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="DebrajManna87_0-1724239643067.png" style="width: 564px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/155383i77C1447D76898F9C/image-dimensions/564x103?v=v2" width="564" height="103" role="button" title="DebrajManna87_0-1724239643067.png" alt="DebrajManna87_0-1724239643067.png" /></span></P><P>It is bound to the complete entity and with the collection of the entity. </P><H2 id="toc-hId--135818348">Let's begin</H2><P><SPAN>For the interest of time and topic, I am not showing all the basic steps to create a FIORI Elements based application in BAS. There are multiple blog posts and SAP Learning materials available to refer. I will directly jump to perform app extension.</SPAN></P><P><SPAN>We will be using the Fiori Guided Development tool to add a custom action to a page using extension and will be using the page map to perform List Report page controller extension.</SPAN></P><P><SPAN><STRONG>Note:</STRONG> When you use the Fiori Guided Development tool to add a custom action in OData V4 based app, the framework automatically adds a custom action handler function in JavaScript creating a new custom JS file but does not perform controller extension. This is the way OData V4 app extension behaves which adds a "<STRONG>controlConfiguration" </STRONG>in the target page.</SPAN></P><H5 id="toc-hId-54916304"><U>Custom Action in the Table toolbar for the list report in OData V2 vs OData V4:</U></H5><P>OData V2:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="DebrajManna87_0-1724150820072.png" style="width: 496px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/154611i85DBCF2BC762D7FB/image-dimensions/496x273?v=v2" width="496" height="273" role="button" title="DebrajManna87_0-1724150820072.png" alt="DebrajManna87_0-1724150820072.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="DebrajManna87_1-1724150863600.png" style="width: 497px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/154612iD8713DD84EF1380B/image-dimensions/497x214?v=v2" width="497" height="214" role="button" title="DebrajManna87_1-1724150863600.png" alt="DebrajManna87_1-1724150863600.png" /></span></P><P>OData V4:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="DebrajManna87_4-1724151533581.png" style="width: 453px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/154623i1497BCD8A700F154/image-dimensions/453x265?v=v2" width="453" height="265" role="button" title="DebrajManna87_4-1724151533581.png" alt="DebrajManna87_4-1724151533581.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="DebrajManna87_5-1724151752387.png" style="width: 524px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/154626iFB43045EC266F2CF/image-dimensions/524x173?v=v2" width="524" height="173" role="button" title="DebrajManna87_5-1724151752387.png" alt="DebrajManna87_5-1724151752387.png" /></span></P><H6 id="toc-hId--12514482">Further Reference: <A title="Adding Custom Actions Using Extension Points" href="https://sapui5.hana.ondemand.com/#/topic/7619517a92414e27b71f02094bd08d06" target="_self" rel="nofollow noopener noreferrer">Adding Custom Actions Using Extension Points</A> </H6><H5 id="toc-hId--338110706">But why do we need a controller extension? Can't we use the custom action handler function created automatically by the Guided Development tool in an OData V4 app?</H5><P><SPAN>We need to create a controller extension in an OData V4 app explicitly to use the SAP FIORI Elements extension API to open a dialog using the </SPAN><STRONG><SPAN>'loadFragement'</SPAN></STRONG> <SPAN>function;</SPAN><SPAN> to perform OData operations </SPAN><SPAN>and</SPAN><SPAN> to use Edit Flow (A controller extension offering hooks into the edit flow of the application) to invoke action and perform secured execution. Otherwise, within the custom JS file, we won't get the model reference to trigger the OData operation (here </SPAN><SPAN>RAP</SPAN><SPAN> Static Action and Static Function).</SPAN></P><P>So, we will start by adding a custom action to the table toolbar using the FIORI Guided Development tool.</P><P><STRONG>Step 1: </STRONG>Right click on the 'webapp' folder and select 'Open Guided Development'</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="DebrajManna87_6-1724152137317.png" style="width: 353px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/154634i4A97AC07021D3640/image-dimensions/353x502?v=v2" width="353" height="502" role="button" title="DebrajManna87_6-1724152137317.png" alt="DebrajManna87_6-1724152137317.png" /></span></P><P><STRONG>Step 2: </STRONG>Select 'Add a custom action to a page using extensions'.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="DebrajManna87_7-1724152282205.png" style="width: 457px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/154636i45421CA807AACB3A/image-dimensions/457x303?v=v2" width="457" height="303" role="button" title="DebrajManna87_7-1724152282205.png" alt="DebrajManna87_7-1724152282205.png" /></span></P><P><STRONG>Step 3: </STRONG>Follow the guide and select the page and choose a custom controller and function name.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="DebrajManna87_8-1724155598271.png" style="width: 578px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/154664iE60565DD21A7B1D8/image-dimensions/578x227?v=v2" width="578" height="227" role="button" title="DebrajManna87_8-1724155598271.png" alt="DebrajManna87_8-1724155598271.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="DebrajManna87_9-1724155793816.png" style="width: 550px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/154665i53B7CFFD124166F4/image-dimensions/550x182?v=v2" width="550" height="182" role="button" title="DebrajManna87_9-1724155793816.png" alt="DebrajManna87_9-1724155793816.png" /></span></P><P>Following code snippets to be inserted.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="DebrajManna87_10-1724155865275.png" style="width: 479px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/154666iCE5A33D252795EBD/image-dimensions/479x182?v=v2" width="479" height="182" role="button" title="DebrajManna87_10-1724155865275.png" alt="DebrajManna87_10-1724155865275.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="DebrajManna87_11-1724155902305.png" style="width: 476px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/154667iD63C8D4E26EDB1CA/image-dimensions/476x125?v=v2" width="476" height="125" role="button" title="DebrajManna87_11-1724155902305.png" alt="DebrajManna87_11-1724155902305.png" /></span></P><P>Go ahead and insert snippets. This will modify the manifest settings and create custom JS file.</P><P><STRONG>Step 4: </STRONG>But we need to perform controller extension. So, the custom JS file can be deleted. </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="DebrajManna87_12-1724156075266.png" style="width: 347px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/154670i8A6894E7685073C2/image-dimensions/347x469?v=v2" width="347" height="469" role="button" title="DebrajManna87_12-1724156075266.png" alt="DebrajManna87_12-1724156075266.png" /></span></P><P><STRONG>Step 5: </STRONG>Now, we will perform the List report controller extension using the page map. So, right click on 'webapp' folder and select 'Show Page Map'.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="DebrajManna87_13-1724156166558.png" style="width: 372px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/154672i7ADA73DA106AD03F/image-dimensions/372x504?v=v2" width="372" height="504" role="button" title="DebrajManna87_13-1724156166558.png" alt="DebrajManna87_13-1724156166558.png" /></span></P><P><STRONG>Step 6: </STRONG>From the page map, select the List Report page and click on 'Show controller extension'. After that, click on 'Add Controller Extension' to create controller extension on the list report page.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="DebrajManna87_14-1724156338035.png" style="width: 445px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/154675iCB5CBA92EB3C4B4E/image-dimensions/445x329?v=v2" width="445" height="329" role="button" title="DebrajManna87_14-1724156338035.png" alt="DebrajManna87_14-1724156338035.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="DebrajManna87_15-1724156464416.png" style="width: 516px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/154677iBB6816A52F6AA308/image-dimensions/516x213?v=v2" width="516" height="213" role="button" title="DebrajManna87_15-1724156464416.png" alt="DebrajManna87_15-1724156464416.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="DebrajManna87_16-1724156486870.png" style="width: 537px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/154678i70FAF84D761E9D71/image-dimensions/537x390?v=v2" width="537" height="390" role="button" title="DebrajManna87_16-1724156486870.png" alt="DebrajManna87_16-1724156486870.png" /></span></P><P><STRONG>Note: </STRONG>It is advisable to perform controller extensions for the concerned page rather than performing a generic extension for all the list report pages. Here, '<STRONG>VendorEmailList'</STRONG> is the target list report page. So, I selected that option.</P><P><STRONG>Step 7:</STRONG> Now, we can navigate to the controller extension using 'Edit in source code' button and add custom logic.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="DebrajManna87_17-1724156881003.png" style="width: 642px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/154682i4AD45DA208537BF1/image-dimensions/642x159?v=v2" width="642" height="159" role="button" title="DebrajManna87_17-1724156881003.png" alt="DebrajManna87_17-1724156881003.png" /></span></P><P>This the way the controller extension looks.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="DebrajManna87_18-1724156969193.png" style="width: 553px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/154684i934CB01C6FCED067/image-dimensions/553x221?v=v2" width="553" height="221" role="button" title="DebrajManna87_18-1724156969193.png" alt="DebrajManna87_18-1724156969193.png" /></span></P><P>Let us add a custom handler function '<STRONG>uploadMailDialog' </STRONG>to handle the custom action.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="DebrajManna87_19-1724157107032.png" style="width: 584px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/154685i36661938B8B667A6/image-dimensions/584x235?v=v2" width="584" height="235" role="button" title="DebrajManna87_19-1724157107032.png" alt="DebrajManna87_19-1724157107032.png" /></span></P><P>After the controller extension, the following changes applied to the manifest.json file. It signifies a controller extension added to the list report controller.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="DebrajManna87_20-1724157406698.png" style="width: 592px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/154688i886D1E7F4E5A6BAC/image-dimensions/592x110?v=v2" width="592" height="110" role="button" title="DebrajManna87_20-1724157406698.png" alt="DebrajManna87_20-1724157406698.png" /></span></P><P><STRONG>Step 8: </STRONG>Now, we need to tweak the manifest settings in such a way that the custom action triggers the custom handler function '<STRONG>uploadMailDialog' </STRONG>added to the controller extension.</P><P>We need to add the custom action path adding '<STRONG>.extension</STRONG>'<STRONG> </STRONG>as a prefix. '<STRONG>.extension' </STRONG>refers to the controller extension.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="DebrajManna87_21-1724157640087.png" style="width: 532px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/154695i4B50B8F0D0D2FD59/image-dimensions/532x164?v=v2" width="532" height="164" role="button" title="DebrajManna87_21-1724157640087.png" alt="DebrajManna87_21-1724157640087.png" /></span></P><P><STRONG>Step 9: </STRONG>Now, if we preview the application and click on the custom action button, it will trigger the controller extension.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="DebrajManna87_0-1724158710536.png" style="width: 654px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/154709iBFC6ACCD5EC74527/image-dimensions/654x224?v=v2" width="654" height="224" role="button" title="DebrajManna87_0-1724158710536.png" alt="DebrajManna87_0-1724158710536.png" /></span></P><P><STRONG>Step 10: </STRONG>Let us now add a fragment to open the file dialog. So, we will use 'fileUploader' control. I created a fragment folder inside the 'ext' folder and added a new xml file 'uploadFileDialog.fragement.xml'.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="DebrajManna87_1-1724158955749.png" style="width: 632px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/154716i56A04983D3F2F505/image-dimensions/632x217?v=v2" width="632" height="217" role="button" title="DebrajManna87_1-1724158955749.png" alt="DebrajManna87_1-1724158955749.png" /></span></P><P>Following is the sample code snippet.</P><P> </P><P> </P><pre class="lia-code-sample language-markup"><code><core:FragmentDefinition xmlns:core="sap.ui.core" xmlns:f="sap.ui.layout.form" xmlns:u="sap.ui.unified" xmlns="sap.m"
xmlns:layout="sap.ui.layout">
<Dialog id="idFileDialog" title="{i18n>uploadVendorMailDialogTitle}" >
<VBox id="idVBox" width="100%">
<core:InvisibleText id="idInvisibleText" text="{i18n>uploadVendorMailDialogTitle}"/>
<f:SimpleForm id="idSimpleForm" editable="true" layout="ResponsiveGridLayout" maxContainerCols="2">
<f:content>
<Label id="idFileUploadlabel" required="true" text="{i18n>uploadVendorMailFile}"/>
<u:FileUploader id="idFileUpload" name="internalMailFileUpload" change="onFileChange" width="100%"
uploadComplete="onUploadComplete" style="Emphasized" fileType="xls,xlsx" placeholder="{i18n>uploadVendorMailPlaceholder}"
tooltip="{i18n>uploadVendorMailTooolTip}" sendXHR="false" />
</f:content>
</f:SimpleForm>
</VBox>
<footer>
<Toolbar id="idFooterToolbar">
<content>
<Button id="idDownloadTempButton" text="{i18n>downloadTempButtonTxt}" press="onTempDownload" icon= "sap-icon://download-from-cloud" />
<Button id="idUploadButton" text="{i18n>uploadButtonTxt}" type="Emphasized" press="onUploadPress" icon="sap-icon://upload-to-cloud" />
<Button id="idCancelButton" text="{i18n>cancelButtonTxt}" press="onCancelPress" icon="sap-icon://cancel"/>
</content>
</Toolbar>
</footer>
</Dialog>
</core:FragmentDefinition></code></pre><P> </P><P> </P><P>Now, add the logic to open the dialog on click of the action similar to the code snippet mentioned below.</P><P> </P><P> </P><pre class="lia-code-sample language-javascript"><code> uploadMailDialog: function (oEvent) {
this.base.getExtensionAPI().loadFragment({
name: Constants.fragmentName,
type: "XML",
controller: this
}).then(function (oDialogResult) {
oDialog = oDialogResult;
oDialogResult.open();
})
},</code></pre><P> </P><P> </P><P>Now, in application preview the app looks like below.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="DebrajManna87_2-1724159610982.png" style="width: 512px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/154724iACD4F7DDD34C915C/image-dimensions/512x133?v=v2" width="512" height="133" role="button" title="DebrajManna87_2-1724159610982.png" alt="DebrajManna87_2-1724159610982.png" /></span></P><P><STRONG>Step 11: </STRONG>So, till now, on click of the action 'Upload', a dialog will open up asking the user to upload a file. The button 'Template' will allow users to download an Excel template, and the button 'Upload' will allow users to upload the given file.</P><P>Let us add logic to read the file content, mimetype and filename of the given file. I used '<STRONG>onFileChange</STRONG>' event of the File uploader control as highlighted below.</P><P> </P><P> </P><pre class="lia-code-sample language-javascript"><code> // On File Change
onFileChange: function (oEvent) {
// Read file
var file = oEvent.getParameter("files")[0];
if (file === undefined) {
return;
}
fileType = file.type; //mimetype or file type
fileName = file.name;
//Instantiate JavaScript FileReader API
var fileReader = new FileReader();
//Read file content using JavaScript FileReader API
var readFile = function onReadFile(file) {
return new Promise(function (resolve) {
fileReader.onload = function (loadEvent) {
resolve(loadEvent.target.result.match(/,(.*)$/)[1]);
};
fileReader.readAsDataURL(file);
});
};
new Action(readFile(file)).executeWithBusyIndicator().then(function (result) {
fileContent = result;
})
},</code></pre><P> </P><P> </P><P>Here, I used JS FileReader API to read the file content as data URL and later used RegEx to clean the base64 encoded file content. </P><P><STRONG>Step 12: </STRONG>Now, implement the logic to upload a file once the 'upload' button is clicked.</P><P> </P><P> </P><pre class="lia-code-sample language-javascript"><code> //perform upload
onUploadPress: function (oEvent) {
var oResourceBundle = this.base.getView().getModel("i18n").getResourceBundle();
//check file has been entered
if (fileContent === undefined || fileContent === "") {
MessageToast.show(oResourceBundle.getText("uploadFileErrMsg"));
return;
}
var oModel = this.base.getExtensionAPI().getModel();
var oOperation = oModel.bindContext("/VendorEmail" + Constants.serviceNamespace + "fileUpload(...)");
var fnSuccess = function () {
oModel.refresh();
MessageToast.show(oResourceBundle.getText("uploadFileSuccMsg"));
oDialog.close();
//Clear the file name from file uploader
sap.ui.getCore().byId("idFileUpload").clear();
oDialog.destroy();
fileContent = undefined;
}.bind(this);
var fnError = function (oError) {
this.base.editFlow.securedExecution(
function () {
Messaging.addMessages(
new sap.ui.core.message.Message({
message: oError.message,
target: "",
persistent: true,
type: sap.ui.core.MessageType.Error,
code: oError.error.code
})
);
var aErrorDetail = oError.error.details;
aErrorDetail.forEach((error) => {
Messaging.addMessages(
new sap.ui.core.message.Message({
message: error.message,
target: "",
persistent: true,
type: sap.ui.core.MessageType.Error,
code: error.code
})
);
})
}
);
oDialog.close();
//Clear the file name from file uploader
sap.ui.getCore().byId("idFileUpload").clear();
oDialog.destroy();
fileContent = undefined;
}.bind(this);
oOperation.setParameter("mimeType", fileType);
oOperation.setParameter("fileName", fileName);
oOperation.setParameter("fileContent", fileContent);
oOperation.setParameter("process", sProcess);
oOperation.execute().then(fnSuccess, fnError);
},</code></pre><P> </P><P> </P><P>Here, I triggered OData V4 operation a bound action (RAP 'fileUpload' Static Action) passing File Type, File Name and File Content as parameters.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="DebrajManna87_3-1724162905279.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/154787iDDAC9A3EE1246DC6/image-size/medium?v=v2&px=400" role="button" title="DebrajManna87_3-1724162905279.png" alt="DebrajManna87_3-1724162905279.png" /></span></P><P>Earlier, I already explained that a RAP Static Action or Function is bound to a collection specified by an OData entity set. So, to call such actions or functions, you <SPAN>can create a context binding with an absolute path, or with a relative path for the operation (for example </SPAN>odata.srv.name.space.staticMyAction(...)"<SPAN>) and the header context of a list binding as parent context. The following sample shows a button press event handler which calls the </SPAN>static MyAction<SPAN> action on the </SPAN>MyEntity<SPAN> entity set.</SPAN></P><P> </P><pre class="lia-code-sample language-javascript"><code>var oModel = this.getView().getModel();
oModel.bindContext("/MyEntity/odata.srv.name.space.staticMyAction(...)").invoke();</code></pre><P> </P><P><SPAN>The same example with a relative binding and the header context of the list binding as parent context:</SPAN></P><P> </P><pre class="lia-code-sample language-abap"><code>var oModel = this.getView().getModel(),
// assume there is a table with ID "idMyEntityTab" and its items aggregation bound to "/MyEntity"
oListBinding = this.byId("idMyEntityTab").getBinding("items"),
oHeaderContext = oListBinding.getHeaderContext();
oModel.bindContext("name.space.staticMyAction(...)", oHeaderContext).invoke();</code></pre><P> </P><P><STRONG>Note: </STRONG>In my code sample, I am using "execute" function of the OData V4 Context binding. But, from UI5 version 1.123.0 onwards, "execute" function is deprecated. So, use "invoke" function instead as shown in the example. Simply, replace "execute' function with "invoke".</P><P> </P><pre class="lia-code-sample language-javascript"><code> oOperation.setParameter("mimeType", fileType);
oOperation.setParameter("fileName", fileName);
oOperation.setParameter("fileContent", fileContent);
oOperation.setParameter("process", sProcess);
oOperation.invoke().then(fnSuccess, fnError);</code></pre><P> </P><P>Reference: <A href="https://sapui5.hana.ondemand.com/#/api/sap.ui.model.odata.v4.ODataContextBinding%23methods/execute" target="_self" rel="nofollow noopener noreferrer">Execute function of OData V4 Context Binding API</A> </P><P>Alternatively, you can also use the "invokeAction" method of the Edit Flow API ( <A title="Edit Flow API" href="https://sapui5.hana.ondemand.com/#/api/sap.fe.core.controllerextensions.EditFlow%23methods" target="_self" rel="nofollow noopener noreferrer">Edit Flow API</A> ). However, I found the above approach to be the preferred choice.</P><P>Reference: <A title="How to call RAP static action from elements FPM extension with EditFlow.invokeAction()?" href="https://community.sap.com/t5/technology-q-a/how-to-call-rap-static-action-from-elements-fpm-extension-with-editflow/qaq-p/13671086" target="_self">How to call RAP static action from elements FPM extension with EditFlow.invokeAction()?</A> </P><P>After this step when you will execute the 'upload' action selecting an Excel file to upload, the RAP static action 'fileUpload' will trigger and the XCO XLSX module will do the rest to parse the file content and create/update BO entity instances as explained in my previous blog post.</P><P><STRONG>Step 13: </STRONG>Similar to the file upload, the excel template can also be downloaded invoking RAP static function 'downloadFile'.</P><P>Sample code snippet:</P><P> </P><pre class="lia-code-sample language-javascript"><code>onTempDownload: function (oEvent) {
var oModel = this.base.getExtensionAPI().getModel(),
oResourceBundle = this.base.getView().getModel("i18n").getResourceBundle();
var oModel = this.base.getExtensionAPI().getModel(),
oResourceBundle = this.base.getView().getModel("i18n").getResourceBundle();
var oOperation = oModel.bindContext("/VendorEmail" + Constants.serviceNamespace + "downloadFile(...)");
//Success function to display success messages from OData Operation
var fnSuccess = function () {
var oResults = oOperation.getBoundContext().getObject();
var aUint8Array = Uint8Array.from(atob(oResults.fileContent), c => c.charCodeAt(0)),
oblob = new Blob([aUint8Array], { type: oResults.mimeType });
File.save(oblob, oResults.fileName, oResults.fileExtension, oResults.mimeType);
MessageToast.show(oResourceBundle.getText("downloadTempSuccMsg"));
}.bind(this);
//Error function to display error messages from OData Operation
var fnError = function () {
this.base.editFlow.securedExecution(
function () {
Messaging.addMessages(
new sap.ui.core.message.Message({
message: oError.message,
target: "",
persistent: true,
type: sap.ui.core.MessageType.Error,
code: oError.error.code
})
);
var aErrorDetail = oError.error.details;
aErrorDetail.forEach((error) => {
Messaging.addMessages(
new sap.ui.core.message.Message({
message: error.message,
target: "",
persistent: true,
type: sap.ui.core.MessageType.Error,
code: error.code
})
);
})
}
);
}.bind(this);
// Execute OData V4 operation i.e a static function 'downloadFile' to download the excel template
oOperation.execute().then(fnSuccess, fnError)
// From UI5 version 1.123.0 onwards use invoke function
//oOperation.invoke().then(fnSuccess, fnError);</code></pre><P> </P><P>Please stay tuned for the next blog post where I will explain how I used the XCO XLSX module to create an Excel template and dynamically handled the column names based on the template structure defined in the backend and populated the text maintained in the data elements. This will enable them to read the translated texts as well. The translation process is different in ABAP Cloud; hence, the traditional approach does not work.</P><P> </P><P> </P><P> </P><P> </P><P> </P><P> </P><P> </P><P> </P><P> </P><P> </P><P> </P><P> </P><P> </P><P> </P><P> </P><P> </P><P> </P><P> </P><P> </P><P> </P><P> </P><P> </P><P> </P>2024-08-21T16:06:02.643000+02:00https://community.sap.com/t5/technology-blogs-by-sap/customer-amp-partner-roundtable-for-sap-btp-abap-environment-16/ba-p/13803825Customer & Partner Roundtable for SAP BTP ABAP Environment #162024-08-22T16:14:08.023000+02:00iwona_hahnhttps://community.sap.com/t5/user/viewprofilepage/user-id/4326<H3 id="toc-hId-1172435521"><STRONG><SPAN class="lia-unicode-emoji"><span class="lia-unicode-emoji" title=":backhand_index_pointing_right:">👉</span></SPAN> The call for contributions for one of the upcoming roundtables is open! </STRONG></H3><P> </P><DIV><TABLE><TBODY><TR><TD>If you want to show a demo or share a use case scenario for SAP BTP ABAP Environment send us an<SPAN> </SPAN><A href="mailto:sap_btp_abap_environment@sap.com" target="_blank" rel="noopener nofollow noreferrer">email</A> and we will get back to you.</TD></TR></TBODY></TABLE><SPAN> </SPAN></DIV><H2 id="toc-hId-846839297">Introduction</H2><P> </P><DIV><SPAN class="">A</SPAN><SPAN class="">s<SPAN> </SPAN></SPAN><A class="" href="https://www.sap.com/products/technology-platform/abap.html" target="_blank" rel="noreferrer noopener"><SPAN class="">SAP BTP ABAP environment (aka Steampunk)</SPAN></A><SPAN> </SPAN>and ABAP Cloud<SPAN> </SPAN><SPAN class="">became more </SPAN><SPAN class="">and more popular</SPAN><SPAN class=""><SPAN> </SPAN>inside and outside of SAP, there is a high demand for rolling out the latest product news and updates, asking questions, and of course showing demos. </SPAN><BR /><BR /><SPAN class="lia-unicode-emoji"><span class="lia-unicode-emoji" title=":light_bulb:">💡</span></SPAN> If you weren’t able to join one of our previous roundtables, you can find the slides presented, recordings, and further references in this<SPAN> </SPAN><A href="https://github.com/iwonahahn/SAP-BTP-ABAP-Environment-Roundtable/tree/main" target="_blank" rel="noopener nofollow noreferrer">GitHub repository</A>.<BR /><BR /></DIV><DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="iwona_hahn_1-1711369871866.jpeg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/85948i899EEF37EF74A54C/image-size/medium?v=v2&px=400" role="button" title="iwona_hahn_1-1711369871866.jpeg" alt="iwona_hahn_1-1711369871866.jpeg" /></span><H2 id="toc-hId-650325792"><BR />Meeting Information<BR /><BR /></H2><STRONG>When: </STRONG><BR /><UL><LI><STRONG><SPAN class="">September 19th</SPAN></STRONG>, 10:00 - 11:00 AM CET –<SPAN> </SPAN><A href="https://sap-se.zoom.us/meeting/register/tJIrcumhqjgqG9HaXPYz_jmA1XlKnLlAsXdF" target="_blank" rel="nofollow noopener noreferrer">Zoom Meeting</A> (<STRONG>please register</STRONG><SPAN> </SPAN>in advance) </LI></UL></DIV><DIV> </DIV><DIV><STRONG>Who:</STRONG><UL><LI>All interested <STRONG>customers, partners,</STRONG> and <STRONG>stakeholders</STRONG> are invited to join and exchange ideas and feedback with others and the product team</LI><LI><STRONG>Steampunk team</STRONG>: <STRONG><A href="https://community.sap.com/t5/user/viewprofilepage/user-id/4296" target="_blank">Frank Jentsch</A></STRONG><SPAN> </SPAN><SPAN class="">(Product Lead for SAP BTP ABAP Environment), </SPAN><STRONG><A href="https://community.sap.com/t5/user/viewprofilepage/user-id/4326" target="_self"><SPAN class="">Iwona Hahn</SPAN></A></STRONG> & <STRONG><A href="https://community.sap.com/t5/user/viewprofilepage/user-id/151005" target="_self">Burcu Karlidag</A></STRONG><SPAN class=""> (Product Management),<STRONG> <A href="https://community.sap.com/t5/user/viewprofilepage/user-id/1402783" target="_blank">Timm Falter </A></STRONG>(Area Product Owner for Data Integration and CDS), and<A href="https://community.sap.com/t5/user/viewprofilepage/user-id/1522077" target="_blank"><STRONG> Arne Harren </STRONG></A>(Architect in the Data Integration and CDS area).</SPAN><BR /><BR /></LI></UL></DIV><DIV><STRONG>Preliminary Agenda:</STRONG><BR /><UL><LI>Product news</LI><LI><SPAN class=""><SPAN>SQL-based Data Integration with SQL Services and CDS External Entities incl. demo</SPAN></SPAN></LI><LI>Q&A</LI></UL><SPAN>Looking forward to meeting you!</SPAN></DIV><DIV> </DIV><DIV><A href="https://sap-se.zoom.us/meeting/register/tJIrcumhqjgqG9HaXPYz_jmA1XlKnLlAsXdF" target="_blank" rel="noopener nofollow noreferrer"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="iwona_hahn_2-1711369871851.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/85947i01677A9AE51AAC1D/image-size/medium?v=v2&px=400" role="button" title="iwona_hahn_2-1711369871851.png" alt="iwona_hahn_2-1711369871851.png" /></span></A><BR /><BR /><SPAN>Check out our</SPAN><SPAN> </SPAN><A href="https://pages.community.sap.com/topics/btp-abap-environment" target="_blank" rel="noopener noreferrer">SAP Business Technology ABAP Environment</A><SPAN> page in SAP Community </SPAN><SPAN>for </SPAN><SPAN>product </SPAN><SPAN>updates </SPAN><SPAN>and </SPAN><SPAN>upcoming events.</SPAN></DIV>2024-08-22T16:14:08.023000+02:00https://community.sap.com/t5/application-development-blog-posts/sap-developer-news-august-22nd-2024/ba-p/13804017SAP Developer News, August 22nd, 20242024-08-22T21:10:00.209000+02:00thomas_junghttps://community.sap.com/t5/user/viewprofilepage/user-id/139<P><div class="video-embed-center video-embed"><iframe class="embedly-embed" src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FKRzGV1uoRCI%3Ffeature%3Doembed&display_name=YouTube&url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DKRzGV1uoRCI&image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FKRzGV1uoRCI%2Fhqdefault.jpg&key=b0d40caa4f094c68be7c29880b16f56e&type=text%2Fhtml&schema=youtube" width="400" height="225" scrolling="no" title="CodeJam LATAM, ABAP CDS External Entities, TechEd Session Catalog, Open Source | SAP Developer News" frameborder="0" allow="autoplay; fullscreen; encrypted-media; picture-in-picture;" allowfullscreen="true"></iframe></div></P><P><STRONG>Podcast Version</STRONG>: <A href="https://podcast.opensap.info/sap-developers/2024/08/22/sap-developer-news-august-22nd-2024/" target="_blank" rel="nofollow noopener noreferrer">https://podcast.opensap.info/sap-developers/2024/08/22/sap-developer-news-august-22nd-2024/</A></P><H3 id="toc-hId-1172457595">DESCRIPTION</H3><P><STRONG>SAP CodeJams LATAM Wrap Up</STRONG></P><UL><LI>Request your own SAP CodeJam: <A href="https://community.sap.com/t5/sap-codejam-blog-posts/so-you-want-to-host-a-codejam-everything-you-need-to-know/ba-p/221415" target="_blank">https://community.sap.com/t5/sap-codejam-blog-posts/so-you-want-to-host-a-codejam-everything-you-need-to-know/ba-p/221415</A></LI></UL><P><STRONG>ABAP CDS 2408 Release & External Entities</STRONG></P><UL><LI>Blog post: <A href="https://community.sap.com/t5/blogs/blogarticleprintpage/blog-id/technology-blog-sap/article-id/174427" target="_blank">https://community.sap.com/t5/blogs/blogarticleprintpage/blog-id/technology-blog-sap/article-id/174427</A></LI><LI>SAP Help Portal Link - <A href="https://help.sap.com/docs/abap-cloud/abap-data-models/cds-external-entities?version=s4hana_cloud" target="_blank" rel="noopener noreferrer">https://help.sap.com/docs/abap-cloud/abap-data-models/cds-external-entities?version=s4hana_cloud</A></LI></UL><P><STRONG>SAP TechEd Session Catalog is Live!</STRONG></P><UL><LI>SAP TechEd: <A href="https://www.sap.com/events/teched.html" target="_blank" rel="noopener noreferrer">https://www.sap.com/events/teched.html</A></LI><LI>SAP TechEd Session Catalog: <A href="https://www.sap.com/events/teched/virtual/flow/sap/te24/catalog/page/catalog" target="_blank" rel="noopener noreferrer">https://www.sap.com/events/teched/virtual/flow/sap/te24/catalog/page/catalog</A></LI></UL><P><STRONG>SAP Open Source Licenses and AI Webinar</STRONG></P><UL><LI>Registration links: <A href="https://sapit-home-prod-004.launchpad.cfapps.eu10.hana.ondemand.com/site#my-events&/event=14030066" target="_blank" rel="nofollow noopener noreferrer">internal</A> / <A href="https://events.sap.com/ospo-webinars/en/home" target="_blank" rel="noopener noreferrer">external participants</A></LI></UL><P><STRONG>sap.ui.mdc library available for productive usage</STRONG></P><UL><LI>Blog post: <A href="https://community.sap.com/t5/technology-blogs-by-sap/smart-and-flexible-sap-ui-mdc-released-for-productive-use/ba-p/13793439" target="_blank">https://community.sap.com/t5/technology-blogs-by-sap/smart-and-flexible-sap-ui-mdc-released-for-productive-use/ba-p/13793439</A></LI><LI>Samples: <A href="https://ui5.sap.com/#/entity/sap.ui.mdc/sample/sap.ui.mdc.demokit.sample.TableFilterBarJson" target="_blank" rel="noopener noreferrer">https://ui5.sap.com/#/entity/sap.ui.mdc/sample/sap.ui.mdc.demokit.sample.TableFilterBarJson</A></LI><LI>Tutorial: <A href="https://github.com/SAP-samples/ui5-mdc-json-tutorial" target="_blank" rel="nofollow noopener noreferrer">https://github.com/SAP-samples/ui5-mdc-json-tutorial</A></LI></UL><H3 id="toc-hId-975944090">CHAPTER TITLES</H3><P>0:00 Intro</P><P>0:10 SAP CodeJams LATAM Wrap Up</P><P>1:19 ABAP CDS Release News 2408 – External Entities</P><P>2:58 TechEd Session Catalog is Live</P><P>3:37 SAP Open Source Licenses and AI Webinar</P><P>4:33 sap.ui.mdc library available for productive usage</P><H3 id="toc-hId-779430585">Transcript</H3><P><STRONG>[Antonio and Josh]</STRONG> Hola, SAP developers. Hey, everybody. It's Josh. And Antonio. We are so pleased with the attendance, participation, and the feedback from these eight, ocho, CodeJams we just finished yesterday. Exactly. So from Sao Paulo, Santiago, Buenos Aires, and Bolotá, we experienced four great days focused on event-driven integrations and another four great days focused on SAP Build Apps, and a few Stammtisch as well. Besides the amazing technology and the people, the locations, I also learned something new. We traveled all over another continent. My first time here in South America, Latown, but I felt so at home. We talked SAP, shared community stories, and we chatted about Devtoberfest and TechEd. Agreed. I was quite happy to get to meet many developers around here and colleagues in this region as well. So I'm looking forward to meeting more in the near future. Yep. So that's it for this road trip. Thank you all so much. Muchas gracias. See you next time. Y lazamos, muchos gracias. Ciao.</P><P><STRONG>[Sheena]</STRONG> The standard database of application server ABAP is SAP HANA database. And SAP ABAP program requires access to another database we use to configure a secondary connection. Andrea Schlotter, in her latest blog post on the 24.08 release of ABAP CDS, explains a new and exciting feature, CDS external entities. CDS external entities help to retrieve data from multiple other remote sources, which can be SAP HANA or non-SAP HANA databases. Unlike traditional secondary connections that limit access to a single database and require exact matching of remote and local objects, CDS external entities offer a more flexible and efficient approach by allowing access to multiple remote data sources within a single SQL statement. This feature leverages the data federation approach of the SAP HANA Smart Data Access technology. The blog post also talks about the comparison of secondary connection and external entities, how to access data in ABAP SQL, and establish outbound SQL access using an external entity. Please note that currently, only dynamic external entities are supported, which can only be accessed using ABAP SQL and cannot be used as a data source for other CDS entities. Also note that the dynamic external entities allow only read access, and writable external entities are planned for one of the upcoming releases. For details, check out the links in the description.</P><P><STRONG>[Tom]</STRONG> Planning for TechEd Virtual 2024 is officially in full swing. And I'm thrilled to report that the session catalog is now live. Now is the time to explore all of the learning opportunities we have in store during our free virtual event this October. You'll find over 90 live sessions, including live lectures, code demos, track overviews, jumpstart tutorials, and expert analysis. Signing up is simple, just visit sapteched.com and register for our free virtual event on October 8th and 9th. So sign up now and I'll see you online in October.</P><P><STRONG>[Ajay]</STRONG> Hello, SAP developers, greetings of the day. Generative AI, LLMs, tools such as Copilot and Codestral, everybody is in it now. But what does it mean in terms of responsibilities in the daily work of a developer in an enterprise context? SAP Open Source Webinar on Topic, Open Source Licenses within the context of AI is available on September 3rd, 2024 at 3 p.m. CEST. Georgi, who is an open source champion at SAP, will give an overview of illegal environment surrounding AI, talk about restrictions and obligations of licenses used for AI components, and give you examples of technical and regulatory solutions to avoid IP infringements. If this sounds interesting to you, do not miss this opportunity. Links to the registrations are in the description below.</P><P><STRONG>[Nico]</STRONG> Hi, everyone, and welcome to the SAP Developer News. The SAP UI MDC library is now available for productive usage, and this is since SAPUI5 and OpenUI5 version 1.124. The MDC controls, which is short for metadata-driven controls, by the way, help you build smart controls and even whole applications following the SAP Fiori design guidelines. The SAP Fiori Elements flexible programming model for RoadAW4 also use these controls under the hood. But they work with other protocols such as plain REST as well. Check out these samples in the UI5 documentation, as well as the corresponding tutorial on GitHub. Links are in the description, and I hope to see you soon.</P>2024-08-22T21:10:00.209000+02:00https://community.sap.com/t5/technology-blogs-by-sap/client-handling-in-amdp/ba-p/13772907Client Handling in AMDP2024-08-22T23:21:56.451000+02:00harishbokkasam1https://community.sap.com/t5/user/viewprofilepage/user-id/130103<H4 id="toc-hId-1279324846"><STRONG>What is AMDP?</STRONG></H4><UL><LI>ABAP Managed Database Procedures (AMDP) are the preferred way for developing SAP HANA DB procedures on the ABAP platform.</LI><LI>AMDPs allow you as an ABAP developer to write database procedures directly in ABAP. Special ABAP classes (so-called AMDP classes) can contain embedded code (SQLScript) that is used to generate DB procedures in the SAP HANA DB layer.</LI><LI> AMDP is written in a database-specific language, such as Native SQL or SQLScript, and is implemented within an AMDP method body of an AMDP class.</LI></UL><P><A href="https://help.sap.com/doc/abapdocu_740_index_htm/7.40/en-US/abenamdp.htm" target="_self" rel="noopener noreferrer">AMDP Documentation</A></P><H4 id="toc-hId-1082811341"><STRONG>How can you integrate AMDP into ABAP CDS?</STRONG></H4><UL><LI>ABAP CDS provides a framework for defining and consuming semantic data models on the central database of the application server AS ABAP. </LI><LI>Complex calculations can be pushed down to HANA through code pushdown and data can be retrieved into CDS through AMDPs. </LI><LI>ABAP CDS acts as a container to retrieve data from database through AMDPs.</LI><LI>A CDS view has a field that cannot be calculated with ABAP SQL; then AMDP can be used to implement the calculation logic via Native SQL and code pushdown.</LI></UL><H4 id="toc-hId-886297836"><STRONG>What features in ABAP CDS support AMDPs?</STRONG></H4><UL><LI>Table functions</LI><LI>Scalar functions</LI></UL><P><STRONG>Table functions</STRONG></P><UL><LI>ABAP CDS table functions are implemented natively on the database and can be called in CDS.</LI><LI>Table functions accept multiple input parameters and return multiple values as a tabular data set.</LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="harishbokkasam1_0-1721981343572.png" style="width: 278px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/142087i251134A7BAF8B822/image-dimensions/278x156?v=v2" width="278" height="156" role="button" title="harishbokkasam1_0-1721981343572.png" alt="harishbokkasam1_0-1721981343572.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="harishbokkasam1_1-1721981343575.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/142086i1601722B54813706/image-size/medium?v=v2&px=400" role="button" title="harishbokkasam1_1-1721981343575.png" alt="harishbokkasam1_1-1721981343575.png" /></span> <STRONG>Implementation class Implementation logic </STRONG></P><P><A href="https://help.sap.com/doc/saphelp_nw75/7.5.5/en-us/e5/529f75afbc43e7803b30346a56f963/frameset.htm" target="_self" rel="noopener noreferrer">CDS Table functions documentation</A> </P><P><STRONG>Scalar functions</STRONG></P><UL><LI>An SQL-based scalar function (implemented with SQLScript) is a user-defined function that accepts multiple input parameters and returns exactly one scalar value.</LI><LI>A scalar function allows developers to encapsulate complex algorithms into manageable, reusable code that can then be used in all operand positions of CDS view entities that expect scalar values.</LI><LI>AMDP based scalar functions are visible and accessible in ABAP CDS views.</LI><LI><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="harishbokkasam1_2-1721981343577.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/142088i6EDF6BD6E93C1694/image-size/medium?v=v2&px=400" role="button" title="harishbokkasam1_2-1721981343577.png" alt="harishbokkasam1_2-1721981343577.png" /></span></LI></UL><DIV class=""><H4 id="toc-hId-689784331">How is client handling handled in AMDP?</H4></DIV><P>AMDP in general does not support implicit client handling. When accessing client-dependent database tables or views in an AMDP method, the required client ID must be selected explicitly. </P><P><A href="https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abencds_scalar_functions.htm" target="_self" rel="noopener noreferrer">CDS Scalar functions documentation</A> </P><P><STRONG>Client handling in CDS Table functions</STRONG></P><P>Client handling in CDS table functions is controlled via annotations.</P><P>The<SPAN> </SPAN><A title="Glossary Entry" target="_blank">CDS annotation</A><SPAN> </SPAN><A target="_blank"><SPAN class="">@ClientDependent</SPAN></A><SPAN> </SPAN>can be used to switch client dependency on and off for a CDS table function in ABAP CDS (the default setting is on).</P><UL class=""><LI>The value<SPAN> </SPAN><SPAN class="">#CLIENT_DEPENDENT</SPAN><SPAN> </SPAN>enables client dependency.</LI><LI>The value<SPAN> </SPAN><SPAN class="">#CLIENT_INDEPENDENT</SPAN><SPAN> </SPAN>disables client dependency.</LI></UL><P>CDS table functions can be either client-dependent or -independent. More details on client dependency and its consequences for the CDS entitites and AMDP implementations can be found <A title="Client dependency and consequences" href="https://help.sap.com/doc/abapdocu_755_index_htm/7.55/en-US/abencds_func_client_handling.htm" target="_self" rel="noopener noreferrer">here</A>.</P><P><STRONG>Client handling in scalar functions</STRONG></P><UL><LI><FONT size="3">Client handling has not yet been implemented for CDS scalar functions and therefore, only client-independent objects can be accessed in the AMDP method that implements the scalar function.</FONT></LI></UL><H4 id="toc-hId-493270826">What is a client-safe repository object?</H4><P>A client-safe object can access data of a single client only.</P><DIV class=""><DIV class=""><UL><LI>If an AMDP method is implemented in cloud-compliant ABAP, then it is implicitly client-safe.</LI><LI><SPAN>A repository object that accesses only</SPAN><SPAN> </SPAN><A class="" href="https://ldciuia.wdf.sap.corp:44300/sap/public/bc/abap/docu?sap-language=EN&tree=X&version=A&sap-client=000&style=ui5&object=abenclient_independent_glosry" target="_self" rel="nofollow noopener noreferrer">client-independent</A><SPAN> </SPAN><SPAN>SQL data sources is implicitly client-safe and must access only client-safe objects.</SPAN></LI></UL></DIV></DIV><DIV class=""><DIV class=""><P data-unlink="true">AMDP does not support implicit client handling. Therefore,<SPAN> </SPAN>client safety must be delegated to the objects accessed in an AMDP method and declared in its<SPAN> </SPAN>USING list. </P><P>More details on the requirements for defining client-safe AMDP methods. </P><P><A href="https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abenamdp_client_safety.htm" target="_self" rel="noopener noreferrer">client Safety in AMDP</A> </P><P><A href="https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abennews-79.htm" target="_self" rel="noopener noreferrer">Client safety in CDS view entities</A></P></DIV></DIV>2024-08-22T23:21:56.451000+02:00https://community.sap.com/t5/application-development-blog-posts/sap-developer-news-august-29th-2024/ba-p/13811577SAP Developer News, August 29th, 20242024-08-29T21:10:00.041000+02:00thomas_junghttps://community.sap.com/t5/user/viewprofilepage/user-id/139<P><div class="video-embed-center video-embed"><iframe class="embedly-embed" src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FxvdewwwM5kc%3Ffeature%3Doembed&display_name=YouTube&url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DxvdewwwM5kc&image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FxvdewwwM5kc%2Fhqdefault.jpg&key=b0d40caa4f094c68be7c29880b16f56e&type=text%2Fhtml&schema=youtube" width="400" height="225" scrolling="no" title="SAP Developer News" frameborder="0" allow="autoplay; fullscreen; encrypted-media; picture-in-picture;" allowfullscreen="true"></iframe></div></P><P><STRONG>Podcast:</STRONG> <A href="https://podcast.opensap.info/sap-developers/2024/08/29/sap-developer-news-august-29th-2024/" target="_blank" rel="noopener nofollow noreferrer">https://podcast.opensap.info/sap-developers/2024/08/29/sap-developer-news-august-29th-2024/</A></P><H3 id="toc-hId-1173296734">DESCRIPTION</H3><P><STRONG>SAP BTP ABAP Environment Release 2408</STRONG></P><UL><LI>Release Notes Blog Post: <A href="https://community.sap.com/t5/technology-blogs-by-sap/sap-btp-abap-environment-release-2408/ba-p/13801154" target="_blank">https://community.sap.com/t5/technology-blogs-by-sap/sap-btp-abap-environment-release-2408/ba-p/13801154</A></LI></UL><P><STRONG>SAP TechEd Registration</STRONG></P><UL><LI>SAP TechEd: <A href="https://www.sap.com/events/teched.html" target="_blank" rel="noopener noreferrer">https://www.sap.com/events/teched.html</A></LI><LI>SAP TechEd Session Catalog: <A href="https://www.sap.com/events/teched/virtual/flow/sap/te24/catalog/page/catalog" target="_blank" rel="noopener noreferrer">https://www.sap.com/events/teched/virtual/flow/sap/te24/catalog/page/catalog</A></LI></UL><P><STRONG>New CodeJam: Getting started with Generative AI Hub on SAP AI Core</STRONG></P><UL><LI>New CodeJam in the topic list: <A href="https://community.sap.com/t5/sap-codejam-blog-posts/sap-codejam-topics/ba-p/221407" target="_blank">https://community.sap.com/t5/sap-codejam-blog-posts/sap-codejam-topics/ba-p/221407</A></LI><LI>CodeJam event in Warsaw, Poland: <A href="https://community.sap.com/t5/sap-codejam/getting-started-with-generative-ai-hub-on-sap-ai-core/ec-p/13809704#M572" target="_blank">https://community.sap.com/t5/sap-codejam/getting-started-with-generative-ai-hub-on-sap-ai-core/ec-p/13809704#M572</A></LI></UL><P><STRONG>ABAP Developer Challenge and Devtoberfest</STRONG></P><UL><LI>ABAP Developer Challenge: <A href="https://community.sap.com/t5/application-development-blog-posts/sap-developer-challenge-abap-core-data-services/ba-p/13778288" target="_blank">https://community.sap.com/t5/application-development-blog-posts/sap-developer-challenge-abap-core-data-services/ba-p/13778288</A></LI><LI>Devtoberfest: <A href="https://community.sap.com/t5/devtoberfest-blog-posts/devtoberfest-2024-contest/ba-p/13781593" target="_blank">https://community.sap.com/t5/devtoberfest-blog-posts/devtoberfest-2024-contest/ba-p/13781593</A></LI></UL><H3 id="toc-hId-976783229">CHAPTER TITLES</H3><P>0:00 Intro</P><P>0:10 SAP BTP ABAP Environment Release 2408</P><P>2:15 SAP TechEd Registration</P><P>3:08 New CodeJam: Getting started with Generative AI Hub on SAP AI Core</P><P>4:04 ABAP Developer Challenge and Devtoberfest</P><H3 id="toc-hId-780269724">Transcript</H3><P><STRONG>[Rich] </STRONG>Hey folks, Rich Heilman here, and yes it is time for yet again another release of the BTP ABAP environment, release 2408. And once again, this release is jam packed with new features for ABAP developers. Just to name a few, ABAP Developer Tools now supports a read-only fallback editor for development objects that do not have a native editor, for example BSPs, and also ADT now supports displaying warning messages coming from the HANA database while debugging nested AMDPs. CDS now supports external databases via ABAP CDS and ABAP SQL using CDS external entities. We also have support for logical external schemas for outbound SQL access with external entities. There has been updates to the ABAP repository object wizard, which now includes generating ABAP CDS provider models. There is also new support for creating CDS aspects to store and reuse field definitions and calculations. and we also have support for a few new annotations as well.</P><P>There are a bunch of new features around UI services in Fiori Launchpad, like support for adding a custom logo to the Launchpad and other customizing of the browser window. A lot of new features around integration topics like direct push-based integration over RFC, new enhancements around the advanced event mesh, and creating and assigning API packages.</P><P>Now I've only touched on a few of the new features to hit release 24.08. So, if you want the full story and all of the details, be sure to check out the 24.08 release blog post today. See you next time.</P><P><STRONG>[Josh]</STRONG> It's time for SAP TechEd. Every year, TechEd is our time to get together, share ideas, learn, and have a lot of fun. Last year's TechEd was awesome, and good news, registration for TechEd 2024 is officially open. We've got an incredible TechEd lineup. First off, two full days of keynote analysis, code demos over 80 live sessions, three channels of programming, and live Q&A. That's right, they're still letting me talk live on a microphone. Then, and I am so excited about this, join us on tour as we make our way around the world with in-person stops on three continents throughout 2024 and 2025. We can't wait to connect in person for deep dive sessions, hands-on labs, and continue learning together. And trust me, this is a TechEd you will not wanna miss. See you online in October.</P><P><STRONG>[Nora]</STRONG> Hey there, we have a new Generative AI CodeJam on the list. The first two events are already scheduled. One of them will be on the 20th of September in Warsaw, Poland at the KMD office and the other one will be right after Virtual TechEd in Munich. During the CodeJam you will learn how to access different large range models via Generative AI Hub on SAP AI Core. We will use the Python SDK of Generative AI Hub and we will also use the SAP AI Launchpad to access the models. You will also learn how to implement a retrieval augmented generation use case using the HANA Vector Engine and we will have a look at different chunking techniques, how you can chunk your documents right and then we will also have a look at a multi modal model where you will learn how to work with images and text. So, make sure to also check out all the other great code gems on the list, find an event near you or host your own event. See you there! Hello, SAP developers.</P><P><STRONG>[Shilpa]</STRONG> I hope you are enjoying the August Developer Challenge on ABAP Core Data Services. The last task in this four-week challenge was out yesterday. We have seen huge response over 550 plus submissions throughout the challenge and thanks to each one of you for taking time and as well as involving in some good discussions on best practices. For those of you who have not yet taken part in the challenge, you have one more week left until we close it. In this four-week task, you will learn about the basics of ABAP series, annotations, associations, criticality and object page. While this challenge is coming to an end, we have another exciting event kicking off in September and that is Devtoberfest. We are back again with lots of interesting sessions which ranges from September 23rd until October 25th. Like last year, we have dedicated topics each day ranging from ABAP, CAP, SAP Build, Build Code, integration, machine learning, AI, and front-end. Most of the sessions are already scheduled in the community event page. Check it out and happy learning!</P>2024-08-29T21:10:00.041000+02:00