Aufträge-Service
Auftrags- und Positionsdaten zuverlässig per OData abrufen.
S/4HANA: API_SALES_ORDER_SRV
Die API API_SALES_ORDER_SRV stellt Verkaufsaufträge (Vertriebsbelege) auf Header- und Positionsebene bereit.
Entitäten und Struktur
| Entität | Funktion |
|---|---|
A_SalesOrder | Auftragskopf mit Stammdaten |
A_SalesOrderItem | Auftragspositionen |
Expansion: Positionen werden via $expand=to_Item verknüpft.
Feldmapping: SAP-Feld ↔ ABAP-Tabelle
| API-Feld | ABAP-Feld | Tabelle | Beschreibung |
|---|---|---|---|
SalesOrder | VBELN | VBAK | Auftragsnummer |
SalesOrderType | AUART | VBAK | Belegart (TA, DR, etc.) |
SoldToParty | KUNNR | VBAK | Auftraggeber |
SalesOrganization | VKORG | VBAK | Verkaufsorganisation |
TotalNetAmount | NETWR | VBAK | Gesamtnettowert |
OverallDeliveryBlockStatus | LIFSK | VBUK | Liefersperre-Status |
OverallCreditCheckStatus | CMGST | VBUK | Kreditlimit-Status |
PurchaseOrderByCustomer | BSTNK | VBAK | Kundenbestellnummer |
Material | MATNR | VBAP | Materialnummer |
OrderQuantity | KWMENG | VBAP | Bestellmenge |
RequestedDeliveryDate | LFDAT | VBAP | Lieferdatum |
Abfrage-Beispiel mit Filter und Expansion
GET /sap/opu/odata/sap/API_SALES_ORDER_SRV/A_SalesOrder?
$filter=CreationDate ge datetime'2026-04-01T00:00:00'&
$expand=to_Item&
$top=100&
$skip=0Parameter:
$filter: CreationDate-basierte Selektion$expand: Positionen laden$top/$skip: Paging (siehe 07 - Delta-Logik & Paging)
JSON-Response (vereinfacht)
{
"d": {
"results": [
{
"SalesOrder": "0010001234",
"SalesOrderType": "TA",
"SoldToParty": "0000100050",
"SalesOrganization": "1000",
"TotalNetAmount": "1500.00",
"OverallDeliveryBlockStatus": "A",
"OverallCreditCheckStatus": "0",
"PurchaseOrderByCustomer": "PO-2026-001",
"CreationDate": "/Date(1712188800000)/",
"to_Item": {
"results": [
{
"SalesOrder": "0010001234",
"SalesOrderItem": "000010",
"Material": "000000100050014500",
"OrderQuantity": "100.000",
"RequestedDeliveryDate": "/Date(1712707200000)/"
}
]
}
}
]
}
}ECC: Custom SEGW (Z_BILENDO_SALESORDERS_SRV)
Für SAP ECC wird ein Custom OData-Service via SEGW (Service Generator) implementiert.
DPC-Implementierung (Data Provider Class)
Die Implementierung liest VBAK (Auftragskopf), VBAP (Positionen), VBUK (Status) und VBPA (Geschäftspartner).
GET_ENTITYSET mit Filter und Paging
METHOD io_tech_request_context->get_entity_data_response.
DATA: lt_sales_orders TYPE STANDARD TABLE OF z_sales_order,
ls_filter TYPE /iwbep/s_cod_select_option,
lv_erdat TYPE erdat,
lv_vkorg TYPE vkorg,
lv_top TYPE i,
lv_skip TYPE i.
" Filter-Parameter extrahieren
ls_filter = io_tech_request_context->get_filter( ).
" ERDAT und VKORG aus Filter lesen
LOOP AT ls_filter-select_options ASSIGNING FIELD-SYMBOL(<ls_opt>).
IF <ls_opt>-property = 'ERDAT'.
lv_erdat = <ls_opt>-range[ 1 ]-low.
ELSEIF <ls_opt>-property = 'VKORG'.
lv_vkorg = <ls_opt>-range[ 1 ]-low.
ENDIF.
ENDLOOP.
" Paging
lv_top = io_tech_request_context->get_top( ).
lv_skip = io_tech_request_context->get_skip( ).
" Datenselektion (VBAK + VBAP + VBUK Join)
SELECT vbak~vbeln, vbak~auart, vbak~kunnr, vbak~vkorg,
vbak~netwr, vbuk~lifsk, vbuk~cmgst, vbak~bstnk,
vbap~matnr, vbap~kwmeng, vbap~lfdat
INTO CORRESPONDING FIELDS OF TABLE lt_sales_orders
FROM vbak
INNER JOIN vbap ON vbak~vbeln = vbap~vbeln
INNER JOIN vbuk ON vbak~vbeln = vbuk~vbeln
WHERE vbak~erdat >= lv_erdat
AND vbak~vkorg = lv_vkorg
ORDER BY vbak~vbeln
LIMIT lv_top OFFSET lv_skip.
" Warenempfänger aus VBPA hinzufügen (optional)
PERFORM fill_warenempfaenger CHANGING lt_sales_orders.
" Response setzen
er_entity_set = lt_sales_orders.
ENDMETHOD.Warenempfänger (Lieferadresse) via VBPA
FORM fill_warenempfaenger CHANGING pt_orders TYPE z_t_salesorders.
DATA: ls_vbpa TYPE vbpa.
LOOP AT pt_orders ASSIGNING FIELD-SYMBOL(<ls_order>).
" VBPA für Warenempfänger (Partnerfunktion 'WE') selektieren
SELECT SINGLE empfaenger INTO <ls_order>-warenempfaenger
FROM vbpa
WHERE vbeln = <ls_order>-vbeln
AND parvw = 'WE' " Warenempfänger
AND vbpa~pafkt = 1. " Hauptadresse
ENDLOOP.
ENDFORM.Supported Query-Parameter (ECC)
| Parameter | Beispiel |
|---|---|
$filter | CreationDate ge datetime'2026-04-01T00:00:00' |
$filter (VKORG) | SalesOrganization eq '1000' |
$top | $top=500 |
$skip | $skip=1000 |
$orderby | $orderby=CreationDate desc |
Liefersperre-Freigabe (optional, bidirektional)
Die Freigabe von Liefersperren ist ein häufiger Anwendungsfall und wird in Bilendo nach Zahlungseingang auslöst.
S/4HANA: PATCH auf A_SalesOrder
PATCH /sap/opu/odata/sap/API_SALES_ORDER_SRV/A_SalesOrder('0010001234')
Content-Type: application/json
{
"DeliveryBlockReason": ""
}Effekt: Setzt VBUK-LIFSK auf 0 (Liefersperre aufgehoben).
ECC: BAPI_SALESORDER_CHANGE
Für ECC wird der BAPI BAPI_SALESORDER_CHANGE verwendet:
CALL FUNCTION 'BAPI_SALESORDER_CHANGE'
EXPORTING
salesdocument = '0010001234'
TABLES
order_header_inx = lt_header_inx
IMPORTING
return = lt_return.
COMMIT WORK.Implementierungsdetails: Siehe 08 - Re-Integration (Write-Back).
Delta-Selektion
Für die Synchronisierung von Auftragsänderungen stehen zwei Felder zur Verfügung:
| Feld | Verwendung |
|---|---|
CreationDate | Erstmaliger Abruf neuer Aufträge |
LastChangeDate | Inkrementelle Updates (Änderungen) |
Hinweis: Detaillierte Paging- und Delta-Strategien sind dokumentiert in 07 - Delta-Logik & Paging.
Zweck in Bilendo
Die Aufträge dienen zwei Primärzielen:
Vertriebswertberechnung: Basis für Umsatzprognosen und Leistungsindikatoren
Liefersperre-Management: Automatische Freigabe nach Zahlungseingang
Richtung: One-Way (SAP → Bilendo), ausgenommen Liefersperre-Freigabe bei Bedarf.
**