Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 5 Next »

Introduction

This plugin would allow SAP ECC enterprise users to specify one of the Inventory Management data sources as source in Cloud Data Fusion. Typical pipeline scenario would include specifying one of the data sources as source (under Sources plugins) and BigQuery as sink. For the sake of simplicity, this document will cover one data source (Material Movements from Inventory Management - 2LIS_03_BF).

User Experience and Configuration

  • SAP ECC Setup
    1. SAP ECC users log into SAP Gateway Service Builder (segw) to create and expose the data source as SAP OData service. SAP has published following articles around this step:

      1. OData service introduction 

      2. Step-by-step guide to build OData service

    2. User creates OData service for the data source (2LIS_03_BF). Output is RESTful OData service that can be accessed by Cloud Data Fusion.

    3. User can also use SAP Netweaver Gateway client to test the service (with HTTP request and response)

  • Cloud Data Fusion - Source configuration
    1. User would log into their CDF instance and click on “Hub”.

    2. Under “Plugins” section, user should be able to find “SAP ECC Source”.

    3. This integration would provide a single JAR files for SAP ECC data sources. User would upload the JAR file and this would deploy the plugin using the JAR file.

    4. Once uploaded, the user is prompted to provide following configuration information. Please note that all the fields below should be macro enabled.


Label

Label Description

User Widget

Name

Name of the source

Textbox

Description

Description of the service and the data source it is going to connect to (e.g. 2LIS_03_BF)

Textbox

OData service URL

OData service URL exposed via SAP ECC

Textbox

User name

Login user name for authenticating API call

Textbox

Password

Password for authenticating API call

Textbox

    1. The same dialog will have “Test connection” button to allow users to validate a validation API call. If failed, the error message will be presented to the user in red next to “Test connection” button.

    2. Once connection has been established successfully to this OData service, it can be used as a source for creating data pipelines using Cloud Data Fusion.

  • Cloud Data Fusion - Sink setup (e.g. BigQuery for this specific example)
    1. User would create a BigQuery table inside a dataset where the data extracted through OData service API will be ingested.

    2. User needs to ensure that the table schema includes data types that have been mapped as part of this integration (see below for integration considerations section for more details)

Integration considerations

  • Data type mismatch - OData output has data types (section 6) different than the data types available in BigQuery. Some sort of data type conversion needs to happen before the extracted data can be ingested into BigQuery. Below is the suggested mapping of OData data types to CDAP schema data types:

OData data type

CDAP schema data type

Edm.Binary

Schema.Type.String

Edm.Boolean

Schema.Type.Bool

Edm.Byte

Schema.Type.String

Edm.DateTime

Schema.Type.DateTime

Edm.Decimal

Schema.Type.Float

Edm.Double

Schema.Type.Double

Edm.Single

Schema.Type.Float

Edm.Guid

Schema.Type.String

Edm.Int16

Schema.Type.Int

Edm.Int32

Schema.Type.Int

Edm.Int64

Schema.Type.Long

Edm.SByte

Schema.Type.Bytes

Edm.String

Schema.Type.String

Edm.Time

Schema.Type.Time

Edm.DateTimeOffset

Schema.Type.Timestamp

  • Field Level Lineage (FLL): Field level lineage should be available for all the sources and sinks.

OData Service API

Metadata

GET: http://vhcalnplci.dummy.nodomain:8000/sap/opu/odata/SAP/ZGW100_XX_S3_SRV/$metadata

Response:

