Introduction
I want to use the outcomes of my track with combined feedback I did receive to publish some more inspirations and examples about the SAP Cloud SDK (for javascript) because meanwhile I see the SAP Cloud SDK within their Virtual Data Model (VDM) as essential for every nodeJs (or java) projects on BTP!
Implementing nodeJs applications / microservices is the optimal way to realize required custom coding in context of SAP Cloud projects by not using no-code / low-code tools (e.g. CPI).
The most nodeJs applications I saw within SAP & BTP context had (node-)modules like "
axios" in use to realize asynchronous REST HTTP requests to send to systems like S/4 HANA.
Using SAP Cloud SDK for these purposes does make life easier - especially the life of us, developers!
The SDK combined with described & structured oData REST APIs empower us to realize Virtual Data Models and simplify & speed up our implementations 🙂
What's a Virtual Data Modell
Data, for example on S/4 HANA, is stored in complex and abstract structures and tables. Therefore, in ABAP we did use the data-objects and models coming from the Data-Dictionary (DDIC) to deal with this complexity.
With capabilities of data-domains and data-types, we were able to know more about parameters used in structures.
So, for example we do know the "BUKRS" data-type has a specific max-length (4 chars) and can contain any characters.
These kinds of details, available on the SAP systems, we want to keep available.
As HANA is using the
Virtual Data Model (VDM) to reflect the abstract and complex structures of the EDM in semantically ways, we're going to do and use the same with the SAP Cloud SDK in our nodeJs typescript app (or within java applications, if you're interested in using java, check out
this post by Henning Heitkoetter)
Because it does not make sense to throw away useful detailed information about parameters supplied in an oData API 😉
So, the (generated) VDM will be some object representation of our oData service, in typescript this is a type-safe client.
And why do we want to use it?
It is really useful while developing the application themself. It does provide you a bunch of capabilities you'll love as a developer:
You will write less code (boilerplate)
You will speed up your implementation (due to existing types)
You will get warnings (e.g. for typos) while implementation / dev-time instead of while run-time
It's easy to generate these VDMs / type-safe clients by using EDMX (Metadata) files (or swagger files)
Enough text, show me what's in for me - Let's focus on that "type-safe" thing ...
Example Business Case: Fetch all Suppliers related to Company Code "DE01".
That's the standard "axios"-approach we know:
We do concatenate the URL to our S/4 system, with entity name, filter and expand functionalities. We're using "axios" to send the HTTP request to S/4 and receive unstructured json data in return.
The URL is a plain string, so typos will not be visible while dev-time and do occur instead while runtime.
The SDK approach:
Within a "requestBuilder" we're going to fetch "getAll" entities within the filter we did add. At the end we do execute it against a destination we did fetch from BTP Destination-Service and receive a structured object from S/4.
This has been typed within seconds, because the VDM did generate a SDK-Client and we're able to implement within the type-safe environment!
The searchhelp (here it's on VS-Code) does show up existing properties of the "supplierCompanyApi" and allows us to select the correct one immediately:
Besides that, we do get warnings if we have some typos (here: missing underscore) within our coding:
This is possible due to the usage of the VDM! As the structured oData API is providing us details about available properties and their types.
More efforts please
Beside the effort of saving time by faster implementing our oData-requests using the VDM, there is more.
Maybe you did already identify the biggest effort of all of that from the screenshots above:
public async getCompanySuppliersAxios(companyCode: string):Promise<any>{
vs.
public async getCompanySuppliers(companyCode: string):Promise<Array<vdmBuPa.SupplierCompany>>{
It's about the returned type of the function!
The consumer of the first function "getCompanySuppliersAxios" does not know about what the function will return (beside the fact it's a promise). It could be anything.
The consumer can't use the effort coming out of types, as there are no types defined and related to the return of the function:
The consumer of the second function "getCompanySuppliers" does know what he can expect: An array of the entity "SupplierCompany" of the VDM "vdmBuPa".
So it does know about the type we do receive and therefore, the properties can get selected up via the searchhelp:
How to start using SAP Cloud SDK?
We saw some benefits of using a VDM within the SAP Cloud SDK.
But the SDK does provide us more capabilities:
Conclusion
Within the Cloud SDK and their adoption of the Virtual Data Model, SAP is providing functionalities and capabilities to us developers to easy use the benefits of structured oData APIs.
In my last project we did set up more then 30 different VDM clients, which we do host on AzureDevOps as
Artifacts (if you want so - it's like a "private npm"). We set up multiple CI/CD pipelines to automatically refresh VDMs if a related oData API got changed. These VDMs did not only point to S/4 HANA systems, they also got used within R/3 onPremise installations and CAP applications running on BTP.
This approach did help and speed up our implementation at the same level, as it did raise the quality of our application portfolio, who is consuming / using these VDMs. We were able to reduce a lot of bug appearances, as issues with oData APIs or type miss matches did appear already while implementation phase.
Based on many different backgrounds of skills, it can be a long and though way down the road to get to know javascript, nodeJs, typescript and the SAP Cloud SDK within VDMs. But it's worth it: Raising quality, saving time and it does make fun as well
🙂
Last but not least - Thanks to the team behind the SDK, I did raise some issues, questions or feature-improvement-ideas on the
official github repository and I am really impressed by the speed and quality of responses I do receive.