ABAP RAP - Tipps & Tricks

Webinar – ABAP® RAP Tipps & Tricks

Vielen Dank für Ihre Teilnahme an unserem Webinar!

Vielen Dank an alle Teilnehmer unseres Webinars zum Thema ABAP RAP Tipps & Tricks aus der Praxis.

Unterlagen/Links zum Webinar „ABAP RAP Tipps & Tricks aus der Praxis“

Video Sprungmarken

Links

Cache Buster Dokumenation

App Index Calculate

SE11 Suchhilfe via Custom Entity

Twitter

Unser nächstes Webinar

Das Thema steht noch nicht fest, aber der Termin steht schon einmal: 24. Juni 2022 – Und registrieren kann man sich auch schon: https://www.eventbrite.at/e/abap-webinar-tbd-tickets-332256186197

Aber es wird sicher wieder ein spannendes Thema!

Rapid Report Generator – Sneak Preview

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.

Eventbrite Freitag 13. Mai 10:00 – 10:30

Fuzzy Search für Rapid Report Generator Reports

Fuzzy Search für Rapid Report Generator Reports

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.

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.

Was man für AMDP braucht und wie man die Fuzzy-Suche nutzt steht hier in einem unseren älteren Beiträgen: AMDP – Fuzzy Search im ABAP® mit SAP HANA®

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.

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:

SAP HANA Fuzzy Search https://help.sap.com/docs/SAP_HANA_PLATFORM/691cb949c1034198800afde3e5be6570/cc602780bb5710148aa2bf6cab3c015b.html?&locale=en-US

Fuzzy Search für Fiori Anwendung https://help.sap.com/docs/ABAP_PLATFORM_BW4HANA/cc0c305d2fab47bd808adcad3ca7ee9d/6f9212bbaf5e4d598c774b96d93f7b79.html?locale=en-US

AMDP https://help.sap.com/doc/abapdocu_753_index_htm/7.53/de-DE/abenamdp.htm

ABAP® CDS Table Functions – AMDP – Fuzzy Search für ABAP® SQL mit SAP HANA®

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.

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

BY DATABASE FUNCTION„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

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

Der SELECT im SQL Cockpit for SAP® Systems

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:

Webinar – Modernize your ABAP®

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“

Video Sprungmarken

Twitter

Unser nächstes Webinar

Das Thema steht noch nicht fest, aber der Termin steht schon einmal: 29. April 2022 – Und registrieren kann man sich auch schon: https://www.eventbrite.at/e/webinar-cooler-inhalt-folgt-tickets-305097915077

Webinar_RAP Teil 3

Webinar – ABAP® RESTful Application Programming Model (RAP) – Teil 3

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“

Links

Im Laufe des Webinars haben wir über folgende Sites gesprochen:

Teilnehmer

  • Deutschland 44%
  • Österreich 41%
  • Schweiz  3.5 %
  • Rest 11.5 % (Tschechien, Ungarn, Türkei, Weißrussland, UK)

Twitter

Unsere nächtes Webinar

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.

Webinar_RAP Teil 2

Webinar – ABAP® RESTful Application Programming Model (RAP) – Teil 2

Vielen Dank für Ihre Teilnahme an unserem Webinar!

Auch das nächste Webinar im September wird zum Thema RAP sein. Es gibt genug Themen. – Anmeldelink befindet sich ganz unten in diesem Blog.

Unterlagen/Links zum Webinar „ABAP RESTful Application Programming Model (RAP) – 2. Teil“

Teilnehmer

  • Deutschland 52%
  • Österreich 38%
  • Schweiz  5 %
  • Rest 5 % (Belgien, Frankreich, Polen, USA)

Twitter

Unsere nächtes Webinar

Webinar_RAP Teil 1

Webinar – ABAP® RESTful Application Programming Model (RAP)

Vielen Dank für Ihre Teilnahme an unserem Webinar!

Wie angekündigt, werden wir uns auch im nächsten Webinar mit RAP beschäftigen. Dann etwas mehr im Detail. – Anmeldelink befindet sich ganz unten in diesem Blog.

