Skip to content

Latest commit

 

History

History
235 lines (191 loc) · 10.3 KB

currency-and-unit-customizing-in-odata-v4-4d1b9d4.md

File metadata and controls

235 lines (191 loc) · 10.3 KB

Currency and Unit Customizing in OData V4

For amounts or measures, you may sometimes need different currencies or units than defined in the CLDR. The data types sap.ui.model.odata.type.Currency and sap.ui.model.odata.type.Unit enable you to use code lists with customizing for currency codes and units.

For code lists with currency or unit customizing, you need to define the following annotations:

  • Currencies: com.sap.vocabularies.CodeList.v1.CurrencyCodes

  • Units: com.sap.vocabularies.CodeList.v1.UnitsOfMeasure

Code list annotations for currency codes and measures in "metadata.xml"

<EntityType Name="Product">
    ...
   <Property Name="WeightMeasure" Type="Edm.Decimal" Nullable="false" Precision="13" Scale="variable" />
   <Property Name="WeightUnit" Type="Edm.String" Nullable="false" MaxLength="3" />
   <Property Name="CurrencyCode" Type="Edm.String" Nullable="false" MaxLength="5" />
   <Property Name="Price" Type="Edm.Decimal" Nullable="false" Precision="15" Scale="variable" />
    ...
</EntityType>
...
<Annotations Target="SAP__self.Container">
   <Annotation Term="com.sap.vocabularies.CodeList.v1.CurrencyCodes">
      <Record>
         <PropertyValue Property="Url" String="../../../../default/iwbep/common/0001/$metadata" />
         <PropertyValue Property="CollectionPath" String="Currencies" />
      </Record>
   </Annotation>
</Annotations>
<Annotations Target="SAP__self.Container">
   <Annotation Term="com.sap.vocabularies.CodeList.v1.UnitsOfMeasure">
      <Record>
         <PropertyValue Property="Url" String="../../../../default/iwbep/common/0001/$metadata" />
         <PropertyValue Property="CollectionPath" String="UnitsOfMeasure" />
      </Record>
   </Annotation>
</Annotations>
 
...
<Annotations Target="SAP__self.Product/Price">
    ...
   <Annotation Term="Org.OData.Measures.V1.ISOCurrency" Path="CurrencyCode" />
    ...
</Annotations>
...
<Annotations Target="SAP__self.Product/WeightMeasure">
    ...
   <Annotation Term="Org.OData.Measures.V1.Unit" Path="WeightUnit" />
    ...
</Annotations>

Code lists that are referenced by the com.sap.vocabularies.CodeList.v1.CurrencyCodes or com.sap.vocabularies.CodeList.v1.UnitsOfMeasure annotations need the following:

  • The internal code as its only key property

  • A language-dependent description

  • A numeric property with the unit-specific number of significant fractional digits

  • Optional: An external code that should be visualized instead of the internal code

  • Optional: A standard code

The key property is annotated with:

  • com.sap.vocabularies.Common.v1.Text pointing to the description property

  • com.sap.vocabularies.Common.v1.UnitSpecificScale pointing to the numeric property

  • Optional: com.sap.vocabularies.CodeList.v1.StandardCode pointing to the standard code property

The entity type is optionally annotated with Org.OData.Core.V1.AlternateKeys pointing to another property that should be used for visualization.

If the alternate key is available, the type uses the alternate key as the key of the currency or unit. In this case, the data of the actual service have to contain the alternate key representation in the currency or unit property. The key is used and expected in the data if no alternate key is annotated. Note that there must be a maximum of one alternate key, and that key and alternate key must have exactly one property.

The property annotated as com.sap.vocabularies.CodeList.v1.StandardCode is interpreted as the ISO code by sap.ui.model.odata.type.Currency and used to find currency symbols. The currency symbols may be used for entering data.

Example for the metadata of a code list service

...
  <EntityType Name="Currency">
    <Key>
      <PropertyRef Name="CurrencyCode" />
    </Key>
    <Property Name="CurrencyCode" Type="Edm.String" MaxLength="5" />
    <Property Name="ISOCode" Type="Edm.String" MaxLength="3" />
    <Property Name="Text" Type="Edm.String" MaxLength="15" />
    <Property Name="DecimalPlaces" Type="Edm.SByte" />
  </EntityType>
  
  <EntityType Name="UnitOfMeasure">
    <Key>
      <PropertyRef Name="UnitCode" />
    </Key>
    <Property Name="UnitCode" Type="Edm.String" MaxLength="3" />
    <Property Name="ISOCode" Type="Edm.String" MaxLength="3" />
    <Property Name="ExternalCode" Type="Edm.String" MaxLength="3" />
    <Property Name="Text" Type="Edm.String" MaxLength="30" />
    <Property Name="DecimalPlaces" Type="Edm.Int16" />
  </EntityType>
  
  <Annotations Target="SAP__self.Currency/CurrencyCode">
    <Annotation Term="Common.Text" Path="Text" />
    <Annotation Term="Common.UnitSpecificScale" Path="DecimalPlaces" />
    <Annotation Term="CodeList.StandardCode" Path="ISOCode" />
  </Annotations>
  
  <Annotations Target="SAP__self.UnitOfMeasure">
    <Annotation Term="Core.AlternateKeys">
      <Collection>
        <Record>
          <PropertyValue Property="Key">
            <Collection>
              <Record>
                <PropertyValue Property="Name" PropertyPath="ExternalCode" />
                <PropertyValue Property="Alias" String="ExternalCode" />
              <Record>
            </Collection>
          </PropertyValue>
        <Record>
      </Collection>
    </Annotation>
  </Annotations>
  
  <Annotations Target="SAP__self.UnitOfMeasure/UnitCode">
    <Annotation Term="Common.Text" Path="Text" />
    <Annotation Term="Common.UnitSpecificScale" Path="DecimalPlaces" />
    <Annotation Term="CodeList.StandardCode" PropertyPath="ISOCode" />
    <Annotation Term="CodeList.ExternalCode" PropertyPath="ExternalCode" />
  </Annotations>
