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). | 








