Stammdaten-Service
Kundenstammdaten effizient per OData aus SAP nach Bilendo übernehmen.
S/4HANA: Standard API (API_BUSINESS_PARTNER)
Die Standard-API für Geschäftspartner in S/4HANA bietet direkten Zugriff auf Stammdaten über vordefinierte OData-Entitäten.
Entitäten
A_Customer: Kundenhauptdaten
A_CustomerCompany: Kundencompany-spezifische Daten
Feldmapping: S/4HANA → Bilendo
| S/4-Feld | OData-Property | Bilendo-Feld | Datentyp | Pflicht |
|---|---|---|---|---|
| KUNNR | Customer | KundenNr | String | Ja |
| NAME1 | CustomerName | Name1 | String | Ja |
| BUKRS | CompanyCode | MandantCode | String | Nein |
| AKONT | ReconciliationAccount | Ausgleichskonto | String | Nein |
| ZTERM | PaymentTerms | Zahlungsbedingung | String | Nein |
| KLIMK | CreditLimit | Kreditlimit | Decimal | Nein |
| CTLPC | RiskCategory | Risikokategorie | String | Nein |
| LOEVM | DeletionFlag | Löschflag | String | Nein |
Beispiel-Anfrage
GET /sap/opu/odata/sap/API_BUSINESS_PARTNER/A_Customer?$filter=LastChangeDate ge datetime'2024-01-01T00:00:00'&$expand=to_CustomerCompany&$select=Customer,CustomerName,CompanyCode&$top=100&$skip=0
Authorization: Basic <Base64-Credentials>Beispiel-Response
{
"d": {
"results": [
{
"__metadata": {
"id": "http://saphostname:8000/sap/opu/odata/sap/API_BUSINESS_PARTNER/A_Customer('1000000')",
"uri": "http://saphostname:8000/sap/opu/odata/sap/API_BUSINESS_PARTNER/A_Customer('1000000')",
"type": "API_BUSINESS_PARTNER.A_Customer"
},
"Customer": "1000000",
"CustomerName": "Musterkunde AG",
"CompanyCode": "1000",
"ReconciliationAccount": "130100",
"PaymentTerms": "ZB01",
"CreditLimit": "500000.00",
"RiskCategory": "01",
"LastChangeDate": "/Date(1704067200000)/",
"to_CustomerCompany": {
"__deferred": {
"uri": "http://saphostname:8000/sap/opu/odata/sap/API_BUSINESS_PARTNER/A_Customer('1000000')/to_CustomerCompany"
}
}
}
]
}
}ECC: Custom SEGW Service (Z_BILENDO_CUSTOMER_SRV)
Für ECC-Systeme ohne Standard-APIs wird ein SEGW-basierter Custom Service implementiert, der Daten aus KNA1, KNB1 und KNB5 bereitstellt.
Entity Type Definition
<EntityType Name="ZBilendoCustomer">
<Key>
<PropertyRef Name="Kunnr"/>
</Key>
<Property Name="Kunnr" Type="Edm.String" Nullable="false" MaxLength="10"/>
<Property Name="Name1" Type="Edm.String" MaxLength="35"/>
<Property Name="Name2" Type="Edm.String" MaxLength="35"/>
<Property Name="Ort01" Type="Edm.String" MaxLength="35"/>
<Property Name="Land1" Type="Edm.String" MaxLength="3"/>
<Property Name="Bukrs" Type="Edm.String" MaxLength="4"/>
<Property Name="Akont" Type="Edm.String" MaxLength="10"/>
<Property Name="Zterm" Type="Edm.String" MaxLength="4"/>
<Property Name="Klimk" Type="Edm.Decimal" Precision="15" Scale="2"/>
<Property Name="Ctlpc" Type="Edm.String" MaxLength="1"/>
<Property Name="Erdat" Type="Edm.DateTime"/>
<Property Name="Laeda" Type="Edm.DateTime"/>
<Property Name="Loevm" Type="Edm.String" MaxLength="1"/>
</EntityType>DPC Extension: GET_ENTITYSET Implementation
METHOD /iwbep/if_mgw_appc_runtime~get_entityset.
DATA: lt_kna1 TYPE STANDARD TABLE OF kna1,
lt_knb1 TYPE STANDARD TABLE OF knb1,
lt_knb5 TYPE STANDARD TABLE OF knb5,
lt_result TYPE STANDARD TABLE OF zbilendo_customer,
ls_result TYPE zbilendo_customer,
ls_filter TYPE /iwbep/s_mgw_select_option,
lv_top TYPE i,
lv_skip TYPE i.
" Parameter auslesen
lv_top = io_tech_request_context->get_top( ).
lv_skip = io_tech_request_context->get_skip( ).
" Filter für LastChangeDate/Laeda aus OData-Request extrahieren
LOOP AT io_tech_request_context->get_filter( )->get_expressions( ) INTO ls_filter.
IF ls_filter-property = 'Laeda'.
" Filter wird in WHERE-Clause verwendet
ENDIF.
ENDLOOP.
" Daten aus Tabellen lesen
SELECT a~kunnr a~name1 a~name2 a~ort01 a~land1 a~erdat a~laeda a~loevm
b~bukrs b~akont b~zterm b~klimk b~ctlpc
INTO TABLE lt_kna1
FROM kna1 AS a
INNER JOIN knb1 AS b ON a~kunnr = b~kunnr
LEFT JOIN knb5 AS c ON a~kunnr = c~kunnr
WHERE a~loevm NE 'X'
ORDER BY a~laeda DESCENDING.
" Ergebnisse in OData-Entity-Format transformieren
LOOP AT lt_kna1 ASSIGNING <fs_kna1>.
MOVE-CORRESPONDING <fs_kna1> TO ls_result.
APPEND ls_result TO lt_result.
ENDLOOP.
" Paging anwenden
IF lv_skip > 0.
DELETE lt_result FROM 1 TO lv_skip.
ENDIF.
IF lv_top > 0.
DELETE lt_result FROM lv_top + 1.
ENDIF.
" Ergebnisse in Response-Format setzen
CALL METHOD er_entityset->append_t( it_entityset = lt_result ).
ENDMETHOD.Feldmapping: OData → Bilendo
Vollständige Zuordnung aller relevanten Felder zwischen SAP und Bilendo-Zielsystem:
| SAP-Tabelle | SAP-Feld | S/4-API-Property | ECC-Custom-Property | Bilendo-Feldname | Datentyp | Pflicht | Beschreibung |
|---|---|---|---|---|---|---|---|
| KNA1 | KUNNR | Customer | Kunnr | KundenNr | String | Ja | Kundennummer |
| KNA1 | NAME1 | CustomerName | Name1 | Name1 | String | Ja | Kundenname Zeile 1 |
| KNA1 | NAME2 | - | Name2 | Name2 | String | Nein | Kundenname Zeile 2 |
| KNA1 | ORT01 | CityName | Ort01 | Stadt | String | Nein | Ort |
| KNA1 | LAND1 | Country | Land1 | LandCode | String | Nein | Ländercode |
| KNA1 | ERDAT | CreationDate | Erdat | ErstelltAm | DateTime | Nein | Erstellungsdatum |
| KNA1 | LAEDA | LastChangeDate | Laeda | GeändertAm | DateTime | Nein | Letzte Änderung |
| KNA1 | LOEVM | DeletionFlag | Loevm | Gelöscht | String | Nein | Löschflag |
| KNB1 | BUKRS | CompanyCode | Bukrs | MandantCode | String | Ja | Mandant |
| KNB1 | AKONT | ReconciliationAccount | Akont | Ausgleichskonto | String | Nein | Abstimmungskonto |
| KNB1 | ZTERM | PaymentTerms | Zterm | Zahlungsbedingung | String | Nein | Zahlungsbedingung |
| KNB1 | KLIMK | CreditLimit | Klimk | Kreditlimit | Decimal | Nein | Kreditlimit |
| KNB1 | CTLPC | RiskCategory | Ctlpc | Risikokategorie | String | Nein | Risikokategorie |
| KNB5 | KDGRP | CustomerGroup | - | Kundengruppe | String | Nein | Kundengruppe |
Delta-Selektion
Für inkrementelle Synchronisationen werden Filter basierend auf Änderungszeitstempel verwendet.
S/4HANA
$filter=LastChangeDate ge datetime'2024-01-15T10:30:00'ECC
$filter=Laeda ge datetime'2024-01-15T10:30:00'Weitere Details zur Delta-Logik und zum Paging: 07 - Delta-Logik & Paging
**