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

Feldmapping: S/4HANA → Bilendo

S/4-FeldOData-PropertyBilendo-FeldDatentypPflicht
KUNNRCustomerKundenNrStringJa
NAME1CustomerNameName1StringJa
BUKRSCompanyCodeMandantCodeStringNein
AKONTReconciliationAccountAusgleichskontoStringNein
ZTERMPaymentTermsZahlungsbedingungStringNein
KLIMKCreditLimitKreditlimitDecimalNein
CTLPCRiskCategoryRisikokategorieStringNein
LOEVMDeletionFlagLöschflagStringNein

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-TabelleSAP-FeldS/4-API-PropertyECC-Custom-PropertyBilendo-FeldnameDatentypPflichtBeschreibung
KNA1KUNNRCustomerKunnrKundenNrStringJaKundennummer
KNA1NAME1CustomerNameName1Name1StringJaKundenname Zeile 1
KNA1NAME2-Name2Name2StringNeinKundenname Zeile 2
KNA1ORT01CityNameOrt01StadtStringNeinOrt
KNA1LAND1CountryLand1LandCodeStringNeinLändercode
KNA1ERDATCreationDateErdatErstelltAmDateTimeNeinErstellungsdatum
KNA1LAEDALastChangeDateLaedaGeändertAmDateTimeNeinLetzte Änderung
KNA1LOEVMDeletionFlagLoevmGelöschtStringNeinLöschflag
KNB1BUKRSCompanyCodeBukrsMandantCodeStringJaMandant
KNB1AKONTReconciliationAccountAkontAusgleichskontoStringNeinAbstimmungskonto
KNB1ZTERMPaymentTermsZtermZahlungsbedingungStringNeinZahlungsbedingung
KNB1KLIMKCreditLimitKlimkKreditlimitDecimalNeinKreditlimit
KNB1CTLPCRiskCategoryCtlpcRisikokategorieStringNeinRisikokategorie
KNB5KDGRPCustomerGroup-KundengruppeStringNeinKundengruppe

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


**