Sample metadata response
<?xml version="1.0" encoding="UTF-8"?>
<edmx:Edmx xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:sap="http://www.sap.com/Protocols/SAPData" Version="1.0">
  <edmx:DataServices m:DataServiceVersion="2.0">
    <Schema xmlns="http://schemas.microsoft.com/ado/2008/09/edm" Namespace="ZGW100_XX_S2_SRV" xml:lang="en" sap:schema-version="1">
      <EntityType Name="SalesOrder" sap:content-version="1">
        <Key>
          <PropertyRef Name="SoId" />
        </Key>
        <Property Name="SoId" Type="Edm.String" Nullable="false" MaxLength="10" sap:label="Sales Order ID" sap:creatable="false" sap:updatable="false" sap:sortable="false" sap:filterable="false" />
        <Property Name="Note" Type="Edm.String" Nullable="false" MaxLength="255" sap:label="Description" sap:creatable="false" sap:updatable="false" sap:sortable="false" sap:filterable="false" />
        <Property Name="BuyerId" Type="Edm.String" Nullable="false" MaxLength="10" sap:label="Business Partner ID" sap:creatable="false" sap:updatable="false" sap:sortable="false" sap:filterable="false" />
        <Property Name="BuyerName" Type="Edm.String" Nullable="false" MaxLength="80" sap:label="Company" sap:creatable="false" sap:updatable="false" sap:sortable="false" sap:filterable="false" />
        <Property Name="CurrencyCode" Type="Edm.String" Nullable="false" MaxLength="5" sap:label="Currency Code" sap:creatable="false" sap:updatable="false" sap:sortable="false" sap:filterable="false" sap:semantics="currency-code" />
        <Property Name="GrossAmount" Type="Edm.Decimal" Nullable="false" Precision="16" Scale="3" sap:label="Gross Amount" sap:creatable="false" sap:updatable="false" sap:sortable="false" sap:filterable="false" />
        <Property Name="NetAmount" Type="Edm.Decimal" Nullable="false" Precision="16" Scale="3" sap:label="Net Amount" sap:creatable="false" sap:updatable="false" sap:sortable="false" sap:filterable="false" />
        <Property Name="TaxAmount" Type="Edm.Decimal" Nullable="false" Precision="16" Scale="3" sap:label="Tax Amount" sap:creatable="false" sap:updatable="false" sap:sortable="false" sap:filterable="false" />
        <NavigationProperty Name="SalesOrderItems" Relationship="ZGW100_XX_S2_SRV.SalesOrderSalesOrderItems" FromRole="FromRole_SalesOrderSalesOrderItems" ToRole="ToRole_SalesOrderSalesOrderItems" />
      </EntityType>
      <EntityType Name="SalesOrderItem" sap:content-version="1">
        <Key>
          <PropertyRef Name="SoId" />
          <PropertyRef Name="SoItemPos" />
        </Key>
        <Property Name="SoId" Type="Edm.String" Nullable="false" MaxLength="10" sap:label="Sales Order ID" sap:creatable="false" sap:updatable="false" sap:sortable="false" sap:filterable="false" />
        <Property Name="SoItemPos" Type="Edm.String" Nullable="false" MaxLength="10" sap:label="Item Position" sap:creatable="false" sap:updatable="false" sap:sortable="false" sap:filterable="false" />
        <Property Name="ProductId" Type="Edm.String" Nullable="false" MaxLength="10" sap:label="Product ID" sap:creatable="false" sap:updatable="false" sap:sortable="false" sap:filterable="false" />
        <Property Name="Note" Type="Edm.String" Nullable="false" MaxLength="255" sap:label="Description" sap:creatable="false" sap:updatable="false" sap:sortable="false" sap:filterable="false" />
        <Property Name="CurrencyCode" Type="Edm.String" Nullable="false" MaxLength="5" sap:label="Currency Code" sap:creatable="false" sap:updatable="false" sap:sortable="false" sap:filterable="false" sap:semantics="currency-code" />
        <Property Name="GrossAmount" Type="Edm.Decimal" Nullable="false" Precision="16" Scale="3" sap:label="Gross Amount" sap:creatable="false" sap:updatable="false" sap:sortable="false" sap:filterable="false" />
        <Property Name="NetAmount" Type="Edm.Decimal" Nullable="false" Precision="16" Scale="3" sap:label="Net Amount" sap:creatable="false" sap:updatable="false" sap:sortable="false" sap:filterable="false" />
        <Property Name="TaxAmount" Type="Edm.Decimal" Nullable="false" Precision="16" Scale="3" sap:label="Tax Amount" sap:creatable="false" sap:updatable="false" sap:sortable="false" sap:filterable="false" />
        <Property Name="Quantity" Type="Edm.Decimal" Nullable="false" Precision="13" Scale="3" sap:label="Quantity" sap:creatable="false" sap:updatable="false" sap:sortable="false" sap:filterable="false" />
        <Property Name="QuantityUnit" Type="Edm.String" Nullable="false" MaxLength="3" sap:label="Unit of Measure" sap:creatable="false" sap:updatable="false" sap:sortable="false" sap:filterable="false" sap:semantics="unit-of-measure" />
      </EntityType>
      <Association Name="SalesOrderSalesOrderItems" sap:content-version="1">
        <End Type="ZGW100_XX_S2_SRV.SalesOrder" Multiplicity="1" Role="FromRole_SalesOrderSalesOrderItems" />
        <End Type="ZGW100_XX_S2_SRV.SalesOrderItem" Multiplicity="*" Role="ToRole_SalesOrderSalesOrderItems" />
        <ReferentialConstraint>
          <Principal Role="FromRole_SalesOrderSalesOrderItems">
            <PropertyRef Name="SoId" />
          </Principal>
          <Dependent Role="ToRole_SalesOrderSalesOrderItems">
            <PropertyRef Name="SoId" />
          </Dependent>
        </ReferentialConstraint>
      </Association>
      <EntityContainer Name="ZGW100_XX_S2_SRV_Entities" m:IsDefaultEntityContainer="true" sap:supported-formats="atom json xlsx">
        <EntitySet Name="SalesOrderSet" EntityType="ZGW100_XX_S2_SRV.SalesOrder" sap:creatable="false" sap:updatable="false" sap:deletable="false" sap:pageable="false" sap:addressable="false" sap:content-version="1" />
        <EntitySet Name="SalesOrderCollection" EntityType="ZGW100_XX_S2_SRV.SalesOrder" sap:creatable="false" sap:updatable="false" sap:deletable="false" sap:pageable="false" sap:addressable="false" sap:content-version="1" />
        <EntitySet Name="SalesOrderItemSet" EntityType="ZGW100_XX_S2_SRV.SalesOrderItem" sap:creatable="false" sap:updatable="false" sap:deletable="false" sap:pageable="false" sap:addressable="false" sap:content-version="1" />
        <EntitySet Name="SalesOrderItemCollection" EntityType="ZGW100_XX_S2_SRV.SalesOrderItem" sap:creatable="false" sap:updatable="false" sap:deletable="false" sap:pageable="false" sap:addressable="false" sap:content-version="1" />
        <AssociationSet Name="SalesOrderSalesOrderItems_AssocSet" Association="ZGW100_XX_S2_SRV.SalesOrderSalesOrderItems" sap:creatable="false" sap:updatable="false" sap:deletable="false" sap:content-version="1">
          <End EntitySet="SalesOrderSet" Role="FromRole_SalesOrderSalesOrderItems" />
          <End EntitySet="SalesOrderItemSet" Role="ToRole_SalesOrderSalesOrderItems" />
        </AssociationSet>
      </EntityContainer>
      <atom:link xmlns:atom="http://www.w3.org/2005/Atom" rel="self" href="http://vhcalnplci.dummy.nodomain:8000/sap/opu/odata/SAP/ZGW100_XX_S2_SRV/$metadata" />
      <atom:link xmlns:atom="http://www.w3.org/2005/Atom" rel="latest-version" href="http://vhcalnplci.dummy.nodomain:8000/sap/opu/odata/SAP/ZGW100_XX_S2_SRV/$metadata" />
    </Schema>
  </edmx:DataServices>
