Today, I would like to add an epilog to my “programming model” article series on the SAP HANA SPS9 update (start: A Programming Model for Business Applications (1): Assumptions, Building Blocks, and Example App). In my article, A Programming Model for Business Applications (2): Implementing the Entity Model with CDS I listed a couple of CDS restrictions that blocked me from writing down my data model in a compact format. Some of these limitations have been removed, in particular:
- It is now possible use CDS entities and views from other files.
- CDS supports “unmanaged associations” (= ability to define an association on existing elements using “on”)
- CDS supports “ad-hoc associations” in views
- CDS supports “anonymous structures” in entities
Let me now give some examples on how to use these features in the context of my example application.
1. Referencing CDS entities and views from other files
I think this is quite obvious. Here is an example:
namespace XYZ;
using XYZ::common as common; // SP9_NEW
using XYZ::address as address;
using XYZ::businesspartner as businesspartner;
@Schema:' XYZ '
context salesorder {
<…>
}
Note: The “using” statement works like an import, in my example for the named contexts.
2.“Unmanaged Associations”
Unmanaged associations are useful to define the relation between parent and child in a business object.
Example:
entity SalesOrder {
key ID_ :Integer64;
Item :association[0..*]to salesorder.Item on Item.Parent_ID_ = ID_;// SP9_NEW
<…>
};
entity Item {
key ID_ :Integer64;
Parent_ID_ :Integer64;
Parent :association[1]to SalesOrder on Parent.ID_ = Parent_ID_;// SP9_NEW
<…>
};
I also use them to define time-dependent associations, for example the time-dependent elements (for example name, etc.) of a business partner:
CurrentCommon :association[0..1]to businesspartner.Common on CurrentCommon.Parent_ID_= ID_
and CurrentCommon.ValidityPeriod.StartDate<now()and CurrentCommon.ValidityPeriod.EndDate>now();
3. “Ad-hoc Associations” in Views
With ad-hoc associations in views I can use calculated elements from other views, for example here:
First, I calculate the net amount of an item in a sales order as:
view "Item$C" asselectfrom Item {
ID_,
Parent_ID_,
<...>
(ListPriceAmount* Quantity)*(100- DiscountPercent)/100as "NetAmountValue",
<...>
};
Second, I calculate the total net amount of the sales order as:
view "SalesOrder$C" asselectfrom SalesOrder
mixin{ // SP9_NEW
_Item :associationto "Item$C" on _Item.Parent_ID_ = ID_;
}into
{
ID_,
<...>
sum(_Item.NetAmountValue) as "NetAmountValue",
<...>
}
groupby ID_, <...> ;
4. Anonymous Structures
This is a “nice to have” feature, it helps me to get rid of the “type” definitions for data structures that are only used once, for example here:
entity SalesOrder {
<…>
Status {
LifeCycleStatus :association[0..1]to salesorder.LifeCycleStatus;
InvoiceProcessingStatus :association[0..1]to salesorder.InvoiceProcessingStatus;
CreditWorthinessStatus :association[0..1]to common.CreditWorthinessStatus;
};
As a summary: I can now get rid of my hdbview-Files that I needed in SPS8 because of the CDS limitations. This makes the data model much more readable.
If you want to get an overview on new SPS 09 developer features, you can read the following article: SAP HANA SPS 09: New Developer Features