Unterlagen/Links zum Webinar „ABAP RESTful Application Programming Model (RAP)“

Blogs/Links

FAQ

Es gab einige Fragen im Verlauf des Webinars:

  • Frage: Ist das ABAP RESTful Programming Model, zu dem es ja auch Literatur von SAP Press gibt, das selbe wie RAP?
    • Antwort: Ja genau RAP = RESTful Applicatino Programming Model
  • Frage: Wie kann ich verhindern, dass bei Projections auf einen Root-View, die Compositionen verlorenen gehen?
    • Antwort: Bei der Projection muss man die Composition umbiegen auf die Projection des „Kindes“
  • Frage: OData V4 geht auf onPrem mit 2020 SPS01.
    • Antwort: Jop!
  • Frage: Die neuen, nicht mehr DDIC basierten, View-Entities kann man leider nicht mit den SE16* Transaktionen auswerten. Wisst ihr da einen Workaround? Ist gerade für Troubleshooting auf Nicht-Entwicklungssystemen und Mandanten immer ganz praktisch, da man dort oft keinen ADT Zugriff hat. Zudem ist es für Nicht-Entwickler auch nützlich im die Views, bzw. die Daten zu validieren.
  • Frage: Welche Eclipse Version habt Ihr im Einsatz?
    • Antwort: Eclipse 2020-12 mit ABAP 3.16 -> immer the Latest and greatest! – Ergänzung Föß: Ich aktualisiere Eclipse immer alle 3 Monate, sobald eine neue Version rauskommt. ADT Update checke und update ich ggf. täglich.
  • Frage: Was ist der unterschied von define root view und definde root view entity?
    • Antwort: ROOT VIEW ist noch DDIC basiert (DDIC View)
  • Frage: Gibt es hier ein Thema Locking auf den DB-Tabellen?
    • Antwort: Locking geht natürlich auch: Sperrobjekte, Optimistisches Locking im eTag (das kommt beim nächsten Mal ganz sicher), Draft
  • Frage: Domi hat das managed Szenario oder?
    • Antwort: Domi verwendet das Managed Szenario, aber dem EML ist es egal was drunter läuft – ob managed oder un-managed
  • Frage: Starkes Webinar. Vielen Dank für den Vortrag. Macht das ganze viel sympatischer wenn es live (coding) durchgeführt wird!
    • Antwort: Danke dir!
  • Frage: Danke. Wollte nur wissen, ob man die neueste Version nutzen kann, nicht das es Probleme gibt.
    • Antwort: Immer die neueste von ADT und Eclipse – man sollte aber 1 bis 2 Wochen warten mit dem Eclipse update, bis auch die SAP 100%ig nachgezogen hat 🙂
  • Frage: Eine Verständnisfrage, in den Beispielen der SAP sieht man immer die Implementierung auf Basis „selbst“ erstellter Tabellen. Aber wie funktioniert das ganze Model, wenn ich auf APIs (OneOrder, BP usw) zugreifen muss. Ich will ja nicht unbedingt Daten lesen und schreiben mit direktem Tabellen Zugriff.
    • Antwort: Dieses Thema versuchen wir beim nächsten oder übernächsten Webinar aufzugreifen.

CDS View Entities / CDS Root View Entities

Wir haben im Webinar immer mit CDS ROOT VIEW ENTITIES gearbeitet. CDS View Entites sind ab aber erst ABAP 7.55 verfügbar und es handelt sich dabei um eine verbesserte / erweiterte Möglichkeit der CDS DDIC-based Views. CDS View Entities sind sozusagen der Nachfolger der CDS DDIC-based Views.

Unterschiede:

  • Keine zusätzlicher DB View notwendig (@AbapCatalog.sqlViewName … ) – daher aber auch kein SE16 …
  • Schnellere Aktivierung
  • Vereinfachte Syntax
  • Verbesserter / strikterer Syntaxcheck um potentielle Fehler bereits bei der Aktivierung zu erkennen

Teilnehmer

  • Deutschland 50%
  • Österreich 41%
  • Rest 9 % (Schweiz, Russland, Rumänien, Indien, Frankreich)

