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.
Die SAP HANA Datenbank bietet mit der FUZZY Funktion eine fehlertolerante Textsuche. Während diese Suche für Fiori Applikationen relativ einfach über CDS-Annotations aktiviert werden kann, muss man für ABAP SQL oder ABAP ein paar Objekte anlegen und ein wenig programmieren.
ABAP CDS Fuzzy Search Annotations
ABAP
1
2
3
4
5
6
7
8
@Search.searchable:true
define…
{
@Search.defaultSearchElement:true
@Search.fuzzinessThreshold:0.7
@Search.ranking:#HIGH
...
}
Der Rapid Report Generator – RRG – kann neben ALV Reports auch CDS Views und ABAP Klassen als Datenquelle verwenden. Damit ergeben sich zwei Möglichkeiten eine Fuzzy Suche in RRG Reports anzubieten. In diesem Post schauen wir uns die AMDP Variante an.
AMDPs – ABAP Managed Database Procedures
AMDP bieten die Möglichkeit, SAP HANA Features zu verwenden, die nicht über openSQL/ABAP SQL bereitgestellt werden (z.B. Fuzzy-Suche). Sie sind also eine Erweiterung des bekannten EXEC_SQL. Da AMDP als Methoden in globalen Klassen implementiert sind, können sie auch aus jedem ABAP Coding aufgerufen werden.
Im RRG kann man ABAP Coding über den Report Typ ABAPCLASS einbinden.
Bei diesem Report Typ erfolgt die Datenbeschaffung über das Interface /CADAXO/IF_UI38_TYPE_ABAPCLASS. Wir erstellen also eine Klasse mit diesem Interface und legen den Report an.
Methode EXECUTE_QUERY
Wir verwenden dafür die vorhandene Klasse aus dem Post, ergänzen sie um das Interface und implementieren die Methode /cadaxo/if_ui38_type_abapclass~execute_query.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
CLASS/cadaxo/cl_ui38_dmo_order_amdp DEFINITION
PUBLIC
FINAL
CREATE PUBLIC.
PUBLICSECTION.
INTERFACES/cadaxo/if_ui38_type_abapclass.
INTERFACES if_amdp_marker_hdb.
TYPES:ty_orders TYPE STANDARD TABLE OF/CADAXO/UI38D_Demo_Orders WITH DEFAULTKEY.
Wir holen uns den eingegebenen Suchbegriff aus dem Filterfeld für Name, rufen die AMDP Methode search_orders( ) auf und liefern das Ergebnis an das RRG Framework.
RRG Report
Mit der Transaktion /CADAXO/UI§(_ADMIN legen wir den RRG Report SEARCH_ORDERS_FUZZY mit dem Typ ABAPCLASS an. Als Result Structure verwenden wir /CADAXO/UI38D_Demo_Orders und als ABAP Klasse natürlich /CADAXO/CL_UI38_DMO_ORDER_AMDP.
Die wichtigsten Einstellungen erfolgen bei den Feldern. Hier muss im Bereich Filter Fields der Feld Name als filterbar gekennzeichnet werden. Weiters macht es Sinn den Filter als Pflichtfeld zu definieren und nur einen Einzelwert zuzulassen.
Ergebnisliste
Wir haben jetzt einen Fiori List Report mit fehlertoleranter Suche nach Kundennamen – implementiert in einer ABAP Managed Database Procedure.
ABAP CDS Table Functions – AMDPs für CDS
Mit CDS Table Functions können AMDPs als Datenquelle von CDS Views dienen. Diese können dann in openSQL/ABAP SQL Queries verwendet werden. Ein Post hierzu folgt demnächst! Stay tuned 😉
Links
Hier eine kleine Sammlung an relevanten und nützlichen Links zu diesem Thema:
Im vorangegangenen Post AMDP – Fuzzy Search im ABAP® mit SAP HANA® verwenden wir eine AMDP, um mit ABAP Coding eine Fuzzy Suche durchzuführen. Um diese Suche auch in SQL Statements verwenden zu können – z.B. bei INSERT brauchen wir ABAP CDS Table Functions. Dieser Beitrag bietet hierfür einen Leitfaden und erläutert die Thematik Schritt-für-Schritt.
ABAP CDS Table Function
Hier ist der Ausgangspunkt eine Data Definition – mittels DDL wird die Table Funktion als Datasource definiert und über die Felder die Struktur festgelegt. Table Functions können auch Parameter besitzen.
Auffallend ist das returns vor der Feldlist. Damit wird die Struktur der Datensource festgelegt. Wichtiger ist aber der implemented by method Teil, hier /cadaxo/cl_ui38_dmo_order_amdp=>search_orders_CDS
Wenn die Klasse schon existiert, kann die Methode einfach per Quick-Fix angelegt werden!
AMDP Klasse und Methode anlegen
Auch Table Function AMDP werden als spezielle Methode in einer ABAP Klasse implementiert – die Definition erfolgt wie bei jeder anderen Klasse.
Durch das Interface IF_AMDP_MARKER_HDB wird die Klasse besonders, was bei der Schnittstellendefinition der statischen Methode search_orders_CDS erkennbar ist: „Verwende alle Parameter der Table Function als Importing Parameter und die Feldliste als Struktur der Return Tabelle“. Aber auch im Implementierungs-Teil erkennt man den Sonderstatus.
Derzeit nur „HDB“ – Kommen auch andere Datenbanken?!?!
LANGUAGE SQLSCRIPT
Wir nehmen SQLSCRIPT.
OPTIONS READ-ONLY
Wir lesen nur, geändert wird nicht!
USING /cadaxo/ui38d_demo_orders
Wir wollen die Bestellungen aus /cadaxo/ui38d_demo_orders
Details zur Fuzzy Search findet man hier: https://help.sap.com/docs/SAP_HANA_PLATFORM/691cb949c1034198800afde3e5be6570/ce619608bb5710148a42ebb92208b5cd.html?locale=en-US
Daten selektieren
Auf Table Functions wird ganz normal mittels ABAP SQL zugegriffen
Die SAP HANA Datenbank bietet viele nützliche und coole Funktionen, die über openSQL/ABAP SQL hinaus gehen. Um auf diese Features zuzugreifen und die ganze Power der HANA Datenbank nutzen zu können, gibt es ABAP Managed Database Procedures – AMDP. Damit kann man, ähnlich wie mit EXEC SQL bzw. ADBC (ABAP Database Connectivity), native Datenbank Statements absetzen. In diesem Blogbeitrag beschäftigen wir uns mit den nötigen Anlage- und Implementierungsschritten.
AMDP Klasse und Methode anlegen
AMDP werden als spezielle Methode in einer ABAP Klasse implementiert – die Definition erfolgt wie bei jeder anderen Klasse:
Wir erweitern den SELECT um eine WHERE Klausel und suchen wie folgt nach dem Namen:
1
2
3
4
5
6
7
8
9
10
11
12
e_orders=select OrderId,
CustomerId,
ProductId,
OrderDate,
Quantity,
Unit,
TotalPrice,
Currency,
Description,
Name
from"/CADAXO/UI38D_DEMO_ORDERS"
where contains(Name,:i_search_term,fuzzy(0.5));
Die FUZZY Funktion liefert alle Namen zurück, deren Vergleich mit dem I_Search_Term mindestens einen Score von 0.5 ergibt. Das klingt erstmal einfach, kann aber ziemlich knifflig werden, vor allem, wenn man die Treffermenge, Genauigkeit und Relevanz für Benutzer optimieren möchte. Der passende Schwellenwert ist dann oft nur empirisch ermittelbar.
SCORE
Um den errechneten Wert der Übereinstimmung anzuzeigen und danach zu sortieren, gibt es die Funktion SCORE. Mit FUZZY( 0.0) werden alle Namen mit einem ermittelten Score größer 0 ausgegeben.
1
2
3
4
5
6
7
8
9
10
11
12
13
e_orders=select OrderId,
CustomerId,
ProductId,
OrderDate,
Quantity,
Unit,
TotalPrice,
Currency,
Description,
Name,
score()asScore
from"/CADAXO/UI38D_DEMO_ORDERS"
where contains(Name,:i_search_term,fuzzy(0.0));
Eine Suche nach „Hat Nägel“ ergibt dann z.B. folgende Trefferliste:
Komplettes Coding
Das ganze Coding sieht folgendermaßen aus:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
CLASS/cadaxo/cl_ui38_dmo_order_amdp DEFINITION
PUBLIC
FINAL
CREATE PUBLIC.
PUBLICSECTION.
INTERFACES if_oo_adt_classrun.
INTERFACES if_amdp_marker_hdb.
TYPES:ty_score TYPEpLENGTH3DECIMALS2.
TYPES:BEGIN OF ty_order.
INCLUDE TYPE/CADAXO/UI38D_Demo_Orders.
TYPES:Score TYPE ty_score,
ENDOF ty_order.
TYPES:ty_orders TYPE STANDARD TABLE OF ty_order WITH DEFAULTKEY.
Der Rapid Report Generator for SAP Fiori® – RRG – bietet mehrere Möglichkeiten Suchhilfen für Filterfelder bereitzustellen. Dazu muss zunächst die RRG-Suchhilfe im RRG definiert und entsprechend ihres Typs konfiguriert werden. Dann kann die RRG-Suchhilfe jedem passenden Feld in jedem RRG-Report zugewiesen werden. Felder können auch mehrere RRG-Suchhilfen besitzen.
1. Suchhilfe definieren
RRG-Suchhilfen werden in der Admintransaktion definiert und bearbeitet.
Bei der Anlage muss ein eindeutiger Name und einer dieser Typen von RRG-Suchhilfen gewählt werden:
Domain Values
Elementare Suchhilfe (SE11)
View
Die Konfiguration der RSuchhilfe ist natürlich typabhängig.
Domain Values
Für Domain Values muss die Domäne definiert werden.
Elementare Suchhilfe
Neben der SAP-Suchhilfe muss auch genau ein Feld aus den Suchhilfeparametern ausgewählt werden. Der Wert dieses Feldes wird dann von der RRG-Suchhilfe zurück geliefert.
Alle Felder aus dem Suchhilfeergebnis
Hinweis: Es kann JEDES Felder der SAP-Suchhilfeergebnislist verwendet werden, nicht nur welche, die als EXPORT-Parameter definiert sind!
View
Als Datasource können die folgenden Objekte verwendet werden:
Tabelle
DB-View (SE11)
CDS View/Entity
2. Suchhilfe den Feldern zuordnen
Eine RRG-Suchhilfe kann jedem filterbaren Feld in jedem Report zugeordnet werden. Ein Feld kann auch mehrere RRG-Suchhilfen haben.
In der App kann dann zwischen den RSuchhilfen gewechselt werden.
Vielen Dank für Ihre Teilnahme an unserem Webinar!
Wir sind ja mit Selbstlob sehr zurückhaltend – aber die Erklärung von Domi zu Table Expressions & Table Functions zählt mit zu den besten Erklärungen die ich bisher zu dem Thema gesehen habe!
Natürlich sind auch Sörens Erklärungen zu Field Symbols bzw. Reference hervorzuheben und mein Part zu CORRESPONDING ist bis auf ein paar Versprecher auch ganz gut.
Unterlagen/Links zum Webinar „Modernize your ABAP“
Präsentationsunterlagen in PDF – Diesmal gab es keine Slides
Vielen Dank für Ihre Teilnahme an unserem Webinar!
Das spannende Thema RAP wird uns alle noch viele Jahre beschäftigen. In unseren nächsten Webinaren werden wir uns erst einmal wieder anderen ABAP Themen beschäftigen. Wir sind noch nicht sicher, ob unser nächstes Webinare im November stattfinden wird. Unsere ganze Aufmerksamkeit gilt nämlich nun der ABAPConf welche am 9. Dezember 2021 über die Bühne gehen wird. Ein Tag an dem sich alles um ABAP dreht! Einfach hier auf Eventbrite registrieren, damit ihr in der Sache am Laufenden bleibt! Für das Event selber ist keine Registrierung notwendig.
Unterlagen/Links zum Webinar „ABAP RESTful Application Programming Model (RAP) – 3. Teil“
Findet vielleicht im noch im November oder erst im nächsten Jahr statt. Aber dafür gibt es mit der ABAPconf einen perfekten Ersatz! Wir würden uns freuen, wenn wir Euch bei der ABAPConf wieder sehen würden.