Modul in diesem Artikel: Integration Flow Helper
OData Receiver in SAP CPI: $select, $filter, $expand und $orderby ohne Tippfehler
Query Options für den OData Receiver in SAP CPI: $select, $filter, $expand, $orderby und $top mit Beispielen, die Unterschiede zwischen V2 und V4 und Tippfehler, die HTTP 400 auslösen.

Der OData-Receiver-Adapter in SAP CPI macht aus einem Resource Path und einer Zeile Query Options einen Aufruf an einen OData-Service, etwa eine API von SAP S/4HANA. Die Query Options bestimmen, welche Felder, Zeilen und verknüpften Entitäten zurückkommen – und ein einziger falsch geschriebener Property-Name genügt, damit der Service den Aufruf ablehnt.
Dieser Artikel geht $select, $filter, $expand und $orderby an einem Beispiel durch, zeigt die Unterschiede zwischen OData V2 und V4, über die viele stolpern, und wie Sie die Namen korrekt halten.
Wo die Query Options im OData Receiver stehen
Auf der Registerkarte Processing des Adapters wählen Sie die Operation und setzen dann den Resource Path – das Entity Set oder die Entität, die Sie aufrufen – und die Query Options, also alles nach dem ? in der URL. Der Query-Assistent des Adapters kann beides aus den Service-Metadaten erzeugen und legt diese Metadaten, die EDMX-Datei, in den Ressourcen des iFlows ab.
Query Options können Simple Expressions enthalten, sodass Werte aus der Nachricht kommen können, zum Beispiel $filter=SoldToParty eq '${property.customerId}'. Das folgende Beispiel liest Kundenaufträge samt Positionen aus API_SALES_ORDER_SRV, einem OData-V2-Service:
Resource Path: A_SalesOrder
Query Options: $select=SalesOrder,SoldToParty,CreationDate,to_Item/SalesOrderItem,to_Item/Material
&$expand=to_Item
&$filter=SoldToParty eq '${property.customerId}' and CreationDate ge datetime'2026-01-01T00:00:00'
&$orderby=CreationDate desc
&$top=50Im Adapter stehen die Query Options in einer Zeile; hier sind sie nur zur besseren Lesbarkeit umbrochen.
Die vier Optionen im Einzelnen
| Option | Was sie bewirkt | Beispiel |
|---|---|---|
$select | Gibt nur die aufgeführten Properties zurück und hält Antworten klein | $select=SalesOrder,SoldToParty |
$filter | Gibt nur die Zeilen zurück, die eine Bedingung erfüllen | $filter=SalesOrderType eq 'OR' |
$expand | Bindet verknüpfte Entitäten über eine Navigation Property ein | $expand=to_Item |
$orderby | Sortiert die Zeilen, standardmäßig aufsteigend | $orderby=CreationDate desc |
$top und $skip begrenzen das Ergebnis und teilen es in Seiten. In OData V2 wird eine Property einer expandierten Entität über einen Pfad ausgewählt, etwa to_Item/Material, und die Navigation Property muss zusätzlich in $expand stehen.
$filter hat eigene Operatoren: eq, ne, gt, ge, lt, le, verknüpft mit and, or und not. Textwerte stehen in einfachen Anführungszeichen, und Datumswerte brauchen die Literalform, die die jeweilige Service-Version erwartet.
OData V2 und V4 werden nicht gleich geschrieben
Der OData-Adapter unterstützt beide Versionen, und viele SAP-APIs gibt es in beiden. Eine Query von einer Version in die andere zu kopieren, ist eine häufige Fehlerquelle:
OData V2: $inlinecount=allpages
$filter=substringof('Smith',CustomerName)
$filter=CreationDate ge datetime'2026-01-01T00:00:00'
OData V4: $count=true
$filter=contains(CustomerName,'Smith')
$filter=CreatedAt ge 2026-01-01T00:00:00Z
$expand=_Item($select=Product,Quantity)- Zeilen zählen:
$inlinecount=allpagesin V2,$count=truein V4. - In Text suchen:
substringof('Smith',CustomerName)in V2,contains(CustomerName,'Smith')in V4. Beachten Sie die umgekehrte Reihenfolge der Argumente. - Datumswerte: V2 schreibt
datetime'2026-01-01T00:00:00'; V4 schreibt den Wert ohne Präfix. - Expandierte Properties: V2 wählt sie über einen Pfad aus; V4 verschachtelt die Optionen innerhalb des Expand, wie in
$expand=_Item($select=Product,Quantity).
Die Tippfehler hinter HTTP 400
Ist eine Query Option falsch, antwortet der Service meist mit HTTP 400 und nennt den Teil, den er nicht lesen konnte. Die Fehler dahinter sind fast immer dieselben:
- Falsche Groß-/Kleinschreibung: OData-Namen unterscheiden sie,
soldToPartyist also nichtSoldToParty. - Ein Entity Set, wo eine Navigation Property hingehört:
$expand=A_SalesOrderItemstatt$expand=to_Item. - Eine Property, die es auf einer anderen Entität oder nur in einer anderen Version des Service gibt.
- Fehlende Anführungszeichen um Textwerte oder ein V2-Datumsliteral, das an einen V4-Service geht.
- Ein Problem mit Trennzeichen: Optionen werden mit
&verbunden, und jeder Optionsname beginnt mit$.
Ausdrücke bringen ein eigenes Risiko mit: Ist ${property.customerId} leer, wird der Filter zu SoldToParty eq '' und liefert stillschweigend keine Zeilen statt eines Fehlers. Der Artikel über Simple Expressions erklärt, wie diese Werte gelesen werden.
Query und Service im Gleichschritt halten
- Behandeln Sie das EDMX in den Ressourcen des iFlows als maßgebliche Quelle für Namen, und aktualisieren Sie es, wenn sich der Service ändert.
- Wählen Sie nur die Felder aus, die Sie mappen; eine kleinere Antwort ist schneller und im Trace leichter zu lesen.
- Nutzen Sie bei großen Lesezugriffen die Option des Adapters, seitenweise zu verarbeiten, statt einer riesigen Antwort.
- Testen Sie die Query einmal mit genau den Werten, die eine echte Nachricht einsetzen wird.
Sie rufen statt eines OData-Service eine REST-API auf? Der Artikel zu Postman und OpenAPI behandelt den HTTP Receiver.
Wie der Kitegra hilft
Die Browser-Erweiterung Kitegra liest das EDMX, das Ihr iFlow für einen OData-Receiver-Kanal bereits enthält. Im Designer schlägt sie daraus den Resource Path sowie die Property- und Navigationsnamen für $select, $filter, $expand und $orderby vor – Sie wählen Namen aus, statt sie zu tippen.
Ihr Lint-Bereich meldet OData-Namen, die im EDMX nicht vorkommen, ebenso nicht geschlossene ${ sowie Header und Properties, die nirgends gesetzt werden. Erhält ein Kanal keine Vorschläge, prüfen Sie, ob sein EDMX in den Ressourcen des iFlows liegt. Die Erweiterung speichert, deployt oder bearbeitet nie den Inhalt eines iFlows, und Ihr Tenant ändert sich nur, wenn Sie auf eine von vier benannten Aktionen klicken, die sich abschalten lassen.
Um zu prüfen, was der OData-Service wirklich geantwortet hat, tracen Sie die Nachricht Schritt für Schritt und lesen Sie den Body nach dem Aufruf.
Ohne Kitegra-Konto funktioniert sie für 5 iFlows je Modul. Der Tarif Free umfasst 50, Starter 100 und Pro 300; Business hat kein Limit. Tarife vergleichen.
Probieren Sie ihn im nächsten iFlow aus
Lesen Sie, was der Kitegra im Designer der SAP Integration Suite leistet, oder sehen Sie ihn neben den anderen Chrome-Erweiterungen von Kitegra.
Häufige Fragen
Wo trage ich $filter im OData-Adapter von SAP CPI ein?
Im Feld Query Options auf der Registerkarte Processing des Receiver-Kanals, zusammen mit den anderen Optionen, zum Beispiel $select=SalesOrder&$filter=SalesOrderType eq 'OR'.
Kann ich einen Header oder eine Property in einem OData-Filter verwenden?
Ja. Query Options akzeptieren Simple Expressions, zum Beispiel $filter=SoldToParty eq '${property.customerId}'. Ist der Wert leer, liefert der Filter keine Zeilen; prüfen Sie ihn daher vorher.
Was ist der Unterschied zwischen $inlinecount und $count?
$inlinecount=allpages ist OData V2; $count=true ist die Form in OData V4. Beide liefern mit dem Ergebnis die Gesamtzahl der passenden Zeilen.
Warum scheitert substringof bei meinem Service?
substringof gibt es nur in OData V2. Ein OData-V4-Service verwendet contains(Property,'text'), mit umgekehrter Reihenfolge der Argumente.
Warum antwortet der Service mit HTTP 400?
Meist existiert ein Name aus der Query auf dieser Entität nicht – oft wegen der Groß-/Kleinschreibung, einer mit einem Entity Set verwechselten Navigation Property oder Syntax aus der anderen OData-Version.
Wo speichert SAP CPI die OData-Metadaten?
Der Query-Assistent legt die EDMX-Datei des Service in den Ressourcen des iFlows ab. Aktualisieren Sie sie, wenn sich der Service ändert, damit die Namen stimmen.