AMDP - Fuzzy Search im ABAP mit SAP HANA

AMDP – Fuzzy Search im ABAP® mit SAP HANA®

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:

Durch das Interface IF_AMDP_MARKER_HDB wird die Klasse besonders, was man im Implementierungs-Teil sehen kann:

Die Methodenimplementierung hat einige zusätzliche Statements – Details dazu gibt es auf https://help.sap.com/doc/abapdocu_750_index_htm/7.50/de-de/abapmethod_by_db_proc.htm

BY DATABASE PROCEDURE„Ich bin eine AMDP.“
FOR HDBDerzeit nur „HDB“ – Kommen auch andere Datenbanken?!?!
LANGUAGE SQLSCRIPTWir nehmen SQLSCRIPT.
OPTIONS READ-ONLYWir lesen nur, geändert wird nicht!
USING /cadaxo/ui38d_demo_ordersWir wollen die Bestellungen aus /cadaxo/ui38d_demo_orders.

AMDP Method aufrufen

Aufgerufen wir die AMDP Methode wie jede andere auch:

Fuzzy Search

Ok, der SELECT ist nicht gerade spektakulär – das geht auch mit ABAP SQL. Aber eine fehlertolerante Fuzzy Search?!?

Wir wollen Bestellungen zu Kundennamen finden, auch wenn wir den nicht so ganz genau kennen. Dabei hilft uns CONTAINS und FUZZYhttps://help.sap.com/docs/SAP_HANA_PLATFORM/691cb949c1034198800afde3e5be6570/9a4da8f6f23b4ebf95c98f1104a56db4.html?&locale=en-US

Wir erweitern den SELECT um eine WHERE Klausel und suchen wie folgt nach dem Namen:

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.

Eine Suche nach „Hat Nägel“ ergibt dann z.B. folgende Trefferliste:

Treffliste der Fuzzy Suche mit Score

Komplettes Coding

Das ganze Coding sieht folgendermaßen aus:

header_charts_sagen_mehr_als_1000_worte

Charts sagen mehr als 1000 Worte!

Ein Bild sagt bekanntlich mehr als 1000 Worte. Ein Chart kann zur Verdeutlichung von Trends oder Besonderheiten, die sonst nur schwer ersichtlich wären, beitragen. Mit dem Rapid Report Generator kann jeder Report zusätzlich oder ausschließlich einen Chart ausgeben.

Wir wollen nun den Report aus dem Blogpost RRG – Neuer Report in 3:30 Minuten um die Ausgabe eines Charts erweitern. Ich verzichte hier auf eine Stoppuhr da wir in weniger als einer Minute zu einem Ergebnis kommen werden. Versprochen!

Aktivieren der Chartausgabe

Wir starten wieder in der Rapid Report Administration. Die Ausgabe eines Charts wird ganz einfach durch das Setzen der entsprechenden Checkbox aktiviert:

Ein paar Detailerklärungen:

  • Output Chart – Damit wird die Ausgabe eines Charts für den Report generell aktiviert
  • Default Chart Type – Das ist der initiale Chart Type bei der Ausgabe. In diesem Beispiel haben wir uns für Bar entschieden.
  • Chart Selection – Wenn diese Einstellung aktiviert ist, kann der Anwender den Chart Type zur Laufzeit wechseln.
  • Details Button – Bei dieser Einstellung kann zur Laufzeit ein Details Button zur Detailanzeige von selektierten Chartelementen verwendet werden.
  • Breadcrumbs for Dimension – Dadurch wird die Dimension in Form von Breadcrumbs anstatt eines DropDown Feldes ausgegeben.

Initiale Spalten für Dimension und Measure

Ein Chart benötigt immer zumindest jeweils eine Spalte für die Dimension und einen Messwert. Diese Spalten können bereits in den Reporteinstellungen eingestellt werden. Wenn diese Einstellungen nicht vorbelegt werden, muss der Anwender zur Laufzeit die Spalten selektieren.

Alle Spalten des Reports stehen automatisch abhängig vom Typ als Dimension oder Measure Felder zur Verfügung. Im konkreten Fall haben wir die CARRID als Dimension und das Feld SEATSMAX als Measure aktiviert. Schauen wir uns mal das Ergebnis des Reports an.

Wie eingangs versprochen haben wir in unter einer Minute ein ansprechendes Ergebnis. Der Anwender kann nun noch einige Anpassungen in der Ausgabe vornehmen.

Ändern von Measure oder Dimension

Die Messwerte bzw. Dimensionen können im Chart über die Einstellungsfunktionen jederzeit geändert werden. So können auch mehrere Dimensionen oder Messwerte in einem Chart verwendet werden. Im nachfolgenden Beispiel wurden z.B. Airline und Plane Type als Dimension und 3 Spalten als Messwert verwendet.

Ändern des Chart Types

Wenn die Änderung des Charts erlaubt wurde, stehen dem Anwender eine Fülle weiterer Charttypen zur Verfügung.

Layout Liste & Chart

Wenn eine Liste gemeinsam mit einem Chart ausgegeben wird, können im oberen Bereich 6 Darstellungslayouts selektiert werden.

Die Buttonleiste hat folgende Bedeutung:

  • Table only – Es wird nur die Ergebnisliste ausgegeben
  • Chart only – Es wird nur der Chart ausgegeben
  • Chart/Table vertical – Ausgabe in Form von Chart oben, Tabelle unten
  • Table/Chart vertical – Ausgabe in Form von Tabelle oben, Chart unten
  • Table/Chart horizontal – Ausgabe in Form von Tabelle links, Chart rechts
  • Chart/Table horizontal – Ausgabe in Form von Chat links, Tabelle rechts

