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.
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
Mitten in der S/4HANA Einführung kommen die Anforderungen aus dem Fachbereich. „Wir brauchen aber die Lagerstandsauswertung XY nach VKORG unbedingt auch. Ohne der können wir nicht arbeiten.“ Verständlich, denn die Mitarbeiter beschäftigen sich jetzt intensiv mit dem neuen System und versuchen ihre bestehenden Prozesse nachzuspielen.
Aber da fehlt jetzt was. Klar, die bestehenden Auswertungen und Listen, die in jedem alten R/3 System vorhanden sind. Ohne sie wird der weitere Prozess schwierig.
Aber das Projekt ist bereits in vollem Gange, die Aufwände sind budgetiert und die Ressourcen eingeteilt. Klar, man will immerhin rechtzeitig fertig werden.
Und der Druck wird größer. Auch wenn man im neuen System vielleicht eine andere Herangehensweise an die Prozesse hat, die Leute aus dem Fachbereich wollen dennoch eine gewisse Stabilität. Vielleicht wird man einige dieser Listen im Laufe der Zeit wieder los – vielleicht aber auch nicht. Jedenfalls jetzt – kurz vor GoLive – wo alle nervös sind und die Lage angespannt ist, ist der falsche Zeitpunkt dafür. Also werden die wichtigsten dieser Reports in die neue Fiori Oberfläche übertragen.
Aber wer kennt sich genau aus, wie der Report funktioniert? Wie die Daten gelesen werden? 3000 Zeilen Spaghetti Code aus dem Jahre 1998 wollen auch erst einmal neu gebaut werden.
Mit etwas Customizing wird der Report einfach in eine moderne Fiori Applikation verwandelt.
Die Logik der Datenbeschaffung bleibt im Report. Der Selektionsbildschirm und die Ergebnisliste werden transformiert.
Die Navigation in Business Objekte kann auch durch Fiori Links ersetzt werden.
Auch der „Warenausgang“ kann gebucht werden. Sowie beliebige andere Aktionen können ausgeführt werden.
UI38 (so war unser interner Arbeitstitel) kann aber noch viel mehr. Sie haben eine zentrale Stelle, um auch neue Reports anzulegen. Egal ob CDS View basiert, oder in Methoden ausprogrammiert, mit simplem Customizing bekommen Sie diese schnell und einfach in Ihr Fiori Launchpad. Die Arbeit des Rapid Report Generators ist also mit der Einführung noch nicht zu Ende. Im Gegenteil, er ist das zentrale Tool, um Informationen aus dem ERP System schnell an die gesamte Belegschaft zu übermitteln!
Fazit
Unserer Erfahrung nach gibt es diese absolut notwendigen Reports in jedem Unternehmen. Mal sind es 7, mal 100 Listen. Das ist von Unternehmen zu Unternehmen unterschiedlich. Mit dem Rapid Report Generator bekommen Sie diese, unabhängig von der Anzahl, in kürzester Zeit in die Fiori Oberfläche. Somit sparen Sie jede Menge Zeit und kostbare Nerven bei der Integration und können sich um die wesentlichen Dinge kümmern!
Ein SAP-System besteht traditionell aus einer sehr, sehr großen Anzahl von SAPGui basierten Reports. Die Bandbreite reicht hier von einfachen List-Reports bis hin zu komplexen interaktiven Reports, quer über alle SAP-Module hinweg. Diese Reports sind entweder durch die SAP zur Verfügung gestellt oder wurden durch SAP-Kunden ergänzt.
Es gibt mehrere Ideen und Möglichkeiten diese traditionellen Reports im SAP Fiori Launchpad zu verwenden. In diesem Blog zeige ich, wie wir das mit Hilfe einer SAP-Transaktion via SAPGui for HTML realisieren können.
Ich beschränke mich hier auf die notwendigen Schritte und Einstellungen. Gute Beschreibungstexte, schöne Icons und auch spezielle Launchpad/Rollen Einstellungen überlasse ich eurer Fantasie.
In diesem Bespiel wollen wir den Demo Report BCALV_FULLSCREEN_DEMO im Launchpad anzeigen, daher verwende ich fast durchwegs auch diesen Namen in IDs oder sonstigen Bezeichnungen. So sieht der Report im SAP Gui aus:
Anlage Transaktionscode
Wenn noch nicht vorhanden, legen wir zuerst einmal einen Transaktionscode für den Report an:
Anlage semantisches Objekt
Für das spätere Mapping im Fiori Catalog verwenden wir ein semantisches Objekt. Die Anlage solcher semantischen Objekte erfolgt mit der Transaktion /UI2/SEMOBJ.
Das semantische Objekt sollte mit Z oder Y beginnen, die restlichen Angaben können frei gewählt werden.
Anlage des neuen Fiori Katalogs
Ich verzichte in dieser Demo auf die Erstellung einer Fiori Gruppe da dies für das Beispiel nicht notwendig oder hilfreich ist. Aber wir benötigen zumindest einen Katalog. Es kann natürlich auch ein bestehender Katalog verwendet werden.
Falls jemand fragt, ob diese umständliche Anwendung tatsächlich das zentrale Tool für diese Definitionen ist – ja, leider!
Im Launchpad Customizing erstellen wir nun in der Katalogübersicht einen neuen Katalog:
Anlegen Target Mapping
Für die zuvor angelegte Transaktion legen wir nun das Targetmapping an. Wir verknüpfen hier nun die Transaktion mit dem semantischen Objekt. Folgende Angaben sind zu machen:
– Semantic Object: Z_BCALV_FULLSCREEN_DEMO
– Action: display (z.B. es kann auch eine andere Action gewählt werden)
– Application Type: Transaction
– Transaction: Z_BCALV_FULLS_DEMO
Anlegen Tile
Jetzt folgt der letzte Schritt im Launchpad Customizing. Die Anlage eines Tiles mit der Verknüpfung zum semantischen Objekt. Notwendige Angaben sind:
– Title: sinnvoller Name
– Use semantic object navgation: true
– Semantic Object: Z_BCALV_FULLSCREEN_DEMO
– Action: display (bzw. die gewählte action)
Rollenpflege (PFCG)
Der Katalog muss einer Rolle und die Rolle dem User zugeordnet werden. Diese Einstellungen sind auch nicht Ziel dieses Blogs. Der Part wird normalerweise durch einen Basis- bzw. Berechtigungsadministrator vorgenommen werden. In wenigen Worten:
Anlage/Pflege Rolle
Anlage Transaction SAP Fiori Tile Catalog
Catalog wählen
User zuordnen. Ggf. Gruppe zuordnen.
Report aufrufen
Wenn der Report nur via Katalog dem User zugeordnet wurde, sollte dieser über den App Finder auffindbar sein. Wenn auch eine Gruppe verwendet wurde, sollte der Report beim User bereits beim Einstieg ins Launchpad sichtbar sein.
Report Ergebnigs im Launchpad
Wenn alles korrekt vorgenommen wurde, sollte der Report nun erfolgreich gestartet werden können und das Ergebnis sollte wie folgt aussehen:
Fazit
Eine SAP-Transaktion und somit auch ein Report kann relativ einfach ins SAP Fiori Launchpad eingebunden werden. Der Aufwand ist überschaubar und das Ergebnis kann sich sehen lassen.
Natürlich unterliegt diese Lösung einigen Einschränkungen, die bedacht werden sollten:
– Darstellung in neuem Browser Tab, keine „saubere“ Integration im Launchpad
– Kein Fiori Design
– Key User Extensibility wird nicht unterstützt
– Nicht Responsive – Nicht optimierte Darstellung für Tablets oder Mobile Phones
Alternative – Rapid Report Generator
Wir haben mit dem Rapid Report Generator ein Tool entwickelt, welches bei der Integration von klassischen SAP Reports im SAP Fiori Launchpad bzw. im SAP Fiori Design behilflich ist. Der Rapid Report Generator verwendet ebenfalls den Original Report, rendert die Inhalte jedoch via SAP Fiori Smart Controls zu 100% im SAP Fiori Design und bietet alle SAP Fiori Vorteile.
In diesem Blogbeitrag beschreibe ich, wie man eine SE11 Standard Suchhilfe in eine SAP Fiori Elements Anwendung auf Basis von Custom Entitys einbinden kann. SE11 Suchhilfen gibt es schon ewig und sind aus einem SAP-System nicht wegzudenken. In einem aktuellen S/4 System sind nach wie vor über 30.000 SE11 Suchhilfen vorhanden. Zudem wurden im Laufe der Jahre durch die SAP-Kunden viele Suchhilfen dazu entwickelt. Und daher macht es durchaus Sinn, diese auch in SAP Fiori Elements oder UI5 Anwendungen zu verwenden.
Zum Zeitpunkt dieses Blogs ist mir keine Möglichkeit im SAP Standard bekannt (abgesehen vom Ansatz mit dem SAP Gateway), die SE11 Original-Suchhilfen einfach und schnell in vorhandene SAP Fiori Elements Anwendungen zu integrieren. Aber ehrlich gesagt rechne ich damit, dass dies irgendwann in Zukunft durch spezielle Annotations möglich sein wird. Sollte sich daran was ändern, werde ich diesen Blog natürlich erweitern. Aber bis es so weit ist, müssen wir uns mit ein paar Workarounds helfen.
Prinzipiell müssen wir einmal Sammelsuchhilfen und elementare Suchhilfen unterschieden. Sammelsuchhilfen bestehen aus einer oder mehreren elementaren Suchhilfen. Der hier gezeigte Ansatz verfolgt nur die Integration von elementaren Suchhilfen. Aber natürlich können einzelne Suchhilfen wieder über Annotations zu Sammelsuchhilfen zusammengefügt werden. An dieser Stelle verweise ich auf den Blog Fiori Element: Collective / Multiple value help on selection field von Mohit Bansal. Er zeigt in seinem Blog, wie man mehrere CDS Views als Suchhilfen einbinden kann.
Elementare Suchhilfen welche als Selektionsmethode eine Datenbanktabelle oder einen DB-View verwenden und keinen speziellen Suchhilfe-Exit implementiert haben, können auch mit Hilfe eines klassischen CDS View nachgebildet werden. Dann erspart man sich die zusätzliche ABAP Implementierung. Eine gute Beschreibung dazu findet man in in diesem Blog Fiori Elements-Value help on a selection field within a value help dialog ebenfalls von Mohit Bansal.
Elementare Suchhilfen verwenden jedoch sehr oft Suchhilfe-Exits, dann reicht der Ansatz über klassische CDS Views nicht aus. Mit Hilfe der Custom Entitys können wir unser Vorhaben umsetzen. In dem nachfolgenden Beispiel wird die Suchilfe BUPAP des SAP Business Partners verwendet. Die Suchhilfe besteht lediglich aus einem Suchhilfe Exit.
Step 1 – ABAP Klasse
Zuerst brauchen wir eine ABAP Klasse, welche dann später in der Custom Entity verwendet wird. Die ABAP Klasse muss das Interface if_rap_query_provider implementieren.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CLASSzcl_cq_value_help_bupap DEFINITION
PUBLIC
FINAL
CREATE PUBLIC.
PUBLICSECTION.
INTERFACES if_rap_query_provider.
PROTECTEDSECTION.
PRIVATESECTION.
ENDCLASS.
CLASSzcl_cq_value_help_bupap IMPLEMENTATION.
METHOD if_rap_query_provider~select.
ENDMETHOD.
ENDCLASS.
Step 2 – Custom Entity
Nun legen wir noch die Custom Entity ZCE_VALUE_HELP_BUPAP an.
1
2
3
4
5
6
7
8
9
10
11
@EndUserText.label:'Value Help for BUPAP'
@ObjectModel:{
query:{
implementedBy:'ABAP:zcl_cq_value_help_bupap'
}
}
definerootcustomentityzce_value_help_bupap
{
}
Mit der Annotation ObjectModel.Query.implementedBy wird die zuvor angelegte ABAP Klasse hinterlegt. Nun müssen wir noch auf Basis der Parameter der Suchhilfe, die Custom Entity aufbauen. Die SE11 Suchhilfe sieht wie folgt aus:
Exakt diesen Aufbau bilden wir nun auch in der Custom Entity ab.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@EndUserText.label:'Value Help for BUPAP'
@ObjectModel:{
query:{
implementedBy:'ABAP:zcl_cq_value_help_bupap'
}
}
definerootcustomentityzce_value_help_bupap
{
key partner:bu_partner;
mc_name1:bu_mcname1;
mc_name2:bu_mcname2;
bu_sort1:bu_sort1;
bu_sort2:bu_sort2;
type:bu_type;
valdt:bu_valdt_s;
}
Eine Custom Entity benötigt zwingend ein KEY-Feld. In dem Fall verwenden wir natürlich PARTNER welches auch der Value ist, welcher durch die Suchhilfe zurückgeliefert wird.
Step 3 – Implementierung der Query-Methode
Jetzt wird es spannend, wir implementieren die Suche in der ABAP Query Methode. Glücklicherweise gibt es die Klasse cl_dsh_type_ahead_processor, die uns hier enorm weiterhilft und vieles abnimmt. Mit Hilfe der Klasse prozessieren wir die Suchhilfe.
Dieser Schritt ist jetzt nicht zwingend notwendig. Hier geht es nur darum, dass wir die neue Custom Entity testen wollen.
Service Definition
1
2
3
4
@EndUserText.label:'SD für Value Help BUPAP'
defineserviceZSD_VALUE_HELP_BUPAP{
expose zce_value_help_bupap;
}
Service Bindung
Sobald die Service Bindung angelegt ist, können wir die Custom Entity und die Implementierung der Suche mit der Preview-Funktion testen.
Die Filter- und Result-Felder müssen vorerst noch manuell ausgewählt werden, aber dann sollte bereits ein Ergebnis sichtbar sein.
Wenn alles korrekt implementiert wurde, sollten auch die Filter und die Sortierung funktionieren.
Step 5 – Verwendung der Custom Entity in einem CDS View
Jetzt verknüpfen wir die neue Custom Entity Value Help mit einer bestehenden SAP Fiori Elements Anwendung. Angenommen wir haben eine auf RAP basierende Anwendung zur Darstellung von Business Partner.
Folgende Annotation ist nun beim Feld mit der Partnernummer anzugeben.
Danach sollte bei der Anwendung für das Feld PartnerID folgende Suchhilfe zur Verfügung stehen.
Fazit
Es ist vielleicht keine perfekte Lösung, wie gesagt, ich warte auf eine Lösung im SAP Standard. Aber mit Hilfe der Custom Entitys kann man SE11 Suchhilfen einfach und rasch in Fiori Elements oder UI5 Smart Controls verwenden.
Um einem Anwender eine nahtlose Integration zwischen verschiedenen Fiori Anwendungen im Launchpad zu bieten, ist eine App to App Navigation zwischen den Fiori Anwendungen sehr wichtig. Wie ihr gleich sehen werdet, ist das bei neu erstellten UI5 Fiori Anwendungen oder mit Hilfe von CDS gar nicht so schwierig.
Semantisches Objekt, Aktion und Parameter
Ein semantisches Objekt ist in der Regel ein Business Objekt wie z.B. BusinessPartner oder PurchaseOrder. Die Action ist das, was man mit dem Objekt machen kann. Z.B. Approve, Change oder Change. Optional könne Parameter angegeben werden welche eine Objektinstanz (Partner ID oder Product-ID) spezifizieren. Je nach Anwendung wird dann direkt die gewünschte Objektinstanz aufgemacht. Soweit die notwendige Theorie.
UI5 – Service CrossApplicationNavigation
Grundsätzlich wird dafür das Service CrossApplicationNavigation verwendet. Einen Zugriff auf das Service bekommt man wie folgt:
UI5 – Direkte Navigation mit semantischem Objekt, Aktion und Parameter
Mit der Methode toExternal wird die Navigation direkt ausgelöst. In target sind das semantische Objekt und optional die Aktion anzugeben. Und in params kann man ebenfalls optional eine Objektinstanz angeben.
Im Nachfolgenden Beispiel wird das semantische Objekt EPMPurchaseOrder mit der Aktion approve und dem optionalen Parameter PurchaseOrder = 300001993 verwendet.
Wenn zu einem semantischen Objekt mehrere Anwendungen definiert sind und keine Aktion mitgegeben wurde, bekommt der Anwender ein Popup mit einer Auswahlmöglichkeit der Target-Anwendungen.
Nachfolgendes Beispiel zeigt, wie man zur Launchpad Startpage navigiert.
1
2
3
this.oCrossAppNav.toExternal({
target:{shellHash:"#"}
});
UI5 – Erzeugung Link ohne direkte Navigation
Es kann auch die Methode hrefForExternal verwendet werden. Prinzipiell hat die Methode die gleichen Eigenschaften wie toExternal – jedoch wird nicht direkt in die Anwendung navigiert. Stattdessen erhält man einen generierten Link.
Eine App to App Navigation kann auch durch CDS Annotation @Consumption.semanticObject definiert werden. Dadurch wird dann in Fiori Elements Anwendungen oder in UI5 Anwendungen welche Smart Controls einsetzen automatisch die App to App Navigation angeboten.
Das ABAP Programmiermodell für SAP Fiori, also ABAP CDS Views, Business Object Processing Framework und als UI Fiori/Fiori Elements/SAPUI5, bietet die Möglichkeit, einzelne Felder als Mussfelder zu definieren.
Und das ganz einfach über eine Annotation im ABAP CDS View bzw. der Metadata Extension:
@ObjectModel.mandatory: true
Fiori Elements ist dann auch so nett und zeigt im Änderungsmodus die Mussfeld-Sternchen:
Das ist aber – außer für Key-Felder – leider nur eine Information.
Weder im UI (Browser) noch im SAP Backend erfolgt irgendeine weitere Prüfung auf mandatory Fields!
Ohne Büro sichern?
Klar, kein Problem…
Um die Mussfelder zu prüfen, braucht man eine Validate-Methode im BOPF Objekt und verwenden die Standardklasse /BOBF/CL_LIB_V_MANDATORY_ATTR als Implementation Class.
Damit werden alle Felder gegen die Metadaten geprüft und eine passenden Fehlermeldungen erstellt.
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.
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.