https://raw.githubusercontent.com/ajmaradiaga/feeds/main/scmt/topics/ABAP-Development-blog-posts.xml SAP Community - ABAP Development 2024-05-09T23:00:04.337151+00:00 python-feedgen ABAP Development blog posts in SAP Community https://community.sap.com/t5/technology-blogs-by-members/dynamic-bdc-in-table-control/ba-p/13671723 Dynamic BDC in Table Control 2024-04-16T12:52:14.723000+02:00 Lik_Wei https://community.sap.com/t5/user/viewprofilepage/user-id/174095 <H1 id="toc-hId-863415883">Introduction</H1><P>During the execution of the program, a maximum of five lines are displayed in the table control. To get a better understanding of how this works, consider the program's attempt to loop through all the records contained within the ITEM_TAB table.</P><P>&nbsp;</P><H1 id="toc-hId-666902378">Implementation</H1><P>In the context of table control, there's a need to reset the counter to 4 after the insertion of a new line. The reason behind this is that once a new line is inserted, the program proceeds to display four lines that include the inserted values. Additionally, there's a blank line, which is positioned on line 5.</P><P>Every time a new record is to be added, it should be positioned on line 5, following the execution of <STRONG>OKCODE</STRONG> =0006. This approach ensures the proper display and handling of data within the table control.</P><P>To provide a clearer understanding of how this works, below is a snapshot of the BDC program with the associated <STRONG>T-Code</STRONG> FB60:<!-- notionvc: 3d5aa2f8-a438-42b8-9339-a3f23ac9d385 --></P><P>&nbsp;</P><P>&nbsp;</P><pre class="lia-code-sample language-abap"><code>* Intialize counter for table control rows (Max 5 lines). lv_cnt = 1. * Insert BDC_FIELD from each line in table ITEM_TAB. LOOP AT item_tab ASSIGNING FIELD-SYMBOL(&lt;lf_item_tab&gt;). CONDENSE lv_cnt. lv_txt_fkber = |ACGL_ITEM-FKBER({ lv_cnt })|. lv_txt_hkont = |ACGL_ITEM-HKONT({ lv_cnt })|. lv_txt_wrbtr = |ACGL_ITEM-WRBTR({ lv_cnt })|. lv_txt_sgtxt = |ACGL_ITEM-SGTXT({ lv_cnt })|. lv_txt_prctr = |ACGL_ITEM-PRCTR({ lv_cnt })|. lv_txt_kostl = |ACGL_ITEM-KOSTL({ lv_cnt })|. lv_txt_shkzg = |ACGL_ITEM-SHKZG({ lv_cnt })|. PERFORM bdc_dynpro USING 'SAPMF05A' '1100'. PERFORM bdc_field USING 'BDC_OKCODE' '=PI'."'/00'. PERFORM bdc_field USING 'RF05A-BUSCS' lc_r. PERFORM bdc_field USING 'INVFO-ACCNT' iv_vendor. PERFORM bdc_field USING 'INVFO-XBLNR' iv_xblnr. PERFORM bdc_field USING 'INVFO-WRBTR' lv_wrbtr. PERFORM bdc_field USING 'BDC_CURSOR' lv_txt_hkont. PERFORM bdc_field USING lv_txt_hkont &lt;lf_item_tab&gt;-glaccount. * ............................................................* PERFORM bdc_dynpro USING 'SAPMF05A' '0330'. PERFORM bdc_field USING 'BDC_CURSOR' 'BSEG-XREF3'. PERFORM bdc_field USING 'BDC_OKCODE' '=RW'. PERFORM bdc_field USING 'BSEG-XREF1' &lt;lf_item_tab&gt;-xref1. PERFORM bdc_field USING 'BSEG-XREF2' &lt;lf_item_tab&gt;-xref2. PERFORM bdc_field USING 'BSEG-XREF3' &lt;lf_item_tab&gt;-xref3. * Managing line items in the table control of FB60 transaction. IF lv_cnt &gt; 4. "Max 5 records appear in table control. * Reset the counter to 4 (Last line in the table conrtol) after last record is filled up. lv_cnt = 4. PERFORM bdc_dynpro USING 'SAPMF05A' '1100'. PERFORM bdc_field USING 'BDC_OKCODE' '=0006'. PERFORM bdc_field USING 'BDC_CURSOR' lv_txt_hkont. ENDIF. lv_cnt = lv_cnt + 1. "Counter increment by 1. ENDLOOP. PERFORM bdc_dynpro USING 'SAPMF05A' '1100'. PERFORM bdc_field USING 'BDC_OKCODE' '=BU'. PERFORM bdc_field USING 'RF05A-BUSCS' lc_r. PERFORM bdc_field USING 'INVFO-ACCNT' iv_vendor. PERFORM bdc_field USING 'INVFO-XBLNR' iv_xblnr. PERFORM bdc_field USING 'INVFO-WRBTR' lv_wrbtr. PERFORM bdc_field USING 'BDC_CURSOR' lv_txt_hkont. PERFORM bdc_transaction TABLES messtab USING 'FB60' ctu mode update.</code></pre><P>&nbsp;</P><P>&nbsp;</P><P>If you've encountered an error while using different devices, the issue could be due to the varying screen resolutions of your devices. This is a common problem that can occur when working with a variety of devices, each with its own unique specifications. The software needs to adapt to these different environments, and this is where our solution comes into play.</P><P>To address this, we need to add a specific part of code, the defsize option, to our program. The defsize option is a powerful tool that ensures consistent handling of table control across all systems. It is designed to provide a uniform experience, regardless of the device or screen resolution being used.</P><P>The process begins by recording your transaction using the default screen size. This establishes a baseline for the software to refer to and ensures that the process is calibrated properly.</P><P>Next, you will need to increment the index. This is done based on the number you get from the default recording for the table control entries. This step is crucial as it allows the program to adjust the display according to the specific requirements of the device being used.</P><P>By following these steps, you can ensure that your program can handle table control consistently across all devices and screen resolutions. This will not only resolve the error you're currently experiencing but also make your program more robust and reliable for future use.</P><P><!-- notionvc: 075cb609-693f-48c1-9843-65a4c77e122b --></P><P>&nbsp;</P><P>&nbsp;</P><pre class="lia-code-sample language-abap"><code>DATA ctu_options TYPE ctu_params. ctu_options-defsize = 'X'. CALL TRANSACTION 'MMZ1' USING bdcdata OPTIONS FROM ctu_options.</code></pre><P>&nbsp;</P><P>&nbsp;</P><H1 id="toc-hId-470388873">Conclusion</H1><P>I sincerely hope that this blog has been a helpful resource in your journey to understand how to develop a BDC Table Control program. My aim was to provide you with a comprehensive guide that simplifies the process and makes it more accessible to everyone, regardless of their level of familiarity with the platform. If you found this blog useful, I would greatly appreciate it if you could share it with others who might also benefit from this information.</P><P>Your likes and shares help to spread the word about these resources and support the work that goes into creating them. Moreover, your feedback and comments are extremely valuable to me. They not only help me improve my future content, but also provide a space for discussion and learning. I look forward to hearing your thoughts and engaging in fruitful discussions!</P><P><!-- notionvc: 9eb12686-94f9-4f19-8295-853352bced81 --></P><P><!-- notionvc: f3a4e0c8-4cbc-4082-b911-f5a717d6c46b --></P> 2024-04-16T12:52:14.723000+02:00 https://community.sap.com/t5/application-development-blog-posts/a-journey-of-discovery-and-a-prime-example-for-utilizing-dynamic-logpoints/ba-p/13668125 A journey of discovery and a prime example for utilizing dynamic logpoints 2024-04-16T13:02:04.868000+02:00 BaerbelWinkler https://community.sap.com/t5/user/viewprofilepage/user-id/439 <P>I recently got pulled into trying to resolve a helpdesk ticket raised by a user department because they had noticed something "off" with delivery note attachments&nbsp; to several deliveries. For some unknown reason, some deliveries kept getting the same PDF attached over and over again - and not just a few times but really often, like up to almost 140,000 times!</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="JourneyOfDiscovery-01.jpg" style="width: 651px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/95501i51DAEEF856E0D195/image-size/large?v=v2&amp;px=999" role="button" title="JourneyOfDiscovery-01.jpg" alt="JourneyOfDiscovery-01.jpg" /></span></P><P><STRONG>Collecting information</STRONG></P><P>To begin with, we didn't really know where these were coming from and our only lead were the many entries also getting added to the archive link table TOA01. There, we noticed a big jump in daily additions at around November 20. Before then, we had daily additions in the 3 digit numbers range and afterwards it quickly jumped up to 250K entries per day.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="JourneyOfDiscovery-03.jpg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/95567i4E76FFBB011961E7/image-size/large?v=v2&amp;px=999" role="button" title="JourneyOfDiscovery-03.jpg" alt="JourneyOfDiscovery-03.jpg" /></span></P><P>I then did a <STRONG>where-used analysis</STRONG> for table TOA01 and found function module ARCHIVE_CONNECTION_INSERT which looked like a promising lead just based on its name! Luckily enough, we have the <STRONG>SAP Call Monitor (SCMON)</STRONG> active in our productive environments, so I went there to see if there were any "interesting" hits for the function module. Not too surprisingly, there was a very clear outlier within the 7 days worth of data readily available:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="JourneyOfDiscovery-04.jpg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/95568i987451E352E40AA2/image-size/large?v=v2&amp;px=999" role="button" title="JourneyOfDiscovery-04.jpg" alt="JourneyOfDiscovery-04.jpg" /></span></P><P>So, I checked&nbsp; our RFC-enabled function module which looked fine logic-wise and which also hadn't been changed recently. It therefore couldn't really be the underlying reason for what was happening in the system. I now however had some impacted piece of code to take a closer look at.</P><P><STRONG>Dynamic logpoints to the rescue!</STRONG></P><P>As far as I'm concerned, dynamic logpoints (SDLP) are one of the best options to troubleshoot issues like the one at hand where you can't capture the process stand alone via starting a report or transaction. So, I identified a suitable place in the code and defined a logpoint for a few relevant fields:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="JourneyOfDiscovery-05.jpg" style="width: 631px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/95576i705F45F71233BB0C/image-dimensions/631x296?v=v2" width="631" height="296" role="button" title="JourneyOfDiscovery-05.jpg" alt="JourneyOfDiscovery-05.jpg" /></span></P><P>It didn't take long for a very distinct patter to emerge in that we had most delivery numbers showing up with slowly increasing KEY COUNTS (the combination of fields in Key Definition) and a few others where the numbers went up far more quickly.</P><P>Slow cycle with something between 36 and 40 minutes between each addition:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="JourneyOfDiscovery-06.jpg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/95580i83BB93F4F904B7AA/image-size/large?v=v2&amp;px=999" role="button" title="JourneyOfDiscovery-06.jpg" alt="JourneyOfDiscovery-06.jpg" /></span></P><P>Fast cycle with something between 1m50s and 2m30s (ignoring the outlier):</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="JourneyOfDiscovery-07.jpg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/95581i059F89CD911B1F68/image-size/large?v=v2&amp;px=999" role="button" title="JourneyOfDiscovery-07.jpg" alt="JourneyOfDiscovery-07.jpg" /></span></P><P>Watching this for a few days, the pattern was eerily consistent so that it was roughly possible to tell when numbers would go up again for one of the deliveries simply by knowing if it was stuck in the slow or fast cycle! Just how eerily regular the pattern was, can be seen in this screenshot with only partially masked delivery numbers. I had the dynamic logpoints active for about 8 hours each day, during which time they had been triggered about 74K times each:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="JourneyOfDiscovery-08.jpg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/95582i322DBFC47B9EE735/image-size/large?v=v2&amp;px=999" role="button" title="JourneyOfDiscovery-08.jpg" alt="JourneyOfDiscovery-08.jpg" /></span></P><P><STRONG>Resolution of the issue</STRONG></P><P>By that time we had collected more than enough data to be "fairly" certain that the root cause for the issue was outside our SAP system and had to be with one of our external logistic partners who kept re-sending the same delivery notes over and over again instead of just once. After getting in touch with them, the issue was quickly resolved: the root cause of all of this was a local C-drive running out of space with nobody noticing! Once that was tackled on their end, the number of transmitted delivery notes went down to pre-issue numbers immediately!</P><P><STRONG>Next steps</STRONG></P><P>Now that we successfully stopped the build-up of unwanted attachments we'll need to find a way to get rid of the millions of obsolete attachments in an orderly way with always obviously leaving one attachment intact but deleting all the many others from an impacted delivery. I already identified one most likely helpful function module for this task: <SPAN>ARCHIV_DELETE_META. I'll however have to investigate how best to get rid of the many items without causing issues for the system with these many updates. </SPAN></P><P><SPAN>So, here is a question for you: did you per chance already have to tackle a comparable clean-up of archivelink attachments and if so, am I on the right track with ARCHIV_DELETE_META or are there other/better options available? If you have any suggestions, please mention them in the comments. Thanks!</SPAN></P> 2024-04-16T13:02:04.868000+02:00 https://community.sap.com/t5/technology-blogs-by-sap/capture-your-own-workload-statistics-in-the-abap-environment-in-the-cloud/ba-p/13667180 Capture Your Own Workload Statistics in the ABAP Environment in the Cloud 2024-04-18T13:02:05.620000+02:00 christiancop https://community.sap.com/t5/user/viewprofilepage/user-id/625488 <P>As an administrator in <a href="https://community.sap.com/t5/c-khhcw49343/SAP+BTP%25252C+ABAP+environment/pd-p/73555000100800001164" class="lia-product-mention" data-product="11-1">SAP BTP, ABAP environment</a> or in <a href="https://community.sap.com/t5/c-khhcw49343/SAP+S%25252F4HANA+Cloud+ABAP+Environment/pd-p/60907aa9-99e9-4d5d-9103-8b970e9bc0a4" class="lia-product-mention" data-product="39-1">SAP S/4HANA Cloud ABAP Environment</a>, it’s important to keep track of performance issues and identify bottlenecks. Now SAP offers a few Fiori apps to help you with monitoring the system workload. However, relying on what data the system automatically collects for you sometimes isn’t enough.</P><P>Instead, you want to define yourself what kind of workload information is captured, such as in the following use cases:</P><UL><LI>Standard apps and tools show you that there’s a high workload, but when you drill down to details, you don’t get the information you’re interested in.</LI><LI>You want to monitor the workload of a clearly defined special case, such as the workload generated by a user or by one of your custom apps (which you might want to watch using its request entry point).</LI><LI>You have specific requests where you want to get alerted when the workload, for example, exceeds a defined threshold.</LI></UL><P>In this blog post, I’ll show you how to use the <EM>Capture Request Statistics</EM> app to cover these use cases.</P><H3 id="toc-hId-1120830963"><SPAN class=""><SPAN class="">Background: the System </SPAN></SPAN><SPAN class=""><SPAN class="">Workload</SPAN></SPAN><SPAN class=""><SPAN class=""> App</SPAN></SPAN></H3><P><SPAN>Before I introduce you to the <EM>Capture Request Statistics</EM> app, let me start with a brief recap of what the <EM>System Workload</EM> app can do for you out of the box (for more details, see the blog post </SPAN><SPAN><A href="https://blogs.sap.com/2023/04/24/analyzing-performance-degradations-in-the-abap-environment-in-the-cloud/" target="_blank" rel="noopener noreferrer">Analyzing performance degradations in the ABAP environment in the Cloud</A></SPAN><SPAN>).</SPAN></P><P>Let’s say you want to analyze the performance of your ABAP system in the <EM>System Workload</EM> app:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="System Workload app" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/95592iD385E7CF005F9EA9/image-size/large?v=v2&amp;px=999" role="button" title="TM_System_Workload.png" alt="System Workload app" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">System Workload app</span></span></P><P><SPAN>You find the top resource-consuming application in the system and want to analyze it further. You can analyze this application in more detail by choosing the </SPAN><EM>Details</EM><SPAN> arrow at the end of the row. In the following screen, you typically find samples of single ABAP statistics records for this workload. Now, how are these ABAP statistics records collected by default and how can you influence what is captured? Let's take a look behind the scenes.</SPAN></P><H3 id="toc-hId-924317458"><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class="">Default Configuration: Capture Workload Statistics with Static Thresholds</SPAN></SPAN></SPAN></SPAN></SPAN></H3><P>An ABAP Environment in the Cloud comes with pre-delivered SAP profiles that capture ABAP statistics records in your system. You can find these pre-delivered SAP profiles in the <EM>Capture Request Statistics</EM> app:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Pre-delivered SAP profiles" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/95589i0FB1B72F365706C2/image-size/large?v=v2&amp;px=999" role="button" title="CRS_default_profiles.png" alt="Pre-delivered SAP profiles" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Pre-delivered SAP profiles</span></span></P><P><SPAN>These profiles ensure that the statistics about “bad” requests - meaning a high consumption of compute resources – are captured in the system. If you look, for example, at the details of the static profile for expensive requests regarding server response time, you find a static threshold of 1 second:</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Pre-delivered SAP profile - capture requests with high server response time" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/95590iC8508BAE822CC1ED/image-size/large?v=v2&amp;px=999" role="button" title="CRS_default_static_profile.png" alt="Pre-delivered SAP profile - capture requests with high server response time" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Pre-delivered SAP profile - capture requests with high server response time</span></span></SPAN></P><P><SPAN>With this profile always active, ABAP statistics records with an ABAP server response time larger than 1 second are captured and stored. Similarly, the other pre-delivered static profiles capture requests that exceed 1 second regarding HANA CPU time, ABAP CPU time, etc.</SPAN></P><P>In the profile header, you can find that for the SAP-delivered profiles, a sampling rate of 1% has been set. It means that only 1% of the records that fulfill the filter condition will be captured. In addition, the record limit per minute is set to 50. The periodic data collector that runs every minute and processes the ABAP statistics records (together with the profiles in the <EM>Capture Request Statistics</EM> app) will only store the ABAP statistics records up to this limit in the database. So, if many ABAP statistics records fulfill the filter condition at a time, not all of these records will be stored.</P><P>For SAP-delivered profiles, this low record limit per minute together with the low sampling rate ensures that the workload and data footprint for processing and storing monitoring data in your system stay low, even if the overall business workload on the system gets exceedingly high.</P><H3 id="toc-hId-727803953"><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class="">Default Configuration: Capture Workload Statistics Dynamically</SPAN></SPAN></SPAN></SPAN></SPAN></H3><P>In addition to the pre-delivered static profiles, the dynamic SAP profile <EM>SAP_DYNAMIC_CAPTURING</EM> ensures that for the top workload of your system “good” statistic samples of requests are also captured (with respect to the server response time). As a result, you can compare statistics of samples of “bad” workload to statistics of samples of “good” workload. The top workload in your system might vary as well as the behavior in response times. The dynamic profile adapts to these changes.</P><P>In addition, for the top workload, the dynamic profile captures samples of ABAP statistics when their server response times deviate too much from the average server response time of this specific kind of workload. This ensures that for workloads with typically different server response times, samples of ABAP statistics records are also at hand, even if their server response times do not exceed the static thresholds of the static profile types.</P><P>In principle, the pre-delivered static profiles together with the dynamic profile will give you a high chance that for your top workload, you’ll find samples of ABAP statistics records in the system that you can use for detailed analysis. You get this data using the <EM>System Workload</EM> app and by drilling down to the ABAP statistics records, and in most of the cases, that’s enough. However, as these statistics are sampled, it might happen that sometimes you don't find any records that you can use for further analysis:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="System Workload app - no detailed statistics available" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/95598i889C198FE81A56E3/image-size/large?v=v2&amp;px=999" role="button" title="TM_Request_Processing.png" alt="System Workload app - no detailed statistics available" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">System Workload app - no detailed statistics available</span></span></P><P><SPAN>To have these detailed statistics for your root cause analysis, you can capture your own workload statistics in your ABAP environment in the Cloud.</SPAN></P><H3 id="toc-hId-531290448"><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class="">Capture Your Own Workload Statistics in the Capture Request Statistics App</SPAN></SPAN></SPAN></SPAN></SPAN></H3><P>You can create your own capture profiles, of course. While the SAP profiles are designed in such a way that they capture samples of ABAP statistics records for generic expensive workload in the ABAP tenant, you might want to specify the workload more concretely. For example, you might be interested specifically in the ABAP statistics records of your user or of a certain outbound communication arrangement. Or you might be interested in workload that exceeds a specific threshold (as in the pre-delivered SAP profiles). To do so, you can create your own capture profile.</P><P>If, for example, you have built a new ABAP RESTful application for travel bookings, you could define a profile that filters on its specific request entry point (consisting of request entry name and request entry type):</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Custom profile" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/95585i1CFDC6C8A1EE4DC4/image-size/large?v=v2&amp;px=999" role="button" title="Custom_static_profile.png" alt="Custom profile" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Custom profile</span></span></P><P>A<SPAN>&nbsp;custom profile is in status </SPAN><EM>Inactive</EM><SPAN> when newly created. If you click on the </SPAN><EM>Activate</EM><SPAN> button, the profile status will be set to status </SPAN><EM>Processing,</EM><SPAN> and only then will the data collector process ABAP statistics records that fulfill the defined filter conditions. On activation of the profile, you also need to specify the duration of how long the profile should be active. When the duration is exceeded and all the relevant ABAP statistics records are processed, the profile will be set to status </SPAN><EM>Finished</EM><SPAN> and no further ABAP statistics records will be processed for this profile.</SPAN></P><P><SPAN>In the example profile shown here, a sampling rate of 100% and a record limit per minute of 1000 has been set. Both are the maximum possible values.&nbsp;</SPAN><SPAN>This setting guarantees that all ABAP statistics records fulfilling the filter conditions are captured. Of course, if the record limit of 1000 is exceeded, you won’t capture everything. But this happens only in rare cases. In any case, it’s ensured that also for a badly designed capture profile, your business is not impacted by the additional workload of capturing request statistics.</SPAN></P><P>The target user group in the profile header indicates that only workload is considered that is running in customer user context. You can specify this further by considering, for example, only customer communication users or customer business users.</P><P>If the profile is active and users are performing actions in your ABAP RESTful application, the according ABAP statistics records are captured and stored in the database for a period that you have defined in the retention time of your profile.</P><P>For further analysis, e.g., the performance of a new app that you have built, you can navigate to the captured ABAP statistics records by clicking on <EM>Analyze Request Statistics</EM>. There you can analyze the captured single ABAP statistics records in detail and obtain insights into the behavior of your newly created app:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Analyze ABAP statistics records in detail" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/95616i3095B0D51383866A/image-size/large?v=v2&amp;px=999" role="button" title="TM_ABAP_Statistics_Records.png" alt="Analyze ABAP statistics records in detail" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Analyze ABAP statistics records in detail</span></span></P><P><SPAN class=""><SPAN class="">You can find more information, for example, about SQL statements or, in the case of communication, about HTTP calls by choosing the </SPAN></SPAN><SPAN class=""><SPAN class=""><SPAN class="">Details</SPAN></SPAN></SPAN><SPAN class=""><SPAN class=""> arrow at the end of a row, which leads you to the details of that ABAP statistics record.</SPAN></SPAN></P><P><SPAN>If your new application belongs to the more expensive workload in the system, you’ll easily find the captured ABAP statistics records also in the </SPAN><EM>System Workload</EM><SPAN> app. There, you start from the overall workload (aggregated ABAP statistics records) of your business tenants. If you drill down to the details of your application, you will get to the ABAP statistics records. Your custom profile ensures that they have been captured:</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="System Workload app - detailed statistics available" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/95602i44C955DB30D4DCD8/image-size/large?v=v2&amp;px=999" role="button" title="TM_Request_Processing_Data.png" alt="System Workload app - detailed statistics available" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">System Workload app - detailed statistics available</span></span></SPAN></P><P><STRONG>Note:</STRONG><SPAN> With the </SPAN><EM>Capture Request Statistics</EM><SPAN> app, you can also define profiles with profile type </SPAN><EM>SQL Trace</EM><SPAN>. With these profiles, you can trace the execution of SQL statements. These captured SQL statements can be further analyzed in the </SPAN><EM>SQL Trace Analysis</EM><SPAN> app. This might be another story for another blog post in the future, so stay tuned.</SPAN></P><P>You can find more information about the <EM>Capture Request Statistics</EM>&nbsp;app in the following documentation:</P><UL><LI><A href="https://help.sap.com/docs/btp/sap-business-technology-platform/capturing-request-statistics" target="_self" rel="noopener noreferrer">Capturing Request Statistics</A>&nbsp;for <a href="https://community.sap.com/t5/c-khhcw49343/SAP+BTP%25252C+ABAP+environment/pd-p/73555000100800001164" class="lia-product-mention" data-product="11-2">SAP BTP, ABAP environment</a></LI><LI><A href="https://help.sap.com/docs/SAP_S4HANA_CLOUD/0cc8af9d2f2e40f38b38b46b49325e2d/e86943aee62d48a8ac26ec22710bd63d.html" target="_self" rel="noopener noreferrer">Capturing Request Statistics</A>&nbsp;for <a href="https://community.sap.com/t5/c-khhcw49343/SAP+S%25252F4HANA+Cloud+ABAP+Environment/pd-p/60907aa9-99e9-4d5d-9103-8b970e9bc0a4" class="lia-product-mention" data-product="39-2">SAP S/4HANA Cloud ABAP Environment</a></LI></UL><H3 id="toc-hId-334776943"><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class="">Getting Notified About Specific Workloads</SPAN></SPAN></SPAN></SPAN></SPAN></H3><P>You may have noticed that by defining a custom capture profile for capturing ABAP statistics records, you can set the option for <EM>Health Monitoring</EM>. If you have connected your <a href="https://community.sap.com/t5/c-khhcw49343/SAP+BTP%25252C+ABAP+environment/pd-p/73555000100800001164" class="lia-product-mention" data-product="11-3">SAP BTP, ABAP environment</a> or&nbsp;<a href="https://community.sap.com/t5/c-khhcw49343/SAP+S%25252F4HANA+Cloud+ABAP+Environment/pd-p/60907aa9-99e9-4d5d-9103-8b970e9bc0a4" class="lia-product-mention" data-product="39-3">SAP S/4HANA Cloud ABAP Environment</a> tenant to <a href="https://community.sap.com/t5/c-khhcw49343/SAP+Cloud+ALM/pd-p/73554900100800002513" class="lia-product-mention" data-product="469-1">SAP Cloud ALM</a>, you’ll receive a counter per capture request statistics profile in <a href="https://community.sap.com/t5/c-khhcw49343/SAP+Cloud+ALM/pd-p/73554900100800002513" class="lia-product-mention" data-product="469-2">SAP Cloud ALM</a> <EM>for Operations</EM> in the <EM>Health Monitoring</EM> app. You can find more information on how to connect your tenant to SAP Cloud ALM here:</P><UL><LI><SPAN><A href="https://developers.sap.com/tutorials/abap-environment-monitoring-calm-health-monitoring.html" target="_blank" rel="noopener noreferrer">Monitor An SAP BTP ABAP Environment Service Using SAP Cloud ALM (CALM)</A></SPAN></LI><LI><SPAN><A href="https://support.sap.com/en/alm/sap-cloud-alm/operations/expert-portal/setup-managed-services/setup-s4hana-cloud.html" target="_blank" rel="noopener noreferrer">Setup for SAP S/4HANA Public Cloud Edition</A></SPAN></LI></UL><P>For our custom profile example <EM>Z_STATIC_PROFILE</EM>, you’ll find the tile <EM>Captured ABAP Statistics Records</EM> in the <EM>Health Monitoring</EM> app in your connected <a href="https://community.sap.com/t5/c-khhcw49343/SAP+Cloud+ALM/pd-p/73554900100800002513" class="lia-product-mention" data-product="469-3">SAP Cloud ALM</a> tenant. If you click on the tile for details, you find your custom profile together with a counter</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="SAP Cloud ALM - Health Monitoring" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/95619i39178717905FCFEA/image-size/large?v=v2&amp;px=999" role="button" title="CALM_Health_Monitoring.png" alt="SAP Cloud ALM - Health Monitoring" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">SAP Cloud ALM - Health Monitoring</span></span></P><P><SPAN>This counter is normalized to 5 minutes. This means that during the last 5 minutes, 27 ABAP statistics records were captured in your ABAP tenant that fulfill the filter conditions that you have defined in your custom profile. Besides this usage scenario, you can also use the </SPAN><EM>Health Monitoring</EM><SPAN> feature on capture profiles with static thresholds (like in the case of the pre-delivered static SAP profiles) to count how often your defined thresholds are exceeded. For more information, see also the blog post </SPAN><SPAN><A href="https://community.sap.com/t5/technology-blogs-by-sap/monitoring-the-performance-of-outbound-communication-in-the-abap/ba-p/13566730" target="_blank">Monitoring the Performance of Outbound Communication in the ABAP Environment in the Cloud</A></SPAN><SPAN>.</SPAN></P><P>If you want to get alerted by email when the filter conditions of your profile are hit a certain number of times, you can configure alerts in <a href="https://community.sap.com/t5/c-khhcw49343/SAP+Cloud+ALM/pd-p/73554900100800002513" class="lia-product-mention" data-product="469-4">SAP Cloud ALM</a> in the <EM>Health Monitoring</EM> app. For more information, see the blog post <A href="https://community.sap.com/t5/technology-blogs-by-sap/monitoring-the-health-of-the-abap-system-in-the-cloud/ba-p/13570209" target="_blank">Monitoring the Health of the ABAP System in the Cloud</A>.</P><H3 id="toc-hId-138263438"><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class="">Summary</SPAN></SPAN></SPAN></SPAN></SPAN></H3><P>The default configuration of your <a href="https://community.sap.com/t5/c-khhcw49343/SAP+BTP%25252C+ABAP+environment/pd-p/73555000100800001164" class="lia-product-mention" data-product="11-4">SAP BTP, ABAP environment</a> or <a href="https://community.sap.com/t5/c-khhcw49343/SAP+S%25252F4HANA+Cloud+ABAP+Environment/pd-p/60907aa9-99e9-4d5d-9103-8b970e9bc0a4" class="lia-product-mention" data-product="39-4">SAP S/4HANA Cloud ABAP Environment</a> tenant comes with pre-delivered SAP profiles that capture ABAP statistics records for the most important workload in your system. This helps you analyze and understand your system workload in detail.</P><P><SPAN>However, if you want to enhance this default configuration, you can do so by creating your own profiles using the <EM>Capture Request Statistics</EM> app. The monitoring data collector ensures that requests that fulfill </SPAN><SPAN>your filter conditions are captured and stored in the system for further analysis. You can define profiles for capturing ABAP statistics records and for capturing SQL statements.</SPAN></P><P><SPAN>Let’s quickly recap in which use cases creating your own profiles in the <EM>Capture Request Statistics</EM> app is useful: </SPAN></P><UL><LI>In your standard system-local analysis of the system behavior, detailed statistics are missing for a certain workload that you need to have at hand.</LI><LI>You want to proactively capture extensive details for a workload of your choice to analyze it in detail.</LI><LI>In <a href="https://community.sap.com/t5/c-khhcw49343/SAP+Cloud+ALM/pd-p/73554900100800002513" class="lia-product-mention" data-product="469-5">SAP Cloud ALM</a>, you want to understand how often your workload in the landscape hits certain criteria (= your filter conditions defined in the profiles), and you want to get alerted in this case</LI></UL><P>I’d like to thank everyone who contributed to this blog post, especially my colleagues <a href="https://community.sap.com/t5/user/viewprofilepage/user-id/852125">@anke_griesbaum</a>, <a href="https://community.sap.com/t5/user/viewprofilepage/user-id/5052">@Karen_Kuck</a>, <a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1803">@SabineReich</a>, and <a href="https://community.sap.com/t5/user/viewprofilepage/user-id/220841">@steffen_siegmund</a>.</P><P>Let me know in the comments if and how you’ve used the <EM>Capture Request Statistics</EM> app and what you think of it.</P> 2024-04-18T13:02:05.620000+02:00 https://community.sap.com/t5/application-development-blog-posts/sap-developer-news-april-18th-2024/ba-p/13674660 SAP Developer News, April 18th, 2024 2024-04-18T14:16:44.083000+02:00 qmacro https://community.sap.com/t5/user/viewprofilepage/user-id/53 <P><STRONG><SPAN><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%2FFVAali4nfLQ%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DFVAali4nfLQ&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FFVAali4nfLQ%2Fhqdefault.jpg&amp;key=b0d40caa4f094c68be7c29880b16f56e&amp;type=text%2Fhtml&amp;schema=youtube" width="600" height="337" scrolling="no" title="CodeJam Roadshow, CAP Plugins, Build Dev Challenge, FioriConf, AI Webinar | SAP Developer News" frameborder="0" allow="autoplay; fullscreen; encrypted-media; picture-in-picture;" allowfullscreen="true"></iframe></div></SPAN></STRONG></P><P><STRONG><SPAN>SAP CodeJam European Roadshow</SPAN></STRONG><SPAN>&nbsp;</SPAN></P><UL><LI><SPAN>SAP CodeJam Event Calendar: </SPAN><A href="https://community.sap.com/t5/sap-codejam/eb-p/codejam-events" target="_blank"><SPAN>https://community.sap.com/t5/sap-codejam/eb-p/codejam-events</SPAN></A><SPAN>&nbsp;</SPAN></LI><LI><SPAN>SAP CodeJam Group: </SPAN><A href="https://community.sap.com/t5/sap-codejam/gh-p/code-jam" target="_blank"><SPAN>https://community.sap.com/t5/sap-codejam/gh-p/code-jam</SPAN></A><SPAN>&nbsp;</SPAN>&nbsp;</LI></UL><P><STRONG><SPAN>SAP CodeTalk with Daniel Schlachter on the CAP plugin concept</SPAN></STRONG><SPAN>&nbsp;</SPAN></P><UL><LI><SPAN>The interview </SPAN><A href="https://www.youtube.com/watch?v=cG-cMqAhqyQ" target="_blank" rel="noopener nofollow noreferrer"><SPAN>https://www.youtube.com/watch?v=cG-cMqAhqyQ</SPAN></A> <SPAN>&nbsp;</SPAN></LI><LI><SPAN>The Capire section on "CAP Plugins &amp; Enhancements" </SPAN><A href="https://cap.cloud.sap/docs/plugins/#cap-plugins-enhancements" target="_blank" rel="noopener nofollow noreferrer"><SPAN>https://cap.cloud.sap/docs/plugins/#cap-plugins-enhancements</SPAN></A> <SPAN>&nbsp;</SPAN></LI></UL><P><STRONG><SPAN>SAP Build Developer Challenge Week 3 Announcement</SPAN></STRONG><SPAN>&nbsp;</SPAN></P><UL><LI><SPAN>SAP builders group discussion : </SPAN><A href="https://community.sap.com/t5/sap-builders-discussions/april-citizen-developer-challenge-sap-build-apps-task-3/td-p/13672860" target="_blank"><SPAN>https://community.sap.com/t5/sap-builders-discussions/april-</SPAN></A> <A href="http://citizen-/" target="_blank" rel="noopener nofollow noreferrer"><SPAN>citizen-developer-challenge-sap-build-apps-task-3/td-p/13672860</SPAN></A><SPAN>&nbsp;</SPAN></LI></UL><P><STRONG><SPAN>FioriConf 2024 and SAP CodeJam – SAP Fiori elements flexible programming model</SPAN></STRONG><SPAN>&nbsp;</SPAN></P><UL><LI><SPAN>FioriConf 2024: </SPAN><A href="https://www.fioriconf.org/" target="_blank" rel="noopener nofollow noreferrer"><SPAN>https://www.fioriconf.org/</SPAN></A><SPAN>&nbsp;</SPAN></LI><LI><SPAN>SAP CodeJam topic list: </SPAN><A href="https://community.sap.com/t5/sap-codejam-blog-posts/sap-codejam-topics/ba-p/221407" target="_blank"><SPAN>https://community.sap.com/t5/sap-codejam-blog-posts/sap-codejam-topics/ba-p/221407</SPAN></A><SPAN>&nbsp;</SPAN></LI><LI><SPAN>SAP CodeJam – SAP Fiori elements flexible programming model: </SPAN><A href="https://github.com/SAP-samples/fiori-elements-fpm-exercises-codejam" target="_blank" rel="noopener nofollow noreferrer"><SPAN>https://github.com/SAP-samples/fiori-elements-fpm-exercises-codejam</SPAN></A><SPAN>&nbsp;</SPAN></LI></UL><P><STRONG><SPAN>Solution Experience Live Session: Deliver Real-World Results with SAP Business AI, April 30, 2024</SPAN></STRONG><SPAN>&nbsp;</SPAN></P><UL><LI><SPAN>Register: </SPAN><A href="https://events.sap.com/live-session-sap-business-ai/en/home" target="_blank" rel="noopener noreferrer"><SPAN>https://events.sap.com/live-session-sap-business-ai/en/home</SPAN></A><SPAN>&nbsp;</SPAN></LI><LI><SPAN>SAP Business AI release highlights: </SPAN><A href="https://community.sap.com/t5/technology-blogs-by-sap/deliver-real-world-results-with-sap-business-ai-q4-2023-amp-q1-2024-release/ba-p/13650291" target="_blank"><SPAN>https://community.sap.com/t5/technology-blogs-by-sap/deliver-real-world-results-with-sap-business-ai-q4-2023-amp-q1-2024-release/ba-p/13650291</SPAN></A><SPAN>&nbsp;</SPAN></LI></UL><P><STRONG>CHAPTER TITLES&nbsp;&nbsp;</STRONG></P><P><SPAN>0:00 Intro</SPAN><SPAN>&nbsp;<BR /></SPAN><SPAN>0:07 SAP CodeJam European Roadshow&nbsp;</SPAN><SPAN>&nbsp;<BR /></SPAN><SPAN>1:04 SAP CodeTalk with Daniel Schlachter on the CAP plugin concept</SPAN><SPAN>&nbsp;<BR /></SPAN><SPAN>2:16 SAP Build Developer Challenge Week 3 Announcement</SPAN><SPAN>&nbsp;<BR /></SPAN><SPAN>3:00 FioriConf 2024 and SAP CodeJam </SPAN><SPAN>– </SPAN><SPAN>SAP Fiori elements flexible programming model</SPAN><SPAN>&nbsp;<BR /></SPAN><SPAN>3:55 Solution Experience Live Session: Deliver Real-World Results with SAP Business AI, April 30, 2024</SPAN><SPAN>&nbsp;</SPAN></P><P><SPAN><STRONG>TRANSCRIPT</STRONG></SPAN></P><P>[Tom]<BR />This is the SAP Developer News for the 18th of April, 2024. Live from Amsterdam. Live from Bucharest. Live from Leverkusen, Germany. Hey there, we're halfway through this year's SAP Code Jam European Roadshow. As the little intro there demonstrated, we've hit three cities already, we've got Paris, France, and Madrid, Spain still to go on this trip. We've had a wonderful time interacting with all the community members, developers out there, introducing them to ABAP cloud as well as the SAP cloud application programming model. And this is a great time to remind you that anybody can request and offer to host an SAP Code Jam, we'll do our best to accommodate and and make that possible. So if you'd like to see next time's road show come to an area near you, consider hosting a code jam in the future.</P><P>[DJ]<BR />Recently, there's a new plugin concept that's been introduced in the SAP Cloud Application programming model. On the one hand, it allows the CAP team to build out new functions and features for CAP in a really beautifully modular way and it allows us as developers to consume those extensions and new features also in a really beautifully simple way, often only requiring one line in our projects. It also allows us in the community to contribute extensions to CAP as well. This is the CAP plugin concept and recently I got the opportunity to talk about the CAP plugin concept and learn more about it from one of the enablement team members Daniel Schlachter. It's in a code talk format so you can consume it in video form or in audio form in the code talk podcast. Check it out. The link is in the description.</P><P>[Shrini]<BR />Hello, SAP Builders. We are already in week three of the developer challenge. And this time, we will be diving into the theming capabilities of SAP Build. Our very own developer advocate, Rekha, has prepared an exciting challenge that will walk you through all the different options available in the theme, style, and layout tabs of SAP Build apps. She has also provided step-by-step instructions on how to complete the challenge in a post. Participate in the challenge and share your screenshots, along with the hashed answers in the reply section of this discussion in the SAP Builders group. We are eager to see your responses to this challenge.</P><P>[Nico]<BR />Hi everyone, and welcome to the SAP Developer News. This is just a friendly reminder that FioriConf 2024 happens on April 24th. It's free, live, online only, with a 100% focus on SAP Fiori. The event is organized by SAP community members and is a great fit for everyone working with SAP Fiori, be it developers, consultants, architects, or admins. Make sure to check out the link in the description. And speaking of SAP Fiori, we just added a new topic to the list of available topics for SAP Code Jam events, the SAP Fiori Elements Flexible Programming Model. Make sure to check out the link in the description if you want to host or attend an SAP Code Jam event, and also check out the repository with the content. Hope to see you soon. Bye.</P><P>[Nora]<BR />Many partners and customers always ask me what SAP means by business AI, and what SAP's approach is to business AI, and how SAP can help them transform their businesses and leverage AI for their businesses. If you also have those questions, Then listen up because SAP Learning is hosting a 16-minute solution experience live session on the 30th of April at 1.30 Central European summertime to answer exactly those questions. The session is suitable for all audiences as it is a get started session. And you will not only learn about SAP's latest innovative use cases of AI, but also understand SAP's strategy towards business AI and how your business can benefit from it. The speaker is no other than Dr. Philipp Herzig, our Chief AI Officer, who will also guide you through the 2024 Q1 releases of Business AI and he will share all the know-how with you that you need to stay up to date and to transform your business. So make sure you register with the link below and sign up for the event and don't miss out on all the insights.</P> 2024-04-18T14:16:44.083000+02:00 https://community.sap.com/t5/enterprise-resource-planning-blogs-by-sap/debugging-transaction-md04-in-sap-s-4hana/ba-p/13672215 Debugging transaction MD04 in SAP S/4HANA 2024-04-19T03:03:14.027000+02:00 Caetano https://community.sap.com/t5/user/viewprofilepage/user-id/121014 <P style=" text-align : justify; ">Back in 2014 I wrote the blog&nbsp;<A href="https://community.sap.com/t5/enterprise-resource-planning-blogs-by-sap/how-to-analyze-transaction-md04-in-debug/ba-p/13285380" target="_blank">How to analyze transaction MD04 in debug</A>, which explained how we could analyze the execution of the Stock/Requirements List (transaction MD04) in debug mode, in order to understand which how is selected and resolve common issues that might affect the MRP elements displayed in MD04.&nbsp;</P><P style=" text-align : justify; ">In 2015, however, SAP S/4HANA was introduced and the logic to select the planning elements from the database in the Stock/Requirements List was redesigned for a better performance on the HANA database. While the old blog is still relevant for debugging transaction MD04 in SAP ECC, this new blog explains how to debug MD04 in an SAP S/4HANA system.&nbsp;</P><P style=" text-align : justify; ">We can use debugger to understand, for example, why a certain element exists in the database but it is not displayed in MD04, why an MRP element is not relevant for MRP or why it is displayed with a different quantity.&nbsp;</P><P style=" text-align : justify; ">The starting point to debug MD04 in an SAP S/4HANA system is still function module AUFBAUEN_MDPSX_ANZEIGEN; however, instead of calling different procedures where MRP elements are sequentially selected from the database and processed by an ABAP code, method GET_MAT_WERKS_S4H of class CL_PPH_MDPSX_SELECTION will be called, as shown in the figure below.<BR /><BR /></P><P style=" text-align: center; "><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Caetano_0-1713480552536.png" style="width: 790px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98452i487458A34C957477/image-dimensions/790x770?v=v2" width="790" height="770" role="button" title="Caetano_0-1713480552536.png" alt="Caetano_0-1713480552536.png" /></span><STRONG>Figure 1 - Method GET_MAT_WERKS_S4H&nbsp;being called in MD04<BR /><BR /></STRONG></P><P style=" text-align : justify; ">Inside this method, a HANA stored procedure will be called to read the all the MRP elements from the database at once, taking advantage of HANA internal parallelism. In the following figure we can see the details of the stored procedure that is called, however, we won’t be able to debug the AMDP execution in the ABAP debugger.<BR /><BR /></P><P style=" text-align: center; "><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Caetano_1-1713480552558.png" style="width: 790px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98453i5BC060A3D223CFB9/image-dimensions/790x772?v=v2" width="790" height="772" role="button" title="Caetano_1-1713480552558.png" alt="Caetano_1-1713480552558.png" /></span><STRONG>Figure 2 - HANA procedure where data is read in MD04<BR /><BR /></STRONG></P><P style=" text-align : justify; ">After the execution of the AMDP procedure, system will collect the MRP elements read from the database and build the internal table ET_MDPS_OUT. This internal table will contain all the MRP elements that were selected from the database and that might be relevant to MRP. We can see in the figure below that 17 records were selected from the database.&nbsp;<STRONG>Here is the first point that we can check to determine if a planning element was originally selected from the database or not</STRONG>.<BR /><BR /></P><P style=" text-align: center; "><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Caetano_2-1713480552569.png" style="width: 789px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98451iBE0C93A4889FFD92/image-dimensions/789x450?v=v2" width="789" height="450" role="button" title="Caetano_2-1713480552569.png" alt="Caetano_2-1713480552569.png" /></span><STRONG>Figure 3 - Contents of internal table&nbsp;ET_MDPS_OUT after the data selection<BR /><BR /></STRONG></P><P style=" text-align : justify; ">With the internal table populated with the MRP elements, system will call method FINALIZE_MDPSX_CDS of class CL_PPH_MDPSX_POSTPROCESSING, in order to determine if a planning element should be really displayed in MD04 and determine additional settings. In the following figure we can see the piece of code where system determines whether an MRP element is available for MRP and the firming indicator, for example (note that all comments are in English, so we can easily understand what is happening inside each call).<BR /><BR /></P><P style=" text-align: center; "><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Caetano_3-1713480552583.png" style="width: 790px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98455iE4E704A469CCCB85/image-dimensions/790x725?v=v2" width="790" height="725" role="button" title="Caetano_3-1713480552583.png" alt="Caetano_3-1713480552583.png" /></span><STRONG>Figure 4 - Additional checks after data selection<BR /><BR /></STRONG></P><P style=" text-align : justify; ">After the execution of this method, we will come back to the old function module AUFBAUEN_MDPSX_ANZEIGEN, and the old table MDPSX will be populated with the MRP elements. The following pictures show the contents of internal table MDPSX after the execution of function module AUFBAUEN_MDPSX_ANZEIGEN and the results displayed in transaction MD04, and as we can see in the pictures, both are very similar.&nbsp;<BR /><BR /></P><P style=" text-align: center; "><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Caetano_4-1713480552601.png" style="width: 790px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98456i6352C3529C2B76C2/image-dimensions/790x452?v=v2" width="790" height="452" role="button" title="Caetano_4-1713480552601.png" alt="Caetano_4-1713480552601.png" /></span><STRONG>Figure 5 - Contents of internal table MDPSX</STRONG></P><P style=" text-align : justify; ">&nbsp;</P><P style=" text-align: center; "><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Caetano_5-1713480552614.png" style="width: 791px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98454i6F72C3746D23BCCB/image-dimensions/791x513?v=v2" width="791" height="513" role="button" title="Caetano_5-1713480552614.png" alt="Caetano_5-1713480552614.png" /></span><STRONG>Figure 6 - Results displayed in MD04<BR /><BR /></STRONG></P><P style=" text-align : justify; ">As we mentioned earlier, the logic to select the MRP elements from the database has been completely rewritten and the data selection has been pushed into the HANA layer. It means that old ABAP BAdIs that were previously called when reading the MRP elements from the database will no longer be called. This is the case, for example, of BAdI&nbsp;<STRONG>MD_CHANGE_MRP_DATA</STRONG>, which was commonly used in SAP ECC to manipulate the MRP elements in the Stock/Requirements List. As an alternative, we can use the ABAP BAdI&nbsp;<STRONG>MD_ADD_ELEMENTS</STRONG>, which can be for the same purpose. As of SAP S/4HANA 2022, we can also use the new AMDP BAdI&nbsp;<STRONG>PPH_SUPPLY_DEMAND_LIST</STRONG>, which is also called by MRP Live and the MRP Fiori Apps. This&nbsp;<A href="https://community.sap.com/t5/enterprise-resource-planning-blogs-by-sap/sap-s-4hana-2022-new-badi-to-influence-mrp-elements-in-mrp-live-and-classic/ba-p/13568425" target="_blank">blog</A>&nbsp;provides more details about this BAdI.</P><P style=" text-align : justify; ">Finally, there are situations where we might still want to have the old logic ABAP triggered when troubleshooting an issue. This is the case, for example, if we think that there is a bug in the new logic and we want to compare it with the old one. We can force MD04 to use the old logic by typing HANA_OFF in the command field, and HANA_ON to make sure that the new logic is used. Note that this should only use used for troubleshooting, not as part of the daily usage of MD04.&nbsp;<BR /><BR /></P><P style=" text-align: center; "><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Caetano_6-1713480552616.png" style="width: 790px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98457i09429492540A48D7/image-dimensions/790x537?v=v2" width="790" height="537" role="button" title="Caetano_6-1713480552616.png" alt="Caetano_6-1713480552616.png" /></span><STRONG>Figure 7 - Command HANA_OFF in MD04<BR /><BR /></STRONG></P><P><STRONG><EM>&nbsp;</EM></STRONG>After we finish reading the MRP elements from the database, we continue with the same flow that previously executed in SAP ECC. The following function modules, mentioned in the previous blog, are still relevant in SAP S/4HANA:</P><UL><LI><STRONG>MD_GET_KUND:</STRONG>&nbsp;Read customer information for sales orders;</LI><LI><STRONG>MD_GET_LIEF:</STRONG>&nbsp; Read vendor information;</LI><LI><STRONG>MDEZX_AUFBAUEN:</STRONG>&nbsp;Build the MRP elements texts, as they are displayed on the screen;</LI><LI><STRONG>MDSUX_AUFBAUEN:</STRONG>&nbsp;Build the MD04 period totals;</LI></UL><P><STRONG><EM>Brought to you by the SAP S/4HANA RIG</EM></STRONG></P><P>&nbsp;</P> 2024-04-19T03:03:14.027000+02:00 https://community.sap.com/t5/technology-blogs-by-sap/analyze-expensive-abap-workload-in-the-cloud-with-work-process-sampling/ba-p/13675553 Analyze Expensive ABAP Workload in the Cloud with Work Process Sampling 2024-04-19T15:56:01.041000+02:00 sebastian_kusch https://community.sap.com/t5/user/viewprofilepage/user-id/508815 <P>As an administrator or developer in the ABAP environment in the cloud, you need to keep track of the workload that kept your system busy throughout the day or at specific points in time. You want to check how many of your work processes are or were occupied with what kind of workload, consuming how much ABAP CPU time and main memory. Finally, you want to find out which ABAP coding was responsible for the high consumption of these resources.&nbsp;</P><P>In this blog post, I’d like to show you how you can use the <EM>Sampled Work Process Data</EM> app to analyze concurrent workload and resource consumption and to find the root cause of a performance problem.</P><P>&nbsp;</P><H1 id="toc-hId-863533218"><STRONG>Sampled Work Process Data App vs. Other Tools</STRONG></H1><P>Maybe you are already familiar with the <EM>System Workload</EM> app that provides an overview of the ABAP workload in your system. The following blog post gives you an insight with examples:</P><P><U><A href="https://community.sap.com/t5/technology-blogs-by-sap/analyzing-performance-degradations-in-the-abap-environment-in-the-cloud/ba-p/13557456" target="_blank">Analyzing Performance Degradations in the ABAP Environment in the Cloud</A></U></P><P>The ABAP system provides two data capturing mechanisms for the ABAP workload: ABAP statistics records and ABAP work process samples. The different strategies for data collection and timing aspects are explained in the following documentation on SAP Help Portal:</P><P><A href="https://help.sap.com/docs/btp/technical-monitoring-cockpit-cloud-version/monitoring-system-workload-data-provisioning" target="_blank" rel="noopener noreferrer">Monitoring the System Workload: Data Collection and Focus of Available Apps | SAP Help Portal</A></P><P>Both data capturing strategies are designed to cover different scenarios. You can read more about the supported monitoring use cases in the following documentation on SAP Help Portal:</P><P><A href="https://help.sap.com/docs/btp/technical-monitoring-cockpit-cloud-version/monitoring-system-workload-apps-and-their-use-cases" target="_blank" rel="noopener noreferrer">Monitoring the System Workload: Apps and Their Use Cases | SAP Help Portal</A></P><P>The ABAP statistics data of the <EM>System Workload</EM> app is persisted after the respective processing step has finished. In addition, the data on CPU time and main memory consumption is only available for the entire processing step, so you can’t determine if any interesting "hotspot" is hiding somewhere in the ABAP coding, let alone where they’re precisely located in the code.</P><P><SPAN>You might also have heard about - or already used - the ABAP Profiler, which creates ABAP traces that provide detailed insights into your program, its resource consumption and potential "hotspots" in your coding. However, using the ABAP Profiler requires you to explicitly activate it before running any specific program or application. This means that retrospective analysis is not possible. Furthermore, the results are usually limited to your application only, or at best a subset of the workload in the system. Other software running concurrently, which may cause resource bottlenecks, is not considered.</SPAN><SPAN>&nbsp;</SPAN>For more information about the ABAP Profiler, please refer to the following documentation on SAP Help Portal:</P><P><A href="https://help.sap.com/docs/abap-cloud/abap-development-tools-user-guide/profiling-abap-code?version=sap_btp" target="_blank" rel="noopener noreferrer">Profiling ABAP Code | SAP Help Portal</A></P><P>If you want to detect a large resource consumption immediately <SPAN>&nbsp;</SPAN>or detect the responsible code location without activating any tracing, you’d rather use the <EM>Sampled Work Process Data</EM> app.</P><P>&nbsp;</P><H1 id="toc-hId-667019713"><STRONG>Get an Overview of the ABAP CPU Time Consumption</STRONG></H1><P><STRONG>&nbsp;</STRONG>On the SAP Fiori launchpad of the ABAP environment in SAP BTP, I went to the <EM>Technical Monitoring</EM> area and chose the <EM>Sampled Work Process Data</EM> app. This app is available for administrator and developer roles.<SPAN>&nbsp;</SPAN></P><P>On the entry screen of the app, I get an overview of the ABAP CPU time consumption for the last 24 hours with a resolution of ten minutes. I can easily adjust the time range and the resolution using the time slider at the top.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Time Slider" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98593i61C63D21ECC77A2F/image-size/large?v=v2&amp;px=999" role="button" title="2024-03-04_15-22-58.jpg" alt="Time Slider" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Time Slider</span></span></P><P>I can even change to a granularity of single seconds. Of course, this only makes sense for a total time range of much less than 24 hours, such as 1 minute, for instance.</P><P>In the upper part of the screen, there’s a graphical overview drilled down by the <EM>Request Entry Type</EM> (for example, <EM>OData v4</EM> or <EM>SQL Service</EM>). In the lower part of the screen, there’s a table that lists the top 10 consumers with more detailed characteristics, such as the <EM>Request Entry Name</EM>. Additionally, there’s a metric that indicates the overall ABAP CPU utilization as a percentage over time. This is represented by the black line in the screenshot below, with a scale located on the right side.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="ABAP CPU Time Overview" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98611i3BC376181C22D131/image-size/large?v=v2&amp;px=999" role="button" title="2024-04-19_09-48-26.jpg" alt="ABAP CPU Time Overview" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">ABAP CPU Time Overview</span></span></P><H1 id="toc-hId-470506208"><STRONG>A</STRONG><STRONG>nalyze Concurrent Workload and Resource Consumption</STRONG></H1><P><SPAN>The entry screen provides four different metrics to depict resource consumption. These metrics include ABAP CPU time, main memory, and dialog and background work process utilization. Speaking of filters, you can use the filters for </SPAN><EM>Transaction Code</EM><SPAN>, </SPAN><EM>Request Entry Type</EM><SPAN>, </SPAN><EM>Request Entry Name</EM><SPAN>, </SPAN><EM>Tenant ID</EM><SPAN> and </SPAN><EM>WM Process Class ID</EM><SPAN> to focus on what you are really interested in:</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Filter and Drilldown" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98618i696D8341DB1B6AA7/image-size/large?v=v2&amp;px=999" role="button" title="2024-04-19_09-53-03.jpg" alt="Filter and Drilldown" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Filter and Drilldown</span></span></P><P>Filter values can be precise values or wildcards.</P><P>When it comes to drilldown, you might be interested in drilling down according to other characteristics or a more fine-grained resolution of the depicted workload. On the upper right, you can define the set of characteristics that the drilldown is based on:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Adjusting the Drilldown" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98620i8BD9CE528E8DDE15/image-size/large?v=v2&amp;px=999" role="button" title="2024-04-19_09-54-49.jpg" alt="Adjusting the Drilldown" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Adjusting the Drilldown</span></span></P><P>By default, this is only the <EM>Request Entry Type</EM>. However, you can also select the <EM>Transaction Code</EM>, <EM>Request Entry Name</EM>, <EM>Tenant ID</EM> and <EM>WM Process Class ID</EM>, either individually or in any combination that is appropriate for your specific use case. This allows you to investigate concurrent resource consumption in different dimensions. In the chart below, the top values of your drilldown characteristics (in this case, just the <EM>Request Entry Name</EM>) are displayed accordingly:</P><P>&nbsp;</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="ABAP CPU Time Drilled Down by the Request Entry Name" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98621i07BE60C68C283905/image-size/large?v=v2&amp;px=999" role="button" title="2024-04-19_09-56-04.jpg" alt="ABAP CPU Time Drilled Down by the Request Entry Name" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">ABAP CPU Time Drilled Down by the Request Entry Name</span></span></P><P>In the chart, you can clearly identify which types of workloads are competing <STRONG>concurrently</STRONG> for resources within the same 10 minutes interval. By adjusting the time slider, you can also choose much finer granularities.</P><P><STRONG>Note: </STRONG>Please be aware that the work process sampling is, as the name suggests, based on samples (snapshots) of the work process data provided by the ABAP kernel that are taken once per second. The ABAP CPU time consumption is then calculated as the delta between consecutive samples. This means that only expensive workloads running for more than a second are displayed as relevant ABAP CPU time consumers.</P><P>&nbsp;</P><H1 id="toc-hId-273992703"><STRONG>Reveal the Root Cause of Performance Problems</STRONG></H1><P>Now let’s assume that we don’t have a uniform distribution of the workload as in the example above. Instead, one of the <EM>Request Entry Name</EM> values is popping up again and again, for example, around 09:30 a.m.:&nbsp;</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="ABAP CPU Time with an Expensive Workload" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98622i672C9EB82D7CCC09/image-size/large?v=v2&amp;px=999" role="button" title="2024-04-12_11-35-57.jpg" alt="ABAP CPU Time with an Expensive Workload" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">ABAP CPU Time with an Expensive Workload</span></span></P><P>I click on the bar in the chart as shown in the above screenshot (which filters for the respective <EM>Request Entry Name</EM> <STRONG>and</STRONG> time interval) and then on the <EM>Details</EM> arrow on the right of a table row. This takes me to the <EM>Request Entry Point</EM> screen for the ABAP CPU time. (If I had switched to the <EM>Main Memory</EM> or another aspect before, I would arrive at a corresponding detail view for that metric, of course.) Since I have also selected a specific time interval, I get a zoomed-in view with a resolution of single seconds, here for the time range between 09:20 and 09:30:</P><P>&nbsp;</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Request Entry Point Screen with a Resolution of Single Seconds" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98623i70240CC009284DA8/image-size/large?v=v2&amp;px=999" role="button" title="2024-04-12_09-45-22.jpg" alt="Request Entry Point Screen with a Resolution of Single Seconds" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Request Entry Point Screen with a Resolution of Single Seconds</span></span></P><P>This screens also offers a graphical overview over time, along with further details in the table. However, the drilldown characteristic in the chart is the <EM>Current Program Name</EM>, that is the name of the coding artifact (typically a class name) that was being executed when the sample was created. This chart may already give you a pretty good understanding of which parts of your application (on a technical level in terms of ABAP coding that is run) are expensive and where you may find optimization potential (as shown in the screenshot below). Clicking on the legend or directly on the chart filters the table data accordingly. You can zoom in and zoom out, as on the previous screens. The lower part of the screen shows a list of single work process samples, which include detailed characteristics and metrics describing the work process at specific points in time.</P><P>In this case, we can recognize two executions of the same workload that were both running for two and a half minutes. During the execution, the CPU time consumption per second was often close to 1000 milliseconds.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="“Most Prominent” Current Program Name in Our Example" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98624iDB3F06E1F8C3F6CE/image-size/large?v=v2&amp;px=999" role="button" title="2024-04-12_09-45-22-2.jpg" alt="“Most Prominent” Current Program Name in Our Example" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">“Most Prominent” Current Program Name in Our Example</span></span></P><P>Now I click on the <EM>Details</EM> arrow at the end of a row in the table, which leads me to the <EM>Single Work Process Sample</EM> object page with even more details:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Characteristics on the Object Page" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98625i9C9A33284381D424/image-size/large?v=v2&amp;px=999" role="button" title="2024-04-12_09-51-35.jpg" alt="Characteristics on the Object Page" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Characteristics on the Object Page</span></span></P><P>For a database-intensive scenario, you have the option to navigate further to the ABAP statistics record using the link on the upper right of the screen. On the <EM>ABAP Statistics Record</EM> screen, you can find – among other things – detailed data about the HANA processing time and the single expensive SQL statements, as explained in the blog post about the <EM>System Workload</EM> app mentioned at the beginning of this blog post.</P><P>Now let’s go back to the <EM>Single Work Process Sample</EM> object page. Here, I can also switch to the <EM>Work Process: Metrics</EM> tab page of the object page to learn, for instance, about the number of table entries transferred between the application server and the database within the last second before this sample was taken:</P><P>&nbsp;</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Metrics on the Object Page" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98626i6F6A04893453B078/image-size/large?v=v2&amp;px=999" role="button" title="2024-04-12_09-53-09.jpg" alt="Metrics on the Object Page" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Metrics on the Object Page</span></span></P><P>In this ABAP CPU-intensive scenario<SPAN>&nbsp;</SPAN>, work process sampling can help directly identify whether there’s room for improvement. You can recognize that your application is CPU-intensive if many single samples have a CPU time consumption that’s not too far from 1 second, as is the case here.</P><P>Typical defects include expensive operations on large internal tables. On the <EM>ABAP Stack Trace</EM> tab page of the object page, I can check whether this is the reason for poor performance:</P><P>&nbsp;</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="ABAP Stack Trace on the Object Page" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98627iFCE8626D00B26DB3/image-size/large?v=v2&amp;px=999" role="button" title="2024-04-12_09-54-02.jpg" alt="ABAP Stack Trace on the Object Page" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">ABAP Stack Trace on the Object Page</span></span></P><P>By navigating from here to ABAP development tools for Eclipse (ADT) or an HTML viewer (by clicking on the <EM>Details</EM> arrow next to a line in the table), I can easily jump to the respective code where, in our simple example, a LOOP statement is executed on an internal table.</P><P><STRONG>Note</STRONG>: In the case of single expensive statements (typically a READ TABLE or a LOOP statement, as in our example here, or a long-running Open SQL statement), the ABAP kernel – when regaining control and returning a stack trace –usually points to the <STRONG>next</STRONG> statement (the one directly following the really expensive one). Thus, we shouldn’t be concerned about the IF statement, but rather the LOOP statement.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="ABAP Code Behind the Performance Glitch" style="width: 661px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98628iD530ED1AAA016741/image-size/large?v=v2&amp;px=999" role="button" title="2024-04-12_09-56-41.jpg" alt="ABAP Code Behind the Performance Glitch" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">ABAP Code Behind the Performance Glitch</span></span></P><H1 id="toc-hId-77479198"><STRONG>Verify the Impact of Performance Improvements</STRONG></H1><P>In this simple example, the performance of the statement can be significantly improved by introducing a secondary key. In addition, we slightly adjust the LOOP statement by referring to the secondary key:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Enhancement of the Static Attribute ST_PIERS" style="width: 532px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98629iAA0A542B27049E8D/image-size/large?v=v2&amp;px=999" role="button" title="2024-04-12_10-25-55.jpg" alt="Enhancement of the Static Attribute ST_PIERS" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Enhancement of the Static Attribute ST_PIERS</span></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Loop Statement Using the Secondary Key" style="width: 421px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98630i10F6857C0301CD62/image-size/large?v=v2&amp;px=999" role="button" title="2024-04-12_11-26-52.jpg" alt="Loop Statement Using the Secondary Key" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Loop Statement Using the Secondary Key</span></span></P><P>We can assess the impact of this tiny change by inspecting the time interval from 10:00 to 10:10 a.m., during which the same workload was run again. This can be done on both the <EM>Sampled Work Process Data</EM> entry screen ...</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Sampled Work Process Data Screen After Fixing the Issue" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98631iAA7E91B2DAD2FE79/image-size/large?v=v2&amp;px=999" role="button" title="2024-04-12_19-20-29.jpg" alt="Sampled Work Process Data Screen After Fixing the Issue" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Sampled Work Process Data Screen After Fixing the Issue</span></span></P><P>...and the <EM>Request Entry Point</EM> screen by selecting the respective time interval.&nbsp;</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Request Entry Point Screen After Fixing the Issue" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98632i0FA78025CBEF453C/image-size/large?v=v2&amp;px=999" role="button" title="2024-04-12_10-24-24.jpg" alt="Request Entry Point Screen After Fixing the Issue" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Request Entry Point Screen After Fixing the Issue</span></span></P><P>We can clearly recognize that now two executions of the same workload finish within seconds and that the FIND_RELATION_DATA method does not even show up in any of the collected work process samples anymore. Here are both versions of the workload in direct comparison on the <EM>Request Entry Point</EM> screen:</P><P><STRONG><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Non-Optimized and Optimized Workload on the Request Entry Point Screen" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98634i23CFD8A5D605C9AF/image-size/large?v=v2&amp;px=999" role="button" title="2024-04-12_19-52-14.jpg" alt="Non-Optimized and Optimized Workload on the Request Entry Point Screen" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Non-Optimized and Optimized Workload on the Request Entry Point Screen</span></span></STRONG></P><H1 id="toc-hId--119034307"><STRONG>Conclusion</STRONG></H1><P>The <EM>Sampled Work Process Data</EM> app in the <EM>Technical Monitoring</EM> area of the SAP Fiori launchpad in an ABAP environment in the cloud gives you a lot of insights into concurrent workload in your system and lets you glance under the hood of ABAP CPU or memory intensive applications. It bridges the gap between apps based on ABAP statistics records and tracing tools like the ABAP Profiler.</P><P>I’d like to thank everyone who contributed to this blogpost, especially my colleagues anke.griesbaum, christian.cop, steffen.siegmund, ingrid.mautes, karen.kuck and sabine.reich.</P><P>For more information, refer to the following documentation on SAP Help Portal:</P><P><A href="https://help.sap.com/docs/btp/technical-monitoring-cockpit-cloud-version/sampled-work-process-data" target="_blank" rel="noopener noreferrer">Sampled Work Process Data | SAP Help Portal</A></P><P>&nbsp;</P><P>&nbsp;</P><P>&nbsp;</P><P>&nbsp;</P><P>&nbsp;</P><P>&nbsp;</P><P>&nbsp;</P><P>&nbsp;</P> 2024-04-19T15:56:01.041000+02:00 https://community.sap.com/t5/application-development-blog-posts/new-way-to-maintain-settings-in-abap/ba-p/13675087 New way to maintain settings in ABAP 2024-04-19T15:56:43.813000+02:00 antonsikidin https://community.sap.com/t5/user/viewprofilepage/user-id/675659 <P>source code <A href="https://github.com/AntonSikidin/global_settings" target="_blank" rel="noopener nofollow noreferrer">https://github.com/AntonSikidin/global_settings</A></P><P>Time-to-time constants appear in your code. Some time constants are less constant. They have different types for example date of feature start, rfc_dest to other system, and number of parallel tasks.</P><P>To maintain settings you have to create a table of 1 row or class for constant. Both this way has different costs to create settings, add settings, and change settings. Less is better.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img_01.png" style="width: 930px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98346i1C53F5DBBA50116D/image-size/large?v=v2&amp;px=999" role="button" title="img_01.png" alt="img_01.png" /></span></P><P>And you have tens of tables of 1 row that replicate each other.</P><P>I have a solution that has the best part of both ways to maintain settings. Easy to create, easy to add, and easy to maintain. As a bonus, you can have documentation for settings like flag_25 type xfeld.</P><P>We can hold</P><UL><LI>single value</LI><LI>single structure</LI><LI>table of value</LI><LI>table of struct</LI></UL><P>to hold this different variable in one table I serialized them in JSON and saved them in the table of text255</P><P>to read settings:</P><UL><LI>select data</LI><LI>join string</LI><LI>deserialize</LI></UL><H1 id="toc-hId-863528510">After installation navigate to screen #2</H1><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img_02.png" style="width: 672px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98349iBD2EBF47E4774C9E/image-size/large?v=v2&amp;px=999" role="button" title="img_02.png" alt="img_02.png" /></span></P><P>We need to adjust something</P><P>Make layout bigger</P><P>from</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img_03.png" style="width: 668px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98351i75F03E278B11BCCF/image-size/large?v=v2&amp;px=999" role="button" title="img_03.png" alt="img_03.png" /></span></P><P>to<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img_04.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98352i89C900243801D185/image-size/large?v=v2&amp;px=999" role="button" title="img_04.png" alt="img_04.png" /></span></P><P>Change field size: Double click</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img_05.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98353i1BDF00CDAB1EEBAA/image-size/large?v=v2&amp;px=999" role="button" title="img_05.png" alt="img_05.png" /></span></P><P>Visible length 50</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img_06.png" style="width: 252px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98355i9F565D56343CD835/image-size/large?v=v2&amp;px=999" role="button" title="img_06.png" alt="img_06.png" /></span></P><P>Double click</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img_07.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98357i867312984A51947F/image-size/large?v=v2&amp;px=999" role="button" title="img_07.png" alt="img_07.png" /></span></P><P>Visible length 15</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img_09.png" style="width: 251px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98358i8E69D29BB5ACC7E4/image-size/large?v=v2&amp;px=999" role="button" title="img_09.png" alt="img_09.png" /></span></P><P>Double click</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img_10.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98359i78171DE90CD0CB5B/image-size/large?v=v2&amp;px=999" role="button" title="img_10.png" alt="img_10.png" /></span></P><P>Text “Is Table?”</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img_11.png" style="width: 242px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98360i2C052A0400AB74CF/image-size/large?v=v2&amp;px=999" role="button" title="img_11.png" alt="img_11.png" /></span></P><P>Activate!</P><P>To describe your settings go to <STRONG>ZTR_GS_CONFIG</STRONG> (Global Settings Configuration).</P><P>First level – project name</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img_12.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98361iF8ADAE072BBB3B34/image-size/large?v=v2&amp;px=999" role="button" title="img_12.png" alt="img_12.png" /></span></P><P>Second-level variables of this project</P><OL><LI>Name of variable/structure/table</LI><LI>Short description</LI><LI>Abap type. For data elements, this element must be used in a table or structure</LI><LI>Sign that it is a table. You can’t use table type</LI></OL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img_13.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98363i532306C4423769DF/image-size/large?v=v2&amp;px=999" role="button" title="img_13.png" alt="img_13.png" /></span></P><P>The third level is a long description of what these settings are for, how they change program flow, and what possible value can hold</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img_14.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98364i1C38A1052E6FA059/image-size/large?v=v2&amp;px=999" role="button" title="img_14.png" alt="img_14.png" /></span></P><P>Changes save in transport requests.</P><P>To edit the value of settings go to <STRONG>ZTR_GS_EDITOR</STRONG> in each system( development, quality, production )</P><P>Enter the project name or search.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img_15.png" style="width: 768px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98365i8C204067A3DB68F9/image-size/large?v=v2&amp;px=999" role="button" title="img_15.png" alt="img_15.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img_16.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98367i822F47712106EA60/image-size/large?v=v2&amp;px=999" role="button" title="img_16.png" alt="img_16.png" /></span></P><P>In the variable block list all settings of this project. You can view or change by clicking on the var name.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img_17.png" style="width: 390px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98368i7E8F5F47BB411252/image-size/large?v=v2&amp;px=999" role="button" title="img_17.png" alt="img_17.png" /></span></P><P>Long description in Description block.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img_18.png" style="width: 802px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98369iA816072645497071/image-size/large?v=v2&amp;px=999" role="button" title="img_18.png" alt="img_18.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img_19.png" style="width: 42px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98370i9468688FAD016025/image-size/large?v=v2&amp;px=999" role="button" title="img_19.png" alt="img_19.png" /></span>&nbsp;to view history.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img_20.png" style="width: 678px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98371i86CB5F69751D4C38/image-size/large?v=v2&amp;px=999" role="button" title="img_20.png" alt="img_20.png" /></span></P><P>use&nbsp; <span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img_21.png" style="width: 168px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98393i51C7B9B4B2B33AA2/image-size/large?v=v2&amp;px=999" role="button" title="img_21.png" alt="img_21.png" /></span> for navigation.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img_22.png" style="width: 576px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98373i55825CE7BB9CDF6E/image-size/large?v=v2&amp;px=999" role="button" title="img_22.png" alt="img_22.png" /></span></P><P>You can easily work with these settings in the program.</P><P>&nbsp;</P><P>&nbsp;</P><P>&nbsp;</P><pre class="lia-code-sample language-abap"><code>REPORT Z_TEST_NEW_SETTINGS. DATA : lr_gs TYPE REF TO zcl_gs " settings object * variable to hold settings data , lv_data TYPE datum , lv_struct TYPE SCARR , lt_table_of_date TYPE TABLE OF datum , lt_table_of_struct TYPE TABLE OF SCARR . START-OF-SELECTION. *create object lr_gs = NEW zcl_gs( 'FIRST_PROJECT' ). *read settings lr_gs-&gt;get_object( EXPORTING iv_var_name = 'DATE' IMPORTING ev_data = lv_data ). lr_gs-&gt;get_object( EXPORTING iv_var_name = 'STRUCT' IMPORTING ev_data = lv_struct ). lr_gs-&gt;get_object( EXPORTING iv_var_name = 'TABLE_OF_DATE' IMPORTING ev_data = lt_table_of_date ). lr_gs-&gt;get_object( EXPORTING iv_var_name = 'TABLE_OF_STRUCT' IMPORTING ev_data = lt_table_of_struct ). *display cl_demo_output=&gt;write( lv_data ). cl_demo_output=&gt;write( lv_struct ). cl_demo_output=&gt;write( lt_table_of_date ). cl_demo_output=&gt;write( lt_table_of_struct ). cl_demo_output=&gt;display( ).</code></pre><P>&nbsp;</P><P>&nbsp;</P><P>&nbsp;</P><P>&nbsp;<span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img_23.png" style="width: 556px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98375iD13C01827AEE1145/image-size/large?v=v2&amp;px=999" role="button" title="img_23.png" alt="img_23.png" /></span></P><P>You cannot use a structure or table with includes with suffixes like this</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img_24.png" style="width: 921px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98377iEA28AEEA4CFE5855/image-size/large?v=v2&amp;px=999" role="button" title="img_24.png" alt="img_24.png" /></span></P> 2024-04-19T15:56:43.813000+02:00 https://community.sap.com/t5/technology-blogs-by-sap/abap-cloud-developer-trial-2022-available-now/ba-p/13598069 ABAP Cloud Developer Trial 2022 Available Now 2024-04-19T18:52:59.860000+02:00 julieplummer20 https://community.sap.com/t5/user/viewprofilepage/user-id/2108 <P>Dear all,</P><P>ABAP Cloud Developer Trial 2022 is now available on Docker:</P><P><A href="https://hub.docker.com/r/sapse/abap-cloud-developer-trial" target="_blank" rel="noopener nofollow noreferrer">https://hub.docker.com/r/sapse/abap-cloud-developer-trial/tags</A> -&gt; <STRONG>2022</STRONG></P><P><STRONG>ABAP Cloud Developer Trial</STRONG> is a free, downloadable ABAP Platform on SAP HANA 2.0 for trying out the ABAP language and toolset. It is extensively pre-configured with SAP Fiori launchpad, SAP Cloud Connector, pre-configured backend /frontend connections, roles, and sample applications.</P><P>This solution is intended for two groups of developers:</P><UL><LI><STRONG>Non-ABAP developers</STRONG>, who are interested in learning more about the ABAP language and development tools</LI><LI><STRONG>ABAP developers</STRONG><SPAN>, who are interested in learning about new features (see below for some examples)</SPAN></LI></UL><P>Note: This is the new name for ABAP Platform Trial. The name change is to highlight that you can now develop in the new ABAP Language Version, ABAP for Cloud Development. For more information, see&nbsp;the&nbsp;Highlights below. By the way, if you are interested in our overall release strategy for the Trial, see&nbsp;<SPAN><A href="https://community.sap.com/t5/user/viewprofilepage/user-id/533" target="_blank">Karl Kessler</A></SPAN>’s announcement blog post from 2023:&nbsp;<SPAN><A href="https://blogs.sap.com/2023/07/31/now-available-abap-platform-trial/" target="_blank" rel="noopener noreferrer">Now available: ABAP Platform Trial</A></SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="julieplummer20_0-1707312743960.png" style="width: 560px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/62097i148B58C23BE2BCC0/image-dimensions/560x245?v=v2" width="560" height="245" role="button" title="julieplummer20_0-1707312743960.png" alt="julieplummer20_0-1707312743960.png" /></span></P><P><STRONG>IMPORTANT: </STRONG></P><P><STRONG>All: Before you pull the image, make sure:</STRONG></P><UL><LI>You understand the principles of docker container technology</LI><LI>You know the entities docker image / docker container and their relationship</LI><LI>You know the basic commands to work with images and containers</LI></UL><P><STRONG>Mac Users:&nbsp;</STRONG>Previously, ABAP Platform Trial ran on both Intel and M-series processors. Since then, Apple has upgraded its iOS. Thus, on the newest MacOS version, you can no longer run ABAP Cloud Developer Trial on Docker Desktop for MacBooks with an M-seríes processor. This is not a SAP-specific issue.&nbsp;So for now, you have two options:</P><UL><LI>Run Docker Desktop with a MacBook that has an Intel processor.</LI><LI>Use the UTM app to emulate an AMD64 Linux distro via Apple QEMU.</LI></UL><P>Many many thanks to Community member&nbsp;<a href="https://community.sap.com/t5/user/viewprofilepage/user-id/197587">@dylan-drummond</a>&nbsp;for researching this. Dylan has written an exhaustive guide to this:&nbsp;</P><P><A title="M-series Apple Chip MacBooks and Abap Platform Trial containers using Docker and Podman" href="https://community.sap.com/t5/technology-blogs-by-members/m-series-apple-chip-macbooks-and-abap-platform-trial-containers-using/ba-p/13593215" target="_blank">M-series Apple Chip MacBooks and Abap Platform Trial containers using Docker and Podman</A>&nbsp;</P><P>This is Community content, so consume at your own risk; however, this could be very helpful to many Mac users.</P><H1 id="toc-hId-836835714"><SPAN>ABAP License</SPAN></H1><P>The ABAP license supplied with the Docker image lasts only three months.&nbsp;Therefore, you should download and import the demo license as follows:</P><OL><LI>Logon to your ABAP system with the user SAP*, client 000, same password as for DEVELOPER (DEVELOPER , client 001, is locked).</LI><LI>Start transaction SLICENSE; copy the hardware key.</LI><LI>Get the license from&nbsp;<A href="https://go.support.sap.com/minisap/#/minisap" target="_blank" rel="noopener noreferrer">minisap</A>&nbsp;, choosing the system A4H.</LI><LI>Back in your ABAP System, log off, then log on with the user DEVELOPER, client 001.</LI><LI>Choose&nbsp;<STRONG>Install</STRONG>.</LI><LI>The old ("INITIAL") license(s) should be deleted automatically. If not, start SLICENSE again; remove the old invalid licenses. (sap* is not allowed to delete licenses).</LI></OL><H1 id="toc-hId-640322209"><SPAN>Update, 23rd April, 2024: 2022 as a Cloud Appliance (CAL)</SPAN></H1><P><SPAN>Dear all, As an alternative to the Docker download, we have also released the same version of the Trial, under the name&nbsp;<STRONG>SAP ABAP Platform 2022, Developer Edition:</STRONG></SPAN></P><P><A title="SAP ABAP Platform 2022, Developer Edition" href="https://cal.sap.com/catalog#/applianceTemplates/c12a3b3d-99b0-4b44-a0c7-6509fe279a3d" target="_blank" rel="noopener noreferrer">https://cal.sap.com/catalog#/applianceTemplates/c12a3b3d-99b0-4b44-a0c7-6509fe279a3d</A>&nbsp;</P><P>Enjoy!</P><H1 id="toc-hId-443808704"><SPAN>Highlights of the 2022 Edition</SPAN></H1><H2 id="toc-hId-376377918">ABAP Cloud Development: Developer Extensibility Scenario</H2><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="julieplummer20_0-1713188198928.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/96667iAC6067A63A2A3BA6/image-size/medium?v=v2&amp;px=400" role="button" title="julieplummer20_0-1713188198928.png" alt="julieplummer20_0-1713188198928.png" /></span>&nbsp;&nbsp;</P><P><EM><SPAN>ABAP Cloud map</SPAN></EM></P><P><STRONG>ABAP Cloud&nbsp;</STRONG>is&nbsp;<EM>t</EM>he ABAP development model you need to build cloud-ready business apps, services, and extensions. Including it in the ABAP Cloud Developer Trial means that you can get a feel for the concepts pertaining to ABAP Cloud Development and to a clean core when extending SAP S/4HANA. This scenario lets you build extensions <STRONG>directly</STRONG> on the SAP S/4HANA stack - <SPAN>tightly coupled, cloud-ready, and upgrade-stable. Of course, we don't offer the strictly business content from SAP S/4HANA. However, we do offer all the language elements - RAP cloud-optimized language, and released APIs and extension points.&nbsp;</SPAN></P><P><SPAN>Important: You are thereby restricted to &nbsp;cloud-optimized ABAP language. That is, i</SPAN><SPAN>f you are used to developing in Classic ABAP on-premise, and want to try out Cloud development, you must comply with ABAP Cloud Development rules, such as:</SPAN></P><UL><LI>Use public SAP APIs (local or remote) released by SAP to access SAP functionality and SAP data</LI><LI>Use public SAP extension points released by SAP to extend SAP objects. Modifications to SAP objects are not supported. (This includes SFLIGHT, for example.)</LI><LI>Use ADT (ABAP Development Tools) as your ABAP IDE</LI><LI>Use RAP (ABAP RESTful Application Programming Model) to build Fiori apps and services. SAP technologies like Dynpro or Web Dynpro are not released for ABAP cloud development</LI><LI><SPAN>The software components ZLOCAL and ZCUSTOM_DEVELOPMENT can only be used for ABAP Cloud development - that is, compliant with these rules</SPAN></LI></UL><P><SPAN>More information:</SPAN></P><UL><LI><SPAN><A href="https://community.sap.com/t5/enterprise-resource-planning-blogs-by-sap/abap-cloud/ba-p/13557273" target="_self">ABAP Cloud - What is it?</A> .. by <A href="https://community.sap.com/t5/user/viewprofilepage/user-id/189264" target="_self">Boris Gebhardt</A></SPAN></LI><LI><SPAN><A href="https://pages.community.sap.com/topics/abap" target="_blank" rel="noopener noreferrer">ABAP Development | SAP Community</A></SPAN></LI><LI><SPAN><A href="https://community.sap.com/t5/enterprise-resource-planning-blogs-by-sap/new-extensibility-guide-for-s-4hana-is-available/ba-p/13554615" target="_blank">New Extensibility Guide for S/4HANA is available</A></SPAN>, by <SPAN><A href="https://community.sap.com/t5/user/viewprofilepage/user-id/139277" target="_blank">Thomas Schneider</A></SPAN></LI><LI><SPAN><A class="" href="https://community.sap.com/t5/technology-blogs-by-sap/c0-developer-extensibility-for-cds-data-models/ba-p/13546971" target="_self">Developer Extensibility for CDS Data Models (C0 Release Contract)</A></SPAN></LI></UL><H2 id="toc-hId-179864413"><SPAN>ABAP RESTful Application Programming Model (RAP) - 2022</SPAN></H2><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="julieplummer20_2-1707312818813.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/62100i8DACC0C46ADC0D82/image-size/medium?v=v2&amp;px=400" role="button" title="julieplummer20_2-1707312818813.png" alt="julieplummer20_2-1707312818813.png" /></span></P><P>Offers you an efficient way to build enterprise-ready, SAP HANA-optimized, OData-based Fiori UI services and Web APIs in the cloud as well as on-premise.</P><P>New features in 2022 include:</P><UL><LI>Custom business objects</LI><LI><SPAN>Event Consumption and Exposure </SPAN></LI><LI>RAP Generator</LI><LI>RAP business object Test Double Framework (TDF)</LI></UL><P><SPAN>To make it easier for you to get started, we have also added:</SPAN></P><UL><LI><SPAN>The demo and training data model, the&nbsp;</SPAN><A href="https://help.sap.com/docs/ABAP_PLATFORM_NEW/fc4c71aa50014fd1b43721701471913d/def316685ad14033b051fc4b88db07c8.html?locale=en-US&amp;version=202210.latest" target="_blank" rel="noopener noreferrer">ABAP Flight Reference Scenario</A>&nbsp;(or directly:&nbsp;<A href="https://github.com/SAP-samples/abap-platform-refscen-flight/tree/ABAP-platform-2022" target="_self" rel="nofollow noopener noreferrer">ABAP Flight Reference Scenario 2022 on github</A>)</LI><LI>The <A href="https://github.com/SAP-samples/abap-platform-fiori-feature-showcase?tab=readme-ov-file" target="_self" rel="nofollow noopener noreferrer">SAP Fiori Element Feature Showcase App for RAP</A></LI></UL><P>More information:&nbsp;</P><UL><LI><SPAN><A href="https://blogs.sap.com/2019/10/25/getting-started-with-the-abap-restful-programming-model/" target="_blank" rel="noopener noreferrer">Getting Started with the ABAP RESTful Application Programming Model (RAP)</A></SPAN>, by&nbsp;<SPAN><A href="https://community.sap.com/t5/user/viewprofilepage/user-id/1462" target="_blank">Carine Tchoutouo Djomo</A></SPAN>.</LI><LI>The<SPAN>&nbsp;</SPAN><A href="https://help.sap.com/viewer/fc4c71aa50014fd1b43721701471913d/201909.002/en-US/289477a81eec4d4e84c0302fb6835035.html" target="_blank" rel="noopener noreferrer">SAP Help Portal: ABAP RESTful&nbsp; Application Programming Model</A></LI></UL><H2 id="toc-hId--16649092">&nbsp;</H2><H2 id="toc-hId--213162597">Git-Enabled Change and Transport System (gCTS)</H2><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Snag_c56468.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/102333i1DBE682281D4952B/image-size/medium?v=v2&amp;px=400" role="button" title="Snag_c56468.png" alt="Snag_c56468.png" /></span></P><P><EM>gCTS = CTS + git</EM><BR /><BR /><SPAN>A new way of transporting objects, gCTS enables you to use Git to store your ABAP development objects. gCTS makes use of special Git features, such as working on local copies of a central remote Git repository. Software development takes place in the usual editors like ABAP Development Tools (ADT). Changes to objects are still recorded in transport requests. Current states of objects can be pushed to remote Git repositories, either by releasing a transport request or while you’re working.</SPAN><BR /><SPAN>For the official documentation overview, see:&nbsp;</SPAN></P><P><A href="https://help.sap.com/docs/ABAP_PLATFORM_NEW/4a368c163b08418890a406d413933ba7/f319b168e87e42149e25e13c08d002b9.html?version=202210.latest" target="_blank" rel="noopener noreferrer">Git-Enabled Change and Transport System (BC-CTS-GIT) | SAP Help Portal</A></P><P><SPAN>The official documentation for configuration is in two parts:</SPAN></P><OL class="lia-list-style-type-upper-alpha"><LI><SPAN><A href="https://help.sap.com/docs/ABAP_PLATFORM_NEW/4a368c163b08418890a406d413933ba7/26c9c6c5a89244cb9506c253d36c3fda.html?version=202210.latest" target="_self" rel="noopener noreferrer">Configuring Git-Enabled Change and Transport System</A></SPAN><SPAN><BR />Here, we have preconfigured the first two parts, so you only have to complete parts 3-5:&nbsp;&nbsp;</SPAN><SPAN><SPAN>&nbsp;</SPAN></SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="julieplummer20_0-1714132333934.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/102335i76EF49B9BE9CBFA6/image-size/medium?v=v2&amp;px=400" role="button" title="julieplummer20_0-1714132333934.png" alt="julieplummer20_0-1714132333934.png" /></span></LI><LI><SPAN><A href="https://help.sap.com/docs/ABAP_PLATFORM_NEW/4a368c163b08418890a406d413933ba7/479eb77214fb42e9ab183afffbb9cd42.html?version=202210.latest" target="_blank" rel="noopener noreferrer">Configuring Git Repositories</A></SPAN></LI></OL><P><SPAN>Some certificates are already available. If you would like to connect to your own GitHub server or to a provider other than github.com, you have to add the appropriate certificates to the ABAP system in transaction STRUST. The configuration has been done for the default user ‘DEVELOPER’.</SPAN><BR /><BR /><SPAN>To get started with gCTS, simply open the gCTS app in the SAP Fiori Launchpad (FLP).</SPAN><BR /><BR /><SPAN>If you are a SAP customer, partner, or employee, the following SAP Note provides additional information: SAP Note:&nbsp;</SPAN><A href="https://launchpad.support.sap.com/%23/notes/2821718" target="_blank" rel="noopener noreferrer">2821718</A><SPAN>&nbsp;. However, the essential configuration has already been done for everyone.</SPAN></P><H2 id="toc-hId--409676102">abapGit</H2><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="julieplummer20_1-1711536855908.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/87332i247C1C74996707AF/image-size/medium?v=v2&amp;px=400" role="button" title="julieplummer20_1-1711536855908.png" alt="julieplummer20_1-1711536855908.png" /></span></P><P><SPAN>Yes, abapGit is available out of the box.</SPAN><BR /><SPAN>Documentation is here:&nbsp;</SPAN><A href="https://docs.abapgit.org/" target="_blank" rel="noopener nofollow noreferrer">abapGit Documentation</A><BR /><SPAN>If you are not yet familiar with abapGit, this post by&nbsp;</SPAN><SPAN class="">graham.robinson</SPAN><SPAN>&nbsp;is a great introduction, with how-to videos:</SPAN><BR /><A href="https://blogs.sap.com/2017/06/21/abapgit-so-easy/" target="_blank" rel="noopener noreferrer">abapGit So Easy</A></P><H2 id="toc-hId--606189607">Custom Code Migration with the ABAP Test Cockpit (ATC)</H2><P>We've pre-configured ABAP Platform Trial to run as a&nbsp;<STRONG>central check system</STRONG>&nbsp;for checking your custom code prior to migration - particularly useful for:</P><UL><LI>SAP S/4HANA Readiness Checks</LI><LI>SAP Cloud Readiness Check</LI></UL><P>You can test this out of the box locally in SAP ADT, then configure the rest of your landscape to work with it.<BR />For more general information on ATC, see these two excellent blogs, by&nbsp;<SPAN><A href="https://community.sap.com/t5/user/viewprofilepage/user-id/6638" target="_blank">Olga Dolinskaja</A>:</SPAN></P><UL><LI><A href="https://blogs.sap.com/2016/12/12/remote-code-analysis-in-atc-one-central-check-system-for-multiple-systems-on-various-releases/" target="_blank" rel="noopener noreferrer">Remote Code Analysis in ATC</A></LI><LI><A href="https://blogs.sap.com/2014/11/03/abap-test-cockpit-for-developers-in-eclipse/" target="_blank" rel="noopener noreferrer">ATC in ABAP Development Tools (ADT)</A></LI></UL><H2 id="toc-hId--802703112"><SPAN>SAP Cloud Connector</SPAN></H2><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="julieplummer20_0-1707312915858.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/62103iCAAAC494078E22DD/image-size/medium?v=v2&amp;px=400" role="button" title="julieplummer20_0-1707312915858.png" alt="julieplummer20_0-1707312915858.png" /></span></P><P><SPAN>SAP Cloud Connector provides&nbsp;</SPAN>a link between&nbsp;<SPAN>SAP Business Technology Platform (BTP)&nbsp;</SPAN>applications and on-premise systems. It runs as on-premise agent in a secured network; acts as a reverse invoke proxy between the on-premise network and&nbsp;<SPAN>SAP BTP; and&nbsp;</SPAN>lets you use existing on-premise assets without exposing the entire internal landscape.</P><P><BR />If you are interested in connecting your ABAP Platform Trial with a licensed version of SAP BTP, ABAP Environment (i.e.“Steampunk”), I have written a tutorial mission on this:&nbsp;<SPAN><A href="https://developers.sap.com/mission.abap-env-connect-onpremise.html" target="_blank" rel="noopener noreferrer">Connect Your On-Premise System with SAP BTP, ABAP Environment</A></SPAN><BR /><BR />For more information, see:</P><UL><LI>SAP Help Portal, SAP BTP Connectivity:&nbsp;<A href="https://help.sap.com/viewer/78f896d569e842719cd55931d96ac6d7/1.0/en-US/a4ae2a20de084b5cbd1116fbb565b929.html" target="_blank" rel="noopener noreferrer">SAP Cloud Connector</A></LI><LI>SAP Community blog post (third-party content):&nbsp;<A href="https://blogs.sap.com/2015/07/13/cloud-connector-a-brief-guide-for-beginners/" target="_blank" rel="noopener noreferrer">SAP BTP Cloud Connector – A Brief Guide for Beginners</A></LI></UL><H2 id="toc-hId--651962260">&nbsp;</H2><H2 id="toc-hId--848475765"><SPAN>Other Highlights of ABAP Platform 2022: Overview</SPAN></H2><P><SPAN>Blog post:&nbsp;<A href="https://community.sap.com/t5/enterprise-resource-planning-blogs-by-sap/abap-platform-for-sap-s-4hana-2022/ba-p/13562774" target="_blank">ABAP Platform for SAP S/4HANA 2022, from November 2022</A>, by <A href="https://community.sap.com/t5/user/viewprofilepage/user-id/6638" target="_blank">Olga Dolinskaja</A>, including the Overview Presentation</SPAN></P><H2 id="toc-hId--1044989270"><SPAN>Guides, Tutorials, FAQ, Troubleshooting</SPAN></H2><P>If you’re not sure where to start with your new system, we have written several tutorials:</P><P><SPAN><A href="https://blogs.sap.com/2014/02/06/guides-and-tutorials-for-the-developer-edition-of-as-abap-incl-bw-on-sap-hana/" target="_blank" rel="noopener noreferrer">SAP Tutorial Navigator: ABAP On-Premise Tutorials</A></SPAN>.</P><P>I have started putting together FAQs specifically for ABAP Platform Trial / ABAP Cloud Developer Trial on Docker. If you would like to contribute to this, please let me know:</P><P><A href="https://github.com/SAP-docs/abap-platform-trial-image/blob/main/faq-v7.md" target="_blank" rel="noopener nofollow noreferrer">ABAP Trial Platform on Docker: Tips and Tricks</A></P><P>The old FAQs&nbsp;&nbsp;also contains some non-release-specific info on Cookbook-style projects, by SAP Community members: I will&nbsp;</P><P><A href="https://blogs.sap.com/2018/10/16/sap-as-abap-7.5x-developer-editions-faqs/#working_abap" target="_blank" rel="noopener noreferrer">FAQ and Troubleshooting for SAP AS ABAP 7.5x</A></P><P><STRONG>Troubleshooting:&nbsp;</STRONG>One last thing: Now that comments are no longer threaded, it is almost impossible to keep track of / answer your troubleshooting / error questions. Please please create a new question in the <A href="https://community.sap.com/t5/forums/searchpage/tab/message?advanced=false&amp;allow_punctuation=false&amp;q=abap_trial" target="_self">SAP Community - ABAP Development forum</A>&nbsp;(which uses the User Tag "abap_trial"). I will try to monitor these questions, but other experienced ABAP users / mentors will also see them.</P><P>Enjoy!</P> 2024-04-19T18:52:59.860000+02:00 https://community.sap.com/t5/technology-blogs-by-members/app-to-automatically-configure-a-new-abap-developer-system/ba-p/13679865 App to automatically configure a new ABAP Developer System 2024-04-23T21:39:08.985000+02:00 pokrakam https://community.sap.com/t5/user/viewprofilepage/user-id/524 <H3 id="toc-hId-1121820736">TL:DR</H3><P>New application&nbsp;<A href="https://github.com/pokrakam/abapDevSysInit" target="_self" rel="nofollow noopener noreferrer">abapDevSysInit</A>&nbsp;available to automate configuration and personalization tasks after installing a new ABAP Trial or Developer Edition instance.<BR /><STRONG>Disclaimer</STRONG>: <SPAN>Work in progress at the time of writing, expect bugs and changes, may break stuff, use at own risk!</SPAN></P><H3 id="toc-hId-925307231">Background</H3><P>I've been using ABAP Trial and Developer editions since SAP made the first NetWeaver ABAP trial system available back in 2000-something. It's great to have a system you can play around with and break. But that also means we need to install a new system every so often for various reasons - something broke,&nbsp;<SPAN>backups too old, new version available.</SPAN></P><P><SPAN>So here's the problem: How to manage the work I've done that I'd like to keep and move onto my new ABAP instance? Backing up the Virtual Machine is a sensible thing to do, but won't help in all cases. Before abapGit, I used to &nbsp;export my objects using <A href="https://help.sap.com/docs/SUPPORT_CONTENT/abap/3353523985.html?locale=en-US" target="_self" rel="noopener noreferrer">SAPlink</A>&nbsp;and import into the new system. That comes with its own set of challenges of maintaining versions and keeping track of which version is on which system, especially if you regularly use more than one system (description of my setup at the end).&nbsp;</SPAN><SPAN><A href="https://github.com/abapGit/abapGit" target="_self" rel="nofollow noopener noreferrer">abapGit</A> however made a different mindset possible.</SPAN></P><H3 id="toc-hId-728793726"><SPAN>Enter </SPAN><SPAN>&nbsp;<span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="logo.svg" style="width: 200px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/100699iA386BA89F3F90B93/image-size/small?v=v2&amp;px=200" role="button" title="logo.svg" alt="logo.svg" /></span></SPAN></H3><P><SPAN>With abapGit, the Git repository becomes the single source of truth. It is possible to set up an automatic push to GitHub on a daily or even hourly basis. Your systems are now disposable, and it doesn't matter which one you want to use. If a system breaks, or, as happened a few days ago, SAP release <A href="https://community.sap.com/t5/technology-blogs-by-sap/abap-cloud-developer-trial-2022-available-now/ba-p/13598069" target="_self">a new version</A>, then you can just delete it and fire up or install a new instance, and with Docker it's quicker than ever.</SPAN></P><P><SPAN>However the mo</SPAN><SPAN>st time-consuming part is a bunch of stuff that I end up repeating for every new instance. Downloading and installing GitHub SSL certificates, changing user details, pulling various repos from GitHub, setting up GitHub authentication so I don't need to enter my password every time. And mundane stuff like updating my user profile to use decimal points and adding my email address.</SPAN></P><P><SPAN>So I built myself something to automate as much as I can and published it on GitHub.</SPAN></P><H3 id="toc-hId-532280221"><SPAN>How To Use&nbsp;abapDevSysInit</SPAN></H3><P><SPAN>Coming back to the point of the blog: How to use it?</SPAN></P><H5 id="toc-hId-593932154"><SPAN>Installing:&nbsp;</SPAN></H5><P><SPAN>The repo is at <A href="https://github.com/pokrakam/abapDevSysInit" target="_blank" rel="noopener nofollow noreferrer">https://github.com/pokrakam/abapDevSysInit</A>, with two options to install:</SPAN></P><UL><LI><SPAN>If you already have abapGit installed, you can pull it directly from GitHub. Fortunately the new 2022 system already includes it.</SPAN></LI><LI><SPAN>If not, everything is in one report for this very reason, so all that's needed is to create a package and a program zdevsysinit and paste the code from GitHub (link in the readme).</SPAN></LI></UL><H5 id="toc-hId-397418649"><SPAN>Configuring:</SPAN></H5><P><SPAN>Once again, the rationale is to be able to copy/paste, so no tables or anything. Therefore the configuration is just an include that sets a bunch of variables.&nbsp;</SPAN></P><P><SPAN>As the configuration is personal to your requirements, it should be stored outside of SAP ready to be pasted into anew system. The include itself should ideally also live in a different package (e.g. $tmp), unless you have your own cloned version on GitHub.&nbsp;</SPAN></P><P><SPAN>A config include example which you can copy/paste to get started is also in the repo. Settings should be self-explanatory.</SPAN></P><H5 id="toc-hId-200905144"><SPAN>Running:</SPAN></H5><P><SPAN>The program will read the config and also try to determine what is/isn't available and toggle the different activity checkboxes accordingly.<BR /></SPAN><SPAN>e.g. The "Get abapGit Standalone" checkbox will be checked if it can't find report ZABAPGIT_STANDALONE, else unchecked. (Hint: The new 2022 system has a several months old&nbsp;</SPAN>version, so you can use this option to pull the latest one straight away).</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="pokrakam_0-1713897422857.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/100704i8AC84C21F72CC591/image-size/large?v=v2&amp;px=999" role="button" title="pokrakam_0-1713897422857.png" alt="pokrakam_0-1713897422857.png" /></span></P><P>This means the report can also be run directly in the Eclipse ADT console without needing any input.<BR />Note that copy-pasting will not have the selection texts as in the screenshot above, but the raw parameter names (P_ABAPGT instead of "Get abapGit Standalone"). <STRIKE>This is on the todo list.</STRIKE>&nbsp;<EM>Edit</EM>: Done, you should only see P_... parameters the first time it runs, just restart it.</P><P>Feel free to raise any issues for bugs or feature requests on GitHub.</P><H3 id="toc-hId--253773799">Addendum: My Setup</H3><P><SPAN>For anyone interested in my setup: I have two main systems: </SPAN><SPAN>a NetWeaver 7.52 Developer Edition running in VMWare on my MacBook, and an ABAP on HANA Developer Edition on my NAS.<BR />Why two? Convenience. For most Open Source projects 7.52 is quite sufficient and it takes exactly one minute to fire up 7.52 on my five year old MacBook, and it works anywhere, without internet, even on a plane ("in the cloud", I guess).<BR />A4H in contrast takes 10-15 minutes to get going if my NAS is off, and only works at home unless I open up a VPN.</SPAN></P> 2024-04-23T21:39:08.985000+02:00 https://community.sap.com/t5/technology-blogs-by-members/how-to-improve-the-adt-class-runner-with-additional-features/ba-p/13673454 How to improve the ADT Class Runner with additional Features 2024-04-24T10:28:47.088000+02:00 alrikx https://community.sap.com/t5/user/viewprofilepage/user-id/667134 <H1 id="toc-hId-863472676">What is a Class Runner?</H1><P>A class runner is a great tool to test code snippets and run code directly from ADT. You can even write a simple log to the console in Eclipse.</P><H1 id="toc-hId-666959171">What can be improved?</H1><P>When using multiple systems and complex projects I got annoyed at some point in time, that I don't know from which system the last log was, when it was written by which runner and if the last execution has finished or failed maybe.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="alrikx_0-1713355929685.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/97602iF5D9B10CAFFE4AD7/image-size/medium?v=v2&amp;px=400" role="button" title="alrikx_0-1713355929685.png" alt="alrikx_0-1713355929685.png" /></span></P><P>Thats when I started my own class runner that have some improved capabilities.</P><H1 id="toc-hId-470445666">How does it look like?</H1><P>The output looks like this:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="alrikx_1-1713356469986.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/97605i7DE14F717A6836D3/image-size/large?v=v2&amp;px=999" role="button" title="alrikx_1-1713356469986.png" alt="alrikx_1-1713356469986.png" /></span></P><UL><LI>You see when, what, by whom and where it was started.</LI><LI>For every log entry you get a timestamp.</LI><LI>You see when the execution finished.</LI><LI>All times and dates are formatted in your personal date and time format</LI></UL><P>What about the ABAP code?&nbsp;Your code gets defined in the logic() method.</P><P>&nbsp;</P><pre class="lia-code-sample language-abap"><code>CLASS zcl_runner_demo DEFINITION PUBLIC INHERITING FROM zcl_base_runner FINAL CREATE PUBLIC . PUBLIC SECTION. METHODS: logic REDEFINITION. PROTECTED SECTION. PRIVATE SECTION. ENDCLASS. CLASS zcl_runner_demo IMPLEMENTATION. METHOD logic. write( `Hello World` ). write( `this is a demo of the enhanced class runner` ). write( 123 ). ENDMETHOD. ENDCLASS.</code></pre><P>&nbsp;</P><H2 id="toc-hId-403014880">Methods write() and out-&gt;write()</H2><P>The write() method has the same signature as the out-&gt;write() method, you can even access the original out-&gt;write() if needed.</P><P>&nbsp;</P><pre class="lia-code-sample language-abap"><code> METHOD logic. write( `Hello World` ). write( `this is a demo of the enhanced class runner` ). write( 123 ). out-&gt;write( `bare write` ). ENDMETHOD.</code></pre><P>&nbsp;</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="alrikx_2-1713360807380.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/97625i83B4D296DCEBC471/image-size/large?v=v2&amp;px=999" role="button" title="alrikx_2-1713360807380.png" alt="alrikx_2-1713360807380.png" /></span></P><P>of course you can pass structured and table data to write(), like you can do to out-&gt;write()</P><P>&nbsp;</P><pre class="lia-code-sample language-abap"><code> METHOD logic. DATA ls_airport type /dmo/airport. write( `Hello World` ). ls_airport = value #( airport_id = 'SAP' city = 'Dokkerland' ). write( ls_airport ). write( name = 'Info about airport' data = ls_airport ). ENDMETHOD.</code></pre><P>&nbsp;</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="alrikx_0-1713363223717.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/97650iE1D4AEB3F9540667/image-size/large?v=v2&amp;px=999" role="button" title="alrikx_0-1713363223717.png" alt="alrikx_0-1713363223717.png" /></span></P><H2 id="toc-hId-206501375">Uncaught exceptions</H2><P>Method logic is secured against uncaught exceptions.&nbsp;</P><P>&nbsp;</P><pre class="lia-code-sample language-abap"><code> METHOD logic. write( `Hello World` ). raise EXCEPTION new cx_abap_invalid_name( ). ENDMETHOD.</code></pre><P>&nbsp;</P><P>It logs the behaviour:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="alrikx_0-1713361297623.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/97629i80B87F80198E38AF/image-size/large?v=v2&amp;px=999" role="button" title="alrikx_0-1713361297623.png" alt="alrikx_0-1713361297623.png" /></span></P><H1 id="toc-hId--119094849">How does it look under the hood?</H1><P>It is basically an abstract class that wraps the original ADT class runner:</P><P>&nbsp;</P><pre class="lia-code-sample language-abap"><code>"! &lt;p class="shorttext synchronized" lang="en"&gt;Base Runner&lt;/p&gt; "! Improved class runner with enhanced logging capabilities CLASS zcl_base_runner DEFINITION PUBLIC ABSTRACT CREATE PUBLIC. PUBLIC SECTION. INTERFACES if_oo_adt_classrun . "! &lt;p class="shorttext synchronized" lang="en"&gt;This method implements your logic&lt;/p&gt; "! You can use { .METH:write } with enhanced capabilities or the { .DATA:out }-&gt;write( ) for plain logging. "! @raising cx_root | &lt;p class="shorttext synchronized" lang="en"&gt;any exception not caught, will be handled in the runner.&lt;/p&gt; METHODS logic ABSTRACT RAISING cx_root. CLASS-METHODS convertuuid IMPORTING str TYPE string RETURNING VALUE(rv_uuid) TYPE sysuuid_c32. PROTECTED SECTION. DATA out TYPE REF TO if_oo_adt_classrun_out. "! &lt;p class="shorttext synchronized" lang="en"&gt;wrapper for out-&gt;write( )&lt;/p&gt; "! this enhances the default function by writing a timestamp. "! this method should be used in {@link .METH:logic } "! @parameter data | &lt;p class="shorttext synchronized" lang="en"&gt;&lt;/p&gt; "! @parameter name | &lt;p class="shorttext synchronized" lang="en"&gt;&lt;/p&gt; METHODS write IMPORTING data TYPE any name TYPE string OPTIONAL. PRIVATE SECTION. "! &lt;p class="shorttext synchronized" lang="en"&gt;determine the current timestamp and returns as string&lt;/p&gt; "! &lt;ul&gt;&lt;li&gt;in users timezone&lt;/li&gt;&lt;li&gt;in users prefered format&lt;/li&gt;&lt;/ul&gt; "! @parameter rv_dateandtime | &lt;p class="shorttext synchronized" lang="en"&gt;&lt;/p&gt; CLASS-METHODS getCurrentDateandTimeFormatted RETURNING VALUE(rv_dateandtime) TYPE string. "! &lt;p class="shorttext synchronized" lang="en"&gt;draws a horizontal line on the console&lt;/p&gt; "! "! @parameter out | &lt;p class="shorttext synchronized" lang="en"&gt;&lt;/p&gt; CLASS-METHODS horizontalLine IMPORTING out TYPE REF TO if_oo_adt_classrun_out. ENDCLASS. CLASS zcl_base_runner IMPLEMENTATION. METHOD if_oo_adt_classrun~main. me-&gt;out = out. horizontalline( out ). TRY. out-&gt;write( |Start on { xco_cp=&gt;current-&gt;tenant( )-&gt;get_url( io_type = xco_cp_tenant=&gt;url_type-&gt;ui )-&gt;get_host( ) } runner { cl_abap_classdescr=&gt;get_class_name( me ) } by { cl_abap_context_info=&gt;get_user_formatted_name( ) }| &amp;&amp; | at { getcurrentdateandtimeformatted( ) }| ). CATCH cx_abap_context_info_error INTO DATA(lc_context_error). "handle exception out-&gt;write( 'Error occured in determine current user:' ). out-&gt;write( lc_context_error-&gt;get_text( ) ). ENDTRY. TRY. me-&gt;logic( ). CATCH cx_root INTO DATA(lc_error). "handle exception write( 'Error occured in executing the logic:' ). write( lc_error-&gt;get_text( ) ). DATA(previous) = lc_error-&gt;previous. IF lc_error-&gt;previous IS BOUND. write( name = 'Previous' data = lc_error-&gt;previous-&gt;get_text( ) ). ENDIF. ENDTRY. out-&gt;write( |Done at { getcurrentdateandtimeformatted( ) }| ). horizontalline( out ). ENDMETHOD. METHOD write. DATA(descr_ref) = cl_abap_typedescr=&gt;describe_by_data( data ). IF name IS INITIAL. IF descr_ref IS INSTANCE OF cl_abap_elemdescr. out-&gt;write( data = |{ getcurrentdateandtimeformatted( ) }: { data }| ). ELSE. out-&gt;write( data = |{ getcurrentdateandtimeformatted( ) }:| ). out-&gt;write( data = data ). ENDIF. ELSE. IF descr_ref IS INSTANCE OF cl_abap_elemdescr. out-&gt;write( data = |{ getcurrentdateandtimeformatted( ) }: { Name }:{ data }| ). ELSE. out-&gt;write( data = |{ getcurrentdateandtimeformatted( ) }: { Name }:| ). out-&gt;write( data = data ). ENDIF. ENDIF. ENDMETHOD. METHOD getcurrentdateandtimeformatted. DATA tsp TYPE tzntstmps. DATA(lo_unix_timestamp) = xco_cp=&gt;sy-&gt;unix_timestamp( ). DATA(lo_moment) = lo_unix_timestamp-&gt;get_moment( xco_cp_time=&gt;time_zone-&gt;user ). tsp = lo_moment-&gt;as( xco_cp_time=&gt;format-&gt;abap )-&gt;value. rv_dateandtime = |{ tsp TIMESTAMP = USER }|. ENDMETHOD. METHOD horizontalline. out-&gt;write( repeat( val = '-' occ = 120 ) ). ENDMETHOD. METHOD convertuuid. DATA(lo_uuid) = xco_cp_uuid=&gt;format-&gt;c36-&gt;to_uuid( str ). rv_uuid = xco_cp_uuid=&gt;format-&gt;c32-&gt;from_uuid( lo_uuid ). ENDMETHOD. ENDCLASS.</code></pre><P>&nbsp;</P><H1 id="toc-hId--315608354">Summary</H1><P>The improved class runner is a tool that supports <a href="https://community.sap.com/t5/c-khhcw49343/SAP+NetWeaver/pd-p/01200314690800000134" class="lia-product-mention" data-product="730-1">SAP NetWeaver</a>,&nbsp;<a href="https://community.sap.com/t5/c-khhcw49343/SAP+S%25252F4HANA/pd-p/73554900100800000266" class="lia-product-mention" data-product="799-1">SAP S/4HANA</a>&nbsp;and <a href="https://community.sap.com/t5/c-khhcw49343/SAP+BTP%25252C+ABAP+environment/pd-p/73555000100800001164" class="lia-product-mention" data-product="11-1">SAP BTP, ABAP environment</a>, basically everywhere the class runner is supported.</P><P>I put in a function for UUID conversion that I used in one of my last projects a lot, of course its optional.</P><P>It would be easy to extend this logic for application job execution too. All you need is an additional wrapper that rewrites the write method to append an application log and calls the logic method from the application job.</P><P>Feel free to share, reuse and enhance this idea.</P><P><SPAN>If you like this post or it helped you, don't hesitate to give kudos.</SPAN></P> 2024-04-24T10:28:47.088000+02:00 https://community.sap.com/t5/technology-blogs-by-sap/customer-amp-partner-roundtable-for-sap-btp-abap-environment-12/ba-p/13681342 Customer & Partner Roundtable for SAP BTP ABAP Environment #12 2024-04-24T20:33:53.136000+02:00 iwona_hahn https://community.sap.com/t5/user/viewprofilepage/user-id/4326 <DIV class=""><DIV class=""><DIV class=""><H3 id="toc-hId-1122501059"><STRONG><SPAN class="lia-unicode-emoji"><span class="lia-unicode-emoji" title=":backhand_index_pointing_right:">👉</span></SPAN>&nbsp;The call for contributions for one of the upcoming roundtables is open!&nbsp;</STRONG></H3><P>&nbsp;</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>&nbsp;</SPAN><A href="mailto:sap_btp_abap_environment@sap.com" target="_blank" rel="noopener nofollow noreferrer">email</A>&nbsp;and we will get back to you.</TD></TR></TBODY></TABLE><SPAN>&nbsp;</SPAN></DIV><H2 id="toc-hId-796904835">Introduction</H2><P>&nbsp;</P><DIV><SPAN class="">A</SPAN><SPAN class="">s<SPAN>&nbsp;</SPAN></SPAN><A class="" href="https://www.sap.com/products/technology-platform/abap.html" target="_blank" rel="noreferrer noopener"><SPAN class="">SAP&nbsp;BTP&nbsp;ABAP&nbsp;environment (aka Steampunk)</SPAN></A><SPAN>&nbsp;</SPAN>and ABAP Cloud<SPAN>&nbsp;</SPAN><SPAN class="">became&nbsp;more&nbsp;</SPAN><SPAN class="">and more popular</SPAN><SPAN class=""><SPAN>&nbsp;</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.&nbsp;</SPAN><BR /><BR /><SPAN class="lia-unicode-emoji"><span class="lia-unicode-emoji" title=":light_bulb:">💡</span></SPAN>&nbsp;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>&nbsp;</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&amp;px=400" role="button" title="iwona_hahn_1-1711369871866.jpeg" alt="iwona_hahn_1-1711369871866.jpeg" /></span><H2 id="toc-hId-600391330"><BR />Meeting Information<BR /><BR /></H2><STRONG>When:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</STRONG><BR /><UL><LI><STRONG><SPAN class="">May 23rd</SPAN></STRONG>, 10:00 - 11:00 AM CET&nbsp; –<SPAN>&nbsp;</SPAN><A href="https://sap-se.zoom.us/meeting/register/tJEkcOmorzgpE9PZ39C4oRrLL3KjV2OuzJPq" target="_blank" rel="nofollow noopener noreferrer">Zoom Meeting</A>&nbsp;(<STRONG>please register</STRONG><SPAN>&nbsp;</SPAN>in advance)&nbsp;</LI></UL></DIV><DIV>&nbsp;</DIV><DIV><STRONG>Who:</STRONG><UL><LI>All interested&nbsp;<STRONG>customers, partners,</STRONG>&nbsp;and&nbsp;<STRONG>stakeholders</STRONG>&nbsp;are invited to join and exchange ideas and feedback with others and the product team</LI><LI><STRONG>Steampunk team</STRONG>:&nbsp;<STRONG><A href="https://community.sap.com/t5/user/viewprofilepage/user-id/4296" target="_blank">Frank Jentsch</A></STRONG><SPAN>&nbsp;</SPAN><SPAN class="">(Product Lead for SAP BTP ABAP&nbsp;Environment),&nbsp;<A href="https://community.sap.com/t5/user/viewprofilepage/user-id/387576" target="_blank"><STRONG>Anne Keller </STRONG></A>(<SPAN class="">Chief Development Experts ABAP Cloud Dev Tools</SPAN>),&nbsp;<A href="https://community.sap.com/t5/user/viewprofilepage/user-id/185696" target="_blank"><STRONG>Thomas Alexander Ritter </STRONG></A>(Area Product Owner&nbsp;<SPAN class="">ABAP Cloud Dev Tools)</SPAN>,&nbsp;</SPAN><STRONG><A href="https://community.sap.com/t5/user/viewprofilepage/user-id/4326" target="_self"><SPAN class="">Iwona Hahn</SPAN></A></STRONG>&nbsp;&amp;&nbsp;<STRONG><A href="https://community.sap.com/t5/user/viewprofilepage/user-id/151005" target="_self">Burcu Karlidag</A></STRONG><SPAN class="">&nbsp;(BTP ABAP Product Manager)</SPAN><BR /><BR /></LI></UL></DIV><DIV><STRONG>Preliminary Agenda:</STRONG><BR /><UL><LI>Product news</LI><LI><SPAN class="">New features of 2405 release</SPAN></LI><LI><SPAN>E2E Developer Experience for ABAP Cloud incl.&nbsp;demo</SPAN></LI><LI>Q&amp;A</LI></UL><SPAN>Looking forward to meeting you!</SPAN></DIV><DIV>&nbsp;</DIV><DIV><A href="https://sap-se.zoom.us/meeting/register/tJEkcOmorzgpE9PZ39C4oRrLL3KjV2OuzJPq" target="_self" rel="nofollow noopener 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&amp;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>&nbsp;</SPAN><A href="https://pages.community.sap.com/topics/btp-abap-environment" target="_blank" rel="noopener noreferrer">SAP Business Technology ABAP Environment</A><SPAN>&nbsp;page in SAP Community&nbsp;</SPAN><SPAN>for&nbsp;</SPAN><SPAN>product&nbsp;</SPAN><SPAN>updates&nbsp;</SPAN><SPAN>and&nbsp;</SPAN><SPAN>upcoming events.</SPAN><P>&nbsp;</P></DIV></DIV></DIV></DIV><DIV class="">&nbsp;</DIV> 2024-04-24T20:33:53.136000+02:00 https://community.sap.com/t5/technology-blogs-by-members/sap-btp-abap-in-the-cloud-custom-code-transformation-using-abapgit-and-gcts/ba-p/13683259 SAP BTP, ABAP in the Cloud Custom Code Transformation using abapGit and gCTS 2024-04-26T09:09:05.666000+02:00 AnslemArnolda https://community.sap.com/t5/user/viewprofilepage/user-id/490939 <H1 id="toc-hId-864394280">abapGit and gCTS (Git-enabled Change and Transport System)</H1><UL><LI>The basic idea behind abapGit is to exchange source code between any ABAP systems using a Gitbased repository.</LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="AnslemArnolda_0-1714113883072.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/102165iC646DCE9E96802FD/image-size/medium?v=v2&amp;px=400" role="button" title="AnslemArnolda_0-1714113883072.png" alt="AnslemArnolda_0-1714113883072.png" /></span></P><UL><LI>By introducing gCTS, SAP is aiming for the best of both worlds, that is, repository-based<BR />development where concurrent work on the same object is possible, while retaining all the benefits of<BR />central development.</LI><LI>Following is the process flow for gCTS.</LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="AnslemArnolda_1-1714113919791.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/102166i899E36D3C6AE5650/image-size/medium?v=v2&amp;px=400" role="button" title="AnslemArnolda_1-1714113919791.png" alt="AnslemArnolda_1-1714113919791.png" /></span></P><UL><LI>You can use gCTS to distribute your custom code through a central repository, which will enable<BR />possible rollbacks before importing to the target system, if required.</LI><LI>You can possibly use abapGit to move your on-premise ABAP objects to SAP BTP, ABAP<BR />environment. In the next section, we’ll demonstrate how to use abapGit to move ABAP objects from<BR />your SAP S/4HANA on-premise environment to SAP BTP, ABAP environment.</LI></UL><H1 id="toc-hId-667880775">Custom Code Transformation Using abapGit</H1><UL><LI>Transforming on-premise ABAP code to SAP BTP requires three primary steps.<UL><LI>Evaluating current code.</LI><LI>Installing abapGit.</LI><LI>Transforming code.</LI></UL></LI></UL><H2 id="toc-hId-600449989">Evaluation of On-Premise code for Compatibility</H2><UL><LI>Make sure that your code is using the ABAP for SAP BTP language version (ABAP for SAP Cloud<BR />Platform).</LI><LI>Once the language version is changed, execute ATC check or transaction SCI to check for any issues.</LI></UL><H2 id="toc-hId-403936484">Installing abapGIT on an On-Premise and as an Eclipse Plugin</H2><H3 id="toc-hId-336505698">On-Premise</H3><UL><LI>Create a new repository on GitHub.</LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="AnslemArnolda_2-1714114188344.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/102167i02751143FEE0025B/image-size/medium?v=v2&amp;px=400" role="button" title="AnslemArnolda_2-1714114188344.png" alt="AnslemArnolda_2-1714114188344.png" /></span></P><UL><LI>Give a name to the repository and click the “Create Repository” button</LI></UL><P style=" text-align: center; "><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="AnslemArnolda_3-1714114222926.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/102169i5DB0297A229CB6FA/image-size/medium?v=v2&amp;px=400" role="button" title="AnslemArnolda_3-1714114222926.png" alt="AnslemArnolda_3-1714114222926.png" /></span></P><UL><LI>Visit&nbsp;<A href="https://github.com/abapGit/abapGit" target="_self" rel="nofollow noopener noreferrer">https://github.com/abapGit/abapGit</A>&nbsp;and click on the latest build as follows. This simply has the<BR />code for an ABAP report program.</LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="AnslemArnolda_5-1714114364743.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/102174i47EEAC0D202C43FF/image-size/medium?v=v2&amp;px=400" role="button" title="AnslemArnolda_5-1714114364743.png" alt="AnslemArnolda_5-1714114364743.png" /></span></P><UL><LI>Create a report program on your on-premise SAP system and copy the code you see above into the<BR />program and activate.</LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="AnslemArnolda_6-1714114415257.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/102175i5BE6F6F488A3FE5C/image-size/medium?v=v2&amp;px=400" role="button" title="AnslemArnolda_6-1714114415257.png" alt="AnslemArnolda_6-1714114415257.png" /></span></P><UL><LI>The following screen should appear once you execute this program</LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="AnslemArnolda_7-1714114447825.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/102176i2BAF2035C7F0CBE0/image-size/medium?v=v2&amp;px=400" role="button" title="AnslemArnolda_7-1714114447825.png" alt="AnslemArnolda_7-1714114447825.png" /></span></P><UL><LI><FONT color="#008000">abapGit has now been installed on the on-premise system</FONT></LI></UL><H3 id="toc-hId-139992193">As an Eclipse Plugin</H3><UL><LI>Open ADT-&gt;Help-&gt;Install new software and enter the following URL to load abapGIT for ABAP<BR />development on ADT.<BR /><A href="http://eclipse.abapgit.org/updatesite/" target="_self" rel="nofollow noopener noreferrer">http://eclipse.abapgit.org/updatesite/</A>&nbsp;</LI><LI>Simply click on “Next” and install the plugin</LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="AnslemArnolda_8-1714114536582.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/102178i85717065602DA68F/image-size/medium?v=v2&amp;px=400" role="button" title="AnslemArnolda_8-1714114536582.png" alt="AnslemArnolda_8-1714114536582.png" /></span></P><H1 id="toc-hId--314686750"><SPAN>Transform code form on-premise to cloud</SPAN></H1><UL><LI>Visit your GitHub repository and copy the URL corresponding to your repository.<span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="AnslemArnolda_9-1714114638007.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/102179i737F4A2577479924/image-size/medium?v=v2&amp;px=400" role="button" title="AnslemArnolda_9-1714114638007.png" alt="AnslemArnolda_9-1714114638007.png" /></span></LI><LI>Go back to your ABAP report program on the on-premise system, Click new online.<span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="AnslemArnolda_10-1714114679406.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/102180iB59390444D374994/image-size/medium?v=v2&amp;px=400" role="button" title="AnslemArnolda_10-1714114679406.png" alt="AnslemArnolda_10-1714114679406.png" /></span></LI><LI>Paste the URL you copied above to the following location, along with the package that you want to<BR />commit to the Git Repository you created above. This is the package that is in your on-premise<BR />system, which you want to migrate to the cloud environment.</LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="AnslemArnolda_11-1714114737055.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/102181iA9C5475738D5103D/image-size/medium?v=v2&amp;px=400" role="button" title="AnslemArnolda_11-1714114737055.png" alt="AnslemArnolda_11-1714114737055.png" /></span></P><UL><LI>Click on “Create Online Repo”.</LI><LI>Once the execution is completed, you should see the cloned repository as follows, which is ready to<BR />be committed to the online Git Repository.</LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="AnslemArnolda_12-1714114776492.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/102182i2C73AD2DD11B82D8/image-size/medium?v=v2&amp;px=400" role="button" title="AnslemArnolda_12-1714114776492.png" alt="AnslemArnolda_12-1714114776492.png" /></span></P><UL><LI>Now click on “stage” and “commit all changes” to the online repository</LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="AnslemArnolda_13-1714114813371.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/102183i0F62299C7ED0668D/image-size/medium?v=v2&amp;px=400" role="button" title="AnslemArnolda_13-1714114813371.png" alt="AnslemArnolda_13-1714114813371.png" /></span></P><UL><LI>Give a comment for the commit that you do each time as follows. Click on “Commit”</LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="AnslemArnolda_14-1714114841595.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/102184i2DD0DA94A426C455/image-size/medium?v=v2&amp;px=400" role="button" title="AnslemArnolda_14-1714114841595.png" alt="AnslemArnolda_14-1714114841595.png" /></span></P><UL><LI>This will request for your GitHub credentials, to authenticate. Give them and Continue.</LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="AnslemArnolda_15-1714114868471.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/102185i71F02C4E81D65C69/image-size/medium?v=v2&amp;px=400" role="button" title="AnslemArnolda_15-1714114868471.png" alt="AnslemArnolda_15-1714114868471.png" /></span></P><UL><LI>Once the commit is complete, you should see a message as follows</LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="AnslemArnolda_16-1714114894483.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/102187i5CC4FC204E1A87D3/image-size/medium?v=v2&amp;px=400" role="button" title="AnslemArnolda_16-1714114894483.png" alt="AnslemArnolda_16-1714114894483.png" /></span></P><UL><LI>And the source code under the package should be available in your online Git Repository.</LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="AnslemArnolda_17-1714114920621.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/102188i71A2C03399BD2B6C/image-size/medium?v=v2&amp;px=400" role="button" title="AnslemArnolda_17-1714114920621.png" alt="AnslemArnolda_17-1714114920621.png" /></span></P><UL><LI>Open ADT on Eclipse-&gt; Select Your ABAP in the cloud Project -&gt; Window -&gt; Show -&gt; Other -&gt;<BR />abapGit Repositories.</LI><LI>Click the “Plus” button to link your abapGit Repository to ADT. Give the URL corresponding to your<BR />Git Repository here as well.</LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="AnslemArnolda_18-1714114954043.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/102189i79E8D97B3F282772/image-size/medium?v=v2&amp;px=400" role="button" title="AnslemArnolda_18-1714114954043.png" alt="AnslemArnolda_18-1714114954043.png" /></span></P><UL><LI>Create a package in your ABAP in the cloud project, to which you will be importing all the supported<BR />objects in your on-premise ABAP package. Here I have given the same package name.</LI><LI>Make sure to put the “Pull after link” tick as well, so the objects will be pulled from your online Git Repository into ABAP in the cloud project.</LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="AnslemArnolda_19-1714114997143.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/102191iC24B7427E2A1821B/image-size/medium?v=v2&amp;px=400" role="button" title="AnslemArnolda_19-1714114997143.png" alt="AnslemArnolda_19-1714114997143.png" /></span></P><UL><LI>Once that is completed, you should see all supported objects on your on-premise system, imported<BR />into your ABAP in the cloud package.</LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="AnslemArnolda_20-1714115024338.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/102192iF34FF9866184EC43/image-size/medium?v=v2&amp;px=400" role="button" title="AnslemArnolda_20-1714115024338.png" alt="AnslemArnolda_20-1714115024338.png" /></span></P><P>&nbsp;</P> 2024-04-26T09:09:05.666000+02:00 https://community.sap.com/t5/technology-blogs-by-sap/get-started-with-sap-btp-abap-environment-trial-account-vs-free-tier-option/ba-p/13663694 Get started with SAP BTP ABAP Environment: Trial Account vs. Free Tier Option 2024-04-26T15:24:35.800000+02:00 Burcu_Karlidag https://community.sap.com/t5/user/viewprofilepage/user-id/151005 <P>Understanding the various <A href="https://www.sap.com/products/technology-platform/pricing.html" target="_self" rel="noopener noreferrer">Try and Buy</A>&nbsp;options is crucial in exploring the SAP BTP ABAP Environment, ensuring an easy start to your journey.&nbsp;<SPAN>Let's take a closer look at the two tryout options:&nbsp;</SPAN></P><P>&nbsp;</P><H1 id="toc-hId-862551201">Trial Account</H1><P data-unlink="true">The <A href="https://discovery-center.cloud.sap/serviceCatalog/abap-environment?region=all&amp;tab=service_plan&amp;commercialModel=free" target="_blank" rel="noopener nofollow noreferrer">SAP BTP trial</A> allows you to experiment and educate yourself and get familiar with the SAP BTP ABAP Environment.&nbsp;<SPAN>The instance is shared between all trial users. This shared trial offering allows users to share an instance, where all development objects are visible and editable by other trial users. You agree not to upload any personal data, any confidential information of you or your company, or use the service for a productive environment.&nbsp;</SPAN>By default, the trial account lasts for 30 days but can be extended up to 90 days. After this period, the instance is automatically deleted, and a seamless transition to a paid standard version isn't feasible.&nbsp;<SPAN>Due to the shared instance approach, a few features like connectivity are not supported. Please find more information in this&nbsp;<A href="https://community.sap.com/t5/technology-blogs-by-sap/it-s-trial-time-for-abap-in-sap-business-technology-platform/ba-p/13416047" target="_blank">blog post</A>.</SPAN></P><P>&nbsp;</P><H1 id="toc-hId-666037696">Free Tier Option</H1><P>Designed for small proof-of-concept projects, the <A href="https://discovery-center.cloud.sap/serviceCatalog/abap-environment?region=all&amp;tab=service_plan" target="_blank" rel="noopener nofollow noreferrer">free tier option</A> offers exploration of all capabilities for non-productive scenarios over a fixed 90-day trial period. It can also be utilized for piloting remote <A href="https://help.sap.com/docs/btp/sap-business-technology-platform/abap-test-cockpit" target="_blank" rel="noopener noreferrer">ABAP Test Cockpit (ATC</A>) scenarios against on-premise systems in the <A href="https://help.sap.com/docs/btp/sap-business-technology-platform/custom-code-migration" target="_blank" rel="noopener noreferrer">Custom Code Migration App</A>. Unlike the trial version, each user has their own instance. A seamless transition to the paid standard plan is supported within the trial period, without data loss. After 90 days, the instance is automatically deleted.&nbsp;</P><H2 id="toc-hId-598606910">&nbsp;</H2><H2 id="toc-hId-402093405"><SPAN>Selecting the appropriate choice</SPAN></H2><P>To choose the right option between the trial account and the free tier option, consider your specific needs and goals:</P><P>&nbsp;</P><TABLE border="1" width="100%"><TBODY><TR><TD width="33.333333333333336%" height="61px"><H3 id="toc-hId-334662619">Category</H3></TD><TD width="33.333333333333336%" height="61px"><H3 id="toc-hId-138149114">Trial Account</H3></TD><TD width="33.333333333333336%" height="61px"><H3 id="toc-hId--58364391">Free Tier Option</H3></TD></TR><TR><TD width="33.333333333333336%" height="94px"><STRONG>Purpose</STRONG></TD><TD width="33.333333333333336%" height="94px"><SPAN>Experimentation, educational purposes</SPAN></TD><TD width="33.333333333333336%" height="94px"><SPAN>Small proof-of-concept projects, &nbsp;non-productive scenarios</SPAN></TD></TR><TR><TD width="33.333333333333336%" height="61px"><STRONG>Feature Set</STRONG></TD><TD width="33.333333333333336%" height="61px">Limited</TD><TD width="33.333333333333336%" height="61px">Not limited</TD></TR><TR><TD width="33.333333333333336%" height="61px"><STRONG>Duration</STRONG></TD><TD width="33.333333333333336%" height="61px"><SPAN>Extendable up to 90 days</SPAN></TD><TD width="33.333333333333336%" height="61px"><SPAN>Fixed 90-day trial period</SPAN></TD></TR><TR><TD width="33.333333333333336%" height="61px"><STRONG>Data Privacy and Security</STRONG></TD><TD width="33.333333333333336%" height="61px">Shared instance</TD><TD width="33.333333333333336%" height="61px"><SPAN>Individual instance</SPAN></TD></TR><TR><TD width="33.333333333333336%" height="54px"><STRONG>Seamless Transition</STRONG></TD><TD width="33.333333333333336%" height="54px">Not possible</TD><TD width="33.333333333333336%" height="54px">Possible</TD></TR></TBODY></TABLE><P>Please evaluate these aspects and c<SPAN>onsider your future beyond the trial period&nbsp;</SPAN>to determine which option aligns best with your needs.</P> 2024-04-26T15:24:35.800000+02:00 https://community.sap.com/t5/technology-blogs-by-sap/the-2024-developer-insights-survey-the-report/ba-p/13686151 The 2024 Developer Insights Survey: The Report 2024-04-30T03:48:33.552000+02:00 rileyrainey https://community.sap.com/t5/user/viewprofilepage/user-id/8919 <DIV class=""><DIV><DIV style=" padding-left : 60px; "><EM><FONT size="2">We normally publish the annual external report for our annual SAP Developer Insights Survey directly on SAP Developer Center.&nbsp; This year we encountered an unfortunate process issue that delayed publishing this report on that site: rather than delaying it further, I'm posting a copy of the report here for Community review and discussion.&nbsp; We'll post the final copy on developers.sap.com as soon as practical.</FONT><BR /></EM><STRONG><EM><BR /><BR /></EM></STRONG></DIV><DIV class=""><EM><EM><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2024-04-29 at 9.16.22 AM.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103326iBC85E7933F44189C/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2024-04-29 at 9.16.22 AM.png" alt="Screenshot 2024-04-29 at 9.16.22 AM.png" /></span></EM></EM></DIV><DIV class="">&nbsp;</DIV><DIV class=""><EM>Role Overlaps for external SAP developers</EM></DIV></DIV></DIV><H2 id="toc-hId-993565403">Part I: Introduction and General Information<A class="" title="Direct link to Part I: Introduction and General Information" href="http://localhost:3000/external-report-2024#part-i-introduction-and-general-information" target="_blank" rel="noopener nofollow noreferrer">​</A></H2><P>Welcome to the 2024 SAP Developer Insights Survey report. This annual survey targets SAP’s existing external developer audience. It is used to track demographics, usage patterns, and trends within that population. 2024 is the fifth year we have conducted the survey. The survey program is led by the SAP Ecosystem and Community team. Key support is provided by the SAP Global Experience Management Office. Several other SAP teams provide advice and inputs to survey content. Those teams are listed at the end of this report.</P><P>This year's survey was open for six weeks - from mid-January through the end of February.</P><P>Each year's survey is composed of a mix of new topic questions and repeat select questions from past years to track trends.</P><H3 id="toc-hId-926134617">Key Findings from the 2024 Survey<A class="" title="Direct link to Key Findings from the 2024 Survey" href="http://localhost:3000/external-report-2024#key-findings-from-the-2024-survey" target="_blank" rel="noopener nofollow noreferrer">​</A></H3><UL><LI><P><STRONG><EM>SAP Low Code / No Code Use is Increasing</EM></STRONG><SPAN>&nbsp;</SPAN>- this is true both on production Extension projects and proportional to competitor Low Code / No Code products</P></LI><LI><P><STRONG><EM>Increasing Presence of Solution Architects</EM></STRONG><SPAN>&nbsp;</SPAN>- this is a trend we noted last year and it continues this year. 42% of respondents now report that they acted in the role of Solution or Application Architect in the last year -- this proportion has been consistently rising and is up by a net 20% in the past two years. This role is probably underserved in our current external outreach and is likely a good area to focus upon for new programs.</P></LI><LI><P><STRONG><EM>SAP Developer Satisfaction is flat or slightly declining</EM></STRONG><SPAN>&nbsp;</SPAN>- 70% of respondents report they are “very satisfied” or “satisfied” with their development work with SAP. This is down from 75% in 2023 -- lower, but just within the margin of error for responses to this question.</P></LI><LI><P><STRONG><EM>Back-to-Office trend slowing</EM></STRONG><SPAN>&nbsp;</SPAN>- we have been tracking these numbers since 2021. Additional 2024 respondents report settling back into a tradition office work environment, but the rate of the shift has slowed.</P></LI><LI><P><STRONG><EM>BTP Developers Guide - limited awareness</EM></STRONG><SPAN>&nbsp;</SPAN>-- this important guidance document was announced at TechEd this past November, but barely half of respondents were aware of its existence.</P></LI></UL><P>These topics will be covered in more detail in the rest of the report.</P><H3 id="toc-hId-729621112">General Topics<A class="" title="Direct link to General Topics" href="http://localhost:3000/external-report-2024#general-topics" target="_blank" rel="noopener nofollow noreferrer">​</A></H3><P>We included a number of general questions in the survey covering such topics as age, work location and status, as well as role.</P><H4 id="toc-hId-662190326">Employment Status and Relation to SAP<A class="" title="Direct link to Employment Status and Relation to SAP" href="http://localhost:3000/external-report-2024#employment-status-and-relation-to-sap" target="_blank" rel="noopener nofollow noreferrer">​</A></H4><DIV class=""><DIV><DIV class=""><DIV><STRONG>Employment</STRONG></DIV><DIV><SPAN class=""><EM>"What is your current employment status?"</EM></SPAN>&nbsp;&nbsp;</DIV><DIV><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2024-04-29 at 9.58.31 AM.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103359iEA2A795AEE94893C/image-size/medium?v=v2&amp;px=400" role="button" title="Screenshot 2024-04-29 at 9.58.31 AM.png" alt="Screenshot 2024-04-29 at 9.58.31 AM.png" /></span></DIV><DIV class="">&nbsp;</DIV></DIV></DIV></DIV><DIV><DIV class=""><DIV><STRONG>SAP Developer Community Composition</STRONG></DIV><DIV><DIV><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2024-04-29 at 9.58.43 AM.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103360i2AEAA460636C107F/image-size/medium?v=v2&amp;px=400" role="button" title="Screenshot 2024-04-29 at 9.58.43 AM.png" alt="Screenshot 2024-04-29 at 9.58.43 AM.png" /></span></DIV><DIV class=""><SPAN>We have seen no significant change in these breakdowns from year to year.</SPAN></DIV></DIV></DIV></DIV></DIV></DIV><H4 id="toc-hId-465676821">SAP Developer Community Age Distribution</H4><H4 id="toc-hId-269163316"><A class="" title="Direct link to SAP Developer Community Age Distribution" href="http://localhost:3000/external-report-2024#sap-developer-community-age-distribution" target="_blank" rel="noopener nofollow noreferrer"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2024-04-29 at 9.21.32 AM.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103340iE5721F4CC4CA9D34/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2024-04-29 at 9.21.32 AM.png" alt="Screenshot 2024-04-29 at 9.21.32 AM.png" /></span>​</A></H4><P>There is a modest decrease this year in the two eldest age categories. There is a corresponding increase in the 35-44 bucket. We cannot produce an accurate median age from the way that we currently gather this information.</P><H2 id="toc-hId--185515627">Part II. Narrowing the Response Set<A class="" title="Direct link to Part II. Narrowing the Response Set" href="http://localhost:3000/external-report-2024#part-ii-narrowing-the-response-set" target="_blank" rel="noopener nofollow noreferrer">​</A></H2><P>A primary objective of our survey is to build a model of our community's usage patterns. It helps us build more effective programs. With that goal in mind, in the remainder of the report we will narrow the data we'll consider in these ways:</P><UL><LI><STRONG><EM>External Developers Only</EM></STRONG><SPAN>&nbsp;</SPAN>- we exclude responses from SAP employees, and others (students, analysts, etc.)</LI><LI><STRONG><EM>Recent Development Experience</EM></STRONG><SPAN>&nbsp;</SPAN>- we only include responses from those who stated that they had been part of an SAP extension or integration project within the past year</LI></UL><H4 id="toc-hId--123863694">&nbsp;</H4><H4 id="toc-hId--320377199">Workplace and Trends</H4><H4 id="toc-hId--516890704"><A class="" title="Direct link to Workplace and Trends" href="http://localhost:3000/external-report-2024#workplace-and-trends" target="_blank" rel="noopener nofollow noreferrer">​</A></H4><DIV class=""><DIV><DIV class=""><DIV><STRONG>Office Location</STRONG></DIV><DIV><SPAN class=""><EM>"As of right now, where do you primarily physically work from?"</EM></SPAN>&nbsp;&nbsp;</DIV><DIV><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2024-04-29 at 9.51.55 AM.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103357iA14C01687B19DD4B/image-size/medium?v=v2&amp;px=400" role="button" title="Screenshot 2024-04-29 at 9.51.55 AM.png" alt="Screenshot 2024-04-29 at 9.51.55 AM.png" /></span></DIV></DIV></DIV></DIV><DIV><DIV class=""><DIV><STRONG>Year-to-year trend in Workplace</STRONG></DIV></DIV></DIV></DIV><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2024-04-29 at 9.52.07 AM.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103358i6670F6C992E41F11/image-size/medium?v=v2&amp;px=400" role="button" title="Screenshot 2024-04-29 at 9.52.07 AM.png" alt="Screenshot 2024-04-29 at 9.52.07 AM.png" /></span></P><P>This shows a slowing trend of employees moving back to conventional offices from home. From a past Developer Survey, 29% of respondents reported they had primarily worked at home prior to the pandemic.</P><H3 id="toc-hId--917718297">Where are the Developers?<A class="" title="Direct link to Where are the Developers?" href="http://localhost:3000/external-report-2024#where-are-the-developers" target="_blank" rel="noopener nofollow noreferrer">​</A></H3><P>We asked,<SPAN>&nbsp;</SPAN><EM>"Which country are you based in?"</EM></P><TABLE><TBODY><TR><TD><DIV><DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2024-04-29 at 9.26.14 AM.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103341i8D4C04C15020E40F/image-size/medium?v=v2&amp;px=400" role="button" title="Screenshot 2024-04-29 at 9.26.14 AM.png" alt="Screenshot 2024-04-29 at 9.26.14 AM.png" /></span></DIV><DIV>&nbsp;</DIV></DIV></TD><TD>Respondent Count <TABLE><TBODY><TR><TD width="73.2422px" height="30px"><STRONG>Position</STRONG></TD><TD width="121.539px" height="30px"><STRONG>Country</STRONG></TD></TR><TR><TD width="73.2422px" height="30px">1</TD><TD width="121.539px" height="30px">India</TD><TD width="40px" height="30px">108</TD></TR><TR><TD width="73.2422px" height="30px">2</TD><TD width="121.539px" height="30px">Germany</TD><TD width="40px" height="30px">93</TD></TR><TR><TD width="73.2422px" height="30px">3</TD><TD width="121.539px" height="30px">United States</TD><TD width="40px" height="30px">29</TD></TR><TR><TD width="73.2422px" height="30px">4</TD><TD width="121.539px" height="30px">Turkey</TD><TD width="40px" height="30px">18</TD></TR><TR><TD width="73.2422px" height="30px">5</TD><TD width="121.539px" height="30px">Australia</TD><TD width="40px" height="30px">16</TD></TR><TR><TD width="73.2422px" height="30px">6</TD><TD width="121.539px" height="30px">Spain</TD><TD width="40px" height="30px">15</TD></TR><TR><TD width="73.2422px" height="30px">7</TD><TD width="121.539px" height="30px">Canada</TD><TD width="40px" height="30px">12</TD></TR><TR><TD width="73.2422px" height="30px">8</TD><TD width="121.539px" height="30px">Italy</TD><TD width="40px" height="30px">8</TD></TR><TR><TD width="73.2422px" height="30px">9</TD><TD width="121.539px" height="30px">Brazil</TD><TD width="40px" height="30px">7</TD></TR><TR><TD width="73.2422px" height="30px">10</TD><TD width="121.539px" height="30px">Denmark</TD><TD width="40px" height="30px">7</TD></TR><TR><TD width="73.2422px" height="30px">11</TD><TD width="121.539px" height="30px">Mexico</TD><TD width="40px" height="30px">7</TD></TR><TR><TD width="73.2422px" height="30px">12</TD><TD width="121.539px" height="30px">Switzerland</TD><TD width="40px" height="30px">6</TD></TR><TR><TD width="73.2422px" height="30px">13</TD><TD width="121.539px" height="30px">Austria</TD><TD width="40px" height="30px">6</TD></TR><TR><TD width="73.2422px" height="30px">14</TD><TD width="121.539px" height="30px">Chile</TD><TD width="40px" height="30px">5</TD></TR><TR><TD width="73.2422px" height="30px">15</TD><TD width="121.539px" height="30px">Czech Republic</TD><TD width="40px" height="30px">5</TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2024-04-29 at 9.22.36 AM.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103343i0F5B275922F1F0B8/image-size/medium?v=v2&amp;px=400" role="button" title="Screenshot 2024-04-29 at 9.22.36 AM.png" alt="Screenshot 2024-04-29 at 9.22.36 AM.png" /></span></P><P>By country, India has the largest number of respondents and probably the densest geographic concentration, followed by Germany, and then the USA. When grouped by SAP region, however, EMEA North is largest.</P><H3 id="toc-hId--1114231802">Development Job Roles<A class="" title="Direct link to Development Job Roles" href="http://localhost:3000/external-report-2024#development-job-roles" target="_blank" rel="noopener nofollow noreferrer">​</A></H3><P>We asked respondents which common development-related roles they perform.</P><P><EM>"Which roles describe your day-to-day work? (Select all that apply)"</EM></P><DIV class=""><DIV><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2024-04-29 at 9.29.13 AM.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103347i69B12D2BC8DD4E6D/image-size/medium?v=v2&amp;px=400" role="button" title="Screenshot 2024-04-29 at 9.29.13 AM.png" alt="Screenshot 2024-04-29 at 9.29.13 AM.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2024-04-29 at 9.19.53 AM.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103348iECF9B5F39EE3F658/image-size/medium?v=v2&amp;px=400" role="button" title="Screenshot 2024-04-29 at 9.19.53 AM.png" alt="Screenshot 2024-04-29 at 9.19.53 AM.png" /></span></DIV></DIV></DIV><P>Respondents often "wear multiple hats" in their job. This question is asked in "select all that apply" form to capture that information.<BR />The Venn diagram on the right depicts the relative overlaps of the top seven roles reported by respondents. The area of each overlapping region reflects the count respondents performing the overlapping roles. For example, from this we can seel that all (UX) "Designers" are also "Developers". Most but not quite all "Enterprise Architects" also are "Solution Architects".</P><P>It is unsurprising that the "Developer" role leads. Architecture roles as a group have increased each year. Solution/Application developer shows roughly a ten percent increase, year to year. This probably corresponds to SAP Developers' steady move to the Cloud -- cloud extensibility offers more choices in solving a given business problem, and Solution Architects are the role responsible most often for making such decisions.</P><H3 id="toc-hId--1310745307">Development Domains<A class="" title="Direct link to Development Domains" href="http://localhost:3000/external-report-2024#development-domains" target="_blank" rel="noopener nofollow noreferrer">​</A></H3><P>For respondents selecting "Developer" as one of their roles, we were interested in the specific application domains they work in:</P><P><EM>"Which of the following development domains describe your day-to-day work? (select all that apply)"</EM></P><P><EM><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2024-04-29 at 9.31.33 AM.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103349iA12A0A9A72A0B502/image-size/medium?v=v2&amp;px=400" role="button" title="Screenshot 2024-04-29 at 9.31.33 AM.png" alt="Screenshot 2024-04-29 at 9.31.33 AM.png" /></span></EM></P><P>Year to year, Integration came in higher than we expected. Mobile web front-end development is more common than native mobile application development. This isn't completely unexpected, but worth noting.</P><H3 id="toc-hId--1507258812">Recent SAP Project Experience?<A class="" title="Direct link to Recent SAP Project Experience?" href="http://localhost:3000/external-report-2024#recent-sap-project-experience" target="_blank" rel="noopener nofollow noreferrer">​</A></H3><DIV class=""><DIV><SPAN class=""><EM>"Have you developed integrations or extensions for any SAP products or technologies in the past 12 months?"</EM></SPAN>&nbsp;&nbsp;</DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2024-04-29 at 9.32.26 AM.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103350i1102344E36BCC227/image-size/medium?v=v2&amp;px=400" role="button" title="Screenshot 2024-04-29 at 9.32.26 AM.png" alt="Screenshot 2024-04-29 at 9.32.26 AM.png" /></span></DIV><P>Extension and Integration are key scenarios for developers working with SAP applications. We wanted to focus on developers with recent experience in these areas. Roughly 70% of developers answered "Yes" here.</P><H3 id="toc-hId--1703772317">Popular Programming Languages<A class="" title="Direct link to Popular Programming Languages" href="http://localhost:3000/external-report-2024#popular-programming-languages" target="_blank" rel="noopener nofollow noreferrer">​</A></H3><P><EM>"Which programming languages have you used in your development work over the past 12 months? Please select all that apply."</EM></P><P><EM><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2024-04-29 at 9.32.39 AM.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103351i2A44BEDB17230F5F/image-size/medium?v=v2&amp;px=400" role="button" title="Screenshot 2024-04-29 at 9.32.39 AM.png" alt="Screenshot 2024-04-29 at 9.32.39 AM.png" /></span></EM></P><P>This was posed as a multiple response question. ABAP dominates, as it has in every year of our survey. JavaScript is very popular as well, which could be attributed to its use in both SAPUI5 and CAP. Java and Python are roughly tied for third place. The relative positions of these top four languages hasn't changed much, year to year.</P><P>We extended our survey beyond just language use to ask about popular frameworks.</P><H3 id="toc-hId--1900285822">Popular Programming Frameworks<A class="" title="Direct link to Popular Programming Frameworks" href="http://localhost:3000/external-report-2024#popular-programming-frameworks" target="_blank" rel="noopener nofollow noreferrer">​</A></H3><P>We asked respondents who are Developers to pick which common front and back-end frameworks they have worked with in the past year.</P><DIV class=""><DIV><DIV class=""><DIV><STRONG>Front-Ends</STRONG></DIV><DIV><STRONG><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2024-04-29 at 9.34.53 AM.png" style="width: 392px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103352iEF154825D0915944/image-size/medium?v=v2&amp;px=400" role="button" title="Screenshot 2024-04-29 at 9.34.53 AM.png" alt="Screenshot 2024-04-29 at 9.34.53 AM.png" /></span></STRONG></DIV></DIV></DIV><DIV><DIV class=""><DIV><STRONG>Back-Ends</STRONG></DIV><DIV><STRONG><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2024-04-29 at 9.35.01 AM.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103353i9376EA891FC9215A/image-size/medium?v=v2&amp;px=400" role="button" title="Screenshot 2024-04-29 at 9.35.01 AM.png" alt="Screenshot 2024-04-29 at 9.35.01 AM.png" /></span></STRONG></DIV></DIV></DIV></DIV><H3 id="toc-hId--2096799327">Application and Business Technology Platform Architectures<A class="" title="Direct link to Application and Business Technology Platform Architectures" href="http://localhost:3000/external-report-2024#application-and-business-technology-platform-architectures" target="_blank" rel="noopener nofollow noreferrer">​</A></H3><P>SAP applications can be extended using any one of several architectural approaches. These can be grouped into two major classes: on-stack (in-app) and side-by-side (essentially, BTP-based).</P><P>We were wondering which approaches are most popular.</P><DIV class=""><DIV><STRONG>Popular Extension Architectures</STRONG></DIV><DIV><SPAN class=""><EM>"For the most recent extension project that you were part of, what was the principal runtime architecture of the back-end elements?"</EM></SPAN>&nbsp;</DIV><DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2024-04-29 at 10.01.23 AM.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103361iA11646F6EA58D686/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2024-04-29 at 10.01.23 AM.png" alt="Screenshot 2024-04-29 at 10.01.23 AM.png" /></span></DIV></DIV><P>We don't distinguish between newer and older applications (e.g., S/4HANA vs. ECC) -- this likely explains the dominance of "on-stack ABAP". Aside from the obvious dominance of ABAP, we can also see that CAP is relatively popular. We also, somewhat unexpectedly, see that Low Code/No Code products like Build Apps and Build Process Automation have quickly grown in popularity -- this question is asking about real production projects, and seeing those two account for roughly 10% is an interesting surprise. Basically, they have only been available in the last year.</P><P>ABAP and CAP both have style or language variants in their respective frameworks.<BR />ABAP can be programmed as "ABAP for Cloud Development" or "ABAP Standard". CAP is available in JavaScript or Java language variants.<BR />Where the respondent selected ABAP or CAP, we asked about the variant used on the project:</P><P>&nbsp;</P><DIV class=""><DIV><DIV class=""><DIV><STRONG>ABAP Variants</STRONG></DIV><DIV><STRONG><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2024-04-29 at 11.00.09 AM.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103389iBBAE6C4387EEFF50/image-size/medium?v=v2&amp;px=400" role="button" title="Screenshot 2024-04-29 at 11.00.09 AM.png" alt="Screenshot 2024-04-29 at 11.00.09 AM.png" /></span></STRONG></DIV><DIV>&nbsp;</DIV></DIV></DIV><DIV><DIV class=""><DIV><STRONG>CAP Variants</STRONG></DIV><DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2024-04-29 at 11.00.15 AM.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103390i16EBFE0C62C4A721/image-size/medium?v=v2&amp;px=400" role="button" title="Screenshot 2024-04-29 at 11.00.15 AM.png" alt="Screenshot 2024-04-29 at 11.00.15 AM.png" /></span></DIV><DIV><SPAN>The roughly 50-50 breakdown of ABAP styles is consistent with responses elsewhere in the survey. It reflects that roughly half of the ABAP projects are ECC or very early forms of S/4HANA.</SPAN></DIV></DIV></DIV></DIV><P>CAP/JavaScript if plainly most popular for CAP projects. It was curious that CAP/Java wasn't used all by itself and this gave us pause to go look at the data carefully. Recall that these results apply to external SAP Developers only. When we consider SAP employees as well, we do see projects that are CAP/Java-only. We have no explanation for why external developers might use both concurrently on a project. That's something maybe for follow-up investigation.</P><H3 id="toc-hId-2001654464">Popular IDEs<A class="" title="Direct link to Popular IDEs" href="http://localhost:3000/external-report-2024#popular-ides" target="_blank" rel="noopener nofollow noreferrer">​</A></H3><P>We are always curious about general work patterns of developers. We asked about developer's most commonly used editors. While it would be difficult in such a survey of all developers to add many questions, we were particularly curious about most popular IDE or editor.</P><DIV class=""><DIV><STRONG>Preferred IDE or Editor</STRONG></DIV><DIV><SPAN class=""><EM>"Which IDE or text editor do you most commonly use for development tasks?"</EM></SPAN>&nbsp;&nbsp;</DIV><DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2024-04-29 at 11.03.20 AM.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103391iD6CAF879B519E261/image-size/medium?v=v2&amp;px=400" role="button" title="Screenshot 2024-04-29 at 11.03.20 AM.png" alt="Screenshot 2024-04-29 at 11.03.20 AM.png" /></span></DIV></DIV><P>The editor of choice will depend on the language. For example, BAS does not currently support ABAP. This might contribute to its relatively low preference. At the same time, SAP GUI and -- arguably -- Eclipse are the primary editors for ABAP, so it's maybe no surprise that they are reflected as most popular. As a follow-on, we might look at the editor choices here for CAP/JS, CAP/Java, and ABAP developers separately.</P><H3 id="toc-hId-1805140959">Potential / Use of Generative AI for Developers<A class="" title="Direct link to Potential / Use of Generative AI for Developers" href="http://localhost:3000/external-report-2024#potential--use-of-generative-ai-for-developers" target="_blank" rel="noopener nofollow noreferrer">​</A></H3><DIV class=""><DIV><STRONG>Generative AI for Developers</STRONG></DIV><DIV><SPAN class=""><EM>"Generative AI (GenAI) has been an exciting topic for developers in 2023. Looking forward, which of these GenAI capabilities do you expect will be useful in your work? Select the choice that best describes your interest or use for each technology area."</EM></SPAN>&nbsp;&nbsp;</DIV><DIV><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Screenshot 2024-04-29 at 11.13.47 AM.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103392iCF46267675880DF3/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2024-04-29 at 11.13.47 AM.png" alt="Screenshot 2024-04-29 at 11.13.47 AM.png" /></span></DIV></DIV><P>As these capabilities were not generally available in SAP products at the time of the survey, we posed a series of questions intended to gauge their interest in particular features that might be based on Generative AI technologies. Since one or more of these features might be available in non-SAP products, we included choices in each category for the respondent to state that they have either evaluated such a capability or are even using it today.</P><P>An brief explanation of each category was included in the survey and is shown below:</P><P><STRONG><EM>Code Generation and Autocompletion:</EM></STRONG><SPAN>&nbsp;</SPAN>GenAI tools can generate code snippets, complete lines of code, or suggest entire functions based on the context provided by the developer.</P><P><STRONG><EM>Bug Detection and Code Review:</EM></STRONG><SPAN>&nbsp;</SPAN>AI models can be trained to identify potential bugs and vulnerabilities in the code. They can also suggest improvements in code quality, best practices, and code consistency.</P><P><STRONG><EM>Automated Testing and Test Data Generation:</EM></STRONG><SPAN>&nbsp;</SPAN>GenAI can be used to create test cases, which can help in thoroughly testing software applications. This includes generating test data that covers edge cases, potentially reducing the time and effort in manual testing.</P><P><STRONG><EM>Documentation Generation:</EM></STRONG><SPAN>&nbsp;</SPAN>AI can assist in generating and updating technical documentation. It can interpret the code and create comprehensive documentation, which is crucial for maintaining and scaling software projects.</P><P><STRONG><EM>Natural Language Processing (NLP) for Code:</EM></STRONG><SPAN>&nbsp;</SPAN>AI models can translate natural language queries into code, allowing developers to express their intent in plain language. This can be particularly helpful for novice developers working with unfamiliar frameworks.</P><P><STRONG><EM>Customized User Experience Design:</EM></STRONG><SPAN>&nbsp;</SPAN>AI can help generate user interface designs to enhance user experience.</P><P><STRONG><EM>AI-Powered Development Tools:</EM></STRONG><SPAN>&nbsp;</SPAN>Integration of AI in IDEs for real-time assistance, such as suggesting optimizations, refactoring code, or even predicting the next steps in development.</P><P><STRONG><EM>Automated Code Refactoring:</EM></STRONG><SPAN>&nbsp;</SPAN>AI can assist in code refactoring by suggesting or even implementing improvements in code structure.</P><P><STRONG><EM>Software Design and Architecture:</EM></STRONG><SPAN>&nbsp;</SPAN>AI can help in generating software design patterns or architectural models based on specified requirements. This can speed up the initial stages of development and ensure adherence to best practices.</P><P><STRONG><EM>Enhanced Security Protocols:</EM></STRONG><SPAN>&nbsp;</SPAN>Generative AI can be used to develop advanced security protocols and encryption methods, providing robust security solutions in software applications.</P><H3 id="toc-hId-1608627454">Use of Select SAP Technologies<A class="" title="Direct link to Use of Select SAP Technologies" href="http://localhost:3000/external-report-2024#use-of-select-sap-technologies" target="_blank" rel="noopener nofollow noreferrer">​</A></H3><P>In past surveys we asked questions around the awareness and use of select SAP technologies. The list changes year to year. This year we asked more specific questions elsewhere, so the list is short.</P><P>&nbsp;</P><DIV class=""><DIV><DIV class=""><DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2024-04-29 at 10.04.29 AM.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103362i6626C8292B9E2F6C/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2024-04-29 at 10.04.29 AM.png" alt="Screenshot 2024-04-29 at 10.04.29 AM.png" /></span></DIV></DIV></DIV><DIV><DIV class="">&nbsp;</DIV></DIV></DIV><H3 id="toc-hId-1580297640">Developer Satisfaction with SAP<A class="" title="Direct link to Developer Satisfaction with SAP" href="http://localhost:3000/external-report-2024#developer-satisfaction-with-sap" target="_blank" rel="noopener nofollow noreferrer">​</A></H3><DIV class=""><DIV><STRONG>SAP Development Satisfaction</STRONG></DIV><DIV><SPAN class=""><EM>"For your recent experience developing an integration or extension, how would you describe your overall satisfaction with SAP?"</EM></SPAN>&nbsp;&nbsp;</DIV><DIV>&nbsp;</DIV><DIV><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Screenshot 2024-04-29 at 10.05.40 AM.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103363i9DAE6E2144960CCD/image-size/medium?v=v2&amp;px=400" role="button" title="Screenshot 2024-04-29 at 10.05.40 AM.png" alt="Screenshot 2024-04-29 at 10.05.40 AM.png" /></span></DIV></DIV><P>Roughly 70% of respondents report they are “very satisfied” or “satisfied” with their development work with SAP. This is down from 75% reported in 2023 -- a lower number, but just within the margin of error for responses to this question.</P><H3 id="toc-hId-1383784135">BTP Developers Guide<A class="" title="Direct link to BTP Developers Guide" href="http://localhost:3000/external-report-2024#btp-developers-guide" target="_blank" rel="noopener nofollow noreferrer">​</A></H3><DIV class=""><DIV><STRONG>Awareness and Use of the BTP Developers Guide</STRONG></DIV><DIV><SPAN class=""><EM>"A new BTP Developers Guide was announced at SAP’s TechEd this past November. Which statement best described your level of familiarity with this document?"</EM></SPAN>&nbsp;&nbsp;</DIV><DIV><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Screenshot 2024-04-29 at 11.14.56 AM.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103393iA7C780D234C02B44/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2024-04-29 at 11.14.56 AM.png" alt="Screenshot 2024-04-29 at 11.14.56 AM.png" /></span><P>&nbsp;<SPAN>Nearly half of respondents were unaware of this document's release. Raising awareness for this and other related BTP framework documents would be a good goal for 2024.</SPAN></P></DIV></DIV><H3 id="toc-hId-1187270630">Cloud Insights<A class="" title="Direct link to Cloud Insights" href="http://localhost:3000/external-report-2024#cloud-insights" target="_blank" rel="noopener nofollow noreferrer">​</A></H3><P>We first asked respondents if they used any cloud providers for their projects. For those that answered, "yes", we asked about the use of several major providers, including SAP BTP. We also asked if their use included SAP or non-SAP projects. This information was condensed into a chart depicting the relative use of each cloud provider.</P><P>Similar to the earlier questions around BTP Environments, these numbers do not reflect a tally of projects for each platform - instead it reflects developer exposure to each.</P><P>&nbsp;</P><DIV><STRONG>Using Cloud Providers?</STRONG></DIV><DIV><SPAN class=""><EM>"Are you using any cloud providers for your development projects?"</EM></SPAN>&nbsp;&nbsp;</DIV><DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2024-04-29 at 12.58.14 PM.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103442iFB80C36035EB3C8F/image-size/medium?v=v2&amp;px=400" role="button" title="Screenshot 2024-04-29 at 12.58.14 PM.png" alt="Screenshot 2024-04-29 at 12.58.14 PM.png" /></span></DIV><DIV>We asked, "Which cloud providers are you using for development projects?" and we asked in a way to separate SAP-related projects from more general use.</DIV><P>&nbsp;</P><DIV class=""><DIV><DIV class=""><DIV><STRONG>SAP Business Technology Platform</STRONG></DIV><DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2024-04-29 at 1.02.54 PM.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103444i24F20391DBE2067F/image-size/medium?v=v2&amp;px=400" role="button" title="Screenshot 2024-04-29 at 1.02.54 PM.png" alt="Screenshot 2024-04-29 at 1.02.54 PM.png" /></span></DIV></DIV></DIV><DIV><DIV class=""><DIV><STRONG>Microsoft Azure</STRONG></DIV><DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2024-04-29 at 1.03.46 PM.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103445i7D7F1A44A532D164/image-size/medium?v=v2&amp;px=400" role="button" title="Screenshot 2024-04-29 at 1.03.46 PM.png" alt="Screenshot 2024-04-29 at 1.03.46 PM.png" /></span></DIV></DIV></DIV><DIV><DIV class=""><DIV><STRONG>Amazon Web Services</STRONG></DIV><DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2024-04-29 at 1.04.27 PM.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103446iA5BAC3144C450C45/image-size/medium?v=v2&amp;px=400" role="button" title="Screenshot 2024-04-29 at 1.04.27 PM.png" alt="Screenshot 2024-04-29 at 1.04.27 PM.png" /></span></DIV></DIV></DIV><DIV><DIV class=""><DIV><STRONG>Google Cloud Platform</STRONG></DIV><DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2024-04-29 at 1.05.23 PM.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103447iF0517BE80CBBAE2B/image-size/medium?v=v2&amp;px=400" role="button" title="Screenshot 2024-04-29 at 1.05.23 PM.png" alt="Screenshot 2024-04-29 at 1.05.23 PM.png" /></span></DIV></DIV></DIV><DIV><DIV class=""><DIV><STRONG>Alibaba Cloud</STRONG></DIV><DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2024-04-29 at 1.06.00 PM.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103448iF5892AE27808E66E/image-size/medium?v=v2&amp;px=400" role="button" title="Screenshot 2024-04-29 at 1.06.00 PM.png" alt="Screenshot 2024-04-29 at 1.06.00 PM.png" /></span></DIV></DIV></DIV></DIV><H3 id="toc-hId-990757125">Low / No Code Tools<A class="" title="Direct link to Low / No Code Tools" href="http://localhost:3000/external-report-2024#low--no-code-tools" target="_blank" rel="noopener nofollow noreferrer">​</A></H3><P>This is the third consecutive year in which we've asked questions around Low Code and No Code products. The list was composed of leaders in the Gartner LCNC Magic Quadrant Report and select SAP products. SAP Process Automation -- now Build Process Automation -- was not yet announced at the time of the 2022 survey, so it only appears in the more recent data.</P><P>For each product, we asked respondents to select the most applicable category reflecting their awareness or use of the product (e.g., "I am aware of the product", "We plan to use the product", "We are currently using the product in production", ...). We normalized the tallies for each year to adjust for the annual variation in overall survey response counts. We then filtered down to just examine productive use:</P><P style=" padding-left : 30px; ">&nbsp;</P><TABLE><TBODY><TR><TD><STRONG>Productive use of Product</STRONG></TD><TD><STRONG>2022</STRONG></TD><TD><STRONG>2023</STRONG></TD><TD><STRONG>2024</STRONG></TD></TR><TR><TD>Vendor A</TD><TD>36%</TD><TD>33%</TD><TD>28%</TD></TR><TR><TD>SAP Build Process Automation</TD><TD>0%</TD><TD>8%</TD><TD>22%</TD></TR><TR><TD>SAP Build Apps</TD><TD>4%</TD><TD>14%</TD><TD>20%</TD></TR><TR><TD>Vendor B</TD><TD>24%</TD><TD>19%</TD><TD>13%</TD></TR><TR><TD>SAP Signavio</TD><TD>9%</TD><TD>10%</TD><TD>8%</TD></TR><TR><TD>Vendor C</TD><TD>12%</TD><TD>8%</TD><TD>5%</TD></TR><TR><TD>Vendor D</TD><TD>4%</TD><TD>2%</TD><TD>2%</TD></TR><TR><TD>Vendor E</TD><TD>5%</TD><TD>3%</TD><TD>1%</TD></TR><TR><TD>Vendor F</TD><TD>5%</TD><TD>3%</TD><TD>1%</TD></TR></TBODY></TABLE><H3 id="toc-hId-794243620">&nbsp;</H3><H3 id="toc-hId-597730115">Learning and Help Resources<A class="" title="Direct link to Learning and Help Resources" href="http://localhost:3000/external-report-2024#learning-and-help-resources" target="_blank" rel="noopener nofollow noreferrer">​</A></H3><P style=" padding-left : 30px; ">We were interested in preferences in the format or media type of learning resources by respondents.</P><DIV style=" padding-left : 30px; "><DIV style=" padding-left : 30px; "><STRONG>Preferred General Technical Resources</STRONG></DIV><DIV style=" padding-left : 30px; "><SPAN class=""><EM>"When learning new skills or technical subjects over the past 12 months, what resources did you tend use the most? Please select up to three resources."</EM></SPAN>&nbsp;&nbsp;</DIV><DIV style=" padding-left : 30px; "><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Screenshot 2024-04-29 at 1.06.45 PM.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103451i0E97003DC560D8B6/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2024-04-29 at 1.06.45 PM.png" alt="Screenshot 2024-04-29 at 1.06.45 PM.png" /></span></DIV></DIV><P style=" padding-left : 30px; ">On the topic of Help, we shifted in this next question from formats to specific web sites.</P><P style=" padding-left : 30px; ">&nbsp;</P><DIV style=" padding-left : 30px; "><DIV style=" padding-left : 30px; "><STRONG>Top SAP Help Resource Sites</STRONG></DIV><DIV style=" padding-left : 30px; "><SPAN class=""><EM>"What is your preferred resource if you need help, or have a challenge with the SAP technology / tool you are working with?<SPAN>&nbsp;</SPAN>"</EM></SPAN>&nbsp;&nbsp;</DIV><DIV style=" padding-left : 30px; "><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Screenshot 2024-04-29 at 1.08.00 PM.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103452i7758BC61B49EBCB5/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2024-04-29 at 1.08.00 PM.png" alt="Screenshot 2024-04-29 at 1.08.00 PM.png" /></span></DIV></DIV><P style=" padding-left : 30px; ">Almost sixty percent of respondents say they use organic search or SAP Community as their primary source of SAP help. This is consistent with past years. This continues to demonstrate good visibility of the Community site overall and likely speaks well for the usefulness of the site content.</P><P style=" padding-left : 30px; ">&nbsp;</P><DIV style=" padding-left : 30px; "><DIV style=" padding-left : 30px; "><DIV style=" padding-left : 30px; "><DIV style=" padding-left : 30px; "><STRONG>SAP Learning Hub Subscribers</STRONG></DIV><DIV style=" padding-left : 30px; "><SPAN class=""><EM>"Do you have a subscription to SAP Learning Hub?"</EM></SPAN>&nbsp;&nbsp;</DIV><DIV style=" padding-left : 30px; "><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2024-04-29 at 1.08.58 PM.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103453iCB838C1F5CEFF9CB/image-size/medium?v=v2&amp;px=400" role="button" title="Screenshot 2024-04-29 at 1.08.58 PM.png" alt="Screenshot 2024-04-29 at 1.08.58 PM.png" /></span></DIV></DIV></DIV><DIV style=" padding-left : 30px; "><DIV style=" padding-left : 30px; "><DIV style=" padding-left : 30px; "><STRONG>Technical Certifications</STRONG></DIV><DIV style=" padding-left : 30px; "><SPAN class=""><EM>"How many technology-related certification programs have you completed within the past four years?"</EM></SPAN>&nbsp;&nbsp;</DIV><DIV style=" padding-left : 30px; "><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2024-04-29 at 1.10.28 PM.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103454iD4640D1951B738CA/image-size/medium?v=v2&amp;px=400" role="button" title="Screenshot 2024-04-29 at 1.10.28 PM.png" alt="Screenshot 2024-04-29 at 1.10.28 PM.png" /></span></DIV></DIV></DIV></DIV><H3 id="toc-hId-401216610">Satisfaction with SAP Learning Hub<A class="" title="Direct link to Satistaction with SAP Learning Hub" href="http://localhost:3000/external-report-2024#satistaction-with-sap-learning-hub" target="_blank" rel="noopener nofollow noreferrer">​</A></H3><DIV style=" padding-left : 30px; "><DIV style=" padding-left : 30px; "><STRONG>Overall Learning Hub Satisfaction</STRONG></DIV><DIV style=" padding-left : 30px; "><SPAN class=""><EM>"How would you describe your overall satisfaction with SAP Learning Hub?"</EM></SPAN>&nbsp;&nbsp;</DIV><DIV style=" padding-left : 30px; "><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2024-04-29 at 1.11.08 PM.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103455iCDC2AFF1B0B46B48/image-size/medium?v=v2&amp;px=400" role="button" title="Screenshot 2024-04-29 at 1.11.08 PM.png" alt="Screenshot 2024-04-29 at 1.11.08 PM.png" /></span></DIV></DIV><H2 id="toc-hId-498106112">Survey Methodology<A class="" title="Direct link to Survey Methodology" href="http://localhost:3000/external-report-2024#survey-methodology" target="_blank" rel="noopener nofollow noreferrer">​</A></H2><P style=" padding-left : 30px; ">This report is based on a Qualtrics web-based survey of 979 respondents from 56 countries. The survey ran for six calendar weeks between January 15th and March 1st, 2024. Ninety percent of the respondents invested ten minutes or less with the survey.</P><P style=" padding-left : 30px; ">The survey was promoted via the SAP Community website and the SAP Developer Center, sap.com pop-up intercepts, social media posts.</P><H4 id="toc-hId--285213407">Other References<A class="" title="Direct link to Other References" href="http://localhost:3000/external-report-2024#other-references" target="_blank" rel="noopener nofollow noreferrer">​</A></H4><P style=" padding-left : 30px; ">The annual<SPAN>&nbsp;</SPAN><A href="https://survey.stackoverflow.co/2023/" target="_blank" rel="noopener noreferrer nofollow">Stack Overflow Developer Survey</A><SPAN>&nbsp;</SPAN>is an excellent (and no-cost) reference for industry-wide habits of developers.</P> 2024-04-30T03:48:33.552000+02:00 https://community.sap.com/t5/application-development-blog-posts/creation-of-odata-service-with-implementation-of-crud-methods-and-deep/ba-p/13685666 Creation of OData service with implementation of CRUD methods and `deep insert` method from scratch 2024-05-03T08:33:54.245000+02:00 lukcad https://community.sap.com/t5/user/viewprofilepage/user-id/888780 <P><STRONG>Overview</STRONG></P><P><STRONG>-- Goal: </STRONG></P><P>Using SAP instance with SAP NW 7.40 or higher without RAP and without BOPF be able to create OData service upon business data model with these specific requirements:</P><P>- inserting of main business record support deep inserting (we save main record of main entity and all enclosed records in child entity)</P><P>- all CRUD methods of modification records for entities should be supported .</P><P>- code after regenerating OData service after adding of new changes is under control of developer via implemented overridden methods.</P><P><STRONG>-- Considered model:</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="lukcad_0-1714379019619.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103015i554C30430D128FF4/image-size/large?v=v2&amp;px=999" role="button" title="lukcad_0-1714379019619.png" alt="lukcad_0-1714379019619.png" /></span></P><P><STRONG>-- Main steps of implementation:</STRONG></P><P>Using Eclipse + ADT you will go through this main steps and with all necessary code:</P><P>1-- Prepare data model with data</P><P>2-- Create project for OData service</P><P>3-- Add data model and generate service</P><P>4-- Register service and do initial test</P><P>5-- Implementation of `deep insert` MODEL via override</P><P>6-- Implementation of entity modification methods</P><P>7-- Implementation of OData CRUD methods using override</P><P>8-- Testing CRUD methods by SAP Gateway Client</P><P>9-- Verification of achieved code</P><P><STRONG>-- As result of you will have:</STRONG></P><P>-- Transportable package ZMLODATA which includes:</P><P>-- Data model with samples of data</P><P>-- OData service ZML_TRAVELLING_ODT</P><P>-- Classes where _EXT implementation decupled from regenerating process of OData service</P><P>Package ZMLODATA will contain these files:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="lukcad_1-1714379019620.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103016iC4AD829F8CA20943/image-size/large?v=v2&amp;px=999" role="button" title="lukcad_1-1714379019620.png" alt="lukcad_1-1714379019620.png" /></span></P><P>Service Project `ZML_TRAVELLING_ODT` will be like this one:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="lukcad_2-1714379019622.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103017i991F516D7EAAC659/image-size/large?v=v2&amp;px=999" role="button" title="lukcad_2-1714379019622.png" alt="lukcad_2-1714379019622.png" /></span></P><P><STRONG>Process of implementation</STRONG></P><P><STRONG>1-- Prepare data model with data</STRONG></P><P>1--1-- create package ZMLODATA</P><P>1--2-- create data elements in package</P><P>&nbsp;</P><TABLE><TBODY><TR><TD><P>ZMLNAME</P></TD><TD><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="lukcad_3-1714379019623.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103020iE2434676C7EDBE35/image-size/large?v=v2&amp;px=999" role="button" title="lukcad_3-1714379019623.png" alt="lukcad_3-1714379019623.png" /></span><P>&nbsp;</P><P>&nbsp;</P></TD></TR><TR><TD><P>ZMLDATEFROM</P></TD><TD><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="lukcad_4-1714379019623.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103018i6D1C52D4440A41A6/image-size/large?v=v2&amp;px=999" role="button" title="lukcad_4-1714379019623.png" alt="lukcad_4-1714379019623.png" /></span><P>&nbsp;</P><P>&nbsp;</P></TD></TR><TR><TD><P>ZMLDATETO</P></TD><TD><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="lukcad_5-1714379019624.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103019i2853B948EE23C7C9/image-size/large?v=v2&amp;px=999" role="button" title="lukcad_5-1714379019624.png" alt="lukcad_5-1714379019624.png" /></span><P>&nbsp;</P><P>&nbsp;</P></TD></TR></TBODY></TABLE><P><STRONG>1--3-- create table ZML_TRAVEL</STRONG></P><P>Using package ZMLODATA you create database table in Eclipse ADT by opening `New ABAP Repository Object` for `Database Table`&nbsp; and using this code definition:</P><P>&nbsp;</P><pre class="lia-code-sample language-abap"><code>@EndUserText.label : 'ZML_TRAVEL' @AbapCatalog.enhancementCategory : #NOT_EXTENSIBLE @AbapCatalog.tableCategory : #TRANSPARENT @AbapCatalog.deliveryClass : #A @AbapCatalog.dataMaintenance : #ALLOWED define table zml_travel { key client : abap.clnt not null; key travel_id : sysuuid_x16 not null; name : zmlname; }</code></pre><P><STRONG>1--4-- create table ZML_BOOKING</STRONG></P><P>You add new Database Table `ZML_BOOKING` by this code into package ZMLODATA:</P><pre class="lia-code-sample language-abap"><code>@EndUserText.label : 'ZML_BOOKING' @AbapCatalog.enhancementCategory : #NOT_EXTENSIBLE @AbapCatalog.tableCategory : #TRANSPARENT @AbapCatalog.deliveryClass : #A @AbapCatalog.dataMaintenance : #ALLOWED define table zml_booking { key client : abap.clnt not null; @AbapCatalog.foreignKey.screenCheck : false key travel_id : sysuuid_x16 not null with foreign key [0..*,1] zml_travel where travel_id = zml_booking.travel_id; key booking_id : sysuuid_x16 not null; hotel : zmlname; dayfrom : zmldatefrom; dayto : zmldateto; }</code></pre><P><STRONG>1--5-- Create Class `zml_gen_data_travels`</STRONG></P><P>In package ZMLODATA you add new ABAP class&nbsp;<STRONG>`zml_gen_data_travels`</STRONG> by this code:&nbsp;</P><pre class="lia-code-sample language-abap"><code>CLASS zml_gen_data_travels DEFINITION PUBLIC FINAL CREATE PUBLIC . PUBLIC SECTION. INTERFACES if_oo_adt_classrun . PROTECTED SECTION. PRIVATE SECTION. ENDCLASS. CLASS zml_gen_data_travels IMPLEMENTATION. METHOD if_oo_adt_classrun~main. DATA it_travel TYPE TABLE OF zml_travel. DATA it_booking TYPE TABLE OF zml_booking. DATA lv_long_time_stamp TYPE timestampl. GET TIME STAMP FIELD lv_long_time_stamp. DATA: l_uuid_x16 TYPE sysuuid_x16. DATA: system_uuid TYPE REF TO if_system_uuid. DATA: oref TYPE REF TO cx_uuid_error. system_uuid = cl_uuid_factory=&gt;create_system_uuid( ). TRY. it_travel = VALUE #( ( client = sy-mandt travel_id = system_uuid-&gt;create_uuid_x16( ) name = 'Travel Minsk - Dubai' ) ( client = sy-mandt travel_id = system_uuid-&gt;create_uuid_x16( ) name = 'Travel Minsk - Moscow' ) ( client = sy-mandt travel_id = system_uuid-&gt;create_uuid_x16( ) name = 'Travel Minsk - Warsaw' ) ( client = sy-mandt travel_id = system_uuid-&gt;create_uuid_x16( ) name = 'Travel Minsk - Dushanbe' ) ( client = sy-mandt travel_id = system_uuid-&gt;create_uuid_x16( ) name = 'Travel Minsk - Batumi' ) ). it_booking = VALUE #( ( client = sy-mandt booking_id = system_uuid-&gt;create_uuid_x16( ) travel_id = it_travel[ name = 'Travel Minsk - Dubai' ]-travel_id dayfrom = '20240101' dayto = '20240104' hotel = 'Amirates Dubai' ) ( client = sy-mandt booking_id = system_uuid-&gt;create_uuid_x16( ) travel_id = it_travel[ name = 'Travel Minsk - Moscow' ]-travel_id dayfrom = '20240105' dayto = '20240107' hotel = 'Marriot' ) ( client = sy-mandt booking_id = system_uuid-&gt;create_uuid_x16( ) travel_id = it_travel[ name = 'Travel Minsk - Warsaw' ]-travel_id dayfrom = '20240108' dayto = '20240114' hotel = 'Outstanding WSW' ) ( client = sy-mandt booking_id = system_uuid-&gt;create_uuid_x16( ) travel_id = it_travel[ name = 'Travel Minsk - Dushanbe' ]-travel_id dayfrom = '20240115' dayto = '20240124' hotel = 'Marriot Hayat' ) ( client = sy-mandt booking_id = system_uuid-&gt;create_uuid_x16( ) travel_id = it_travel[ name = 'Travel Minsk - Batumi' ]-travel_id dayfrom = '20240125' dayto = '20240130' hotel = 'Amber Sea' ) ). out-&gt;write( it_travel ). out-&gt;write( it_booking ). * delete existing entries in the database table DELETE FROM zml_booking. DELETE FROM zml_travel. * insert the new table entries INSERT zml_travel FROM TABLE <a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1442952">@IT</a>_travel. INSERT zml_booking FROM TABLE <a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1442952">@IT</a>_booking. out-&gt;write( |Demo data generated for tables...| ). CATCH cx_uuid_error. "handle exception ENDTRY. ENDMETHOD. ENDCLASS.</code></pre><P><STRONG>1--6-- Run this class by pressing F9</STRONG></P><P>You execute previously created class to add initial records into your data model by pressing F9.</P><P>5 records with travels and 5 records connected to each travel for bookings will be added after executing.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="lukcad_6-1714379019625.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103023iE0F7B036AEF8ECB4/image-size/large?v=v2&amp;px=999" role="button" title="lukcad_6-1714379019625.png" alt="lukcad_6-1714379019625.png" /></span></P><P><STRONG>1--7-- at this moment you should have package with your dictionary and class</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="lukcad_7-1714379019627.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103022i528506E8D85AE55C/image-size/medium?v=v2&amp;px=400" role="button" title="lukcad_7-1714379019627.png" alt="lukcad_7-1714379019627.png" /></span></P><P><STRONG>1--8-- you open data tables by preview of data&nbsp; to find that test records exist:</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="lukcad_8-1714379019628.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103021i011646A5AE2F4111/image-size/large?v=v2&amp;px=999" role="button" title="lukcad_8-1714379019628.png" alt="lukcad_8-1714379019628.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="lukcad_9-1714379019629.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103025i980159BA3FDABE5F/image-size/large?v=v2&amp;px=999" role="button" title="lukcad_9-1714379019629.png" alt="lukcad_9-1714379019629.png" /></span></P><P><STRONG>2-- create project for OData service</STRONG></P><P>You press Alt-F8 and enter and run transaction:&nbsp;<STRONG>SEGW</STRONG></P><P>In opened form you press icon of "Create project"</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="lukcad_10-1714379019629.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103026iA3C1577DC7BEE318/image-size/large?v=v2&amp;px=999" role="button" title="lukcad_10-1714379019629.png" alt="lukcad_10-1714379019629.png" /></span></P><P>You fill in this information on form of creating project:</P><TABLE><TBODY><TR><TD><P>Project</P></TD><TD><P>ZML_TRAVELLING_ODT</P></TD></TR><TR><TD><P>Description</P></TD><TD><P>OData for travelling data</P></TD></TR><TR><TD><P>Package</P></TD><TD><P>ZMLODATA</P></TD></TR></TBODY></TABLE><P>You get a project `ZML_TRAVELLING_ODT` which has initial skeleton without connectivity to your model at this moment:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="lukcad_11-1714379019630.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103024iBA8FC188F2D000BF/image-size/large?v=v2&amp;px=999" role="button" title="lukcad_11-1714379019630.png" alt="lukcad_11-1714379019630.png" /></span></P><P><STRONG>3-- Add data model and generate service</STRONG></P><P>Using project `ZML_TRAVELLING_ODT` you do the next steps to import your entitles of model one by one, make necessary association between entities and generate project.</P><P><STRONG>3--1-- Add Entity Type for ZML_TRAVEL table</STRONG></P><P>Change project `ZML_TRAVELLING_ODT` to Edit mode.</P><P>Using context menu of<STRONG> Data model</STRONG> node you have to choose: Import -&gt; DDIC Stucture</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="lukcad_12-1714379019630.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103027i328AE5AE05C57F8B/image-size/large?v=v2&amp;px=999" role="button" title="lukcad_12-1714379019630.png" alt="lukcad_12-1714379019630.png" /></span></P><P>On first step of import wizard you provide the next information:</P><TABLE><TBODY><TR><TD><P>Name of type which we want create:</P></TD><TD><P>ZML_ITRAVEL</P></TD></TR><TR><TD><P>ABAP Structure (existing our table):</P></TD><TD><P>ZML_TRAVEL</P></TD></TR></TBODY></TABLE><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="lukcad_13-1714379019631.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103028iDA0F53394ED06AAC/image-size/large?v=v2&amp;px=999" role="button" title="lukcad_13-1714379019631.png" alt="lukcad_13-1714379019631.png" /></span></P><P>On second step mark all fields:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="lukcad_14-1714379019631.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103029i4FADEC10D9E6FEE0/image-size/large?v=v2&amp;px=999" role="button" title="lukcad_14-1714379019631.png" alt="lukcad_14-1714379019631.png" /></span></P><P>On third step point the key of your records as TRAVEL_ID</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="lukcad_15-1714379019632.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103032i389438640E4F598D/image-size/large?v=v2&amp;px=999" role="button" title="lukcad_15-1714379019632.png" alt="lukcad_15-1714379019632.png" /></span></P><P>In imported properties provide correctly operations:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="lukcad_16-1714379019632.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103030i3CEB819484666FE8/image-size/large?v=v2&amp;px=999" role="button" title="lukcad_16-1714379019632.png" alt="lukcad_16-1714379019632.png" /></span></P><P>if you open Entity Sets you should be able to find there `ZML_ITRAVELSet`</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="lukcad_17-1714379019633.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103031i5966F73DBCEC1944/image-size/large?v=v2&amp;px=999" role="button" title="lukcad_17-1714379019633.png" alt="lukcad_17-1714379019633.png" /></span></P><P><STRONG>3--2-- Add Entity Type for ZML_BOOKING table</STRONG></P><P>Again, you using context menu of<STRONG> Data model</STRONG> node choose Import -&gt; DDIC Structure to open Wizard of importing.</P><P>On the first step of import wizard you provide:</P><TABLE><TBODY><TR><TD><P>Name of type which we want create:</P></TD><TD><P>ZML_IBOOKING</P></TD></TR><TR><TD><P>ABAP Structure (existing our table):</P></TD><TD><P>ZML_BOOKING</P></TD></TR></TBODY></TABLE><P>On second step of wizard you select all fields of entity.</P><P>And on the 3d&nbsp; step of wizard you point key id BOOKING_ID :</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="lukcad_18-1714379019634.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103033iECE83CFB16A6964B/image-size/large?v=v2&amp;px=999" role="button" title="lukcad_18-1714379019634.png" alt="lukcad_18-1714379019634.png" /></span></P><P><STRONG>3--3-- Add association between ZML_ITRAVEL and ZML_IBOOKING</STRONG></P><P>Using context menu on <STRONG>Association node</STRONG> you choose `Create` to start the wizard of creating association.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="lukcad_19-1714379019635.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103034i990537FBA61CF5F4/image-size/large?v=v2&amp;px=999" role="button" title="lukcad_19-1714379019635.png" alt="lukcad_19-1714379019635.png" /></span></P><P>You should provide these parameters on Step 1 of association wizard:</P><TABLE><TBODY><TR><TD><P>Association Name</P></TD><TD><P>ZML_TRAVEL_TO_BOOKING</P></TD></TR><TR><TD><P>Principal Entity Type Name</P></TD><TD><P>ZML_ITRAVEL</P></TD></TR><TR><TD><P>Principal Cardinality</P></TD><TD><P>1</P></TD></TR><TR><TD><P>Principal Navigation Property</P></TD><TD><P>TO_BOOKING</P></TD></TR><TR><TD><P>Dependent Entity Type Name</P></TD><TD><P>ZML_IBOOKING</P></TD></TR><TR><TD><P>Dependent Cardinality</P></TD><TD><P>0..n</P></TD></TR><TR><TD><P>Dependent Navigation Property</P></TD><TD><P>&nbsp;</P></TD></TR></TBODY></TABLE><P>On Step 2 of wizard association you point principal key TravelId for `Dependent Property`:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="lukcad_20-1714379019635.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103035i2978F2E551CD271F/image-size/large?v=v2&amp;px=999" role="button" title="lukcad_20-1714379019635.png" alt="lukcad_20-1714379019635.png" /></span></P><P>On Step 3 of wizard association you press Finish</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="lukcad_21-1714379019636.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103036i6C3CD3D047E2E333/image-size/large?v=v2&amp;px=999" role="button" title="lukcad_21-1714379019636.png" alt="lukcad_21-1714379019636.png" /></span></P><P>You can check association in node Associations:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="lukcad_22-1714379019636.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103038i33407E849CF27326/image-size/large?v=v2&amp;px=999" role="button" title="lukcad_22-1714379019636.png" alt="lukcad_22-1714379019636.png" /></span></P><P>Also, you can check as `Navigation Property` with name `TO_BOOKING` if you expand <STRONG>Entity Types</STRONG> nodes in Data Model of project. The existence of this navigation property after applying association and the name `TO_BOOKING` we will use for `expand` functionality as well as for `deep insert` functionality</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="lukcad_23-1714379019637.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103037iA60FE5810F8554AF/image-size/large?v=v2&amp;px=999" role="button" title="lukcad_23-1714379019637.png" alt="lukcad_23-1714379019637.png" /></span></P><P><STRONG>3--4-- Generate Runtime Objects of OData service</STRONG></P><P>You press icon `Generate Runtime Objects`</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="lukcad_24-1714379019638.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103039i9595DEB3592E2F72/image-size/large?v=v2&amp;px=999" role="button" title="lukcad_24-1714379019638.png" alt="lukcad_24-1714379019638.png" /></span></P><P>As a result, 4 classes with prefix `<STRONG>ZCL_</STRONG>` will be generated in your package. Currently, all methods to serve ZML_IBTRAVELSET and ZML_IBOOKINGSET entity types will be pre-filled in with pattern of raising exception to generate message that method is not implemented yet.&nbsp; Later on, you will do implementation of each method in classes with `<STRONG>_EXT</STRONG>` suffix by overriding methods.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="lukcad_25-1714379019638.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103041iF7BC923D87585097/image-size/large?v=v2&amp;px=999" role="button" title="lukcad_25-1714379019638.png" alt="lukcad_25-1714379019638.png" /></span></P><P><STRONG>4-- Register service and do initial test</STRONG></P><P>You should register service into SAP gateway and verify that service is maintained by initial test. It is better to do now, before you start implementation of methods to let you be ensured that service engin is generated correctly and you were able to maintain it correctly into SAP Gateway.</P><P><STRONG>4--1-- Register service</STRONG></P><P>In project open node `Service maintenance` and choose accessible SAP Gateway and press button `+Register` and then on prefilled form choose package ZMLODATA and save registration.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="lukcad_26-1714379019639.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103040i9C2BC56C78DAC13C/image-size/large?v=v2&amp;px=999" role="button" title="lukcad_26-1714379019639.png" alt="lukcad_26-1714379019639.png" /></span></P><P>After registration you will be re-directed to Service Maintenance list ( also you can use transaction to be there in any time: /IWFND/MAINT_SERVICE ) where you can choose your service by technical name 1ZML_TRAVELLING_ODT`.</P><P><STRONG>4--2-- Initial test</STRONG></P><P>Once your service is registered you can test it by `SAP Gateway Client` through opening Maintenance list and then after choosing your service using ICF Nodes panel do pressing on `SAP Gateway Client` or you can directly start testing client form Service Maintenance of chosen gateway by pressing button `SAP Gateway Client` on form of Service registration.</P><P>Press `SAP Gateway Client` and and execute proposed URI and check that you have HTTP response with status 200 OK</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="lukcad_27-1714379019640.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103044i25445BED109D63EC/image-size/large?v=v2&amp;px=999" role="button" title="lukcad_27-1714379019640.png" alt="lukcad_27-1714379019640.png" /></span></P><P>change URI to ask provide operations with format JSON (just change format=xml to <STRONG>format=json</STRONG>)</P><P><STRONG>/sap/opu/odata/sap/ZML_TRAVELLING_ODT_SRV/?$format=json</STRONG></P><P>and execute to verify that you can get JSON response with status <STRONG>200 Ok</STRONG> :</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="lukcad_28-1714379019642.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103042iE1AAD493C68B0F45/image-size/large?v=v2&amp;px=999" role="button" title="lukcad_28-1714379019642.png" alt="lukcad_28-1714379019642.png" /></span></P><P>So currently OData which you created has information about your entities but if you try to use those entities (datasets) you will have error, because entities are not still connected to your data in databases.</P><P>if you will try to run this request:</P><P><STRONG>/sap/opu/odata/sap/ZML_TRAVELLING_ODT_SRV/ZML_ITRAVELSet?$format=json</STRONG></P><P>instead of data in response you will find <STRONG>error 501</STRONG> and message "<STRONG>Method 'ZML_ITRAVELSET_GET_ENTITYSET' not implemented in data provider class</STRONG>"</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="lukcad_29-1714379019643.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103043i1CF80F9769FB3C99/image-size/large?v=v2&amp;px=999" role="button" title="lukcad_29-1714379019643.png" alt="lukcad_29-1714379019643.png" /></span></P><P>In next steps (5,6,7) you will implement all necessary methods.</P><P><STRONG>5-- Implementation of `deep insert` MODEL via override</STRONG></P><P>As developer, you should modify class which is dedicated for extending object model of implementation: `<STRONG>zcl_zml_travelling_odt_mpc_ext`</STRONG> where name of class is proposed during generating service and the name of class for extending model by default is a combination:&nbsp; `ZCL`_ + &lt;name_of_service&gt; + `_MPC_EXT`</P><P>you will add manually the new deep structure there and do override of existing method `<STRONG>define</STRONG>` to be able map structure to certain entity.</P><P>This implementation is important to enable using structure for `<STRONG>deep insert</STRONG>` which will be needing to write correctly code for method CREATE of entity ZML_ITRAVELSet,.</P><P><STRONG>5--1-- Add structure for `deep insert`</STRONG></P><P>Open class for extending `<STRONG>zcl_zml_travelling_odt_mpc_ext`</STRONG> which is here:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="lukcad_30-1714379019643.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103046iF7918FD1097BE8FA/image-size/large?v=v2&amp;px=999" role="button" title="lukcad_30-1714379019643.png" alt="lukcad_30-1714379019643.png" /></span></P><P>You should add new type for structure of deep insert which is based on your types of data sets.</P><P>Goal to create hierarchy of types:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="lukcad_50-1714381260523.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103085iBD9EDE6F12480701/image-size/large?v=v2&amp;px=999" role="button" title="lukcad_50-1714381260523.png" alt="lukcad_50-1714381260523.png" /></span></P><P>In public section of extension class <STRONG>zcl_zml_travelling_odt_mpc_ext</STRONG> you should add new structure:</P><pre class="lia-code-sample language-abap"><code> TYPES: BEGIN OF ty_s_trv_book. INCLUDE TYPE zcl_zml_travelling_odt_mpc=&gt;ts_zml_itravel. TYPES: to_booking TYPE STANDARD TABLE OF zcl_zml_travelling_odt_mpc=&gt;ts_zml_ibooking WITH DEFAULT KEY, END OF ty_s_trv_book.</code></pre><P>Name of structure for this particular example is `<STRONG>ty_s_trv_book</STRONG>`.</P><P><STRONG>5--2-- Override method `define`</STRONG></P><P>Open in editor class <STRONG>zcl_zml_travelling_odt_mpc_ext</STRONG> and press Ctrl + space and choose <STRONG>Override `define`</STRONG>.</P><P>In overridden method is main aim is to map entity type of service to new structure of `deep insert`.&nbsp;Code of overridden method `<STRONG>define</STRONG>`:</P><pre class="lia-code-sample language-abap"><code> METHOD define. DATA lo_entity_type TYPE REF TO /iwbep/if_mgw_odata_entity_typ. super-&gt;define( ). lo_entity_type = model-&gt;get_entity_type( iv_entity_name = 'ZML_ITRAVEL' ). lo_entity_type-&gt;bind_structure( iv_structure_name = 'zcl_zml_travelling_odt_mpc_ext=&gt;ty_s_trv_book' ). ENDMETHOD.</code></pre><P>&nbsp;</P><P><STRONG>5--3-- Full code of extension method after preparation of `deep insert`:</STRONG></P><pre class="lia-code-sample language-abap"><code>CLASS zcl_zml_travelling_odt_mpc_ext DEFINITION PUBLIC INHERITING FROM zcl_zml_travelling_odt_mpc CREATE PUBLIC . PUBLIC SECTION. TYPES: BEGIN OF ty_s_trv_book. INCLUDE TYPE zcl_zml_travelling_odt_mpc=&gt;ts_zml_itravel. TYPES: to_booking TYPE STANDARD TABLE OF zcl_zml_travelling_odt_mpc=&gt;ts_zml_ibooking WITH DEFAULT KEY, END OF ty_s_trv_book. METHODS define REDEFINITION. PROTECTED SECTION. PRIVATE SECTION. ENDCLASS. CLASS zcl_zml_travelling_odt_mpc_ext IMPLEMENTATION. METHOD define. DATA lo_entity_type TYPE REF TO /iwbep/if_mgw_odata_entity_typ. super-&gt;define( ). lo_entity_type = model-&gt;get_entity_type( iv_entity_name = 'ZML_ITRAVEL' ). lo_entity_type-&gt;bind_structure( iv_structure_name = 'zcl_zml_travelling_odt_mpc_ext=&gt;ty_s_trv_book' ). ENDMETHOD. ENDCLASS.</code></pre><P><STRONG>6-- Implementation of entity modification methods</STRONG></P><P>As developer, you should modify class which is dedicated for extending methods to work with data: `<STRONG>zcl_zml_travelling_odt_dpc_ext`</STRONG> where name of class is proposed during generating service and the name of class for extending data methods is combination of by default:&nbsp; `ZCL`_ + &lt;name_of_service&gt; + `_DPC_EXT`</P><P>Before start extending OData CRUD methods, you add 3 custom methods in this particular case:</P><P><STRONG>6--1-- add custom method `zml_create_uuid` for getting UUID:</STRONG></P><P>In protected section of class definition add:</P><pre class="lia-code-sample language-abap"><code> METHODS zml_create_uuid RETURNING VALUE(es_uuid) TYPE sysuuid_x16.</code></pre><P>In implementation area of class add:</P><pre class="lia-code-sample language-abap"><code> METHOD zml_create_uuid. DATA lv_long_time_stamp TYPE timestampl. GET TIME STAMP FIELD lv_long_time_stamp. DATA: l_uuid_x16 TYPE sysuuid_x16. DATA: system_uuid TYPE REF TO if_system_uuid. DATA: oref TYPE REF TO cx_uuid_error. system_uuid = cl_uuid_factory=&gt;create_system_uuid( ). TRY. es_uuid = system_uuid-&gt;create_uuid_x16( ). CATCH cx_uuid_error. "handle exception ENDTRY. ENDMETHOD.</code></pre><P>&nbsp;</P><P><STRONG>6--2-- add custom method `zml_modify_travel` for update or insert ZML_TRAVEL entity:</STRONG></P><P>In protected section of class definition add:</P><pre class="lia-code-sample language-abap"><code> METHODS zml_modify_travel IMPORTING !ls_entity TYPE zcl_zml_travelling_odt_mpc=&gt;ts_zml_itravel RETURNING VALUE(es_entity) TYPE zcl_zml_travelling_odt_mpc=&gt;ts_zml_itravel.</code></pre><P>&nbsp;In implementation area of class add:</P><pre class="lia-code-sample language-abap"><code> METHOD zml_modify_travel. DATA: it_entity TYPE zcl_zml_travelling_odt_mpc=&gt;ts_zml_itravel. MOVE-CORRESPONDING ls_entity TO it_entity. IF ( it_entity-client IS INITIAL ). it_entity-client = sy-mandt. ENDIF. TRY. it_entity-name = ls_entity-name. DATA itb_entity TYPE TABLE OF zml_travel. IF ( it_entity-travel_id IS INITIAL ). it_entity-travel_id = zml_create_uuid( ). itb_entity = VALUE #( ( it_entity ) ). INSERT zml_travel FROM TABLE <a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1074930">@itb</a>_entity. ELSE. itb_entity = VALUE #( ( it_entity ) ). MODIFY zml_travel FROM TABLE <a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1074930">@itb</a>_entity. ENDIF. es_entity = it_entity. CATCH cx_uuid_error. ENDTRY. ENDMETHOD.</code></pre><P>&nbsp;</P><P><STRONG>6--3-- add custom method `zml_modify_booking` for update or insert ZML_BOOKING entity:</STRONG></P><P>In protected section of class definition add:</P><pre class="lia-code-sample language-abap"><code> METHODS zml_modify_booking IMPORTING !ls_entity TYPE zcl_zml_travelling_odt_mpc=&gt;ts_zml_ibooking RETURNING VALUE(es_entity) TYPE zcl_zml_travelling_odt_mpc=&gt;ts_zml_ibooking.</code></pre><P>&nbsp;In implementation area of class add:</P><pre class="lia-code-sample language-abap"><code> METHOD zml_modify_booking. DATA: it_entity TYPE zcl_zml_travelling_odt_mpc=&gt;ts_zml_ibooking. MOVE-CORRESPONDING ls_entity TO it_entity. IF ( ls_entity-client IS INITIAL ). it_entity-client = sy-mandt. ENDIF. IF ( ls_entity-travel_id IS NOT INITIAL ). TRY. DATA itb_entity TYPE TABLE OF zml_booking. IF ( it_entity-booking_id IS INITIAL ). it_entity-booking_id = zml_create_uuid( ). itb_entity = VALUE #( ( it_entity ) ). INSERT zml_booking FROM TABLE <a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1074930">@itb</a>_entity. ELSE. itb_entity = VALUE #( ( it_entity ) ). MODIFY zml_booking FROM TABLE <a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1074930">@itb</a>_entity. ENDIF. es_entity = it_entity. CATCH cx_uuid_error. ENDTRY. ENDIF. ENDMETHOD.</code></pre><P>&nbsp;<SPAN>&nbsp; &nbsp;</SPAN></P><P><STRONG>6--4-- add custom method `deep_insert_travel_booking` for insert ZML_TRAVEL and ZML_BOOKING entities:</STRONG></P><P>In protected section of class definition add:</P><pre class="lia-code-sample language-abap"><code> METHODS deep_insert_travel_booking IMPORTING !io_data_provider TYPE REF TO /iwbep/if_mgw_entry_provider EXPORTING !es_s_trv_book TYPE zcl_zml_travelling_odt_mpc_ext=&gt;ty_s_trv_book RAISING /iwbep/cx_mgw_busi_exception /iwbep/cx_mgw_tech_exception .</code></pre><P>&nbsp; In implementation area of class add:</P><pre class="lia-code-sample language-abap"><code> METHOD deep_insert_travel_booking. DATA: ls_travel_booking_data TYPE zcl_zml_travelling_odt_mpc_ext=&gt;ty_s_trv_book. DATA: ls_entity TYPE zcl_zml_travelling_odt_mpc=&gt;ts_zml_itravel. DATA: ls_childentity TYPE zcl_zml_travelling_odt_mpc=&gt;ts_zml_ibooking. DATA: ar_childentities TYPE STANDARD TABLE OF zcl_zml_travelling_odt_mpc=&gt;ts_zml_ibooking WITH DEFAULT KEY. io_data_provider-&gt;read_entry_data( IMPORTING es_data = ls_travel_booking_data ). MOVE-CORRESPONDING ls_travel_booking_data TO ls_entity. ls_entity = zml_modify_travel( ls_entity = ls_entity ). MOVE-CORRESPONDING ls_travel_booking_data-to_booking TO ar_childentities. LOOP AT ar_childentities INTO ls_childentity. ls_childentity-travel_id = ls_entity-travel_id. ls_childentity = zml_modify_booking( ls_entity = ls_childentity ). ar_childentities[ sy-index ] = ls_childentity. ENDLOOP. MOVE-CORRESPONDING ls_entity TO es_s_trv_book. MOVE-CORRESPONDING ar_childentities TO es_s_trv_book-to_booking. ENDMETHOD.</code></pre><P>&nbsp;<STRONG>7-- Implementation of OData CRUD methods using override</STRONG></P><P><STRONG>7--1-- Start override methods</STRONG></P><P>Open class `<STRONG>ZCL_ZML_TRAVELLING_ODT_DPC_EXT</STRONG>` (name of class is proposed during generating for overriding and the name of class is combination of by default:&nbsp; `ZCL`_ + &lt;name_of_service&gt; + `_DPC_EXT`</P><P>This is generated class and will be regenerated if you need put changes in model and generate service once again.</P><P>SAP has classes for extending generated code, and those classes will not be re-created during generating, so your changes will be applicable after regenerating once again.</P><P>You can override any method by using Ctrl + space and choosing method for override from list:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="lukcad_31-1714379019645.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103047iCAD883F3845C5B31/image-size/large?v=v2&amp;px=999" role="button" title="lukcad_31-1714379019645.png" alt="lukcad_31-1714379019645.png" /></span></P><P><STRONG>7--2-- override method `/iwbep/if_mgw_appl_srv_runtime~create_deep_entity` manually </STRONG></P><P>This is single method which we do overriding manually and with definition in PUBLIC SECTION of class.</P><P>Add to PUBLIC SECTION this redefinition:</P><pre class="lia-code-sample language-abap"><code>METHODS /iwbep/if_mgw_appl_srv_runtime~create_deep_entity REDEFINITION.</code></pre><P>&nbsp; Add to implementation area:</P><pre class="lia-code-sample language-abap"><code> METHOD /iwbep/if_mgw_appl_srv_runtime~create_deep_entity. DATA: ls_travel_booking_data TYPE zcl_zml_travelling_odt_mpc_ext=&gt;ty_s_trv_book. CLEAR: er_deep_entity. TRY. CALL METHOD deep_insert_travel_booking EXPORTING io_data_provider = io_data_provider IMPORTING es_s_trv_book = ls_travel_booking_data. copy_data_to_ref( EXPORTING is_data = ls_travel_booking_data CHANGING cr_data = er_deep_entity ). CATCH /iwbep/cx_mgw_busi_exception. ENDTRY. ENDMETHOD.</code></pre><P>&nbsp;<STRONG>7--3-- override method `zml_itravelset_update_entity`</STRONG></P><pre class="lia-code-sample language-abap"><code> METHOD zml_itravelset_update_entity. DATA: ls_converted_keys TYPE zcl_zml_travelling_odt_mpc=&gt;ts_zml_itravel, ls_entity TYPE zcl_zml_travelling_odt_mpc=&gt;ts_zml_itravel. io_data_provider-&gt;read_entry_data( IMPORTING es_data = ls_entity ). IF ( ls_entity-travel_id IS INITIAL ). io_tech_request_context-&gt;get_converted_keys( IMPORTING es_key_values = ls_converted_keys ). ls_entity-travel_id = ls_converted_keys-travel_id. ENDIF. io_data_provider-&gt;read_entry_data( IMPORTING es_data = ls_entity ). CLEAR er_entity. er_entity = zml_modify_travel( ls_entity = ls_entity ). ENDMETHOD.</code></pre><P>&nbsp;<STRONG>7--4-- override method `zml_itravelset_delete_entity`</STRONG></P><pre class="lia-code-sample language-abap"><code> METHOD zml_itravelset_delete_entity. DATA: ls_converted_keys TYPE zcl_zml_travelling_odt_mpc=&gt;ts_zml_itravel. io_tech_request_context-&gt;get_converted_keys( IMPORTING es_key_values = ls_converted_keys ). DELETE FROM zml_booking WHERE travel_id = ls_converted_keys-travel_id. DELETE FROM zml_travel WHERE travel_id = ls_converted_keys-travel_id. ENDMETHOD.</code></pre><P>&nbsp;<STRONG>7--5-- override method `zml_itravelset_create_entity`</STRONG></P><pre class="lia-code-sample language-abap"><code> METHOD zml_itravelset_create_entity. DATA: ls_entity TYPE zcl_zml_travelling_odt_mpc=&gt;ts_zml_itravel. io_data_provider-&gt;read_entry_data( IMPORTING es_data = ls_entity ). CLEAR er_entity. er_entity = zml_modify_travel( ls_entity = ls_entity ). ENDMETHOD.</code></pre><P>&nbsp;<STRONG>7--6-- override method `zml_ibookingset_get_entity`</STRONG></P><pre class="lia-code-sample language-abap"><code> METHOD zml_ibookingset_get_entity. DATA:ls_keytab TYPE LINE OF /iwbep/t_mgw_name_value_pair. LOOP AT it_key_tab INTO ls_keytab. ENDLOOP. IF ( ls_keytab-name = 'BookingId' ). SELECT SINGLE * FROM zml_booking INTO CORRESPONDING FIELDS OF er_entity WHERE booking_id = ls_keytab-value. ELSEIF ( ls_keytab-name = 'TravelId' ). SELECT SINGLE * FROM zml_booking INTO CORRESPONDING FIELDS OF er_entity WHERE travel_id = ls_keytab-value. ENDIF. ENDMETHOD.</code></pre><P>&nbsp;<STRONG>7--7-- override method `zml_itravelset_get_entity`</STRONG></P><pre class="lia-code-sample language-abap"><code> METHOD zml_itravelset_get_entity. DATA:ls_keytab TYPE LINE OF /iwbep/t_mgw_name_value_pair. LOOP AT it_key_tab INTO ls_keytab. ENDLOOP. IF ( ls_keytab-name = 'BookingId' ). DATA: lv_travel_id TYPE zml_booking-travel_id. SELECT SINGLE travel_id FROM zml_booking INTO lv_travel_id WHERE booking_id = ls_keytab-value. IF sy-subrc = 0. SELECT SINGLE * FROM zml_travel INTO CORRESPONDING FIELDS OF er_entity WHERE travel_id = lv_travel_id. ENDIF. ELSEIF ( ls_keytab-name = 'TravelId' ). SELECT SINGLE * FROM zml_travel INTO CORRESPONDING FIELDS OF er_entity WHERE travel_id = ls_keytab-value. ENDIF. ENDMETHOD.</code></pre><P>&nbsp;<STRONG>7--8-- override method `zml_ibookingset_get_entityset`</STRONG></P><pre class="lia-code-sample language-abap"><code> METHOD zml_ibookingset_get_entityset. DATA:ls_keytab TYPE LINE OF /iwbep/t_mgw_name_value_pair. LOOP AT it_key_tab INTO ls_keytab. ENDLOOP. IF ( ls_keytab IS NOT INITIAL ). IF ( ls_keytab-name = 'BookingId' ). SELECT * FROM zml_booking INTO CORRESPONDING FIELDS OF TABLE et_entityset WHERE booking_id = ls_keytab-value. ELSEIF ( ls_keytab-name = 'TravelId' ). DATA: lv_travel_id TYPE zml_travel-travel_id. SELECT SINGLE travel_id FROM zml_booking INTO lv_travel_id WHERE travel_id = ls_keytab-value. SELECT * FROM zml_booking INTO CORRESPONDING FIELDS OF TABLE et_entityset WHERE travel_id = lv_travel_id. ENDIF. ELSE. SELECT * FROM zml_booking INTO CORRESPONDING FIELDS OF TABLE et_entityset. ENDIF. ENDMETHOD.</code></pre><P>&nbsp;<STRONG>7--9-- override method `zml_itravelset_get_entityset`</STRONG></P><pre class="lia-code-sample language-abap"><code> METHOD zml_itravelset_get_entityset. DATA: lv_source_entity_set_name TYPE /iwbep/mgw_tech_name. lv_source_entity_set_name = io_tech_request_context-&gt;get_source_entity_set_name( ). IF lv_source_entity_set_name IS INITIAL. SELECT * FROM zml_travel INTO CORRESPONDING FIELDS OF TABLE et_entityset. ELSE. SELECT * FROM zml_travel INTO CORRESPONDING FIELDS OF TABLE et_entityset. ENDIF. ENDMETHOD.</code></pre><P>&nbsp;<STRONG>7--10-- override method `zml_ibookingset_update_entity`</STRONG></P><pre class="lia-code-sample language-abap"><code> method zml_ibookingset_update_entity. DATA: ls_converted_keys TYPE zcl_zml_travelling_odt_mpc=&gt;ts_zml_ibooking, ls_entity TYPE zcl_zml_travelling_odt_mpc=&gt;ts_zml_ibooking. io_data_provider-&gt;read_entry_data( IMPORTING es_data = ls_entity ). IF ( ls_entity-booking_id IS INITIAL ). io_tech_request_context-&gt;get_converted_keys( IMPORTING es_key_values = ls_converted_keys ). ls_entity-booking_id = ls_converted_keys-booking_id. ENDIF. io_data_provider-&gt;read_entry_data( IMPORTING es_data = ls_entity ). CLEAR er_entity. er_entity = zml_modify_booking( ls_entity = ls_entity ). endmethod.</code></pre><P>&nbsp;<STRONG>7--11-- override method `zml_ibookingset_delete_entity`</STRONG></P><pre class="lia-code-sample language-abap"><code> method zml_ibookingset_delete_entity. DATA: ls_converted_keys TYPE zcl_zml_travelling_odt_mpc=&gt;ts_zml_ibooking. io_tech_request_context-&gt;get_converted_keys( IMPORTING es_key_values = ls_converted_keys ). DELETE FROM zml_booking WHERE booking_id = ls_converted_keys-booking_id. endmethod.</code></pre><P><STRONG>7--12-- override method `zml_ibookingset_create_entity`</STRONG></P><pre class="lia-code-sample language-abap"><code> method zml_ibookingset_create_entity. DATA: ls_entity TYPE zcl_zml_travelling_odt_mpc=&gt;ts_zml_ibooking. io_data_provider-&gt;read_entry_data( IMPORTING es_data = ls_entity ). CLEAR er_entity. er_entity = zml_modify_booking( ls_entity = ls_entity ). endmethod.</code></pre><P>&nbsp;<STRONG>8-- Testing CRUD methods by SAP Gateway Client</STRONG></P><P><STRONG>8--1-- GET all records from entities</STRONG></P><P><STRONG>8--1--1-- GET entities with query parameter $format=json</STRONG></P><P>Check again by SAP Gateway Client that you can extract data from ZML_ITRAVELSet and for ZML_IBOOKINGSet</P><P><STRONG>/sap/opu/odata/sap/ZML_TRAVELLING_ODT_SRV/ZML_ITRAVELSet?$format=json</STRONG></P><P><STRONG>/sap/opu/odata/sap/ZML_TRAVELLING_ODT_SRV/ZML_IBOOKINGSet?$format=json</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="lukcad_32-1714379019646.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103045iCA6B82061A9A4A40/image-size/large?v=v2&amp;px=999" role="button" title="lukcad_32-1714379019646.png" alt="lukcad_32-1714379019646.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="lukcad_33-1714379019647.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103049i50982F6F23320FD0/image-size/large?v=v2&amp;px=999" role="button" title="lukcad_33-1714379019647.png" alt="lukcad_33-1714379019647.png" /></span></P><P><STRONG>8--1--2-- GET entities by using header parameters instead of query parameter</STRONG></P><P>You need to be able to add header parameters because in json it is easier to operate and some operation will work only with header (POST, PATCH, PUT and DELETE)</P><P>So look at screenshots below how you can add parameters and all rest screenshots will have always header parameters for your understanding.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="lukcad_34-1714379019648.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103050i5CD956B3E9BB1666/image-size/large?v=v2&amp;px=999" role="button" title="lukcad_34-1714379019648.png" alt="lukcad_34-1714379019648.png" /></span></P><P>It is right to keep these two parameters added&nbsp; for all operations:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="lukcad_35-1714379019649.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103048i97FBC061FBD6644C/image-size/large?v=v2&amp;px=999" role="button" title="lukcad_35-1714379019649.png" alt="lukcad_35-1714379019649.png" /></span></P><P>and add this parameter only for PATCH, PUT, and DELETE:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="lukcad_36-1714379019649.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103051iDDEA37ED95556505/image-size/large?v=v2&amp;px=999" role="button" title="lukcad_36-1714379019649.png" alt="lukcad_36-1714379019649.png" /></span></P><P><STRONG>8--2-- GET specific record from entity</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="lukcad_37-1714379019650.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103052i36B24FEC513B071E/image-size/large?v=v2&amp;px=999" role="button" title="lukcad_37-1714379019650.png" alt="lukcad_37-1714379019650.png" /></span></P><P><STRONG>8--3-- GET specific record with details using EXPAND</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="lukcad_38-1714379019651.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103053i13EBC1523650A38C/image-size/large?v=v2&amp;px=999" role="button" title="lukcad_38-1714379019651.png" alt="lukcad_38-1714379019651.png" /></span></P><P><STRONG>8--4-- PUT change record to change.</STRONG></P><P>8--4--1-- PUT for ZML_ITRAVELSet it will be:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="lukcad_39-1714379019652.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103054i99AE990DBF0E6A9C/image-size/large?v=v2&amp;px=999" role="button" title="lukcad_39-1714379019652.png" alt="lukcad_39-1714379019652.png" /></span></P><P><STRONG>8--4--2-- PUT for ZML_IBOOKINGSet it will be:</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="lukcad_40-1714379019653.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103055i2E9BB74257CDEC1B/image-size/large?v=v2&amp;px=999" role="button" title="lukcad_40-1714379019653.png" alt="lukcad_40-1714379019653.png" /></span></P><P>You can verify if data were successfully applied by GET:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="lukcad_41-1714379019654.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103056i9E49A99D6613EFB0/image-size/large?v=v2&amp;px=999" role="button" title="lukcad_41-1714379019654.png" alt="lukcad_41-1714379019654.png" /></span></P><P><STRONG>8--6-- PATCH change only pointed parameters.</STRONG></P><P><STRONG>8--6--1-- PATCH for entity ZML_ITRAVELSet:</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="lukcad_42-1714379019655.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103058iACA5861B4E0A7CEE/image-size/large?v=v2&amp;px=999" role="button" title="lukcad_42-1714379019655.png" alt="lukcad_42-1714379019655.png" /></span></P><P><STRONG>8--6--2-- PATCH for entity ZML_IBOOKINGSet:</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="lukcad_43-1714379019656.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103057iE1C25F3C49E2182C/image-size/large?v=v2&amp;px=999" role="button" title="lukcad_43-1714379019656.png" alt="lukcad_43-1714379019656.png" /></span></P><P>You can verify if it was changes by GET:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="lukcad_44-1714379019656.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103059iB4A064835DE1765D/image-size/large?v=v2&amp;px=999" role="button" title="lukcad_44-1714379019656.png" alt="lukcad_44-1714379019656.png" /></span></P><P><STRONG>8--8-- DELETE -remove record and all child records</STRONG></P><P><STRONG>8--8--1-- DELETE for entity ZML_ITRAVELSet</STRONG></P><P>Your code you can check and in code we delete child records from ZML_IBOOKINGSet and then record from ZML_ITRAVELSet. But it is up to you have this logic. You can allow delete only if childe records were delete previously. Just for simplicity we do deleting as cascade.</P><P><STRONG>Notice</STRONG>: parameter `if-match` should be removed from header, overwise you will have error.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="lukcad_45-1714379019657.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103060iA102B6961282F514/image-size/large?v=v2&amp;px=999" role="button" title="lukcad_45-1714379019657.png" alt="lukcad_45-1714379019657.png" /></span></P><P><STRONG>8--8--2-- DELETE for entity ZML_IBOOKINGSet</STRONG></P><P><STRONG>Notice</STRONG>: parameter `if-match` should be removed from header, overwise you will have error.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="lukcad_46-1714379019658.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103061i675D2A05E6927194/image-size/large?v=v2&amp;px=999" role="button" title="lukcad_46-1714379019658.png" alt="lukcad_46-1714379019658.png" /></span></P><P><STRONG>8--9-- INSERT - add new records</STRONG></P><P><STRONG>8--9--1-- INSERT for entity set `ZML_ITRAVELSet`</STRONG></P><P>You have implemented `<STRONG>deep insert</STRONG>` with deep structure. So you expect to create complex records when you POST entity ZML_ITRAVELSet. It will be one record for ZML_ITRAVELSet and related records (child records) for entity ZML_IBOOKINGSet. Deep structure supposes to use head structure from ZML_ITRAVELSet and child structure with name `TO_BOOK` from ZML_IBOOKINGSet. So you have to prepare request with such payload:</P><pre class="lia-code-sample language-json"><code>{ "Client" : "001", "Name" : "Travel Minsk - Milano", "TO_BOOKING": [ { "Client" : "001", "Hotel" : "Ahmat hotel", "Dayfrom" : "\/Date(1481760000000)\/", "Dayto" : "\/Date(1481760000000)\/" }, { "Client" : "001", "Hotel" : "Yes hotel", "Dayfrom" : "\/Date(1481760000000)\/", "Dayto" : "\/Date(1481760000000)\/" } ] }</code></pre><P>you point this URI:</P><P><STRONG>/sap/opu/odata/SAP/ZML_TRAVELLING_ODT_SRV/ZML_ITRAVELSet</STRONG></P><P>and you choose method: <STRONG>POST</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="lukcad_47-1714379019659.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103062iFE4D42269C5C37B0/image-size/large?v=v2&amp;px=999" role="button" title="lukcad_47-1714379019659.png" alt="lukcad_47-1714379019659.png" /></span></P><P><STRONG>8--9--2-- INSERT for entity set `ZML_IBOOKINGSet`</STRONG></P><P>You should know GUID of your parent record for ZML_ITRAVELSet</P><pre class="lia-code-sample language-json"><code>{ "TravelId" : "0242ac11-0002-1eef-80aa-0315685dd657", "Hotel" : "Amirates Dubai stars", "Dayfrom" : "\/Date(1704067200000)\/", "Dayto" : "\/Date(1704326400000)\/" }</code></pre><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="lukcad_48-1714379019660.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103063i36B631197164C122/image-size/large?v=v2&amp;px=999" role="button" title="lukcad_48-1714379019660.png" alt="lukcad_48-1714379019660.png" /></span></P><P>Response contains payload about what has been added and and which Booking Id was created.</P><P>If you wish you can GET particular record by using (guid' value of Booking Id ') :</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="lukcad_49-1714379019661.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103064iA6A0F31D5751ACC3/image-size/large?v=v2&amp;px=999" role="button" title="lukcad_49-1714379019661.png" alt="lukcad_49-1714379019661.png" /></span></P><P><STRONG>9-- Verification of achieved code</STRONG></P><P>You can compare your code or if you feel that it is better to apply ready to use project and go through this document you can find this project here on GitHub:</P><P><A href="https://github.com/lukcad/ZMLODATA.git" target="_blank" rel="nofollow noopener noreferrer">https://github.com/lukcad/ZMLODATA.git</A></P><P>Also, you can verify your overridden methods for class&nbsp;<SPAN><STRONG>zcl_zml_travelling_odt_dpc_ext</STRONG> here:</SPAN></P><pre class="lia-code-sample language-abap"><code>CLASS zcl_zml_travelling_odt_dpc_ext DEFINITION PUBLIC INHERITING FROM zcl_zml_travelling_odt_dpc CREATE PUBLIC . PUBLIC SECTION. METHODS /iwbep/if_mgw_appl_srv_runtime~create_deep_entity REDEFINITION. PROTECTED SECTION. methods zml_ibookingset_update_entity redefinition. methods zml_ibookingset_delete_entity redefinition. methods zml_ibookingset_create_entity redefinition. METHODS zml_create_uuid RETURNING VALUE(es_uuid) TYPE sysuuid_x16. METHODS zml_modify_travel IMPORTING !ls_entity TYPE zcl_zml_travelling_odt_mpc=&gt;ts_zml_itravel RETURNING VALUE(es_entity) TYPE zcl_zml_travelling_odt_mpc=&gt;ts_zml_itravel. METHODS zml_modify_booking IMPORTING !ls_entity TYPE zcl_zml_travelling_odt_mpc=&gt;ts_zml_ibooking RETURNING VALUE(es_entity) TYPE zcl_zml_travelling_odt_mpc=&gt;ts_zml_ibooking. METHODS deep_insert_travel_booking IMPORTING !io_data_provider TYPE REF TO /iwbep/if_mgw_entry_provider EXPORTING !es_s_trv_book TYPE zcl_zml_travelling_odt_mpc_ext=&gt;ty_s_trv_book RAISING /iwbep/cx_mgw_busi_exception /iwbep/cx_mgw_tech_exception . METHODS zml_itravelset_update_entity REDEFINITION. METHODS zml_itravelset_delete_entity REDEFINITION. METHODS zml_itravelset_create_entity REDEFINITION. METHODS zml_ibookingset_get_entity REDEFINITION. METHODS zml_itravelset_get_entity REDEFINITION. METHODS zml_ibookingset_get_entityset REDEFINITION. METHODS zml_itravelset_get_entityset REDEFINITION. PRIVATE SECTION. ENDCLASS. CLASS zcl_zml_travelling_odt_dpc_ext IMPLEMENTATION. METHOD zml_itravelset_get_entityset. DATA: lv_source_entity_set_name TYPE /iwbep/mgw_tech_name. lv_source_entity_set_name = io_tech_request_context-&gt;get_source_entity_set_name( ). IF lv_source_entity_set_name IS INITIAL. SELECT * FROM zml_travel INTO CORRESPONDING FIELDS OF TABLE et_entityset. ELSE. SELECT * FROM zml_travel INTO CORRESPONDING FIELDS OF TABLE et_entityset. ENDIF. ENDMETHOD. METHOD zml_ibookingset_get_entityset. DATA:ls_keytab TYPE LINE OF /iwbep/t_mgw_name_value_pair. LOOP AT it_key_tab INTO ls_keytab. ENDLOOP. IF ( ls_keytab IS NOT INITIAL ). IF ( ls_keytab-name = 'BookingId' ). SELECT * FROM zml_booking INTO CORRESPONDING FIELDS OF TABLE et_entityset WHERE booking_id = ls_keytab-value. ELSEIF ( ls_keytab-name = 'TravelId' ). DATA: lv_travel_id TYPE zml_travel-travel_id. SELECT SINGLE travel_id FROM zml_booking INTO lv_travel_id WHERE travel_id = ls_keytab-value. SELECT * FROM zml_booking INTO CORRESPONDING FIELDS OF TABLE et_entityset WHERE travel_id = lv_travel_id. ENDIF. ELSE. SELECT * FROM zml_booking INTO CORRESPONDING FIELDS OF TABLE et_entityset. ENDIF. ENDMETHOD. METHOD zml_itravelset_get_entity. DATA:ls_keytab TYPE LINE OF /iwbep/t_mgw_name_value_pair. LOOP AT it_key_tab INTO ls_keytab. ENDLOOP. IF ( ls_keytab-name = 'BookingId' ). DATA: lv_travel_id TYPE zml_booking-travel_id. SELECT SINGLE travel_id FROM zml_booking INTO lv_travel_id WHERE booking_id = ls_keytab-value. IF sy-subrc = 0. SELECT SINGLE * FROM zml_travel INTO CORRESPONDING FIELDS OF er_entity WHERE travel_id = lv_travel_id. ENDIF. ELSEIF ( ls_keytab-name = 'TravelId' ). SELECT SINGLE * FROM zml_travel INTO CORRESPONDING FIELDS OF er_entity WHERE travel_id = ls_keytab-value. ENDIF. ENDMETHOD. METHOD zml_ibookingset_get_entity. DATA:ls_keytab TYPE LINE OF /iwbep/t_mgw_name_value_pair. LOOP AT it_key_tab INTO ls_keytab. ENDLOOP. IF ( ls_keytab-name = 'BookingId' ). SELECT SINGLE * FROM zml_booking INTO CORRESPONDING FIELDS OF er_entity WHERE booking_id = ls_keytab-value. ELSEIF ( ls_keytab-name = 'TravelId' ). SELECT SINGLE * FROM zml_booking INTO CORRESPONDING FIELDS OF er_entity WHERE travel_id = ls_keytab-value. ENDIF. ENDMETHOD. METHOD zml_itravelset_create_entity. DATA: ls_entity TYPE zcl_zml_travelling_odt_mpc=&gt;ts_zml_itravel. io_data_provider-&gt;read_entry_data( IMPORTING es_data = ls_entity ). CLEAR er_entity. er_entity = zml_modify_travel( ls_entity = ls_entity ). ENDMETHOD. method zml_ibookingset_create_entity. DATA: ls_entity TYPE zcl_zml_travelling_odt_mpc=&gt;ts_zml_ibooking. io_data_provider-&gt;read_entry_data( IMPORTING es_data = ls_entity ). CLEAR er_entity. er_entity = zml_modify_booking( ls_entity = ls_entity ). endmethod. METHOD zml_itravelset_delete_entity. DATA: ls_converted_keys TYPE zcl_zml_travelling_odt_mpc=&gt;ts_zml_itravel. io_tech_request_context-&gt;get_converted_keys( IMPORTING es_key_values = ls_converted_keys ). DELETE FROM zml_booking WHERE travel_id = ls_converted_keys-travel_id. DELETE FROM zml_travel WHERE travel_id = ls_converted_keys-travel_id. ENDMETHOD. method zml_ibookingset_delete_entity. DATA: ls_converted_keys TYPE zcl_zml_travelling_odt_mpc=&gt;ts_zml_ibooking. io_tech_request_context-&gt;get_converted_keys( IMPORTING es_key_values = ls_converted_keys ). DELETE FROM zml_booking WHERE booking_id = ls_converted_keys-booking_id. endmethod. METHOD zml_itravelset_update_entity. DATA: ls_converted_keys TYPE zcl_zml_travelling_odt_mpc=&gt;ts_zml_itravel, ls_entity TYPE zcl_zml_travelling_odt_mpc=&gt;ts_zml_itravel. io_data_provider-&gt;read_entry_data( IMPORTING es_data = ls_entity ). IF ( ls_entity-travel_id IS INITIAL ). io_tech_request_context-&gt;get_converted_keys( IMPORTING es_key_values = ls_converted_keys ). ls_entity-travel_id = ls_converted_keys-travel_id. ENDIF. io_data_provider-&gt;read_entry_data( IMPORTING es_data = ls_entity ). CLEAR er_entity. er_entity = zml_modify_travel( ls_entity = ls_entity ). ENDMETHOD. method zml_ibookingset_update_entity. DATA: ls_converted_keys TYPE zcl_zml_travelling_odt_mpc=&gt;ts_zml_ibooking, ls_entity TYPE zcl_zml_travelling_odt_mpc=&gt;ts_zml_ibooking. io_data_provider-&gt;read_entry_data( IMPORTING es_data = ls_entity ). IF ( ls_entity-booking_id IS INITIAL ). io_tech_request_context-&gt;get_converted_keys( IMPORTING es_key_values = ls_converted_keys ). ls_entity-booking_id = ls_converted_keys-booking_id. ENDIF. io_data_provider-&gt;read_entry_data( IMPORTING es_data = ls_entity ). CLEAR er_entity. er_entity = zml_modify_booking( ls_entity = ls_entity ). endmethod. METHOD /iwbep/if_mgw_appl_srv_runtime~create_deep_entity. DATA: ls_travel_booking_data TYPE zcl_zml_travelling_odt_mpc_ext=&gt;ty_s_trv_book. CLEAR: er_deep_entity. TRY. CALL METHOD deep_insert_travel_booking EXPORTING io_data_provider = io_data_provider IMPORTING es_s_trv_book = ls_travel_booking_data. copy_data_to_ref( EXPORTING is_data = ls_travel_booking_data CHANGING cr_data = er_deep_entity ). CATCH /iwbep/cx_mgw_busi_exception. ENDTRY. ENDMETHOD. METHOD deep_insert_travel_booking. DATA: ls_travel_booking_data TYPE zcl_zml_travelling_odt_mpc_ext=&gt;ty_s_trv_book. DATA: ls_entity TYPE zcl_zml_travelling_odt_mpc=&gt;ts_zml_itravel. DATA: ls_childentity TYPE zcl_zml_travelling_odt_mpc=&gt;ts_zml_ibooking. DATA: ar_childentities TYPE STANDARD TABLE OF zcl_zml_travelling_odt_mpc=&gt;ts_zml_ibooking WITH DEFAULT KEY. io_data_provider-&gt;read_entry_data( IMPORTING es_data = ls_travel_booking_data ). MOVE-CORRESPONDING ls_travel_booking_data TO ls_entity. ls_entity = zml_modify_travel( ls_entity = ls_entity ). MOVE-CORRESPONDING ls_travel_booking_data-to_booking TO ar_childentities. LOOP AT ar_childentities INTO ls_childentity. ls_childentity-travel_id = ls_entity-travel_id. ls_childentity = zml_modify_booking( ls_entity = ls_childentity ). ar_childentities[ sy-index ] = ls_childentity. ENDLOOP. MOVE-CORRESPONDING ls_entity TO es_s_trv_book. MOVE-CORRESPONDING ar_childentities TO es_s_trv_book-to_booking. ENDMETHOD. METHOD zml_create_uuid. DATA lv_long_time_stamp TYPE timestampl. GET TIME STAMP FIELD lv_long_time_stamp. DATA: l_uuid_x16 TYPE sysuuid_x16. DATA: system_uuid TYPE REF TO if_system_uuid. DATA: oref TYPE REF TO cx_uuid_error. system_uuid = cl_uuid_factory=&gt;create_system_uuid( ). TRY. es_uuid = system_uuid-&gt;create_uuid_x16( ). CATCH cx_uuid_error. "handle exception ENDTRY. ENDMETHOD. METHOD zml_modify_travel. DATA: it_entity TYPE zcl_zml_travelling_odt_mpc=&gt;ts_zml_itravel. MOVE-CORRESPONDING ls_entity TO it_entity. IF ( it_entity-client IS INITIAL ). it_entity-client = sy-mandt. ENDIF. TRY. it_entity-name = ls_entity-name. DATA itb_entity TYPE TABLE OF zml_travel. IF ( it_entity-travel_id IS INITIAL ). it_entity-travel_id = zml_create_uuid( ). itb_entity = VALUE #( ( it_entity ) ). INSERT zml_travel FROM TABLE <a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1074930">@itb</a>_entity. ELSE. itb_entity = VALUE #( ( it_entity ) ). MODIFY zml_travel FROM TABLE <a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1074930">@itb</a>_entity. ENDIF. es_entity = it_entity. CATCH cx_uuid_error. ENDTRY. ENDMETHOD. METHOD zml_modify_booking. DATA: it_entity TYPE zcl_zml_travelling_odt_mpc=&gt;ts_zml_ibooking. MOVE-CORRESPONDING ls_entity TO it_entity. IF ( ls_entity-client IS INITIAL ). it_entity-client = sy-mandt. ENDIF. IF ( ls_entity-travel_id IS NOT INITIAL ). TRY. DATA itb_entity TYPE TABLE OF zml_booking. IF ( it_entity-booking_id IS INITIAL ). it_entity-booking_id = zml_create_uuid( ). itb_entity = VALUE #( ( it_entity ) ). INSERT zml_booking FROM TABLE <a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1074930">@itb</a>_entity. ELSE. itb_entity = VALUE #( ( it_entity ) ). MODIFY zml_booking FROM TABLE <a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1074930">@itb</a>_entity. ENDIF. es_entity = it_entity. CATCH cx_uuid_error. ENDTRY. ENDIF. ENDMETHOD. ENDCLASS.</code></pre><P>&nbsp;</P><P>You can use this example of OData service as start point of developing your own package with own model and own project for OData by SEGW transaction. Now you have clear understanding how it can be implemented and fulfill business requirements, especially when those require none generative approach because particular changes of methods business consider as most effective approach on working production instances.&nbsp;</P><P>Thank you for your attention and happy programming,</P><P>Yours sincerely,</P><P>Mikhail.</P><P>PS: if you missed this link:&nbsp;<A href="https://github.com/lukcad/ZMLODATA.git" target="_blank" rel="nofollow noopener noreferrer">https://github.com/lukcad/ZMLODATA.git</A></P><P>&nbsp;</P> 2024-05-03T08:33:54.245000+02:00 https://community.sap.com/t5/application-development-blog-posts/it-s-never-been-easier-to-invoke-machine-learning-and-generative-ai-from-an/ba-p/13687218 It's never been easier to invoke Machine Learning and Generative AI from an ABAP application 2024-05-03T08:34:43.224000+02:00 lpm https://community.sap.com/t5/user/viewprofilepage/user-id/1446391 <P>We have exciting news for SAP developers! You may remember that last year, IBM and SAP <A title="SAP to Embed IBM Watson Artificial Intelligence into SAP® Solutions" href="https://newsroom.ibm.com/2023-05-02-SAP-to-Embed-IBM-Watson-Artificial-Intelligence-into-SAP-R-Solutions" target="_blank" rel="noopener nofollow noreferrer">jointly announced</A>&nbsp; a milestone collaboration around embedding AI into SAP solutions. One visible outcome was the adoption of Watson technology in the SAP Start and SAP Joule digital assistants.</P><P>And at the same time, IBM's been working on creating a watsonx Software Development toolKit (SDK) for SAP ABAP, complementing the existing Watson SDK that was refreshed in 2023.</P><P>I am pleased to confirm that the watsonx ABAP SDK version 1.0.0 <STRONG>is now live</STRONG>. It was released late March 2024 by the IBM SAP Software Engineering Team as expected. It is a separate release from its relative, the Watson SDK, who released a version 2 in Q4 2023. Both SDKs are open source and downloadable from GitHub.</P><P>If you develop SAP apps or have clients doing so, this is big news. It is truly a revolution in easily integrating Machine Learning and Generative AI, in just a few clicks, into an SAP ABAP application. Literally in 10 minutes!</P><P>The watsonx SDK comes in two flavors, allowing SAP developers to easily access watsonx from an ABAP application in a traditional SAP NetWeaver environment, and also in the latest SAP Business Technology Platform (BTP):</P><UL class=""><LI><A href="https://github.com/IBM/abap-sdk-nwas-x/tree/1.0.0" target="_blank" rel="noopener nofollow noreferrer">watsonx ABAP SDK for SAP NetWeaver</A>&nbsp;</LI><LI><A href="https://github.com/IBM/abap-sdk-btp-x/tree/1.0.0" target="_blank" rel="noopener nofollow noreferrer">watsonx ABAP SDK for SAP BTP ABAP Environment</A>&nbsp;</LI></UL><P>The SDK natively supports both the <A href="https://cloud.ibm.com/apidocs/watsonx-ai" target="_blank" rel="noopener nofollow noreferrer">watsonx.ai</A> (V1) and the <A href="https://cloud.ibm.com/apidocs/machine-learning" target="_blank" rel="noopener nofollow noreferrer">Watson Machine Learning</A> (V4). To get developers up to speed quickly, <A href="https://github.com/IBM/abap-sdk-nwas-x/tree/1.0.0?tab=readme-ov-file#examples" target="_blank" rel="noopener nofollow noreferrer">comprehensive examples</A> are included in both of the APIs' documentation.</P><UL><LI>The sample code for the watsonx.ai sends a AI prompt to a generative AI model and collects the generated response. It uses the granite-13b-chat-v2 in the example but there are <A href="https://www.ibm.com/docs/en/watsonx-as-a-service?topic=solutions-supported-foundation-models" target="_blank" rel="noopener nofollow noreferrer">many other superb models</A> available through watsonx.</LI><LI>The sample code for the Watson Machine Learning API lets you unleash the full capability of Watson Machine Learning (ML):<UL><LI>Without going too far in the detail, to use watsonx ML you have to create a watsonx deployment space. This is where you will deploy your ML assets, which can be models, functions, or scripts.</LI><LI>Python is a popular language for functions, in fact most frameworks in Watson ML rely on Python (or R). With a Python function, you can perform any ML task like creating, training, and using models.<UL><LI>For instance you can <A href="https://dataplatform.cloud.ibm.com/exchange/public/entry/view/1eddc77b3a4340d68f762625d40b64f9?context=wx" target="_blank" rel="noopener nofollow noreferrer">recognize hand-written digits</A>, or to <A href="https://dataplatform.cloud.ibm.com/exchange/public/entry/view/61a8b600f1bb183e2c471e7a64299f0e?context=wx" target="_blank" rel="noopener nofollow noreferrer">predict business area for a car rental company</A>, etc.</LI><LI>You're welcome to write your own Python functions from scratch but in most cases you'd want to leverage <A href="https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-py-function.html?context=wx" target="_blank" rel="noopener nofollow noreferrer">existing example notebooks</A> to save time</LI></UL></LI><LI>Going back to the watsonx ABAP SDK: in the supplied sample code, the ABAP application <SPAN class="">deploys arbitrary Python code </SPAN>as a Python function on a watsonx deployment space and calls the deployed function. It also supplies a CURL command that can be used to easily call the deployed function from the command line</LI><LI>So the SDK connects lets you use the full capabilities of watsonx ML with very little development effort.&nbsp; Then no further SAP programming knowledge is necessary, you can refer to the regular watsonx ML <A href="https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-py-function-write.html?context=wx" target="_blank" rel="noopener nofollow noreferrer">documentation</A>. And of course, reuse the many examples of functions, models, and scripts provided by IBM and third parties.</LI></UL></LI></UL><P>See also the <A href="https://community.sap.com/t5/application-development-blog-posts/abap-sdk-for-ibm-watsonx-released/ba-p/13658514" target="_blank">post</A> by <a href="https://community.sap.com/t5/user/viewprofilepage/user-id/184450">@christian_bartels</a> on the same topic.</P> 2024-05-03T08:34:43.224000+02:00 https://community.sap.com/t5/technology-blogs-by-sap/how-to-generate-a-wrapper-for-function-modules-bapis-in-tier-2/ba-p/13692790 How to generate a wrapper for function modules (BAPIs) in tier 2 2024-05-06T16:10:39.975000+02:00 Andre_Fischer https://community.sap.com/t5/user/viewprofilepage/user-id/55 <H1 id="toc-hId-865292930">Introduction</H1><P><SPAN>In a tutorial&nbsp;<A href="https://developers.sap.com/tutorials/abap-s4hanacloud-purchasereq-create-wrapper.html" target="_blank" rel="noopener noreferrer">Implement a Wrapper for the "Create Purchase Requisition" (BAPI_PR_CREATE) function module</A>&nbsp;that was published recently it was shown how to deal with the case in which no convenient released API is available to create purchase requisitions.</SPAN></P><P><SPAN>The question that came to my mind was whether there would be a way to automate the steps described in this tutorial so that creating wrappers for other BAPIs would become more easy.</SPAN></P><P><SPAN>So I did some investigation and have build a prototype of such a wrapper that it based on the same framework as the transaction ACO_PROXY.&nbsp;</SPAN></P><P><SPAN>This transaction is already available for quite some time and can be used to generate a wrapper class for one or more function modules.</SPAN></P><P><SPAN>In order to leverage the generated code it would however be necessary to perform several manual steps to adapt the same. Since these steps can be automated I have build a helper class and a helper report that perform these tasks for your convenience.</SPAN></P><H1 id="toc-hId-668779425"><SPAN>RFC tier2 proxy generator</SPAN></H1><P><SPAN>The RFC tier2 proxy generator is based on the same API that is used by the transaction ACO_PROXY which is described in the following <A href="https://developers.sap.com/tutorials/abap-environment-generation-rfc-proxy.html" target="_blank" rel="noopener noreferrer">tutorial</A>. This transaction allows to generate a wrapper class for one or more function modules. The code can however not be used immediately since it contains a few statements that need to be adjusted (e.g. CLASS-METHODS statements and CALL DESTINATION _dest_ statements).</SPAN></P><P><SPAN>The transaction ACO_PROXY and its underlying API now also check if a data element that is used by a non released function module itself has been released. If this is the case, no shadow type will be generated.</SPAN></P><P><SPAN>The recommended approach (see the tutorial above) is also to use a C1-released interface and a C1-released wrapper class that intantiates the wrapper class being used in your ABAP Cloud coding.</SPAN></P><P><SPAN>So I developed a class that calls the same API&nbsp;</SPAN></P><P>&nbsp;</P><P>&nbsp;</P><P>&nbsp;</P><P>&nbsp;</P><P>&nbsp;</P><pre class="lia-code-sample language-abap"><code>cl_aco_static_proxy=&gt;create_static_proxy_by_rfc( EXPORTING function_names = i_function_modules proxy_name = i_proxy_class_name destination_name = 'NONE' devclass = i_package_name trkorr = i_transport_request classic_exceptions = abap_false bapi_exceptions = abap_false generate_inactive = abap_false destination_by_constructor = abap_false do_not_create_released_type = abap_true ).</code></pre><P>&nbsp;</P><P>&nbsp;</P><P>&nbsp;</P><P>&nbsp;</P><P>&nbsp;</P><P><SPAN>and which in addition </SPAN></P><UL><LI><SPAN>creates an interface and a factory class</SPAN></LI><LI><SPAN>moves part of the code generated by the API mentioned above to the interface</SPAN></LI><LI><SPAN>changes the code of the generated wrapper class to use the interface</SPAN></LI><LI><SPAN>C1-release the factory class and the interface</SPAN></LI></UL><H1 id="toc-hId-472265920"><SPAN>How to get the source code of the RFC tier2 generator</SPAN></H1><P><SPAN>The source code of the RFC tier2 generator has been published in the following repository on Github.com</SPAN></P><P><SPAN><A href="https://github.com/SAP-samples/tier2-rfc-proxy" target="_blank" rel="noopener nofollow noreferrer">SAP-samples/tier2-rfc-proxy</A>&nbsp;</SPAN></P><P>&nbsp;</P><P>&nbsp;</P><H1 id="toc-hId-275752415"><SPAN>Prerequisites</SPAN></H1><P><SPAN>- You have to have a system based on SAP S/4HANA 2022 or 2023 on premise.<BR />- You have to have enabled Developer extensibility<BR />- You have to apply the following notes<BR />- [SAP Note 3444292 - ACO Proxy creates unnecessary shadow types](<A href="https://me.sap.com/notes/3444292" target="_blank" rel="noopener noreferrer">https://me.sap.com/notes/3444292</A>)<BR />- [SAP Note 3457580 - SAP ACO - Duplicate Types for Table Parameters](<A href="https://me.sap.com/notes/3457580" target="_blank" rel="noopener noreferrer">https://me.sap.com/notes/3457580</A>)<BR /></SPAN></P><H1 id="toc-hId-79238910"><SPAN>How to use the RFC tier2 generator</SPAN></H1><P><SPAN>When you have downloaded the class and the report simply start the report&nbsp;<STRONG>zr_gen_rfc_tier2_proxy</STRONG>.</SPAN></P><P><SPAN>Here you can select one or more function modules that will be wrapped by one single class.</SPAN></P><P><SPAN>(e.g BAPI_PR_CREATE, BAPI_PR_CHANGE,&nbsp;BAPI_PR_GETDETAIL, ...)</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="010_select_function_modules.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/106304i589D0764FE7EB4EA/image-size/large?v=v2&amp;px=999" role="button" title="010_select_function_modules.png" alt="010_select_function_modules.png" /></span></SPAN></P><P>Now you have to specify additional parameters such as the <STRONG>target package</STRONG> where the wrapper objects are going to be generated.</P><P>Then there there are two radio buttons that allow you to choose between the generation of an interface, a wrapper class and a factoy class (option 1, recommended) or just one wrapper class (option 2).</P><P>As described in the above mentioned tutorial the approach of using an interface and a factory class is the recommended one.</P><P>Last not least you have to provide the names of the repository objects that will be generated.</P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="020_specify_options.png" style="width: 930px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/106306iFCD3BB67A93825FC/image-size/large?v=v2&amp;px=999" role="button" title="020_specify_options.png" alt="020_specify_options.png" /></span></SPAN></P><P><SPAN>When the reports finishes successfully it will list the generated repository objects.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="030_result_report.png" style="width: 921px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/106305iD44607277AFF1E5B/image-size/large?v=v2&amp;px=999" role="button" title="030_result_report.png" alt="030_result_report.png" /></span></SPAN></P><P>The objects can then be checked in the target package.</P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="040_generated_objects.png" style="width: 547px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/106307i2DB130DF3778B41D/image-size/large?v=v2&amp;px=999" role="button" title="040_generated_objects.png" alt="040_generated_objects.png" /></span></SPAN></P><P><SPAN>Hope this will help to speed up the process of creating wrappers for non-released function modules.</SPAN></P><H1 id="toc-hId--117274595"><SPAN>ToDo's</SPAN></H1><P><SPAN>What is left to do is to change the value help of the report such that only function modules can be selected that are marked as stable.</SPAN></P><P><SPAN><A href="https://community.sap.com/t5/technology-blogs-by-sap/how-to-find-sap-apis-for-sap-s-4hana-3-tier-extensibility-model/ba-p/13623819" target="_blank">How to find SAP APIs for SAP S/4HANA 3-tier extens... - SAP Community</A></SPAN></P><P><SPAN><A href="https://github.com/SAP/abap-atc-cr-cv-s4hc/tree/main" target="_blank" rel="noopener nofollow noreferrer">SAP/abap-atc-cr-cv-s4hc: ABAP test cockpit cloud readiness check variants for SAP S/4HANA Cloud (github.com)</A></SPAN></P><H1 id="toc-hId--313788100"><SPAN>Future Outlook</SPAN></H1><P>In future the idea is to provide such a generator as well in the ABAP development tools for Eclipse.</P><P>This will be possible with the next S/4HANA release and the ADT generator framework. &nbsp;&nbsp;&nbsp;</P><P>&nbsp;</P><P>&nbsp;</P> 2024-05-06T16:10:39.975000+02:00 https://community.sap.com/t5/application-development-blog-posts/increase-width-of-dynpros-generated-by-table-maintenance-generator/ba-p/13695234 Increase width of Dynpros generated by table maintenance generator 2024-05-08T17:49:34.459000+02:00 joschkarick https://community.sap.com/t5/user/viewprofilepage/user-id/272892 <P>If you want to adjust the width for Dynpros generated by the table maintenance generator, follow this guide.</P><OL><LI>Create a new package for the objects created in this guide (e. g. Z_ADJUST_GEN_DYNPRO_WIDTH)</LI><LI>Right-click on the new package and choose "Create -&gt; Other (1) -&gt; SET/GET Parameter ID" and name it Z_DYNPRO_GEN_WIDTH (or whatever name you choose). This will contain the new width-value for the generated dynpros.</LI><LI><SPAN>Open include MSVIMF21. This include contains the ABAP coding which generates Dynpros for maintenance views. Show the implicit enhancement options via Edit -&gt; Enhancement Options -&gt; Show Implicit Enhancement Options and click the Enhance button (swirl icon; shortcut is Shift+F4).</SPAN></LI><LI><SPAN>Find the end of form CREATE_DYNP_HEADER, click on the enhancement line (""""""...) and create a new enhancement implementation for coding. Insert the coding from code snippet below.</SPAN></LI><LI><SPAN>Find the end of form&nbsp;</SPAN><SPAN>CREATE_DYNP_CONT, click on the enhancement line (""""""""...) and create a new enhancement implementation for coding. Insert the coding from the other code snippet below.</SPAN></LI><LI><SPAN>Add parameter&nbsp;Z_DYNPRO_GEN_WIDTH to every user who wants to generate dynpros with the adjusted width and set the parameter value to the new width you desire (200 worked well for me).</SPAN></LI><LI><SPAN>Activate both enhancement implementations, if not done</SPAN></LI></OL><P><SPAN>You might want to provide a different source for the dynpro width, e. g. a customizing table or even a fixed value.</SPAN></P><P><SPAN>Code snippet for CREATE_DYNP_HEADER enhancement:</SPAN></P><P>&nbsp;</P><pre class="lia-code-sample language-abap"><code> DATA lv_dynpro_gen_width(3) TYPE c. " By default dynpros are limitted to a width of 83 characters. " Modern screens are larger, so we can extend the max. width. " The width is determined by user parameter Z_DYNPRO_GEN_WIDTH. GET PARAMETER ID 'Z_DYNPRO_GEN_WIDTH' FIELD lv_dynpro_gen_width. IF sy-subrc = 0. p_header-columns = CONV #( lv_dynpro_gen_width ). ENDIF.</code></pre><P>&nbsp;</P><P><SPAN>Code snippet for CREATE_DYNP_CONT enhancement:</SPAN></P><P>&nbsp;</P><pre class="lia-code-sample language-abap"><code> IF p_mode = '11'. READ TABLE p_cont ASSIGNING &lt;w_cont&gt; WITH KEY type = rpyty_dynp_ctype-table_control name = cont_name. IF sy-subrc &lt;&gt; 0. rc = sy-subrc. EXIT. ENDIF. DATA lv_dynpro_gen_width(3) TYPE c. " By default dynpros are limitted to a width of 83 characters. " Modern screens are larger, so we can extend the max. width. " The width is determined by user parameter Z_DYNPRO_GEN_WIDTH. GET PARAMETER ID 'Z_DYNPRO_GEN_WIDTH' FIELD lv_dynpro_gen_width. IF sy-subrc = 0. &lt;w_cont&gt;-length = CONV #( lv_dynpro_gen_width ). ENDIF. ENDIF.</code></pre><P>&nbsp;</P><P>Enjoy! Feedback is welcome.</P><P>&nbsp;</P> 2024-05-08T17:49:34.459000+02:00 https://community.sap.com/t5/application-development-blog-posts/how-to-bring-generative-ai-to-your-abap-program-using-the-abap-sdk-for-ibm/ba-p/13694067 How to Bring Generative AI to Your ABAP Program Using the ABAP SDK for IBM watsonx 2024-05-08T17:49:41.177000+02:00 joachim_rese https://community.sap.com/t5/user/viewprofilepage/user-id/489707 <H2 id="toc-hId-994428418">Introduction</H2><P>IBM watsonx is an all-in-one platform to train, validate, tune and deploy models for generative AI. It comes with a compilation of deployed generative AI models that can be used out-of-the-box. The ABAP SDK for IBM watsonx is a set of ABAP classes and data types that allows generative AI inferencing by pure ABAP means.</P><P>It is assumed that you have some basic knowledge in generative AI, in particular prompt engineering. Otherwise get familiar with the most important terms, for example by reading <A href="https://community.sap.com/t5/sap-business-technology-platform-partner-knowledge/generative-ai-for-beginners-part-6-prompt-engineering-the-art-of/ta-p/13632760" target="_self">this blog</A>.</P><P>Follow the steps in this blog to implement a generative AI test data generator in ABAP. The program will</P><OL><LI>generate a prompt based on data available in the system</LI><LI>execute that prompt on a model hosted on watsonx.ai</LI><LI>process the generative AI response</LI></OL><P>Throughout this blog all parts that are related to watsonx are explained in detail. Other parts are only mentioned and not elaborated. However, at the end of this post you find the full code of a working demo program. Use this as a reference.</P><P>&nbsp;</P><H2 id="toc-hId-797914913">Create a watsonx Project</H2><P>If you do not already have an IBM watsonx or an IBM Cloud account, "Start your free trail" on <A href="https://www.ibm.com/watsonx" target="_blank" rel="noopener nofollow noreferrer">https://www.ibm.com/watsonx</A>&nbsp;and proceed through the onboarding process.&nbsp;</P><P>After login to watsonx, you get to the home screen. See the right upper corner for the region where your watsonx instance resides. You need this information later.</P><P>Create a new project by clicking the plus sign next to the "Projects" header line.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="watsonx_home.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103150iA082300B200B546E/image-size/large?v=v2&amp;px=999" role="button" title="watsonx_home.png" alt="watsonx_home.png" /></span></P><P>Enter a name and a description for your project and click "Create".</P><P>Inside the watsonx project, click tab "Manage" and copy and save the "Project ID". You will need it later.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="watsonx_projectid.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103131i873FB3D513EBE6D3/image-size/large?v=v2&amp;px=999" role="button" title="watsonx_projectid.png" alt="watsonx_projectid.png" /></span></P><P>You must associate a Watson Machine Learning service to your project. Click on "Service &amp; integration", tab "IBM services". Click "Associate service", check service of type "Watson Machine Learning" and click "Associate"</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="watsonx_wml_service.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/106417i19B1A697A603A88D/image-size/large?v=v2&amp;px=999" role="button" title="watsonx_wml_service.png" alt="watsonx_wml_service.png" /></span></P><P>If there is no service of type "Watson Machine Learning" that can be selected, click "New Service" and instantiate a new Waston Machine Learning service.</P><P>Next you must generate an apikey. To do so, click on the navigation menu at the left upper corner and select "Administration" →&nbsp;"Access (IAM)". Select "API keys" and click "Create". Enter a name and a description and click "Create". An apikey is created and shown to you. Copy and save the apikey; you will not be able to see it again.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="watsonx_apikey.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103301i6A2A59B43452DE2C/image-size/large?v=v2&amp;px=999" role="button" title="watsonx_apikey.png" alt="watsonx_apikey.png" /></span></P><P data-unlink="true">You need to identify the URL to the watsonx API. It complies to scheme<BR /><FONT face="courier new,courier">https://&lt;region&nbsp;code&gt;.ml.cloud.ibm.com</FONT><BR />where &lt;region code&gt; is the region code of the region where your watsonx instance resides (see above). For exmaple&nbsp;<FONT face="courier new,courier">eu-de</FONT> for Europe (Frankfurt) or <FONT face="courier new,courier">us-south</FONT> for Dallas.</P><P data-unlink="true">Finally, you have the credentials that are needed to access watsonx. (Certainly, the values below are invalid and for demonstration only.)</P><P data-unlink="true"><FONT face="courier new,courier">url:&nbsp; &nbsp; &nbsp; &nbsp; https://eu-de.ml.cloud.ibm.com </FONT><BR /><FONT face="courier new,courier">apikey:&nbsp; &nbsp; &nbsp;t8a0OQpVgs6z9jZNKGt9Ghk498f0biyZvRf-E4eqw11K</FONT><BR /><FONT face="courier new,courier">project_id: e8db8f7c-36f6-40ca-804a-238c6e557c46</FONT></P><P data-unlink="true">&nbsp;</P><H2 id="toc-hId-601401408">Prepare the ABAP Environment</H2><P data-unlink="true">You must import the ABAP SDK for IBM watsonx using abapGIT pull. If your runtime environment is NetWeaver 7.50 (or above) or S/4HANA on premise, follow instructions on <A href="https://github.com/IBM/abap-sdk-nwas-x" target="_blank" rel="noopener nofollow noreferrer">https://github.com/IBM/abap-sdk-nwas-x</A>. For the BTP ABAP Environment, follow&nbsp; instructions on&nbsp;<A href="https://github.com/IBM/abap-sdk-btp-x" target="_blank" rel="noopener nofollow noreferrer">https://github.com/IBM/abap-sdk-btp-x</A>.&nbsp;</P><P>For this tutorial a set of tables with some contents is required. If such tables are not available or not known to you, import the&nbsp;<A href="https://help.sap.com/docs/ABAP_PLATFORM_NEW/fc4c71aa50014fd1b43721701471913d/def316685ad14033b051fc4b88db07c8.htmll" target="_self" rel="noopener noreferrer">ABAP Flight Reference Scenario</A>&nbsp;to your environment and generate the demo data.</P><P>Select or create a database table that you want to populate with generative AI data. For example, create package <FONT face="courier new,courier">ZWATSONX</FONT> under structure package <FONT face="courier new,courier">ZLOCAL</FONT> and create table <FONT face="courier new,courier">ZIBM_CUSTOMER</FONT> in that package. This table can be a copy of table <FONT face="courier new,courier">/DMO/CUSTOMER</FONT>. Thus, the database table definition may look like below.</P><P>&nbsp;</P><pre class="lia-code-sample language-abap"><code>@EndUserText.label : 'Copy of table /DMO/CUSTOMER' @AbapCatalog.enhancement.category : #NOT_EXTENSIBLE @AbapCatalog.tableCategory : #TRANSPARENT @AbapCatalog.deliveryClass : #A @AbapCatalog.dataMaintenance : #RESTRICTED define table zibm_customer { key client : abap.clnt not null; key customer_id : /dmo/customer_id not null; first_name : /dmo/first_name; last_name : /dmo/last_name; title : /dmo/title; street : /dmo/street; postal_code : /dmo/postal_code; city : /dmo/city; country_code : land1; phone_number : /dmo/phone_number; email_address : /dmo/email_address; }</code></pre><P>&nbsp;</P><H2 id="toc-hId-404887903">Prompt Generation</H2><P>You must build a prompt that instructs the generative AI model to generate test data. This works best if you use few-shot prompting, which means to include some examples in the prompt. For the sake of&nbsp;convenience and flexibility, do not hard-code those examples. Instead, implement some ABAP code that reads a small portion of the contents and the data dictionary information of some given tables and generates examples for the prompt. A single example can be added to the prompt using this format:</P><P>&nbsp;</P><pre class="lia-code-sample language-json"><code>[example] records: n format: &lt;table field names and types&gt; data: &lt;n table records in JSON format&gt; [end]</code></pre><P>&nbsp;</P><P>The complete prompt looks like this:</P><P>&nbsp;</P><pre class="lia-code-sample language-json"><code>Generate data in JSON format as shown in examples below. Insert tag [end] after given number of records. [example] &lt;example data generated from table #1&gt; [end] [example] &lt;example data generated from table #2&gt; [end] [example] &lt;example data generated from table #3&gt; [end] [input] records: n format: &lt;table field names and type of target table ZIBM_CUSTOMER&gt; data:</code></pre><P>&nbsp;</P><P>The tables that are used to generate the examples should in total include all data types that appear in the target table. They should be client-dependent if (and only if) that target table is client-dependent.</P><P>&nbsp;</P><H2 id="toc-hId-208374398">Calling watsonx Generative AI</H2><P>After the prompt has been generated, you can call watsonx to execute the prompt and thus generate test data. First you must provide watsonx.ai credentials. You can either specify those in your ABAP code or, recommended, configure table ZIBMX_CONFIG accordingly.</P><P>&nbsp;</P><pre class="lia-code-sample language-abap"><code>CONSTANTS c_url TYPE string VALUE 'https://eu-de.ml.cloud.ibm.com'. CONSTANTS c_apikey TYPE string VALUE 't8a0OQpVgs6z9jZNKGt9Ghk498f0biyZvRf-E4eqw11K'. CONSTANTS c_project_id TYPE string VALUE 'e8db8f7c-36f6-40ca-804a-238c6e557c46'.</code></pre><P>&nbsp;</P><P>Next instantiate the wrapper class for watsonx.ai.</P><P>&nbsp;</P><pre class="lia-code-sample language-abap"><code>DATA: lo_watsonx_ai TYPE REF TO zcl_ibmx_watsonx_ai_ml_v1. zcl_ibmx_service_ext=&gt;get_instance( EXPORTING i_url = c_url i_apikey = c_apikey i_version = '2023-05-29' IMPORTING eo_instance = lo_watsonx_ai ).</code></pre><P>&nbsp;</P><P>Now you can call method <FONT face="courier new,courier">text_generation</FONT>. It calls watsonx and returns the generative AI inference result.</P><P>As parameters, you must specify the prompt that has been generated before, the model id and a set of model parameters like decoding method and the maximal number of generated tokens.&nbsp;<SPAN>watsonx supports several generative AI models, for example IBM's Granite models.</SPAN></P><P>Also, you must provide the id of the watsonx project that you have created before.</P><P>&nbsp;</P><pre class="lia-code-sample language-abap"><code>TRY. lo_watsonx_ai-&gt;text_generation( EXPORTING i_textgenrequest = VALUE zcl_ibmx_watsonx_ai_ml_v1=&gt;t_text_gen_request( " prompt input = &lt;prompt&gt; " model parameters model_id = 'ibm/granite-13b-chat-v2' parameters = VALUE zcl_ibmx_watsonx_ai_ml_v1=&gt;t_text_gen_parameters( decoding_method = 'greedy' max_new_tokens = 2000 repetition_penalty = '1.05' stop_sequences = VALUE #( ( `[end]` ) ) " stop at [end] tag ) " watsonx project id project_id = c_project_id ) IMPORTING e_response = DATA(ls_generated_document) ). CATCH zcx_ibmx_service_exception INTO DATA(lo_service_exception). " handle exception ENDTRY.</code></pre><P>&nbsp;</P><P>The inference result is returned in an internal table that contains a single record which holds the generated data in JSON format as indicated in the prompt. Insert the data into the target database table using a JSON parser.</P><P>&nbsp;</P><pre class="lia-code-sample language-abap"><code>DATA lr_data TYPE REF TO data. CREATE DATA lr_data TYPE TABLE OF ZIBM_CUSTOMER. /ui2/cl_json=&gt;deserialize( EXPORTING json = ls_generated_document-results[ 1 ]-generated_text CHANGING data = lr_data-&gt;* ). INSERT ZIBM_CUSTOMER FROM TABLE _data-&gt;*.</code></pre><P>&nbsp;</P><H2 id="toc-hId-11860893">Run the Application</H2><P>Now you are ready to run your ABAP code. After the program has finished, check the data in your table.</P><P>&nbsp;</P><pre class="lia-code-sample language-json"><code>CLIENT CUSTOMER_ID FIRST_NAME LAST_NAME TITLE STREET POSTAL_CODE CITY COUNTRY_CODE PHONE_NUMBER EMAIL_ADDRESS 100 001001 John Doe Mr. 34 South Road 12345 Anytown US +1 212-555-1212 johndoe@email.com 100 001002 Jane Smith Ms. 43 East Street 67890 Emeryville US +1 415-555-1234 janesmith@email.com 100 001003 Jim Johnson Dr. 56 North Avenue 55111 Seattle US +1 206-555-5678 jimjohnson@email.com 100 001004 Anna Miller Mrs. 71 West Lane 33333 London GB +44 20-7654-5309 annamiller@email.com 100 001005 Bob Williams Mr. 89 Maple Street 12345 Toronto CA +1 416-555-1111 bobwilliams@email.com</code></pre><P>&nbsp;</P><H2 id="toc-hId--184652612">Conclusion</H2><P>You learnt how to generate a prompt, execute that prompt on a generative AI model deployed on watsonx and process the response. All this is done with ABAP code only while the complexity of the API calls is hidden by the ABAP SDK for IBM watsonx.</P><P>The same technique can be used to include generative AI in any business process that is implemented in ABAP.</P><P>&nbsp;</P><H2 id="toc-hId--381166117">Addendum</H2><P>Here is the full code of a demo program. It was implemented on BTP ABAP Environment and runs as a console application. To run it on a NetWeaver system or on S/4HANA on premise, remove or replace all references to interface&nbsp;<FONT face="courier new,courier">if_oo_adt_classrun</FONT>, including the <FONT face="courier new,courier">out-&gt;write</FONT> statements. In all cases you have to adjust watsonx credentials before running the application.</P><P>&nbsp;</P><pre class="lia-code-sample language-abap"><code>CLASS zwatsonx_genai_data_generator DEFINITION PUBLIC FINAL CREATE PUBLIC . PUBLIC SECTION. INTERFACES if_oo_adt_classrun . PROTECTED SECTION. PRIVATE SECTION. METHODS field_data IMPORTING i_tabname TYPE string RETURNING VALUE(e_text) TYPE string. METHODS content_data IMPORTING i_tabname TYPE string i_count TYPE i RETURNING VALUE(e_text) TYPE string. METHODS prompt_section IMPORTING i_kind TYPE string i_tabname TYPE string i_count TYPE i RETURNING VALUE(e_text) TYPE string. METHODS insert_json IMPORTING i_json TYPE string i_tabname TYPE string RAISING cx_sy_open_sql_db. ENDCLASS. CLASS zwatsonx_genai_data_generator IMPLEMENTATION. METHOD if_oo_adt_classrun~main. CONSTANTS c_url TYPE string VALUE 'https://eu-de.ml.cloud.ibm.com'. " &lt;-- ADJUST CONSTANTS c_apikey TYPE string VALUE 't8a0OQpVgs6z9jZNKGt9Ghk498f0biyZvRf-E4eqw11K'. " &lt;-- ADJUST CONSTANTS c_project_id TYPE string VALUE 'e8db8f7c-36f6-40ca-804a-238c6e557c46'. " &lt;-- ADJUST CONSTANTS c_tabname TYPE string VALUE 'ZIBM_CUSTOMER'. CONSTANTS c_count TYPE i VALUE 5. " compile prompt (featuring 3-shot prompting) DATA(lv_prompt) = " instruction `Generate data in JSON format as shown in examples below. Insert tag [end] after given number of records.` &amp;&amp; cl_abap_char_utilities=&gt;newline &amp;&amp; " examples prompt_section( i_kind = 'example' i_tabname = '/DMO/AGENCY' i_count = 2 ) &amp;&amp; prompt_section( i_kind = 'example' i_tabname = '/DMO/AIRPORT' i_count = 4 ) &amp;&amp; prompt_section( i_kind = 'example' i_tabname = '/DMO/FLIGHT' i_count = 3 ) &amp;&amp; " input prompt_section( i_kind = 'input' i_tabname = c_tabname i_count = c_count ). " instantiate wrapper class for watsonx.ai API DATA: lo_watsonx_ai TYPE REF TO zcl_ibmx_watsonx_ai_ml_v1. zcl_ibmx_service_ext=&gt;get_instance( EXPORTING i_url = c_url i_apikey = c_apikey i_version = '2023-05-29' IMPORTING eo_instance = lo_watsonx_ai ). " run text generation TRY. lo_watsonx_ai-&gt;text_generation( EXPORTING i_textgenrequest = VALUE zcl_ibmx_watsonx_ai_ml_v1=&gt;t_text_gen_request( " prompt input = lv_prompt " model parameters model_id = 'ibm/granite-13b-chat-v2' parameters = VALUE zcl_ibmx_watsonx_ai_ml_v1=&gt;t_text_gen_parameters( decoding_method = 'greedy' max_new_tokens = 2000 repetition_penalty = '1.05' stop_sequences = VALUE #( ( `[end]` ) ) " stop at [end] tag ) " watsonx project id project_id = c_project_id ) IMPORTING e_response = DATA(ls_generated_document) ). CATCH zcx_ibmx_service_exception INTO DATA(lo_service_exception). out-&gt;write( `ERROR when generating text: ` &amp;&amp; lo_service_exception-&gt;get_longtext( ) ). EXIT. ENDTRY. " collect generated texts (single record in ls_generated_document-results is expected) DATA(lv_json) = ``. LOOP AT ls_generated_document-results INTO DATA(ls_result). lv_json = lv_json &amp;&amp; ls_result-generated_text. ENDLOOP. " if LLM has generated [end] tag, remove it REPLACE ALL OCCURRENCES OF '[end]' IN lv_json WITH ''. " insert JSON data into table TRY. insert_json( i_json = lv_json i_tabname = c_tabname ). CATCH cx_sy_open_sql_db INTO DATA(lo_osql_exception). out-&gt;write( `ERROR when inserting data: ` &amp;&amp; lo_osql_exception-&gt;get_longtext( ) ). EXIT. ENDTRY. " success message out-&gt;write( `Data in table ` &amp;&amp; c_tabname &amp;&amp; ` that has been generated by watsonx generative AI: ` ). DATA lr_data TYPE REF TO data. CREATE DATA lr_data TYPE TABLE OF (c_tabname). SELECT * FROM (c_tabname) INTO TABLE _data-&gt;*. out-&gt;write( lr_data-&gt;* ). ENDMETHOD. METHOD field_data. " generates field type information " example: table has CHAR field of length 8, INT field and STRING field " e_text = FIELDNAME1,C(8) | FIELDNAME2,I | FIELDNAME3,g | DATA ref_descr TYPE REF TO cl_abap_structdescr. DATA lt_comp TYPE abap_compdescr_tab. " initialize return value e_text = ``. " get field type information ref_descr ?= cl_abap_typedescr=&gt;describe_by_name( i_tabname ). lt_comp[] = ref_descr-&gt;components[]. " compile fields type list LOOP AT lt_comp INTO DATA(ls_comp). " get type length info DATA(lv_length) = ``. CASE ls_comp-type_kind. WHEN 'C' OR 'N'. lv_length = condense( CONV string( ls_comp-length DIV 2 ) ). " UTF-16 length to number of chars WHEN 'P'. lv_length = condense( CONV string( ls_comp-length ) ) &amp;&amp; `,` &amp;&amp; condense( CONV string( ls_comp-decimals ) ). ENDCASE. IF NOT lv_length EQ ''. lv_length = `(` &amp;&amp; lv_length &amp;&amp; `)`. ENDIF. " add field data to return value e_text = e_text &amp;&amp; ls_comp-name &amp;&amp; `,` &amp;&amp; ls_comp-type_kind &amp;&amp; lv_length &amp;&amp; ` | `. ENDLOOP. ENDMETHOD. METHOD content_data. " returns first rows of a table in JSON notation DATA lr_data TYPE REF TO data. e_text = `[`. DATA(lv_separator) = ``. " read table content CREATE DATA lr_data TYPE TABLE OF (i_tabname). SELECT * FROM (i_tabname) INTO TABLE _data-&gt;* UP TO @i_count ROWS. " serialize record-wise and add newlines LOOP AT lr_data-&gt;* ASSIGNING FIELD-SYMBOL(&lt;ls_reocord&gt;). e_text = e_text &amp;&amp; lv_separator &amp;&amp; /ui2/cl_json=&gt;serialize( data = &lt;ls_reocord&gt; ). lv_separator = `,` &amp;&amp; cl_abap_char_utilities=&gt;newline. ENDLOOP. e_text = e_text &amp;&amp; `]`. ENDMETHOD. METHOD prompt_section. " returns example table data to be added to prompt, i.e. " [example] " records: 2 " format: PET,C(8) | AGE,I | COMMENT,g | " data: " [{"PET": "cat", "AGE": 4, "COMMENT": "my pet"}, " {"PET": "dog", "AGE": 3, "COMMENT": "your pet"}] " [end] e_text = `[` &amp;&amp; i_kind &amp;&amp; `]` &amp;&amp; cl_abap_char_utilities=&gt;newline &amp;&amp; `records: ` &amp;&amp; condense( CONV string( i_count ) ) &amp;&amp; cl_abap_char_utilities=&gt;newline &amp;&amp; `format: ` &amp;&amp; field_data( i_tabname = i_tabname ) &amp;&amp; cl_abap_char_utilities=&gt;newline &amp;&amp; `data:` &amp;&amp; cl_abap_char_utilities=&gt;newline. IF i_kind EQ 'example'. e_text = e_text &amp;&amp; content_data( i_tabname = i_tabname i_count = i_count ) &amp;&amp; cl_abap_char_utilities=&gt;newline &amp;&amp; `[end]` &amp;&amp; cl_abap_char_utilities=&gt;newline &amp;&amp; cl_abap_char_utilities=&gt;newline. ENDIF. ENDMETHOD. METHOD insert_json. " inserts JSON data into database table DATA lr_data TYPE REF TO data. CREATE DATA lr_data TYPE TABLE OF (i_tabname). /ui2/cl_json=&gt;deserialize( EXPORTING json = i_json CHANGING data = lr_data-&gt;* ). DELETE from (i_tabname). INSERT (i_tabname) FROM TABLE _data-&gt;*. COMMIT WORK. ENDMETHOD. ENDCLASS.</code></pre><P>&nbsp;</P><P>&nbsp;</P> 2024-05-08T17:49:41.177000+02:00 https://community.sap.com/t5/supply-chain-management-blogs-by-members/sap-ewm-displacement-from-picking-to-storage-area-idea-amp-step-by-step/ba-p/13696804 SAP EWM. Displacement from picking to storage area. Idea & step-by-step implementation (with ABAP). 2024-05-09T23:04:45.225000+02:00 gorbenkoteh https://community.sap.com/t5/user/viewprofilepage/user-id/594529 <DIV><SPAN>SAP EWM. Displacement from picking to storage area. Idea &amp; Step-by-step implementation.</SPAN></DIV><DIV>This blog-post written in collaboration with ABAP-developer Victor Pupynin</DIV><DIV>&nbsp;</DIV><DIV><FONT size="5"><STRONG><SPAN>Intro.</SPAN></STRONG></FONT></DIV><DIV>Typical warehouse layout contains next functional areas:</DIV><UL><LI><DIV>Loading and unloading area</DIV></LI><LI><DIV>Goods reception area or warehouse entrance area</DIV></LI><LI><DIV>Repackaging area</DIV></LI><LI><DIV>Warehouse quarantine area</DIV></LI><LI><DIV>Sample selection area</DIV></LI><LI><DIV>Storage area</DIV></LI><LI><DIV><SPAN>Picking area</SPAN></DIV></LI><LI><DIV><SPAN>Order preparation area</SPAN></DIV></LI><LI><DIV><SPAN>Warehouse technical area</SPAN></DIV></LI><LI><DIV><SPAN>Warehouse administrative area</SPAN></DIV></LI></UL><DIV>Problem solved in this blog-post related to&nbsp;<SPAN>Storage area and&nbsp;</SPAN> <SPAN>Picking and order preparation areas.</SPAN></DIV><DIV>So let's do a closer look to activity in it.</DIV><DIV>&nbsp;</DIV><DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="displacement.jpg" style="width: 852px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/108218i210E231580F0F28B/image-size/large?v=v2&amp;px=999" role="button" title="displacement.jpg" alt="displacement.jpg" /></span></DIV><DIV>&nbsp;</DIV><DIV><DIV>Look at collage photo. This is typical warehouse landscape.</DIV><DIV>Level 1 -&nbsp; <SPAN>Picking</SPAN> <SPAN>area</SPAN></DIV><DIV><SPAN>Level 2 and higher&nbsp; -</SPAN>&nbsp;<SPAN>Storage area</SPAN></DIV><DIV><SPAN>also in the foreground - Order preparation area</SPAN></DIV><DIV>&nbsp;</DIV><DIV><SPAN>Typical business scenario:</SPAN></DIV><OL><LI><DIV>ERP-operator create in ECC(or S/4HANA) and distribute to EWM Outbound delivery</DIV></LI><LI><DIV><SPAN>EWM-operator:&nbsp; &nbsp;</SPAN></DIV></LI></OL><DIV>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;2.1. Create wave</DIV><DIV>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;2.2. Assign 1..N outbound deliveries&nbsp; to created wave</DIV><DIV>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.3.&nbsp; Release wave</DIV><DIV>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.4. SAP EWM creates WO/WT&nbsp;according to standard and customer-specific logic&nbsp;</DIV><DIV>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.5. One possible scenario:</DIV><DIV>if WT quantity &gt; quantity in pallet at storage area: route for pallet is: Storage Area -&gt;&nbsp; Console -&gt;&nbsp;<SPAN>Order preparation area</SPAN></DIV><DIV><SPAN>&nbsp; If WT quantity &lt; quantity in pallet at storage area. Route for pallet is: Storage area - &gt; Picking Area - &gt; partial aggregation </SPAN><SPAN>through source pallet to target pallet - &gt; Order preparation area </SPAN></DIV><DIV>&nbsp;</DIV><DIV><SPAN>3.Work in the aisles looks as:</SPAN></DIV><DIV><SPAN>For upper tiers:</SPAN></DIV><DIV><SPAN>High Reach Forklift (Turret Trucks)&nbsp;</SPAN><SPAN>Something like:&nbsp;Yale MTC10-15L,&nbsp;Hyster C1.0–1.5 or&nbsp;</SPAN><SPAN>Jungheinrich ETR 230</SPAN></DIV><DIV><SPAN>Remove the pallet from the upper tiers (Storage area) and put it on the lower tier (Picking area) or Console</SPAN></DIV><DIV>4.Work at the Console looks as:</DIV><DIV><SPAN>Forklift something like </SPAN><SPAN>Jungheinrich </SPAN><SPAN>EFG 213</SPAN></DIV><DIV><SPAN>Remove the pallet from Console and put it on the Picking area</SPAN></DIV><OL><LI><DIV><SPAN>Work at the lower tier looks as:</SPAN></DIV></LI></OL><DIV><SPAN>Workers</SPAN> <SPAN>with trolley</SPAN> <SPAN>"Rocla"&nbsp;carry out the picking process in Picking area. They are partial repack stock from source pallet to target pallet and move target pallet to order preparation area</SPAN></DIV><DIV>&nbsp;</DIV><DIV><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="rocla_img.png" style="width: 952px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/108219iC8FA6160BAE4EF62/image-size/large?v=v2&amp;px=999" role="button" title="rocla_img.png" alt="rocla_img.png" /></span></SPAN></DIV><DIV><DIV><SPAN>Hydraulic "Rocla" trolley&nbsp; Authors photos.</SPAN></DIV></DIV><DIV>&nbsp;</DIV><DIV><DIV><STRONG>Business problem. </STRONG></DIV><DIV>&nbsp;</DIV><DIV>Possible problem on Step 2.3.</DIV><DIV>For a lot of reasons situation when all storage bins at a picking area are full can be occurred.</DIV><DIV>At this case:</DIV><DIV>Wave Release status - (E) Error</DIV><DIV>EWM-operator at warehouse&nbsp; wind-up face-to-face with not easy to understand wave release log.</DIV><DIV>&nbsp;</DIV><DIV><STRONG>Resolution</STRONG></DIV><DIV><SPAN>Create automatic displacement from picking to storage area manually and during wave release. </SPAN></DIV><DIV>Possible <SPAN>sequence (manually via custom report) :</SPAN></DIV><DIV><SPAN>Step 0. Auxiliary table.</SPAN></DIV><DIV><SPAN>ZLGTYP_ROLE - Lgtyp Role (Storage, Transit, Picking, etc).</SPAN></DIV><DIV><SPAN>LGTYP_PICK - Relation between storage and picking area.</SPAN></DIV><DIV>&nbsp;</DIV><DIV><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="tabletype.png" style="width: 745px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/108220iE3A7BB42ED4A9030/image-size/large?v=v2&amp;px=999" role="button" title="tabletype.png" alt="tabletype.png" /></span></SPAN></DIV><DIV>&nbsp;</DIV><DIV><DIV><SPAN>Step 1. Selection screen </SPAN></DIV><DIV><SPAN>Options:</SPAN></DIV><DIV><SPAN>Range of Outbound deliveries.</SPAN></DIV><DIV><SPAN>Range of Waves.</SPAN></DIV><DIV><SPAN>Range of planed GI dates.</SPAN></DIV><DIV>Ideas for Screen implementation - <A href="https://github.com/basisteam-io/BasisTeam-Content/blob/master/blog/EWM/Displacement/selection_screen_1.abap" target="_blank" rel="noopener nofollow noreferrer">selection_screen_1.abap</A></DIV><DIV><A href="https://github.com/basisteam-io/BasisTeam-Content/blob/master/blog/EWM/Displacement/main.abap" target="_blank" rel="noopener nofollow noreferrer">main.abap</A></DIV><DIV><A href="https://github.com/basisteam-io/BasisTeam-Content/blob/master/blog/EWM/Displacement/selection.abap" target="_blank" rel="noopener nofollow noreferrer">selection.abap</A></DIV><DIV>Step 2. Logic for Scenario when all fields on selection screen on Step 1 were empty.</DIV><DIV>Select all Outbound deliveries without GI from the period from STVARV variable.</DIV><DIV>Ideas for selection from STVARV variable -&nbsp; <A href="https://github.com/basisteam-io/BasisTeam-Content/blob/master/blog/EWM/Displacement/stvarv.abap" target="_blank" rel="noopener nofollow noreferrer">stvarv.abap</A></DIV><DIV>&nbsp;</DIV><DIV>Step 3.&nbsp; Get items Outbound deliveries a<SPAN>ccording to the criteria defined in the Steps 1,2</SPAN></DIV><DIV><SPAN>Idea for Get Outbound deliveries according Range of Waves -&nbsp;<A href="https://github.com/basisteam-io/BasisTeam-Content/blob/master/blog/EWM/Displacement/get_wave.abap" target="_blank" rel="noopener nofollow noreferrer">get_wave.abap</A></SPAN></DIV><DIV><SPAN>Ideas how&nbsp; Get items from Outbound deliveries according Range of Outbound deliveries - <A href="https://github.com/basisteam-io/BasisTeam-Content/blob/master/blog/EWM/Displacement/get_delivery_item.abap" target="_blank" rel="noopener nofollow noreferrer">get_delivery_item.abap</A></SPAN></DIV><DIV>&nbsp;</DIV><DIV>Step 4. Divide items from&nbsp;<SPAN>Outbound deliveries from Step 3&nbsp;into 2 Lists</SPAN></DIV><DIV><SPAN>List 1.&nbsp; Item with batch.</SPAN></DIV><DIV><SPAN>List 2.&nbsp; Items without batch.</SPAN></DIV><DIV>Idea for Divide implementation -&nbsp;<A href="https://github.com/basisteam-io/BasisTeam-Content/blob/master/blog/EWM/Displacement/divide_into_2_lists.abap" target="_blank" rel="noopener nofollow noreferrer">divide_into_2_lists.abap</A></DIV><DIV>&nbsp;</DIV><DIV>Step 5. Get available stock for items from Outbound deliveries reсeived on Step 4</DIV><DIV>Idea for implementation -&nbsp;</DIV><DIV><A href="https://github.com/basisteam-io/BasisTeam-Content/blob/master/blog/EWM/Displacement/get_stock_for_wt.abap" target="_blank" rel="noopener nofollow noreferrer">get_stock_for_wt.abap</A></DIV><DIV><A href="https://github.com/basisteam-io/BasisTeam-Content/blob/master/blog/EWM/Displacement/get_available_stock.abap" target="_blank" rel="noopener nofollow noreferrer">get_available_stock.abap</A></DIV><DIV>&nbsp;</DIV><DIV>&nbsp;</DIV><DIV>Step 6. Remove bins with open warehouse tasks or&nbsp;under inventory from List received on Step 5</DIV><DIV>Idea for implementation -</DIV><DIV><A href="https://github.com/basisteam-io/BasisTeam-Content/blob/master/blog/EWM/Displacement/get_stock_for_wt.abap" target="_blank" rel="noopener nofollow noreferrer">get_stock_for_wt.abap</A></DIV><DIV><A href="https://github.com/basisteam-io/BasisTeam-Content/blob/master/blog/EWM/Displacement/get_stock_for_wt_class.abap" target="_blank" rel="noopener nofollow noreferrer">get_stock_for_wt_class.abap</A></DIV><DIV>&nbsp;</DIV><DIV>Step 7. Get bins in picking&nbsp; area for d<SPAN>isplacement</SPAN>.</DIV><DIV>Idea for implementation - <A href="https://github.com/basisteam-io/BasisTeam-Content/blob/master/blog/EWM/Displacement/get_displacement_bins.abap" target="_blank" rel="noopener nofollow noreferrer">Displacement/get_displacement_bins.abap</A></DIV><DIV>&nbsp;</DIV><DIV>Step 8.&nbsp; Create warehouse tasks for displacement for Stock/bins received on Steps 7 and 8</DIV><DIV>Idea for implementation -&nbsp; <A href="https://github.com/basisteam-io/BasisTeam-Content/blob/master/blog/EWM/Displacement/create_tasks.abap" target="_blank" rel="noopener nofollow noreferrer">create_tasks.abap</A></DIV><DIV>&nbsp;</DIV><DIV><STRONG>Testing.</STRONG></DIV><DIV>Prerequisite: Outbound delivery crated and integrated from S/4HANA to EWM.</DIV><DIV>Transaction /SCWM/WAVE</DIV><DIV>Assign Outbound Delivery (Warehouse Requests)</DIV><DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="wave.png" style="width: 967px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/108221i5371E5A1E150F098/image-size/large?v=v2&amp;px=999" role="button" title="wave.png" alt="wave.png" /></span></DIV><DIV><SPAN>Available Stock. HU located at the storage area.</SPAN></DIV><DIV>&nbsp;</DIV><DIV><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="avaiable_stock.png" style="width: 801px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/108222i2E6C2134E2156811/image-size/large?v=v2&amp;px=999" role="button" title="avaiable_stock.png" alt="avaiable_stock.png" /></span></SPAN></DIV><DIV><DIV>Storage Bin at Aisle 01</DIV><DIV>No Empty (or not blocked) storage bins.&nbsp; <SPAN>Displacement inevitably.</SPAN></DIV><DIV><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="aisle.png" style="width: 642px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/108223iB629519A0C3E0FD0/image-size/large?v=v2&amp;px=999" role="button" title="aisle.png" alt="aisle.png" /></span></SPAN></DIV><DIV><DIV>Deplanement in action.</DIV><DIV>&nbsp;</DIV><DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="dip.png" style="width: 637px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/108225iA50E907F45A753E2/image-size/large?v=v2&amp;px=999" role="button" title="dip.png" alt="dip.png" /></span></DIV><DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="dip2.png" style="width: 912px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/108226iFB5415563F65666A/image-size/large?v=v2&amp;px=999" role="button" title="dip2.png" alt="dip2.png" /></span></DIV><DIV><DIV><STRONG>Conclusion.</STRONG></DIV><DIV><SPAN>Approach for </SPAN><SPAN>displacement from picking to storage area</SPAN><SPAN> was provided. </SPAN></DIV></DIV></DIV></DIV></DIV></DIV></DIV> 2024-05-09T23:04:45.225000+02:00