Nachfolgend Beispiele für alle genannten Darstellungsvarianten:

Sichern als PNG

Charts können mit der Funktion Download Chart jederzeit als PNG Datei gesichert werden. Es wird nur der sichtbare Teil in die PNG Datei exportiert. Es sollte daher darauf geachtet werden, dass der gesamte Chart sichtbar ist.

RRG – Neuer Report in 3:30 Minuten

In den nächsten 3:30 Minuten werden wir einen neuen Report für den Rapid Report Generator anlegen. Mit Filter. – Wir werden uns die wirklich notwendigen Schritte und Einstellungen ansehen.

Also dann, Stoppuhr stellen – und los gehts!

00:00 – Aufruf Rapid Report Administration /CADAXO/UI38_ADMIN

Die Rapid Report Administration wird mit der Transaktion /CADAXO/UI38_ADMIN aufgerufen. Das ist zugleich auch die einzige Transaktion, die man sich merken sollte – alle anderen Einstellungen erreicht man über diese zentrale Stelle. Für die Interessierten unter uns – UI38 ist unser interner Projektname. In Anlehnung an SE38 bzw. TM38.

00:10 – Anlegen eines neuen Reports

Aktuell können bereits Reports mit 4 verschiedenen Datenquellen angelegt werden: SELECT, STDALV, SAPQUERY und ABPACLASS. In unserem Beispiel legen wir einen SELECT Report auf die berühmt (berüchtigte) SFLIGHT an:

1 Anlegen eines neuen Reports über das Kontextmenü Reports oder über den Button Report.
2 Als Reportname wählen wir hier Z_DEMO_SFLIGHT und als Report Type selektieren wir SELECT.
3 Im Detailscreen des neuen Reports müssen zumindest die GOLD markierten Einstellungen vorgenommen werden.
3.1 Die Ergebnisstruktur in Result Structure kann (muss aber nicht) gleich wie die Struktur in Data Type sein. Die Übertragung erfolgt via CORRESPONDING (=Namensgleiche Felder).
Nur aktive Reports können in der Fiori App verwendet werden.
3.2 Die Ergebnislisten können in 3 verschiedenen Ausgabeformen dargestellt werden (Responsive, Grid, Analytical).
Wir wählen RESPONSIVE, da diese auf allen Devices optimal gerendert wird.
3.3 Reportname vergeben – Jeder Report benötigt einen Titel. Titel können natürlich auch mehrsprachig gepflegt werden.
3.4 Wichtig – Sichern nicht vergessen

01:00 – Test des Reports im RRG-Launchpad

Sofern man als Anwender genügend Berechtigungen besitzt, sollte der neue Report bereits im RRG-Launchpad zur Verfügung stehen. Mit F5 machen wir einen Refresh im Browser.

Wir können den Report bereits auswählen und sogar starten.

Nicht schlecht. Gerade einmal eine Minute und wir haben schon einen RRG Report im Launchpad. Jetzt wollen wir noch ein paar wichtige Ergänzungen vornehmen.

01:30 – Filterbare Felder definieren

Mit Hilfe der Feldeinstellungen können viele verschiedene Anpassungen für den Report und speziell für die Ergebnisliste vorgenommen werden. An dieser Stelle beschränken wir uns auf ein paar filterrelevante Einstellungen. Zwei Felder sollen filterbar werden.

1Feld CARRID
1. Filterable aktivieren
2. Mandatory aktivieren
3. Filter Position auf 1
2Feld CONNID
1. Filterable aktivieren
2. Filter Position auf 2
3. Filter Exclude aktivieren
3Sichern nicht vergessen

Durch diese Einstellungen sollten für die Felder Airline (CARRID) und Flight Number (CONNID) nun ein Filter zur Verfügung stehen. Airline ist wie gewünscht ein Pflichtfeld und Flight Number ist initial ausgeblendet, kann aber zur Laufzeit durch den Anwender eingeblendet werden. Mal sehen ob das Ergebnis passt, also zurück in den RRG Report. Refresh mit F5 nicht vergessen.

02:30 – Test der Filter im RRG-Launchpad

Oha – siehe da, es kann schon nach Airline gefiltert werden. Und wie eingestellt ist es ein Pflichtfeld. Zum Test geben wir AA (American Airlines) ein und starten den Report mit Start bzw. Go – falls der Report in Englisch aufgerufen wurde.

Perfekt! Der initial ausgeblendet Filter für die Flight Number kann über Filter anpassen bzw. Adapt Filter eingeblendet und verwendet werden.

03:00 – Zurücklehnen und staunen

Es sind jetzt ca. 3:00 Minuten vergangen und wir haben einen fix fertigen Report welcher ungeschaut produktiv gesetzt werden kann. Anstatt der SFLIGHT kann hier jede beliebige Tabelle, DB View, CDS View oder AMDP Tablefunktion verwendet werden.

03:30 – Zusätzliche Einstellungsmöglichkeiten

Das Grundgerüst ist geschafft. Jetzt kann der Report durch die verschiedensten Einstellungsmöglichkeiten an die gewünschten Bedürfnisse angepasst werden:

Hinzufügen von Suchhilfen zu einem Report

Hinzufügen von Suchhilfen zu einem Report

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.