OData Service Development With SAP Gateway
OData Service Development With SAP Gateway
Introduction
In this blog I would like to show the basics of OData service development with SAP Gateway when using code based service
implementation as it is shown in the upcoming SAP CodeJam events about OData service development with SAP Gateway.
Though the recommended approach for OData service development in the most recent SAP NetWeaver releases is to use CDS views
there are still a number of use cases where code based service implementation is a valid option.
1. Your SAP backend system is based on a SAP NetWeaver release 7.31 or earlier
2. Your system is based on SAP NetWeaver 7.40 or later but the business logic you want to re-use has been implemented in ABAP
code
3. It is not possible to implement your business logic in CDS views
As an example we will use a simple OData model based that consist out of SalesOrders and SalesOrderItems with the option to navigate
from a SalesOrder to the correponding line items.
If you are more interested in using CDS views please have a look at my following post:OData service development with SAP Gateway
using CDS via Referenced Data Sources
If you want to know how to annotate services using code based implemenation you can have a look at my following post:
https://blogs.sap.com/2017/04/21/how-to-add-annotations-to-an-odata-service-using-code-based-implementation/
Changes
28.06.2016 Fix for ABAP code: Replaced
lv_osql_where_clause = io_tech_request_context->get_osql_where_clause( ). through
lv_osql_where_clause = io_tech_request_context->get_osql_where_clause_convert().
because otherwise the statement GET SalesOrderSet?$filter=(Customer eq ‘100000000’) would not work because alpha
conversion to ‘0100000000’ would not take place.
24.11.2016 Moved ABAP source code into source code controls
21.04.2017 Added a link that explains how to add annotations to the service.
21.02.2018 Added a hint to un-check the Filter checkbox in SE24
Prequisites
The examples shown in this blog are based on the latest SAP NetWeaver release 750so that we can compare the different implementation
approaches
Project: ZE2E100_XX
Description: ZE2E100_XX
Press Continue
Press Save
Import a DDIC structures for SalesOrder
Click Next.
In the second step of the wizard provide:Select the checkbox for SEPM_ISOE.
Deselect the checkbox for MANDT,
Click Next.
In the third screen of the wizardSelect the checkbox Is Key for the field SALESORDER.
Click Finish.
Expand Folder Properties and examine the entity SalesOrder and the entity set SalesOrderSet.(For example the property names,
the Edm Core Type values and the ABAP field names)
Press Save
Press the Check Project Consistency button.
Verify that no errors were found.
Press the Generate Runtime Objects button.Note: Using the Generate Runtime Objects button automatically saves the project.
Leave all values as defaulted and press Enter.
Register and Test the OData service using the Gateway client
Expand the node Service Maintenance and right-click on GW_HUB and select Register.
In the Add Service popup leave all values as defaulted and press the Local Object button to assign the artifacts to the $tmp package.
Then press Enter to continue
Double-click on the GW_HUB entry under Service Maintenance. Verify that the registration status on the right-hand side is showing a
green traffic light.
In the navigation tree right-click on GW_HUB and select SAP Gateway Client.Alternatively click on the SAP Gateway Client button in
the detail section.
Confirm the warning popup that warns you that you will be redirected to the selected system. Select Yes.
This opens up the SAP Gateway Client in a new screen. The URI of the service document is already defaulted.
Press the Execute button.
As a result you get the service document of your OData service in the HTTP response window
Open the Service Builder Project again (if you have closed it)
Expand the node Service Implementation and expand SalesOrderSet.
Now right-click on GetEntitySet(Query) and choose
Go to ABAP Workbench.
Use Copy&Paste to copy the entire coding shown below into thesalesorderset_get_entityset method. Please note: This is a
new syntax for ABAP SQL.
method SALESORDERSET_GET_ENTITYSET.
select * from sepm_i_salesorder_e
into corresponding fields of table @et_entityset.
endmethod.
o Info: The replaced coding selects data from the CDS view sepm_i_salesorder_e.The results are filled into the
corresponding fields of the return structure et_entityset of the get-entityset method.
This works out of the box since the structure SEPM_ISOE was used to create the entity type using DDIC import. This structure is
the so called sqlViewName of the CDS view sepm_i_salesorder_e. The source code of the DDL source can be viewed using
the report RUTDDLSSHOW.
Click on Activate.
Confirm the activation popup.
Navigate back to the Service Builder main screen using the green back button multiple times.
In the navigation tree right-click on GW_HUB and select SAP Gateway Client.Alternatively click on the SAP Gateway Client button in
the detail section.
This opens up the SAP Gateway Client in a new screen. The URI of the service document is already defaulted.
Press the Button “Entity Sets” and select SalesOrderSet
The request URI field will contain the following value:
/sap/opu/odata/SAP/ZE2E100_<XX>_SRV/SalesOrderSet
method SALESORDERSET_GET_ENTITYSET.
endmethod.
Click on Activate.
Navigate back to the Service Builder main screen using the back button
In the navigation tree right-click on GW_HUB and select SAP Gateway Client.Alternatively click on the SAP Gateway Client button in
the detail section.
This opens up the SAP Gateway Client in a new screen. The URI of the service document is already defaulted.
Replace the URI with the following:
/sap/opu/odata/SAP/ZE2E100_<XX>_SRV/SalesOrderSet?$filter=Grossamountintransaccurrency ge
100000&$select=Salesorder,Grossamountintransaccurrency,Transactioncurrency&$format=json
This will deliver a list of four sales orders whose gross amount exceeds 100.000 Euro and will only show the sales order number
and the gross amount.
500000005
500000030
500000034
500000045
Add support for additional query options to your code
This time the ABAP editor will open the method salesorderset_get_entitysetimmediately.
Switch to the edit mode.
Replace the code with the code shown below.
The code retrieves the values for $top and $skip and the $filter statement as an osql statement for the where clause.The data is retrieved
and in the end it is checked whether $inlinecount is used (which is a default for SAPUI5)
method SALESORDERSET_GET_ENTITYSET.
endmethod.
Click on Activate.
Navigate back to the Service Builder main screen using the back button multiple times.
In the navigation tree right-click on GW_HUB and select SAP Gateway Client.Alternatively click on the SAP Gateway Client button in
the detail section.
This opens up the SAP Gateway Client in a new screen. The URI of the service document is already defaulted.
Replace the URI with the
following:/sap/opu/odata/SAP/ZE2E100_<XX>_SRV/SalesOrderSet?$filter=Grossamountintransaccurrency ge
100000&$select=Salesorder,Grossamountintransaccurrency,Transactioncurrency&$top=2&$skip=1&$inlinecount=allpages&$forma
t=jsonReplace <XX> by your group number and press Execute
This will deliver a list of only 2 sales orders whose gross amount exceeds 100.000 EUR. The first sales order 500000005 is skipped and
only the first 2 of the rest of the list (highlighted in bold) are shown.
The inlinecount however shows that in total 40 sales orders would fit to the filter criteria.
500000005
500000030 <–
500000034 <–
500000045Please note: $skip, $top and $inlinecount are used for client side paging. SAPUI5 uses this to calculate how many pages one
has to navigate through.
What is now left is the implementation of the GET_ENTITY method of the entity set SalesOrderSet and the modelling and implementation of the
navigation between sales order header and the line items.