</edmx:Edmx>

Requesting EntitySet

GET: http://vhcalnplci.dummy.nodomain:8000/sap/opu/odata/SAP/ZGW100_XX_S3_SRV/SalesOrderSet

Response:
Sample 'GetEntitySet' response
<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xml:base="http://vhcalnplci.dummy.nodomain:8000/sap/opu/odata/SAP/ZGW100_XX_S3_SRV/">
  <id>http://vhcalnplci.dummy.nodomain:8000/sap/opu/odata/SAP/ZGW100_XX_S3_SRV/SalesOrderSet</id>
  <title type="text">SalesOrderSet</title>
  <updated>2019-08-21T10:29:14Z</updated>
  <author>
    <name />
  </author>
  <link href="SalesOrderSet" rel="self" title="SalesOrderSet" />
  <entry>
    <id>http://vhcalnplci.dummy.nodomain:8000/sap/opu/odata/SAP/ZGW100_XX_S3_SRV/SalesOrderSet('500000000')</id>
    <title type="text">SalesOrderSet('500000000')</title>
    <updated>2019-08-21T10:29:14Z</updated>
    <category term="ZGW100_XX_S3_SRV.SalesOrder" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
    <link href="SalesOrderSet('500000000')" rel="edit" title="SalesOrder" />
    <content type="application/xml">
      <m:properties>
        <d:SoId>500000000</d:SoId>
        <d:BuyerId>100000000</d:BuyerId>
        <d:BuyerName>SAP</d:BuyerName>
      </m:properties>
    </content>
  </entry>
  <entry>
    <id>http://vhcalnplci.dummy.nodomain:8000/sap/opu/odata/SAP/ZGW100_XX_S3_SRV/SalesOrderSet('500000001')</id>
    <title type="text">SalesOrderSet('500000001')</title>
    <updated>2019-08-21T10:29:14Z</updated>
    <category term="ZGW100_XX_S3_SRV.SalesOrder" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
    <link href="SalesOrderSet('500000001')" rel="edit" title="SalesOrder" />
    <content type="application/xml">
      <m:properties>
        <d:SoId>500000001</d:SoId>
        <d:BuyerId>100000002</d:BuyerId>
        <d:BuyerName>DelBont Industries</d:BuyerName>
      </m:properties>
    </content>
  </entry>
  <entry>
    <id>http://vhcalnplci.dummy.nodomain:8000/sap/opu/odata/SAP/ZGW100_XX_S3_SRV/SalesOrderSet('500000002')</id>
    <title type="text">SalesOrderSet('500000002')</title>
    <updated>2019-08-21T10:29:14Z</updated>
    <category term="ZGW100_XX_S3_SRV.SalesOrder" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
    <link href="SalesOrderSet('500000002')" rel="edit" title="SalesOrder" />
    <content type="application/xml">
      <m:properties>
        <d:SoId>500000002</d:SoId>
        <d:BuyerId>100000005</d:BuyerId>
        <d:BuyerName>TECUM</d:BuyerName>
      </m:properties>
    </content>
  </entry>
  ...

