Die Nummernvergabe ist ein wesentlicher Bestandteil von ABAP RAP Anwendungen. Konkret geht es bei der Nummernvergabe darum, wie die Schlüsselfelder der Entität mit Werten versorgt werden. RAP bietet uns hier verschieden Lösungsansätze, welche jedoch manchmal auch zur Verwirrung führen und ich deshalb hier kurz erläutern möchte.
Zuerst müssen wir einmal klären, was Früh/Spät und Managed/Unmanaged bei der Nummernvergabe bedeutet.
Frühe- und Späte Nummernvergabe
Bei der frühen Nummerierung geht es darum, dass die Nummer bereits durch den Consumer oder durch das RAP-Framework zu einem frühen Zeitpunkt erzeugt wird. Bei der späten Nummerierung werden die eigentlichen Keys erst zum SAVE-Zeitpunkt vergeben, wodurch eine lückenlose Nummerierung realisiert werden kann.
Managed und Unmanaged
Wenn man als Key-Feld eine Guid hat, kann man sich für eine automatische (=managed) Nummerierung entscheiden. Bei der unmanaged Nummerierung wird die Nummernvergabe durch entsprechende ABAP Codes realisiert.
Folgende Kombinationsmöglichkeiten sind vorhanden:
Frühe Nummernvergabe
Späte Nummernvergabe
Extern
X
Managed
X
X
Unmanaged
X
X
Frühe externe Nummernvergabe
Bei der frühen externen Nummernvergabe werden die Key-Felder bereits durch den Consumer gefüllt. In der Behavior-Definition müssen wir dafür sorgen, dass das Feld bei der Erstellung änderbar ist, bei Änderungen jedoch nicht mehr geändert werden kann.
In der Behavior Definition ist für diese Nummerierung keine spezielle Angabe zu machen. Jedoch sollten die Key-Felder bei Updates auf readonly gesetzt werden:
field ( readonly : update ) orderId;
Frühe interne Nummernvergabe
Die frühe interne Nummernvergabe kann nur angewendet werden, wenn es sich bei dem Key-Feld um eine Guid (Raw 16) handelt. In der Behavior Definition sind auch in diesem Scenario nur zwei kleine Definitionen für das Key-Feld vorzunehmen:
field ( readonly ) orderGuid; field ( numbering : managed ) orderGuid;
Zuerst setzen wir die Guid auf readonly und in zweiten Zeile legen wir die automatische interne Nummerierung auf die Guid fest.
Unmanaged interne Nummernvergabe
Diese unmanaged interne Nummernvergabe kann sowohl für managed als auch unmanaged RAP Business Objekte verwendet werden. Auf Entity Level müssen wir eben in der Behavior Definition diese Nummerierung mit early numbering definieren. Ebenso sollten die Key-Felder auf readonly gesetzt werden.
Nun kann man entweder über Quick-Fix oder manuell eine Implementierung für die Nummerierung vornehmen. Die Methodensignatur sieht wie folgt aus:
METHODS earlyNumberingOrder method for NUMBERING [IMPORTING] entities FOR CREATE business_object_entity …
In der Methode ist nun die Nummernvergabe für die Objekte in entities umzusetzen. Wichtig ist, dass die erfolgreichen Nummernvergaben in die Exporttabelle mapped bekannt gegeben werden müssen.
Unmanaged späte Nummernvergabe
Auch die unmanaged späte Nummernvergabe kann für beide RAP Szenarien verwendet werden. Auf Entity Level wird dies durch late numbering definiert. Ebenso sollten die Key-Felder auf readonly gesetzt werden.
Die Implementierung der Nummernvergabe erfolgt in einer Methode adjust_numbering, welche im Zuge der save sequence – nach dem Point of no return – aufgerufen wird. Die Methode kann man sich wieder mit einem Quick-Fix erzeugen lassen.
Die erzeugte Nummer muss über den Export-Parameter mapped mit dem internen temporären Key zugeordnet werden.
Vielen Dank für Ihre Teilnahme an unserem Webinar!
Vielen Dank an alle Teilnehmer unseres Webinars zum Thema ABAP RAP in Action. Bei dem Webinar ging es um Aktionen bzw. Funktionen und wie man diese in RAP implementiert.
Unterlagen/Links zum Webinar „ABAP® RAP in Action“
During the work on some Freestyle UI5 Apps I always look for a way how to save constants in Frontend. I would like to share following practice with you, which I use currently.
Define JSON File with Constants
I am going to create a new File in my project root folder. In this file all constant and values will be stored as a JSON Object.
/webapp/model/constants.json
Constants JSON file example
JavaScript
1
2
3
4
5
6
{
"ConstantString":"Hello World",
"ConstantInt":123
}
Define JSON Model in manifest.json file
I my project manifest.json, I am going to define a new JSON Model with created JSON file in URI
Manifest.json file example
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
"models":{
"i18n":{
...
},
"constants":{
"type":"sap.ui.model.json.JSONModel",
"uri":"model/constants.json"
},
"":{
...
}
}
Using Constants in View
From now on it is possible to use the constant model in View:
Constants JSON file example
XHTML
1
2
3
4
5
6
7
...
<Page id="page"title="Cadaxo UI5 Snippets #1">
<content>
<Text text="{constants>/ConstantString}" />
</content>
</Page>
...
Using Constants in Controller
And of course also in Controllers. For example like this:
Vielen Dank für Ihre Teilnahme an unserem Webinar!
Vielen Dank an alle Teilnehmer unseres Webinars zum Thema ABAP CDS. Ohne ABAP CDS geht in Zukunft in der ABAP Entwicklung nichts mehr. Dass diese aber gar nicht so kompliziert sind, haben wir in diesem Webinar gezeigt.
Das Thema und der Termin stehen noch nicht fest werden wir aber Zeitnah bekannt geben. Unser Fokus liegt nun ganz auf die ABAPConf 2022 die am 7. Dezember über die Bühne gehen wird.
In Cadaxo SQL Cockpit Version 3.8 (Releaseinfos), it is now possible to generate an SAP® Gateway OData Service out of an ABAP Open-SQL Select Statement.
Due to the newly added /CADAXO/ODATA Template, which is from now on available in Select Template wizard, the user can generate the OData Service based on the Select Statement, which the user previously displayed in the Cockpit.
In the next steps, the User is guided through OData Template Wizard. In here some important information about the Service must be added. Like Project Name (SEGW) and name of generated Entities. Filter, Order by, Skip, Top and Count features are optional.
After all steps of the OData Template Wizard are done successfully, the OData Service is activated automatically.
Given ‚Project Name‘ can be opened in SAP Gateway Service Builder (T-Code SEGW) and generated Entity Type and Set can be extended if needed.
Lets try the generated Service in practice!
Thanks to the SAP Fiori® Tools Visual Studio Code Extension I am able to quickly generate new SAP Fiori® elements Application – Worklist.
Without any lines of code, my Service has been used as a Data source and following App has been generated. Filter options are working out-of-the box as well.
Die SQL Cockpit Version 3.8 ist fertig und bietet wieder ein paar Korrekturen/Verbesserungen und einige interessante neue Features. Nachfolgend ein Überblick über die wichtigsten Neuerungen.
Value Download
Tabelleninhalte die länger als 128 Zeichen sind, können im ALV nicht dargestellt werden. Im SQL Cockpit gibt es die Möglichkeit, den Wert als Text oder HTML/XML anzuzeigen.
Der Text kann nun direkt als Datei gespeichert werden.
Beschreibung / *&%HEADER
Das Header Text Kommentar kann man jetzt über das Kontextmenü einfügen
Der Header Text wird dann als Beschreibung der Ergebnislisten angezeigt.
OData Service Generierung (Gatewayservice)
Über das neue Template OData Generierung kann ein SAP® Gateway OData Service generiert werden. Wahlweise kann Coding für $filter, Paging $top/$skip, $orderby und $count generiert werden. Die Service-Klassen können danach individuell erweitert werden.
Atlassian Jira® als Ticketsystem in der Premium Version
Neben dem SAP® Solution Manager kann jetzt auch Atlassian Jira® als Ticketsystem in der Premium Version genutzt werden.
Je nach Customzing werden Kommentartext, Feldwerte und ZIP-Dateien mit PDF oder TXT Formularen der durchgeführten Änderungen zu Ticket hochgeladen.
Das Ticket wird über die ID gesucht und der Text im Update-Popup angezeigt. Das Kommentar und die weiteren Daten werden beim Speicher in das Ticket geschrieben.
Die Dateien und der Tickettext sind im Jira Ticket ersichtlich.
Wir haben die Abende im Lockdown genutzt und ein neues Produkt an den Start gebracht. Am Freitag dem 13. Mai werden wir eine Sneak Preview zum Rapid Report Generator liefern. Wer werden aber nicht nur das Produkt kurz vorstellen, sondern auch ein paar Hintergrundinformationen zur Entwicklung, Architektur (UI5, Gateway) und unseren „Learnings“ liefern.
Viele kennen die Situation. Man hat im Entwicklungssystem eine super coole UI5/Fiori App für ein S/4HANA System gebastelt, aber nach dem Import in das Produktivsystem (oder Q-System) geht erstmal gar nix. Target was not found, Type Error, Unknown Setting, Cannot read properties, …
Sehr oft liegen die Gründe der Probleme am Cache! Nicht nur am Browser Cache, auch im SAP Backend gibt es mehrere zu berücksichtigende Caches. Nachfolgend eine Auflistung der Cache Themen, die mir im Zuge meiner Arbeit untergekommen sind.
Eigentlich unglaublich, wie viele Caches man ggf. löschen / invalidieren muss.
Wichtiger Hinweis: Das sind meine persönlichen Erfahrungen, bitte verwendet die Reports oder Transaktionen nur nach vorheriger Prüfung. Es kann durchaus sein, dass der eine oder andere Report obsolet wird oder in gewissen System nicht verwendet werden darf! Ich übernehme keine Garantie, dass die Reports oder Transaktionen in euren Systemen einwandfrei und korrekt funktionieren.
Name
Typ
Erläuterung
Bereich
/UI5/APP_INDEX_CALCULATE
Report
Ab UI Add-On 2.0+ Sollte periodisch eingeplant sein
Invalidiert alle UI2 Caches (Alle Services mit /UI2/*, SHMM, … )
UI / App
/UI5/UPD_ODATA_METADATA_CACHE
Report
OData Cache – Cache Buster Tokens
UI / App
/UI5/UPDATE_CACHEBUSTER
Report
Nur für UI Add-On 1.0
UI / APP
CL_SADL_LOAD_AREA
Shared Memory
Shared Memory invalidieren
UI / APP
/UI2/FLP_DEL_PERSONALIZATION
Report
SAP Fiori Launchpad Personalisierungen
UI / APP
/UI2/PAGE_CACHE_SYNCHRONIZE /UI2/SYNC_PBC
Report Transaction
Synchronization of the User-Independent Cache
UI / APP
/UI2/EAM_BUILD_CACHE
Report
App Finder Performance Cache
UI / APP
Browser Cache
IE, Chrome, … Cache
UI / APP
/UI5/APP_INDEX_CALCULATE
Das ist mein Lieblingsreport in dem Zusammenhang, da er mir in den meisten Fällen immer die Probleme löst. Es gibt einen Applikationsindex und Caching für Apps, Komponenten und Libraries. Dieser Report löscht bzw. invalidiert diese Caches / Indextabellen und ist im Normalfall automatisch eingeplant.
Ich habe jedoch die Erfahrung gemacht, dass nach einem Transport von Änderungen einer UI5 Anwendung, ein explizites Ausführen des Reports für die jeweilige Anwendung notwendig ist.
Weiter Informationen zu dem Report können hier entnommen werden:
Hier geht es um das Löschen des UI2 Cache. Dieser kann für einen User oder generell gelöscht werden.
/IWFND/CACHE_CLEANUP und /IWBEP/CACHE_CLEANUP
Invalidiert / Löscht das oData Model (SEGW oder RAP) am Frontend- und Backend-Server.
/UI2/INVALIDATE_CLIENT_CACHES
Dieser Report sollte überhaupt nur in Ausnahmefällen notwendig sein – wenn der UI5 Cache Buster im Einsatz ist. Eine Erklärung zum Report gibt es unter help.sap.com.
/UI2/INVALIDATE_GLOBAL_CACHES
Invalidiert alle globalen UI2 Caches. Bitte die Dokumentation des Reports im System beachten.
/UI5/UPD_ODATA_METADATA_CACHE
Der Report löscht die OData Caches Tokens. Bitte auch hier die Dokumentation des Reports beachten.
/UI5/UPDATE_CACHEBUSTER
Der sorgt dafür, dass der Cache Buster mit dem aktuellsten UI5 Metadaten arbeitet. Der Report ist jedoch nur bei Systemen mit UI Add-On 1.0 einzusetzen. Bei Systemen mit einem höheren UI Add-On Release ist hingegen /UI5/APP_INDEX_CALCULATE zu verwenden.
Fiori Launchpad Homepages können normalerweise durch den Anwender personalisiert werden. Es können neue Gruppen angelegt werden, Apps entfernt oder hinzugefügt werden. Manchmal ist es notwendig, solche Personalisierungen zurückzusetzen. Beispielsweise nach Änderungen im Fiori Katalog oder einer Fiori Gruppe. Ein Erklärung zu der Funktion ist hier beschrieben.
/UI2/PAGE_CACHE_SYNCHRONIZE
Der Report bereinigt Cache Probleme im Bereich der Launchpad Catalogs/Groups. Laut SAP sollte der Report regelmäßig eingeplant werden. Der Report ist auch über die Transaktion /UI2/SYNC_PBC erreichbar.
Änderungen an Service-Definitionen müssen manchmal manuell in Transportaufträgen aufgenommen und transportiert werden.
Fazit
Es vergeht fast kein Transport wo nicht irgendein Cache ein Problem bereitet. Aber mit dem /UI5/APP_INDEX_CALCULATE bekommt man das meist in den Griff.
Ich werden diesen Blogpost nach und nach um weitere Erkenntnisse in dem Zusammenhang ergänzen.
We use cookies on our website to give you the most relevant experience by remembering your preferences and repeat visits. By clicking “Accept All”, you consent to the use of ALL the cookies. However, you may visit "Cookie Settings" to provide a controlled consent.
This website uses cookies to improve your experience while you navigate through the website. Out of these, the cookies that are categorized as necessary are stored on your browser as they are essential for the working of basic functionalities of the website. We also use third-party cookies that help us analyze and understand how you use this website. These cookies will be stored in your browser only with your consent. You also have the option to opt-out of these cookies. But opting out of some of these cookies may affect your browsing experience.
Necessary cookies are absolutely essential for the website to function properly. These cookies ensure basic functionalities and security features of the website, anonymously.
Cookie
Dauer
Beschreibung
cookielawinfo-checkbox-analytics
11 months
This cookie is set by GDPR Cookie Consent plugin. The cookie is used to store the user consent for the cookies in the category "Analytics".
cookielawinfo-checkbox-functional
11 months
The cookie is set by GDPR cookie consent to record the user consent for the cookies in the category "Functional".
cookielawinfo-checkbox-necessary
11 months
This cookie is set by GDPR Cookie Consent plugin. The cookies is used to store the user consent for the cookies in the category "Necessary".
cookielawinfo-checkbox-others
11 months
This cookie is set by GDPR Cookie Consent plugin. The cookie is used to store the user consent for the cookies in the category "Other.
cookielawinfo-checkbox-performance
11 months
This cookie is set by GDPR Cookie Consent plugin. The cookie is used to store the user consent for the cookies in the category "Performance".
viewed_cookie_policy
11 months
The cookie is set by the GDPR Cookie Consent plugin and is used to store whether or not user has consented to the use of cookies. It does not store any personal data.
Functional cookies help to perform certain functionalities like sharing the content of the website on social media platforms, collect feedbacks, and other third-party features.
Performance cookies are used to understand and analyze the key performance indexes of the website which helps in delivering a better user experience for the visitors.
Analytical cookies are used to understand how visitors interact with the website. These cookies help provide information on metrics the number of visitors, bounce rate, traffic source, etc.
Advertisement cookies are used to provide visitors with relevant ads and marketing campaigns. These cookies track visitors across websites and collect information to provide customized ads.