OData Service-Definitionen
Service-Registrierung, Entity Sets und Metadaten der OData-Services.
Übersicht
Die Bereitstellung von OData-Services in SAP-Systemen erfolgt über zwei primäre Technologiestapel, die je nach Systemlandschaft zum Einsatz kommen:
CDS Views (S/4HANA) – Moderne, deklarative Schicht für OData-Exposition
SEGW Service Builder (ECC 6.0) – Legacy-Ansatz mit manuellem Entity- und Service-Design
Beide Ansätze ermöglichen REST-basierte Datenintegration mit Filtering, Paging und Sorting-Mechanismen, erfordern jedoch unterschiedliche Implementierungsparadigmen.
CDS Views (S/4HANA)
Konzeptionelle Grundlagen
Core Data Services (CDS) stellen ein deklaratives Programmiermodell für S/4HANA dar, das die OData-Exposition durch Metadaten-Annotationen automatisiert. Die kritische Annotation @OData.publish: true aktiviert die automatische Service-Generierung ohne weiteren manuellen Konfigurationsaufwand.
Mechanismus der Exposition:
CDS View wird mittels
@OData.publish: truegekennzeichnetGateway liest View-Metadaten automatisch
OData $metadata wird generiert
Service wird unter
/sap/opu/odata/sap/<SERVICE_NAME>verfügbar
Standard SAP CDS Views für Kundendaten
| View | Beschreibung | Primäre Felder |
|---|---|---|
I_Customer | Kundenmaster (Kopfdaten) | Customer, CustomerName, CustomerType, CreatedDate |
I_CustomerCompany | Kundenzuordnung zu Geschäftsbereich | Customer, Company, CreditLimit, PaymentTerms |
I_OperationalAcctgDocItem | Offene Posten (FI-Modul) | AccountingDocument, LineItem, Amount, Currency, PostingDate |
I_SalesOrder | Verkaufsaufträge (SD-Modul) | SalesOrder, OrderDate, CustomerPoNumber, TotalNetAmount |
I_SalesOrderItem | Verkaufsauftrag-Positionen | SalesOrder, SalesOrderItem, Product, OrderQuantity, NetAmount |
I_CreditMgmtAccount | Kreditmanagement-Konten | CreditAccount, CreditLimit, ExposedAmount, UtilizationPercent |
Custom CDS View: Z_I_BilendoCustomer
Für Bilendo-spezifische Anforderungen wird eine Custom CDS View implementiert, die Master- und Stammdaten konsolidiert:
@OData.publish: true
@AbapCatalog.sqlViewName: 'Z_I_BILENDO_C'
@VDM.viewType: #COMPOSITE
define view Z_I_BilendoCustomer as
select from kna1
inner join knb1 on kna1.kunnr = knb1.kunnr
inner join knb5 on knb1.kunnr = knb5.kunnr
and knb1.bukrs = knb5.bukrs
{
key kna1.kunnr as Customer,
knb1.bukrs as CompanyCode,
kna1.name1 as CustomerName,
kna1.stras as Street,
kna1.ort01 as City,
kna1.pstlz as PostalCode,
kna1.land1 as Country,
kna1.telf1 as Phone,
knb1.stceg as TaxNumber,
knb1.akont as ReconciliationAccount,
knb1.zterm as PaymentTerms,
knb5.duedt as CreditLimit,
knb1.frste as RiskCategory,
kna1.erdat as CreationDate,
kna1.aedat as LastChangeDate
};Aktivierungsschritte:
ABAP Development Tools (Eclipse) oder SE80 öffnen
View unter Paket
ZBILENDOanlegenDefinition speichern und validieren
Über
/IWFND/MAINT_SERVICEregistrieren
SEGW Service Builder (ECC 6.0)
Für ECC 6.0 Systeme ohne CDS-Unterstützung wird der SAP Gateway Service Builder (SEGW) verwendet. Dies ist ein grafisches Werkzeug zur Definition von OData-Services.
Schrittweise Implementierung
Schritt 1: Projekt-Anlage in SEGW
Transaktion: SEGW
→ Projekt: Z_BILENDO_ODATA
→ Description: "Bilendo Customer and Clearing Integration"
→ Package: ZBILENDOSchritt 2: Entity Types definieren
Folgende Entity Types werden im Service definiert:
| Entity Type | Beschreibung | Primärschlüssel |
|---|---|---|
ZBilendoCustomer | Kundenmaster mit Zahlungsdaten | Customer, CompanyCode |
ZBilendoOpenItem | Offene Posten | DocumentNumber, Item |
ZBilendoClearedItem | Ausgeglichene Posten | DocumentNumber, Item |
ZBilendoSalesOrder | Verkaufsaufträge | SalesOrder |
Entity Type Definition (Beispiel ZBilendoCustomer):
| Property | Type | Length | Key | Filterable | Sortable |
|---|---|---|---|---|---|
| Customer | Edm.String | 10 | X | X | X |
| CompanyCode | Edm.String | 4 | X | X | X |
| CustomerName | Edm.String | 80 | X | X | |
| Street | Edm.String | 60 | |||
| City | Edm.String | 40 | X | ||
| PostalCode | Edm.String | 10 | |||
| Country | Edm.String | 3 | |||
| Phone | Edm.String | 30 | |||
| TaxNumber | Edm.String | 16 | X | ||
| CreditLimit | Edm.Decimal | 15,2 | X | X | |
| PaymentTerms | Edm.String | 4 | |||
| RiskCategory | Edm.String | 2 | X |
Schritt 3: Entity Sets konfigurieren
Entity Sets bilden die Endpunkte des OData-Service ab:
Entity Set: Customers
→ Entity Type: ZBilendoCustomer
→ Path: Customers
→ Reusable: Nein
Entity Set: OpenItems
→ Entity Type: ZBilendoOpenItem
→ Path: OpenItems
→ Reusable: Nein
Entity Set: SalesOrders
→ Entity Type: ZBilendoSalesOrder
→ Path: SalesOrders
→ Reusable: NeinSchritt 4: Runtime generieren
SEGW → Project Z_BILENDO_ODATA
→ Menü: Service → Generate Runtime Objects
→ Backend: abap/backend
→ Zielpaket: ZBILENDODies generiert automatisch:
Data Provider Class (DPC) für CRUD-Operationen
Model Provider Class (MPC) für Metadaten
Schritt 5: DPC Extension implementieren
Die Data Provider Class wird erweitert, um konkrete Datenbeschaffungslogik zu implementieren:
CLASS zcl_z_bilendo_odata_dpc_ext DEFINITION
PUBLIC
INHERITING FROM zcl_z_bilendo_odata_dpc
CREATE PUBLIC.
PUBLIC SECTION.
METHODS get_entityset
REDEFINITION.
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.
CLASS zcl_z_bilendo_odata_dpc_ext IMPLEMENTATION.
METHOD get_entityset.
CASE iv_entity_set_name.
WHEN 'Customers'.
DATA: lt_customers TYPE TABLE OF zcl_z_bilendo_odata_mpc=>ts_zbilendo_customer.
DATA: ls_filter TYPE /iwbep/s_mgw_tech_pair.
LOOP AT it_filter_select_options INTO ls_filter.
IF ls_filter-property = 'CUSTOMER'.
SELECT kunnr, bukrs, name1, stras, ort01, pstlz, land1, telf1,
stceg, akont, zterm, duedt, frste, erdat, aedat
INTO CORRESPONDING FIELDS OF TABLE lt_customers
FROM kna1
INNER JOIN knb1 ON kna1.kunnr = knb1.kunnr
WHERE kna1.kunnr IN ls_filter-value.
ENDIF.
ENDLOOP.
IF sy-subrc = 0.
et_entityset = lt_customers.
ENDIF.
WHEN OTHERS.
SUPER->get_entityset(
EXPORTING
iv_entity_set_name = iv_entity_set_name
it_filter_select_options = it_filter_select_options
iv_skip = iv_skip
iv_top = iv_top
IMPORTING
et_entityset = et_entityset
).
ENDCASE.
ENDMETHOD.
ENDCLASS.Implementierungsdetails:
Filtering: $filter-Parameter werden in
it_filter_select_optionsbereitgestelltPaging: iv_skip und iv_top implementieren OFFSET/LIMIT-Semantik
Performance: Index-Nutzung durch gezieltes SELECT auf gefilterte Felder
Schritt 6: Service-Registrierung
Transaktion: /IWFND/MAINT_SERVICE
→ Service: Z_BILENDO_ODATA_SRV (aus SEGW generiert)
→ Action: "Activate and Maintain Services"
→ Service URL: /sap/opu/odata/sap/Z_BILENDO_ODATA_SRV/Service-Registrierung und Validierung
Registrierungstransaktion: /IWFND/MAINT_SERVICE
Die zentrale Verwaltung aller OData-Services erfolgt in /IWFND/MAINT_SERVICE:
Workflow:
Service aus SEGW oder CDS View auswählen
Status: "Aktiviert" setzen
Gateway Client zuweisen (optionale technische Konfiguration)
Speichern
Validierung via Metadata und Gateway Client
Metadaten-Endpoint (Browser):
https://<HOST>:<PORT>/sap/opu/odata/sap/<SERVICE_NAME>/$metadataBeispiel für Z_BILENDO_ODATA_SRV:
https://erp.bilendo.local:8000/sap/opu/odata/sap/Z_BILENDO_ODATA_SRV/$metadataGateway Client Test-UI:
Transaktion: /IWFND/GW_CLIENT
→ Service Name: Z_BILENDO_ODATA_SRV
→ Request: GET /Customers?$filter=Customer eq '0000000001'&$top=10Naming Convention
Konsistente Benennungskonventionen gewährleisten Wartbarkeit und Interoperabilität:
| Objekt | ECC (SEGW) | S/4HANA (CDS) | Präfix |
|---|---|---|---|
| Service-Projekt | Z_BILENDO_ODATA | (View-Name) | Z_ |
| Entity Type | ZBilendoCustomer | z_i_bilendo_customer | Z_I_ |
| Entity Set (Endpoint) | Customers | /sap/opu/odata/.../Customers | (camelCase) |
| Data Provider Class | zcl_z_bilendo_odata_dpc_ext | (auto) | ZCL_ |
| Custom Tabellen | ZBILENDO_* | ZBILENDO_* | Z_ |
| CDS View Typ | N/A | @VDM.viewType | I_ (Interface), C_ (Composite) |
Beispiel Service-URL Struktur:
S/4HANA: /sap/opu/odata/sap/Z_I_BILENDO_CUSTOMER_SRV/Customers
ECC 6.0: /sap/opu/odata/sap/Z_BILENDO_ODATA_SRV/Customers**