Previous Page Arrow Next Page Arrow

4.1 Typical SData Schema

The service consumer can get the contract schema with the following HTTP request:

GET /sdata/myApp/myContract/-/$schema

This query returns an XSD schema:

<?xml version="1.0"?>
<xs:schema xmlns:tns="http://schemas.sage.com/myContract" 
           targetNamespace="http://schemas.sage.com/myContract" 
           xmlns:sme="http://schemas.sage.com/sdata/sme/2007" 
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           elementFormDefault="qualified" 
           version="1.0.7">

  <!-- Resource Kind Definition -->
  <xs:element name="product" type="tns:product--type" 
    sme:role="resourceKind" sme:pluralName="products" sme:label="Product"
    sme:canGet="true" sme:canPost="true" sme:canPut="true" sme:canDelete="true"
    sme:canPageNext="true" sme:canPagePrevious="true" sme:canPageIndex="true" 
    sme:hasUuid="true" sme:supportsETag="true" sme:batchingMode="syncOrAsync" />
  <xs:complexType name="product--type">
    <xs:all>
      <xs:element name="productNumber" type="xs:string" minOccurs="0"
                  sme:label="#" sme:canSort="true" sme:canFilter="true" sme:precedence="1" 
                  sme:isUniqueKey="true" />
      <xs:element name="name" type="xs:string" minOccurs="0" 
                  sme:label="Name" sme:canSort="true" sme:canFilter="true" sme:precedence="1"/>
    </xs:all>
  </xs:complexType>
  <xs:complexType name="product--list">
     <xs:sequence>
       <xs:element minOccurs="0" maxOccurs="unbounded" name="product" type="tns:product--type" />
    </xs:sequence>
  </xs:complexType>

  <!-- Resource Kind Definition -->
  <xs:element name="salesOrder" type="tns:salesOrder--type" 
    sme:role="resourceKind" sme:pluralName="salesOrders" sme:label="Sales Order"

    sme:canGet="true" sme:canPost="true" sme:canPut="true" sme:canDelete="true"
    sme:canPageNext="true" sme:canPagePrevious="true" sme:canPageIndex="true" 
    sme:hasUuid="true" sme:supportsETag="true" sme:batchingMode="syncOrAsync" />
  <xs:complexType name="salesOrder--type">
    <xs:all>
      <xs:element name="orderNumber" type="xs:string" minOccurs="0"
                  sme:label="#" sme:canSort="true" sme:canFilter="true" sme:precedence="1" 
                  sme:isUnique="true" sme:isReadOnly="true"/>
      <xs:element name="orderDate" type="xs:date" minOccurs="0"
                  sme:label="Date" sme:canSort="true" sme:canFilter="true" sme:precedence="2" />
      <xs:element name="shipDate" type="xs:date" minOccurs="0" nillable="true"
                  sme:label="Shipping Date" sme:canSort="true" sme:canFilter="true" sme:precedence="3" />
      <xs:element name="subTotal" type="xs:decimal" minOccurs="0"
                  sme:label="Sub-total" sme:canSort="true" sme:canFilter="true" sme:precedence="2" 
                  sme:isReadOnly="true" />
      <xs:element name="billAddress" type="tns:address--type" minOccurs="0"
                  sme:relationship="child" sme:isCollection="false" sme:label="Billing Address" 
                  sme:canGet="true" sme:canPut="true" />
      <xs:element name="shipAddress" type="tns:address--type" minOccurs="0"
                  sme:relationship="child" sme:isCollection="false" sme:label="Shipping Address" 
                  sme:canGet="true" sme:canPut="true" />
      <xs:element name="orderLines" type="tns:salesOrderLine--list" minOccurs="0"
                  sme:relationship="child" sme:isCollection="true" sme:label="Order Lines" 
                  sme:canGet="true" sme:canPost="true" />
      <xs:element name="contact" type="tns:contact--type" minOccurs="0"
                  sme:relationship="reference" sme:label="Contact" 
                  sme:canGet="true" />
    </xs:all>
  </xs:complexType>
  <xs:complexType name="salesOrder--list">
     <xs:sequence>
       <xs:element minOccurs="0" maxOccurs="unbounded" name="salesOrder" type="tns:salesOrder--type" />
    </xs:sequence>
  </xs:complexType>

  <!-- Resource Kind Definition -->
  <xs:element name="salesOrderLine" type="tns:salesOrderLine--type" 
    sme:role="resourceKind" sme:pluralName="salesOrderLines" sme:label="Sales Order Line"

    sme:canGet="true" sme:canPost="true" sme:canPut="true" sme:canDelete="true"
    sme:canPageNext="true" sme:canPagePrevious="true" sme:canPageIndex="true" 
    sme:hasUuid="true" sme:supportsETag="true" sme:batchingMode="syncOrAsync" />
  <xs:complexType name="salesOrderLine--type">
    <xs:all>
      <xs:element name="orderQty" type="xs:decimal" minOccurs="0"
                  sme:label="Qty" />
      <xs:element name="unitPrice" type="xs:decimal" minOccurs="0"
                  sme:label="Unit Price" />
      <xs:element name="order" type="tns:salesOrder--type" minOccurs="0"
                  sme:relationship="parent" sme:label="Order" />
      <xs:element name="product" type="tns:product--type" minOccurs="0"
                  sme:relationship="reference" sme:label="Product" />
    </xs:all>
  </xs:complexType>
  <xs:complexType name="salesOrderLine--list">
     <xs:sequence>
       <xs:element minOccurs="0" maxOccurs="unbounded" name="salesOrderLine" type="tns:salesOrderLine--type" />
    </xs:sequence>
  </xs:complexType>

  <!-- Resource Kind Definition -->
  <xs:element name="contact" type="tns:contact--type"
    sme:role="resourceKind" sme:pluralName="contacts" sme:label="Contact"

    sme:canGet="true" sme:canPost="true" sme:canPut="true" sme:canDelete="true"
    sme:canPageNext="true" sme:canPagePrevious="true" sme:canPageIndex="true" 
    sme:hasUuid="true" sme:supportsETag="true" sme:batchingMode="syncOrAsync" />
  <xs:complexType name="contact--type">
    <xs:all>
      <xs:element name="civility" type="tns:civility--type" minOccurs="0"
                  sme:label="Civility" />
      <xs:element name="firstName" type="xs:string" minOccurs="0"
                  sme:label="First Name" sme:canSort="true" sme:canFilter="true" sme:precedence="1" /> 
      <xs:element name="lastName" type="xs:string" minOccurs="0"
                  sme:label="Last Name" sme:canSort="true" sme:canFilter="true" sme:precedence="1" /> 
      <xs:element name="address" type="tns:address--type" minOccurs="0"
                  sme:relationship="child" sme:isCollection="false" sme:label="Address" /> 
    </xs:all>
  </xs:complexType>
  <xs:complexType name="contact--list">
     <xs:sequence>
       <xs:element minOccurs="0" maxOccurs="unbounded" name="contact" type="tns:contact--type" />
    </xs:sequence>
  </xs:complexType>

  
  <!-- Resource Kind Definition -->
  <xs:element name="address" type="tns:address--type"
    sme:role="resourceKind" sme:pluralName="addresses" sme:label="Address"

    sme:canGet="true" sme:canPost="true" sme:canPut="true" sme:canDelete="true"
    sme:canPageNext="true" sme:canPagePrevious="true" sme:canPageIndex="true" 
    sme:hasUuid="true" sme:supportsETag="true" sme:batchingMode="syncOrAsync" />
  <xs:complexType name="address--type">
    <xs:all>
      <xs:element name="street" type="xs:string" minOccurs="0"
                  sme:label="Street" /> 
      <xs:element name="city" type="xs:string" minOccurs="0"
                  sme:label="City" />
      <xs:element name="postalCode" type="xs:string" minOccurs="0"
                  sme:label="Postal Code" />
      <xs:element name="countryCode" type="xs:string" minOccurs="0"
                  sme:label="Country Code" />
    </xs:all>
  </xs:complexType>
  <xs:complexType name="address--list">
     <xs:sequence>
       <xs:element minOccurs="0" maxOccurs="unbounded" name="address" type="tns:address--type" />
    </xs:sequence>
  </xs:complexType>

  <!-- Auxiliary Type Definition -->
  <xs:simpleType name="civility--type">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Mr"/>
      <xs:enumeration value="Mrs"/>
      <xs:enumeration value="Ms"/>
    </xs:restriction>
  </xs:simpleType>

  <!-- Service Operation Definition -->
  <xs:element name="productComputeSimplePrice" 
              type="tns:productComputeSimplePrice--type"
              sme:role="serviceOperation"
              sme:path="products/$service/computeSimplePrice"
              sme:invocationMode="sync" />
  <xs:complexType name="productComputeSimplePrice--type">
    <xs:all>
      <xs:element name="request" type="tns:simplePriceRequest--type" minOccurs="0" />
      <xs:element name="response" type="tns:simplePriceResponse--type" minOccurs="0" />
    </xs:all>
  </xs:complexType>
 
  <xs:complexType name="simplePriceRequest--type">
    <xs:all>
      <xs:element name="product" type="tns:product--type" minOccurs="0"
                  sme:relationship="reference" sme:label="Product" />
      <xs:element name="contact" type="tns:contact--type" minOccurs="0"
                  sme:relationship="reference" sme:label="Contact" />
      <xs:element name="quantity" type="xs:decimal" sme:label="Quantity" />
    </xs:all>
  </xs:complexType>
 
  <xs:complexType name="simplePriceResponse--type">
    <xs:all>
      <xs:element name="unitPrice" type="xs:decimal" sme:label="Unit Price" />
      <xs:element name="quantityPrice" type="xs:decimal" sme:label="Quantity Price" />
      <xs:element name="discount" type="xs:decimal" sme:label="Discount" />
      <xs:element name="tax" type="xs:decimal" sme:label="Tax" />
    </xs:all>
  </xs:complexType>

</xs:schema>

This schema defines XML structures for the different components of an SData contract.


Previous Page Arrow Next Page Arrow