SAP API Management & HANA XS - Part III

Sandro Montemezzani - 11.03.2019

Übersicht

In diesem Teil der Blog-Reihe füllen wir die Datenbank mit Tabellen und binden diese an einen OData-Service.

Projekt Package

Zunächst einmal benötigen wir ein Package für unser Projekt im SAP Hana Editor. Damit wir dieses erstellen können, loggen wir uns als SYSTEM ein und verteilen unserem User folgende Rechte auf das Root-Packet: REPO.READ, REPO.EDIT_NATIVE_OBJECTS und REPO.ACTIVATE_NATIVE_OBJECTS.

Nun können wir uns wieder als COMPANYDATADEV einloggen und im Editor das Packet companydata erstellen.

HANA CDS

Zum automatischen Generieren der Tabellen nutzen wir das HANA CDS (Core Data Service) System.

Hierfür legen wir in unserem neu angelegten Projekt-Packet eine neue Datei TABLES.hdbdd an:

namespace companydata;
@Schema: 'COMPANYDATADEV'

context TABLES {
    type BusinessKey: Integer;

    entity Companies {
    key id: BusinessKey;
        key: String(20);
        long_name: String(50);
        short_name: String(50);
    } technical configuration {
        column store;
    };

    ...

}

Wir benötigen ebenfalls die Tabellen Entities, Addresses und HoursOfOperation. Beim Speichern der Datei werden die Tabellen automatisch in die Datenbank eingefügt.

Tabellen

Nun wollen wir diese Tabellen über einen OData Service erreichbar machen. Hierfür legen wir eine CompanyData.xsodata Datei an:

service namespace "companydata" {
  "COMPANYDATADEV"."companydata::TABLES.Companies" as "companies";
  "COMPANYDATADEV"."companydata::TABLES.Entities" as "entities";
  "COMPANYDATADEV"."companydata::TABLES.HoursOfOperation" as "hours";
}

Damit stellen wir die 3 Endpunkte /companies, /entities und /hours zur Verfügung. Um den OData-Service aktivieren zu können, müssen wir noch eine .xsapp-Datei erstellen:

{
  "exposed": true,
  "authentication": [
    {
      "method": "Basic"
    }
  ]
}

Der OData Service ist nun fertig aufgesetzt. Zum Testen kann man die Metadaten aufrufen mit:

$ curl -su COMPANYDATAUSER_READONLY:********* https://hanapXXXXXXXXXXtrial.hanatrial.ondemand.com/companydata/CompanyData.xsodata/$metadata |xmllint --format -
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<edmx:Edmx xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx" Version="1.0">
  <edmx:DataServices xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" m:DataServiceVersion="2.0">
    <Schema xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://schemas.microsoft.com/ado/2008/09/edm" Namespace="companydata">
      <EntityType Name="companiesType">
        <Key>
          <PropertyRef Name="id"/>
        </Key>
        <Property Name="id" Type="Edm.Int32" Nullable="false"/>
        <Property Name="key" Type="Edm.String" MaxLength="20"/>
        <Property Name="long_name" Type="Edm.String" MaxLength="50"/>
        <Property Name="short_name" Type="Edm.String" MaxLength="50"/>
      </EntityType>
      <EntityType Name="entitiesType">
        <Key>
          <PropertyRef Name="id"/>
        </Key>
        <Property Name="id" Type="Edm.Int32" Nullable="false"/>
        <Property Name="key" Type="Edm.String" MaxLength="20"/>
        <Property Name="long_name" Type="Edm.String" MaxLength="50"/>
        <Property Name="short_name" Type="Edm.String" MaxLength="50"/>
        <Property Name="company_id" Type="Edm.Int32"/>
        Property Name="address_id" Type="Edm.Int32"/>
      </EntityType>
      <EntityType Name="hoursType">
        <Key>
          <PropertyRef Name="id"/>
        </Key>
        <Property Name="id" Type="Edm.Int32" Nullable="false"/>
        <Property Name="day_of_week" Type="Edm.Int32"/>
        <Property Name="opens_at" Type="Edm.Time"/>
        <Property Name="closes_at" Type="Edm.Time"/>
        <Property Name="valid_from" Type="Edm.DateTime"/>
        <Property Name="valid_until" Type="Edm.DateTime"/>
        <Property Name="entity_id" Type="Edm.Int32"/>
      </EntityType>
      <EntityContainer Name="CompanyData" m:IsDefaultEntityContainer="true">
        <EntitySet Name="companies" EntityType="companydata.companiesType"/>
        <EntitySet Name="entities" EntityType="companydata.entitiesType"/>
        <EntitySet Name="hours" EntityType="companydata.hoursType"/>
      </EntityContainer>
    </Schema>
  </edmx:DataServices>
</edmx:Edmx>

Schlusswort

Im folgenden Part werden wir den Zugriff auf den OData Service per API Management vereinfachen.

Zurück zur Übersicht