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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
@ClientDependent: false @EndUserText.label: 'ui38 - demo - Orders' define table function /CADAXO/UI38D_DEMO_ORDER_SH with parameters name_search :abap.char( 50 ) returns { key OrderId : /cadaxo/ui38_dmo_order_id; CustomerId : /cadaxo/ui38_dmo_customer_id; ProductId : /cadaxo/ui38_dmo_product_id; OrderDate : /cadaxo/ui38_dmo_order_date; Quantity : /cadaxo/ui38_dmo_quantity; Unit : /cadaxo/ui38_dmo_unit; TotalPrice : /cadaxo/ui38_dmo_price; Currency : /cadaxo/ui38_dmo_currency; Description : /cadaxo/ui38_dmo_description; Name : /cadaxo/ui38_dmo_name; Score : /cadaxo/ui38_dmo_score; } implemented by method /cadaxo/cl_ui38_dmo_order_amdp=>search_orders_CDS; |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
CLASS /cadaxo/cl_ui38_dmo_order_amdp DEFINITION PUBLIC FINAL CREATE PUBLIC . PUBLIC SECTION. INTERFACES if_amdp_marker_hdb. CLASS-METHODS search_orders_CDS FOR TABLE FUNCTION /cadaxo/ui38d_demo_order_sh. PROTECTED SECTION. PRIVATE SECTION. ENDCLASS. |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
CLASS /cadaxo/cl_ui38_dmo_order_amdp IMPLEMENTATION. METHOD search_orders_CDS BY DATABASE FUNCTION FOR HDB LANGUAGE SQLSCRIPT OPTIONS READ-ONLY USING /cadaxo/ui38d_demo_orders. RETURN SELECT OrderId, CustomerId, ProductId, OrderDate, Quantity, Unit, TotalPrice, Currency, Description, Name, score( ) as Score from "/CADAXO/UI38D_DEMO_ORDERS" WHERE contains( Name, :name_search, fuzzy( 0.0 ) ); ENDMETHOD. ENDCLASS. |
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 HDB | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 |
SELECT FROM /cadaxo/ui38d_demo_order_sh( name_search = 'Hat Nägel' ) fields OrderId, CustomerId, ProductId, OrderDate, Quantity, Unit, TotalPrice, Currency, Description, Name, Score INTO TABLE @DATA(orders). |