...

With the metadata above, you can use the data types sap.ui.model.odata.type.Currency and the sap.ui.model.odata.type.Unit in an input field as shown in the following example. The data types use a composite binding with the amount or measure as first part, the currency code or unit as second part, and the information about the code list customizing that has to be used as third part.

Example how to use currency and unit types in a freestyle SAPUI5 application

...
<Input value="{mode:'TwoWay', parts:['WeightMeasure', 'WeightUnit', {mode:'OneTime', path:'/##@@requestUnitsOfMeasure', targetType:'any'}], type:'sap.ui.model.odata.type.Unit'}"/>
...
<Input value="{mode:'TwoWay', parts:['Price', 'CurrencyCode', {mode:'OneTime', path:'/##@@requestCurrencyCodes', targetType:'any'}], type:'sap.ui.model.odata.type.Currency'}"/>
...

The code lists are automatically requested only once per browser session and code list URL.

If the Decimal type is used for the 'WeightMeasure' or 'Price' part, its format options may additionally influence the number of displayed and allowed decimals.For more information, see sap.ui.model.odata.type.Currency#formatValue and sap.ui.model.odata.type.Unit#formatValue.

If you use XML templating, you can use sap.ui.model.odata.v4.AnnotationHelper.format to generate the composite binding for an amount or measure property. To recognize a property as an amount or measure, the property needs to be annotated either with the Org.OData.Measures.V1.ISOCurrency, or with the Org.OData.Measures.V1.Unit annotation. For more informatio about XML templating, see XML Templating.

Additional annotations when using XML templating

<!-- used in view template -->
<Annotations Target="SAP__self.Product">
   <Annotation Term="com.sap.vocabularies.UI.v1.LineItem">
      <Collection>
         ...
         <Record Type="com.sap.vocabularies.UI.v1.DataField">
            <PropertyValue Property="Label" String="Weight" />
            <PropertyValue Property="Value" Path="WeightMeasure" />
         </Record>
         <Record Type="com.sap.vocabularies.UI.v1.DataField">
            <PropertyValue Property="Label" String="Price" />
            <PropertyValue Property="Value" Path="Price" />
         </Record>
         ...
      </Collection>
   </Annotation>
</Annotations>

The composite binding for the sap.ui.model.odata.type.Currency and sap.ui.model.odata.type.Unit data types is generated by the sap.ui.model.odata.v4.AnnotationHelper.format method. You can use it in the XML template view.

How to use AnnotationHelper.format with currencies or units

<template:alias name="format" value="sap.ui.model.odata.v4.AnnotationHelper.format">
<template:alias name="label" value="sap.ui.model.odata.v4.AnnotationHelper.label">
<VBox>
   <template:with path="meta>/ProductList/@com.sap.vocabularies.UI.v1.LineItem" var="lineItem">
      <Table items="{/ProductList}">
         <columns>
            <template:repeat list="{lineItem>}" var="field">
               <Column>
                  <Label text="{field>@@label}"/>
               </Column>
            </template:repeat>
         </columns>
         <ColumnListItem>
            <template:repeat list="{lineItem>}" var="field">
               <Input value="{field>Value/@@format}"/>
            </template:repeat>
         </ColumnListItem>
      </Table>
   </template:with>
</VBox>
</template:alias>
</template:alias>

Example: Templating output

<VBox>
    <Table items="{/ProductList}">
      <columns>
          ...
          <Column>
            <Label text="Weight"/>
          </Column>
          <Column>
            <Label text="Price"/>
          </Column>
          ...
      </columns>
      <ColumnListItem>
              ...
              <Input value="{mode:'TwoWay', parts:[{path:'WeightMeasure', type:'sap.ui.model.odata.type.Decimal', constraints:{'precision':13, 'scale':'variable', 'nullable':false}}, {path:'WeightUnit', type:'sap.ui.model.odata.type.String', constraints:{'maxLength':3, 'nullable':false}}, {mode:'OneTime', path:'/##@@requestUnitsOfMeasure', targetType:'any'}], type:'sap.ui.model.odata.type.Unit'}"/>
              <Input value="{mode:'TwoWay', parts:[{path:'Price', type:'sap.ui.model.odata.type.Decimal', constraints:{'precision':15, 'scale':'variable', 'nullable':false}}, {path:'CurrencyCode', type:'sap.ui.model.odata.type.String', constraints:{'maxLength':5, 'nullable':false}}, {mode:'OneTime', path:'/##@@requestCurrencyCodes', targetType:'any'}], type:'sap.ui.model.odata.type.Currency'}"/>
              ...
      </ColumnListItem>
    </Table>
</VBox>