Querying Data

GET: http://vhcalnplci.dummy.nodomain:8000/sap/opu/odata/SAP/ZGW100_XX_S2_SRV/SalesOrderCollection?$top=1&$select=BuyerName

Response:
Sample querying data response
<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xml:base="http://vhcalnplci.dummy.nodomain:8000/sap/opu/odata/SAP/ZGW100_XX_S2_SRV/">
  <id>http://vhcalnplci.dummy.nodomain:8000/sap/opu/odata/SAP/ZGW100_XX_S2_SRV/SalesOrderCollection</id>
  <title type="text">SalesOrderCollection</title>
  <updated>2019-08-21T10:46:14Z</updated>
  <author>
    <name />
  </author>
  <link href="SalesOrderCollection" rel="self" title="SalesOrderCollection" />
  <entry>
    <id>http://vhcalnplci.dummy.nodomain:8000/sap/opu/odata/SAP/ZGW100_XX_S2_SRV/SalesOrderCollection('500000000')</id>
    <title type="text">SalesOrderCollection('500000000')</title>
    <updated>2019-08-21T10:46:14Z</updated>
    <category term="ZGW100_XX_S2_SRV.SalesOrder" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
    <link href="SalesOrderCollection('500000000')" rel="self" title="SalesOrder" />
    <content type="application/xml">
      <m:properties>
        <d:BuyerName>SAP</d:BuyerName>
      </m:properties>
    </content>
  </entry>
</feed>


For more examples, please, refer: https://www.odata.org/odata-services/

SAP ECC Source Plugin


Source Properties

Section

User Facing Name

Widget Type

Description

Constraints

GeneralLabeltextboxLabel for UI.
Reference NametextboxUniquely identified name for lineage.
OData Service URL
textbox

URL of the SAP ECC OData service. The URL must end with an external service name

(e.g., http://eccsvrname:8000/sap/opu/odata/sap/zgw100_dd02l_so_srv/).

Required

Resource Pathtextbox

Path of the SAP ECC OData entity.

For example:

  • "SalesOrderCollection"
  • "Category(1)/Products"

Required


Query
textbox

OData query options to filter the data.

For example: "$select=Name,Description&$top=10".


The plugin copies data from the combined URL:
<OData Service URL>/<Entity Set>?<Query>

For more information, see OData URL components.


CredentialsUsername
textboxUsername for basic authentication.
PasswordpasswordPassword for basic authentication.

Output SchemaschemaSpecifies the schema of the entries.


References

Plugin Type

  • Batch Source
  • Batch Sink 
  • Real-time Source
  • Real-time Sink
  • Action
  • Post-Run Action
  • Aggregate
  • Join
  • Spark Model
  • Spark Compute


  • No labels