Twitter

Unsere nächtes Webinar

Cadaxo SQL Cockpit Report Generation

Cadaxo SQL Cockpit Report Generation

One important (and cool) feature of SQL Cockpit is an ability to auto-generate ABAP reports directly from the SQL query entered in the cockpit.

We illustrate below, one example of how this may be utilised

As you can see from the code snippet and screenshot below, suppose we want to generate a report output that executes a relatively complex select query :

If you want to generate SAP report that executes this query, it would be a tedious and repetitive work to create a report manually in ABAP. Report generation feature of SQL Cockpit makes this work much simpler and quicker as illustrated below (We have implemented customer requirements with many more fields and complex select query that pulls data from upto 10 database tables!).

After executing the SQL query, just click on the highlighted „Template“ icon and „Select Template“ textbox appears

Choose an ‚advanced‘ option in the screenshot above.

We are taken to the Report Template Wizard

Click on the Continue button

Enter the report name, description, and other optional information. Note that „Tabular Selection Blocks“ checkbox to generate multiple tabs on the selection screen is selected. Continue to the next window

As shown below, we get a list of selection screen field options, (also auto-generated from the WHERE condition of the SQL query 🙂 )

As shown above, we have three options…

  1. create a selection screen field with an auto-populated value from the SQL where condition
  2. create a selection screen field without an auto-populated value from the SQL where condition
  3. Select query of a generated report will contain hard-coded value from the SQL where condition

Click on Continue button again after making your selections from one of these options

Finally, a generate report option is presented along with a list of specified report parameters in the previous step as seen below

Click on the Generate Report button

Select package as applicable and we are done.

Presto!

A generated report can be viewed / executed in SE38 like any other custom report.

Note the selection screen as seen below (with different selection screen tabs for fields from different tables)

Here is a screenshot from the select query (that was also auto-generated, of course 🙂 )

As highlighted in the screenshot, one of the where condition was created with a hard-coded values from the select query („Wien“) as per the selection in the report generation template!

Conclusion: we can auto-generate complex SAP reports using SQL Cockpit in less than 15 minutes! We can even customize special features based on individual client requirements.

This saves a lot of a lot of repetitive work for programmers and power users 😉

Symbole aus Ergebnisliste generieren

Symbole aus Ergebnisliste generieren

Im SQL Cockpit können Symbole als Platzhalter verwendet werden. Ein Symbol kann entweder einen einzelnen Wert oder eine Range-Tabelle enthalten und wird im Normalfall manuell durch den User gepflegt.

In diesem Beispiel wurde ein Symbol SIMPLE_SYMBOL mit dem Wert ‘0001‘ definiert.

In einem SELECT könnte das Symbol wie folgt in der WHERE Bedingung verwendet werden:

Das SQL Cockpit kann aber auch mit mehrwertigen Symbolen umgehen. Dazu muss zum Symbol noch ein Datenelement gepflegt werden. Dann können die Werte über den Button in der Typ-Spalte gepflegt werden.

Die Wertepflege sieht dann z.B. wie folgt aus:

Die Verwendung im SELECT ist geringfügig anders, anstelle einer beliebigen Vergleichsoperation muss hier natürlich vor dem Symbol ein IN verwendet werden:

Symbolgenerierung aus einer Ergebnisliste

Nun aber zum eigentlichen Thema dieses Blogs. Angenommen, man hat eine relativ umfangreiche Liste erstellt und möchte aus einer Spalte alle Werte als Selektionsparameter für einen anderen Select verwenden.

Um diese Anforderung abzudecken haben wir im Kontextmenü der Spaltenüberschriften eine Funktion zum Erstellen eines Symbols ergänzt. Nach Auswahl der Funktion muss lediglich der Symbolname in einem Popup angegeben werden.

Das zugrundeliegende Datenelement ist bereits gefüllt. Alle Werte werden als „Einzelwerte Selektieren“ in das Symbol aufgenommen. Doppelte Einträge werden natürlich entfernt, leere Werte werden nicht übernommen. Das Symbol kann sofort nach der Generierung verwendet werden.