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ätFunktion
A_SalesOrderAuftragskopf mit Stammdaten
A_SalesOrderItemAuftragspositionen

Expansion: Positionen werden via $expand=to_Item verknüpft.

Feldmapping: SAP-Feld ↔ ABAP-Tabelle

API-FeldABAP-FeldTabelleBeschreibung
SalesOrderVBELNVBAKAuftragsnummer
SalesOrderTypeAUARTVBAKBelegart (TA, DR, etc.)
SoldToPartyKUNNRVBAKAuftraggeber
SalesOrganizationVKORGVBAKVerkaufsorganisation
TotalNetAmountNETWRVBAKGesamtnettowert
OverallDeliveryBlockStatusLIFSKVBUKLiefersperre-Status
OverallCreditCheckStatusCMGSTVBUKKreditlimit-Status
PurchaseOrderByCustomerBSTNKVBAKKundenbestellnummer
MaterialMATNRVBAPMaterialnummer
OrderQuantityKWMENGVBAPBestellmenge
RequestedDeliveryDateLFDATVBAPLieferdatum

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=0

Parameter:

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)

ParameterBeispiel
$filterCreationDate 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:

FeldVerwendung
CreationDateErstmaliger Abruf neuer Aufträge
LastChangeDateInkrementelle 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:

  1. Vertriebswertberechnung: Basis für Umsatzprognosen und Leistungsindikatoren

  2. Liefersperre-Management: Automatische Freigabe nach Zahlungseingang

Richtung: One-Way (SAP → Bilendo), ausgenommen Liefersperre-Freigabe bei Bedarf.


**