Core Data Services (CDS) ABAP

Virtual Elements

(C) Brandeis Consulting

Virtuelles Element - Warum?

Use-Case

  • CDS kann sehr viel
  • ... aber nicht immer alles

Beispiel

Gewisse Logiken sind so komplex, dass diese nur sehr schwer umsetzbar sind, aber ein vorhander Baustein das Ergebnis mit einem simplen Aufruf liefert

Überlegung

  • Zurückgreifen auf ABAP!
(C) Brandeis Consulting

Erweiterung der CDS

Syntax klassisch

    @ObjectModel.virtualElement: true
    @ObjectModel.virtualElementCalculatedBy: 'ZCL_DEMO_CDS_VIRT'
    cast( '' as abap.char(12))  as approver,

Syntax Projection View

    @ObjectModel.virtualElementCalculatedBy: 'ZCL_DEMO_CDS_VIRT'
    virtual Approver : abap.char( 12 ),
(C) Brandeis Consulting

Logik im ABAP

Klasse anlegen

  • Verwenden des Interface IF_SADL_EXIT_CALC_ELEMENT_READ
  • Zusätzlich möglich:
    • IF_SADL_EXIT_FILTER_TRANSFORM
    • IF_SADL_EXIT_SORT_TRANSFORM

Klasse implementieren

  • Implementiere GET_CALCULATE_INFO
    • Hier wird definiert, welche Felder erforderlich sind
  • Implementiere CALCULATE
    • Hier geschieht die Magie!
(C) Brandeis Consulting

Beispiel-Implementierung

Ermittlung der Felder

  METHOD if_sadl_exit_calc_element_read~get_calculation_info.

    LOOP AT it_requested_calc_elements INTO DATA(lv_req_elem).

      CASE lv_req_elem.

        WHEN 'GROSS_PRICE'.

          INSERT CONV #( 'NET_PRICE' ) INTO TABLE et_requested_orig_elements.
          INSERT CONV #( 'TAXES' ) INTO TABLE et_requested_orig_elements.

      ENDCASE.

    ENDLOOP.

  ENDMETHOD.

Berechnen der Felder

METHOD if_sadl_exit_calc_element_read~calculate.

  DATA: lt_data TYPE TABLE OF ZC_Output.

  lt_data = CORRESPONDING #( it_original_data ).

  LOOP AT lt_data ASSIGNING FIELD-SYMBOL(<line>).

    <line>-gross_price = <line>-net_price * <line>-taxes.

  ENDLOOP.

  ct_calculated_data = CORRESPONDING #( lt_data ).

ENDMETHOD.
(C) Brandeis Consulting

Hintergrund und Einschränkungen

Wie funktioniert das?

  • CDS wird von ABAP and die Datenbank durchgereicht
  • Die Datenbank kann KEIN ABAP
  • Wo wird das ABAP ausgeführt?

Einschränkungen

  • Virtuelle Elemente werden über den SADL-Layer zur Verfügung gestellt
  • SADL (Service Adaption Definition Language) ist die Übersetzung von OData nach SQL
  • d.h. Virtuelle Elemente stehen nicht über direktes ABAP SQL zur Verfügung!
(C) Brandeis Consulting

Weitere Möglichkeiten, wenn CDS-only nicht genügt

  • Redefinition der RDS in der SEGW + eigene NACHGELAGERTE Implementierungen
  • Verwendung von CDS Table Functions
(C) Brandeis Consulting