You may clone an existing project from GitHub repository to start with this tutorial.
To enhance your MDK app with customer order information, you need to carry out the following tasks:
- Create a new order list page
- Create a new order details page
- Create a new navigation action to the new order details page
- Write a JavaScript logic to calculate total number of orders for a customer
- Display top 5 orders in customer detail page
- Add a header control to the orders grid of the customer detail page to display a text label
- Add a footer control to the orders grid of customer detail page to show total order count

Step 1: Create a new order list page
This page will display customer orders list, you will add an Object Table control that is used to display information (like Sales order ID, order creation date, gross amount and life cycle status name) about an object.
You can find more details about available controls in section page.
-
In SAP Business Application Studio project, right-click the Pages | MDK: New Page | select Section Page | Next.
You can find more details about section pages.
-
Enter the Page Name Customers_Orders
and click Next and then Finish on the confirmation step.
-
In the Properties pane, set the caption to Customer Orders.
-
Next, add an Object Table compound to display information like sales order ID, order creation date, gross amount and life cycle status name.
In the Layout Editor, expand the Controls | Compound section, drag and drop the Object Table control onto the page area.
A Compound control contains a group of other controls. Unlike in a container control where you can add your own child controls (container items), the child controls in a compound control are fixed. You can populate each of its child control by defining its data binding, depending on which the child controls are created.
-
In the Properties pane, select the previously added service from the Service drop down and then select SalesOrderHeaders
entity set from the dropdown. This way, the Object Table has been bound to SalesOrderHeaders
entity.
Provide below Properties:
Property |
Value |
Service |
Select Sample.service from the dropdown |
Entity |
Select SalesOrderHeaders from the dropdown |
QueryOptions |
$filter=CustomerId eq '{CustomerId}'&$top=5&$orderby=CreatedAt desc |
For a given customer id, query expression will filter top 5 order entries returned in descending when sorted by the order creation date property.
-
Now, start binding Object Table properties with SalesOrderHeaders
entity set properties.
Provide the below information:
Property |
Value |
Description |
$(D,{CreatedAt},'','',{format:'medium'}) |
DetailImage |
Remove the default value and leave it blank |
Footnote |
Remove the default value and leave it blank |
PreserveIconStackSpacing |
false |
ProgressIndicator |
Remove the default value and leave it blank |
Status |
$(C,{GrossAmount},{CurrencyCode},'',{maximumFractionDigits:2,useGrouping:true}) |
Subhead |
bind to {CustomerId} |
Substatus |
bind to {LifeCycleStatusName} |
Title |
bind to {SalesOrderId} |
$(D,{CreatedAt},'','',{format:'medium'})
is an expression of how to format a date, end result would be like June 20, 2020. By default it will be formatted to the device’s locale setting. More details on Date Formatter is available in documentation.
$(C,{GrossAmount},{CurrencyCode},'',{maximumFractionDigits:2,useGrouping:true})
is an expression of how to format currency value, end result would be like €200.44. By default it will be formatted to the device’s locale setting. More details on Currency Formatter is available in documentation.
-
In the Search section of the Properties pane, change both the Search Enabled property and Barcode Scanner property to true
.
-
In the Behavior section of the Properties pane, select DisclosureIndicator
to AccessoryType
property.
-
In the EmptySection
of the Properties pane, provide No Orders Found
for the caption property.
Step 2: Create a new order details page
This page will show related details for an order. In this page, you will add an Object Header control that is used to display information (like first name, last name, date of birth, email address & phone number) about the header of an object and Static Key Value control to display key value pair items like address, city, postal code & country.
-
In SAP Business Application Studio project, right-click the Pages | MDK: New Page | select Section Page | Next.
-
Enter the Page Name SalesOrders_Details
and click Next and the Finish on the confirmation step.
-
In the Properties pane set the Caption to Order Details.
-
Next, you will add a Static Key Value container and its container item Key Value Item to display information like sales order id, life cycle status & date of order creation name.
Static Key Value is a container that can display one or more key value pair items on a section page. In this container, you can include a Key Value Item, a simple key value cell that displays a label and a text pair. You can find more details here about this container.
In the Layout Editor, expand the Controls | Container section, drag and drop the Static Key Value control onto the page area.
-
Now, add key value item to this container. In the Layout Editor, expand the Controls | Container Item section, drag and drop the Key Value Item control onto the page area.
Provide the below information:
Property |
Value |
KeyName |
Order Number |
Value |
bind to {SalesOrderId} |
Make sure to select values for the mentioned properties only from SalesOrderHeader
entity. You may find similar values from other entities.
-
Repeat the above step by adding 5 more Key Value Item on the page.
Provide the below information:
Property |
Value |
KeyName |
Status |
Value |
bind to {LifeCycleStatusName} |
Property |
Value |
KeyName |
Created At |
Value |
$(D,{CreatedAt},'','',{format:'medium'}) |
Property |
Value |
KeyName |
Net Amount |
Value |
$(C,{NetAmount},{CurrencyCode},'',{maximumFractionDigits:2,useGrouping:true}) |
Property |
Value |
KeyName |
Tax Amount |
Value |
$(C,{TaxAmount},{CurrencyCode},'',{maximumFractionDigits:2,useGrouping:true}) |
Property |
Value |
KeyName |
Total Amount |
Value |
$(C,{GrossAmount},{CurrencyCode},'',{maximumFractionDigits:2,useGrouping:true}) |
You should have final binding for all key value items as below:
Step 3: Create navigation actions
-
Now, you will create two Navigation actions that opens the Order List and Order Details page when called.
Right-click the Actions folder | MDK: New Action | choose MDK UI Actions in Category | click Navigation Action | Next.
Provide the below information:
Field |
Value |
Action Name |
NavToCustomers_Orders |
PageToOpen |
Select Customers_Orders.page from the dropdown |
Click Next and then Finish on the confirmation step.
-
Repeat the above step and create a new navigation action.
Provide the below information:
Field |
Value |
Action Name |
NavToSalesOrders_Details |
PageToOpen |
Select SalesOrders_Details.page from the dropdown |
Click Next and then Finish on the confirmation step.
Step 4: Set the OnPress of the customer Orders
Go back to the Customers_Orders.page
and set the OnPress
event of the Object Table. You will link the Object Table to the NavToSalesOrders_Details.action
so that when an end-user selects a order, the SalesOrders_Detail.page
will open. MDK automatically passes the selected order to the details page.
In Customers_Orders.page
, select the Object Table, click the link icon under the Events tab for the OnPress
property to open the Object Browser.
Double-click the NavToSalesOrders_Details.action
and click OK to set it as the OnPress
Action.
Step 5: Write JavaScript logic to calculate total number of orders
You will show a total count of orders for a customer in Customers_Detail.page
. You will write a JavaScript logic for this calculation.
-
Right-click the Rules folder | MDK: New Rule File | select Empty JS Rule.
-
Enter the Rule name Customers_OrderCount
, press Enter
.
-
Copy and paste the following code.
export default function CustomerOrderCount(context) {
//The following currentCustomer will retrieve the current customer record
const currentCustomer = context.getPageProxy().binding.CustomerId;
//The following expression will retrieve the total count of the orders for a given customer
return context.count('/DemoSampleApp/Services/Sample.service', 'SalesOrderHeaders', `$filter=CustomerId eq '${currentCustomer}'`).then((count) => {
return count;
});
}
-
Save the changes to the Customers_OrderCount.js
file.
Step 6: Display top 5 orders in customer detail page
-
You will add an Object Table compound to display top 5 orders information in the Customers_Detail.page
.
In the Layout Editor, expand the Controls | Compound section, drag and drop the Object Table control onto the page area.
-
In the Properties pane, select the previously added service from the Service drop down.
Provide below Properties:
Property |
Value |
Service |
Select Sample.service from the dropdown |
Entity |
Select {{#Property:@odata.readLink}}/SalesOrders from the dropdown |
QueryOptions |
$top=5&$orderby=CreatedAt desc |
The odata.readLink
annotation contains the read URL of the entity or collection.
SalesOrders
is a navigation property in Customer entity to SalesOrderHeader
entity. You can find this information in OData service metadata document.
Query expression will filter order entries returned in descending when sorted by the order creation date property.
-
Now, start binding Object Table properties with SalesOrderHeaders
entity set properties.
In the Appearance section of the Properties pane, provide the below information:
Property |
Value |
Description |
Remove the default value and leave it blank |
DetailImage |
Remove the default value and leave it blank |
Footnote |
Remove the default value and leave it blank |
PreserveIconStackSpacing |
select false from the dropdown |
ProgressIndicator |
Remove the default value and leave it blank |
Status |
$(C,{GrossAmount},{CurrencyCode},'',{maximumFractionDigits:2,useGrouping:true}) |
Subhead |
$(D,{CreatedAt},'','',{format:'medium'}) |
Substatus |
bind to {CurrencyCode} |
Title |
bind to {SalesOrderId} |
-
In the Behavior section of the Properties pane, select DisclosureIndicator
to AccessoryType
property.
-
In the EmptySection
of the Properties pane, provide No Customer Orders Found
to Caption property.
-
You may also want to open SalesOrders_Detail.page
when clicking on any order in Customers_Detail.page
. For this, you will set the OnPress
event of the Object Table and link it to NavToSalesOrders_Details.action
so that when an end-user selects a order, the Order Details page will open. MDK automatically passes the selected order to the details page.
In Customers_Detail.page
, select the Object Collection, click the link icon under the Events tab for the OnPress
property to open the Object Browser.
Double-click the NavToSalesOrders_Details.action
and click OK to set it as the OnPress
action.
Step 7: Add Header control to orders grid
-
For orders grid area, you will add a header to display some text label in Customers_Detail.page
.
In the Layout Editor, expand the Controls | Section Bar section, drag and drop the Header control above the order grid area.
-
Provide the below information:
Property |
Value |
Caption |
Customer Orders |
You can find more details about Header control.
Step 8: Add Footer control to show total order count
-
For orders grid area, you will also add a footer to display total count of orders for a customer.
In the Layout Editor, expand the Controls | Section Bar section, drag and drop the Footer control above the order grid area.
-
Provide the below information:
Property |
Value |
Attribute Label |
click link icon, select Rules from dropdown and bind it to Customers_OrderCount.js |
Caption |
See All |
FooterStyle |
Select attribute from the dropdown |
AccessoryType |
Select DisclosureIndicator from the dropdown |
You can find more details about Footer control.
-
You may also want to open Customer Orders page when clicking See All. For this, you will set the OnPress
event of the Footer control and link it to NavToCustomers_Orders.action
so that when an end-user clicks on See All, the Customer Orders page will open.
In Customers_Detail.page
, select the Footer control See All, click the link icon under the Events tab for the OnPress
property to open the Object Browser.
Double-click the NavToCustomers_Orders.action
and click OK to set it as the OnPress
Action.
Step 9: Deploy and activate the application
Deploy the updated application to your MDK client.
-
Right-click Application.app
and select MDK: Deploy.
-
Select deploy target as Mobile Services.
You should see Deploy succeeded message.
Step 10: Test the application
-
Re-launch the app on your device, you may asked to authenticate with passcode or Biometric authentication. When you see a confirmation pop-up, tap OK. Tap CUSTOMER LIST.
You will see the CUSTOMER ORDERS area in customer detail page and also total count of orders.
If you see No Customer Orders Found message, try with other customer record.
-
Tapping on any order navigates to its details page.
-
Navigate back to Customer Detail page, tap See All, which navigates to the Customer Orders page.

-
Re-launch the app on your device, you may asked to authenticate with passcode or Biometric authentication. When you see a confirmation pop-up, tap OK.
-
Tap Customer List | click a customer record. You will see the Customer Orders area in customer detail page and also total count of orders.
If you see No Customer Orders Found message, try with other customer record.
-
Tapping on any order navigates to its details page.
-
Navigate back to Customer Detail page, tap See All, which navigates to the Customer Orders page.

Congratulations, you have successfully extended MDK app with Customer orders and you are now all set to Implement Create Entity and Linking Entities in an MDK App.