Master Data Governance Application Framework API Guide
Master Data Governance Application Framework API Guide
Master Data Governance Application Framework API Guide
Applicable Releases:
SAP MDG 9.1 and above
Version 2.1
November 2022
Document History
3
1. MDG APPLICATION FRAMEWORK APIS
1.1. API Overview
The MDG framework provides several interfaces that are used by the delivered SAP MDG applications and also can be
used by other external applications (like customer applications) in order to handle the governance process and the
related entity data. These are the interfaces:
Originally, only the Change Request API and the External Model API existed. The Change Request API provides the
possibility to fully control the governance process and the life cycle of a change request. This includes the possibilities
to create, save, activate or reject a change request, to modify its object list as well as to read and change entity data.
The External Model API was provided to enable extended possibilities to read entity data.
Since the Change Request API and the External Model API turned out to be quite complex to use from the caller
perspective, it was decided to provide a new (Governance) API. The focus of the Governance API is, to provide a
single API with full functional scope concerning the coverage of the governance process using workflows (change
request handling) and the correlated handling of the entity data. Furthermore, this API was designed to stay as simple
as possible by hiding several automatic steps. It still needs to fulfill all new requirements arising from the different MDG
applications.
The Convenience API was developed in parallel to the Governance API. This API is on top of the Governance API with
the focus of being even simpler to use. This improved simplicity is reached by reducing its scope to the handling of a
single change request. Its main purpose is to be used for single object maintenance UIs where its usage is restricted
not only to use a single change request but also to change a single object only as well.
Later it was discovered that lower architectural levels sometimes need access to some process relevant data. To
enable this, the (Application) Context API was developed.
In EhP5 only the Change Request API and the External Model API existed. Both APIs can still be used in the later
MDG releases. Whereas the External Model API always was kept up to date with new developments, the development
of the Change Request API was stopped in EhP6. However, with respect to change request handling the Change
Request API offers some functions that are not covered by any other API. This includes the possibility to move objects
between different change requests, to split one change request including to move objects to the new change request,
and to create a change request using another change request as a template.
4
In EhP6 the Convenience API and the Governance API were introduced and their functional scopes were further
extended from release to release. Most of these developments were done to fulfill new requirements coming from the
later MDG applications.
The External Model API is fully up to date in each MDG release. The following table provides a rough overview of the
situation.
5
Figure 1: Architectural layers with respect to the Change Request API
Figure 2: Architectural layers with respect to the Governance and Convenience APIs
2. LIMITATIONS
When using the described APIs a number of limitations have to be considered which are explained in the following
section. These limitations are true for one instance of the respective API within one logical unit of work (LUW).
The functional scopes of the Convenience API and the Governance API were extended from release to release. They
do not offer the same explicit process interaction possibilities as the Change Request API, but on the other hand they
free the caller from some of the responsibilities to perform a consistent governance process. They do this by strictly
following the governance process of the selected change request type and by triggering the respective workflow.
As already mentioned the scope of the External Model API is restricted to read data and it does not provide any
possibility to change data.
The purpose of the context API is to store some governance process relevant data and to allow callers to request this
information at a later point in time and at a completely different place in the call stack. However, the Context API can
only provide the data which had been filled in beforehand. This data filling is only provided by the Convenience API
6
automatically. In all other cases the caller application is responsible to fill in the correct and needed information before
it is requested the first time. The Convenience API fills the Context API as completely as possible. This means that by
instantiating the convenience API the context is only filled with the model name. After providing a change request type
for creating an entity or providing the change request ID for changing an entity, the context is enriched by change
request type, the business process, and the change request ID. However, because of the different possible usages of
the Convenience API itself there is no guarantee for an always filled Context API. It must be checked from case to case
if the requested information is available.
The External Model API and the Context API are independent on the other APIs and can always be used in parallel to
all other ones.
3. INTERFACES
In this chapter, only an idea of the interfaces should be given. For more detailed information please refer to the system
documentation (interface-, class- and method documentation).
7
3.2. External Model API
The External Model API is used to read entity data and hierarchy data (in case the model supports hierarchies) and
creating data references for entities. The External Model API can be instantiated directly using the static method
GET_INSTANCE of the class CL_USMD_MODEL_EXT or it is given in some other interfaces. The External Model API
can be instantiated with a valid data model. Exceptionally the initial Model (I_USMD_MODEL = SPACE) is a valid
model for instantiating the External Model API. In case the initial model is used only change request data can be read.
3.2.1. IF_USMD_MODEL_EXT
The methods of this interface can be used to read entity data and change request data, to create data references for
further processing and to get an instance for hierarchy data access.
3.2.2. IF_USMD_MODEL_CR_EXT
The interface contains methods to read change request data (e.g. the object list of a change request).
The governance API is consumed by the convenience API and the data load process.
3.3.1. IF_USMD_GOV_API
The interface IF_USMD_GOV_API combines all necessary sub-interfaces to support the governance process. The
purpose of the sub-interfaces is to categorize the methods for their use. There is one event defined for this interface
that is raised as soon as the data has been changed due to derivations or data enrichments.
3.3.2. IF_USMD_GOV_API_CR_DATA
The methods of this interface can be used for change request header data, change request notes, change request
attachments, and target systems.
3.3.3. IF_USMD_GOV_API_ENTITY
The methods of this interface can be used for data manipulation based on the governance process. There, methods
can be used for locking an entity, reading and writing entity data, etc.
The attributes of this interface are constants for creating data references of different kinds.
3.3.4. IF_USMD_GOV_API_PROCESS
The methods of this interface can be used to check the data of a change request and to create and forward the
workflow.
3.3.5. IF_USMD_GOV_API_SERVICES
The methods of this interface can be used to retrieve change requests by a specific entity as well as for step type
determination for a specific change request, and for the determination of permitted changes for a change request in
process.
3.3.6. IF_USMD_GOV_API_TRANS
This interface contains two methods that can be used to save the change requests and the corresponding inactive
entity data, and to refresh the master data governance buffer (change request data and entity data).
8
3.3.7. IF_USMD_GOV_API_CR_ACTION
This interface contains one method for the deletion of a change request in draft mode.
One important method is the SET_ENVIRONMENT method. As change requests might be created implicitly because there
is no explicit method for creating a change request, the change request ID or at least the change request type needs to
be set if you want to change an object for which no change request exists. For example, the creation of a change
request is triggered by locking the main entity of a data model and by retrieving a temporary number for the main entity.
Before an entity can be locked and a change request can be created, the environment has to be set. If you want to
create a new change request, the change request type has to be defined.
Just like the governance API, the convenience API also includes other interfaces for better clarity.
3.4.1. IF_USMD_CONV_SOM_GOV_API
The interface IF_USMD_CONV_SOM_GOV_API combines all necessary sub-interfaces to support the convenient
governance process. The purpose of the sub-interfaces is to categorize the methods for their use. There are three
events defined for this interface that are raised in the following situations:
• data has been changed due to derivations or data enrichments
• data was saved
• the key of an entity has changed during activation
The methods of this interface can be used for message handling, setting of the environment, and for determining the
processing details of an entity.
3.4.2. IF_USMD_CONV_SOM_GOV_CR
The methods of the interface IF_USMD_CONV_SOM_GOV_CR handle change request header data as well as change
request notes, attachments, and target systems. With the method RETRIEVE_CREQUESTS_BY_ENTITY you can
determine whether an entity is in process and which change request is used for processing. Methods relevant to the
workflow are also available, for example the method SET_ACTION. It can be used to provide the action result of a
workflow action to finalize processing, to approve, or to reject.
3.4.3. IF_USMD_CONV_SOM_GOV_ENTITY
The methods of interface IF_USMD_CONV_SOM_GOV_ENTITY handle entity data. Entity data can be enqueued. If you
have not already set an existing change request ID as environment, enqueueing an entity or acquiring a new temporary
entity key creates a change request. Otherwise a change request type needs to be provided. Data can be retrieved,
written and checked. SAP also provides a method for field property determination.
3.4.4. IF_USMD_CONV_SOM_GOV_TRANS
The two methods of interface IF_USMD_CONV_SOM_GOV_TRANS are relevant to transactional handling. This interface
contains the methods SAVE and REFRESH_BUFFERS.
3.4.5. IF_USMD_CONV_SOM_GOV_CR_ACTION
This interface IF_USMD_CONV_SOM_GOV_CR_ACTION contains only one method for the deletion of a change request in
draft mode (no workflow has been started so far for the relevant change request).
3.5. CL_USMD_APP_CONTEXT
The Application Context can be used to get the current MDG context e.g. the currently used data model, current used
process and current change request meta data. Application Context method GET_CONTEXT is used to get an instance of
the context API interface IF_USMD_APP_CONTEXT. This instance can be used to read the relevant context information.
Attention: The context contains only the data that has been filled in beforehand.
9
4. DATA HANDLING
4.1. Introduction to the MDG Master Data Handling
In a master data governance process, there are different sources of entity data. On the one side, there are the active
data. These are the valid data in the system, that is, the data which are accessed from all applications and business
processes outside of MDG.
There are also the entities which are changed in a MDG governance process using a change request which are kept
separately from the active data. This data is called inactive data or staging data. When the entity changes of a
governance process are finally approved, the inactive data related to the respective change request are transformed
into the corresponding active data. This process is called change request activation.
The MDG entity types can be divided into flex entity types and reuse entity types. The flex entity types have no own
data storage for their active data but their active and their inactive data are stored within the MDG staging tables. All
read and write accesses to flex entity data are performed the the MDG abstraction layer and the subsequent MDF
layer.
Reuse entity types have their own data storage for their active data. The read and write accesses to this data is
delegated from the MDG abstraction layer to respective access classes. Their inactive data is stored in the MDG
staging tables as in the case of the flex entity types. In addition to the inactive data the reuse entity types also have the
snapshot data which are a copied from the active data and which are created at the point in time when a reuse entity is
inserted into a change request object list. As in the case of the inactive data, the snapshot data are stored in the MDG
staging tables as well. The accesses to this data always happens from the abstraction layer using the MDF layer.
Entity data can be read using the Convenience API, the Governance API, and the External Model API as well. In all
cases, the read request is delegated to the MDG abstraction layer, which itself forwards the requests to the MDF layer
and/or the access classes and returns the combined results to the respective caller.
Data that is changed within a LUW which have not yet been saved, are buffered within the MDF buffer which is located
within the MDF layer. By default, read requests obtain the combined result of stored data adjusted by the content of the
MDF buffer.
In general, the obtained result of a read request depends on the request parameters and the existence of respective
data in the different storage locations and within the MDF buffer. The available request parameters depend on the API
10
used and control which data will be read (For example, active versus inactive entity data, considering the assignment
of inactive data to certain change requests, key selections, attribute selections, and editions).
The External Model API offers the widest variety on how a read request can be specified but on the other hand it is too
complex to be explained here in detail. As already described above, the Governance API offers a simpler interface and
therefore will be explained here as an example in some more detail. The main method for reading entity data with the
Governance API is IF_USMD_GOV_API_ENTITY~READ_ENTITY. This method has the following importing parameters for
controlling the read request:
Figure 4: Reading result depending on the existing data and the values of the importing parameters IF_ACTIVE_DATA and
IV_CREQUEST_ID
11
Figure 5: Architectural layers with respect to the changing of entity data
Entity data can be written by the Change Request API, the Governance API or the Convenience API. In all these cases
the write request is delegated to the MDG abstraction layer. The abstraction layer contains its own temporary Delta
Buffer. It is important to know, that as long as changes are located in this buffer, they are not visible at any read
accesses. To make them available to read accesses they must be transferred at first from the Delta Buffer into the
MDF buffer, a process which is called flush. During such a flush, also some derivations are called which might further
change the data.
To handle the different buffers and different data changing scenarios, the abstraction layer offers different write modes:
1. Direct Mode: With this write mode the changed data are directly written into the MDF buffer. The delta buffer is
not involved at all and a flush is not taking place.
2. Direct Mode with Derivations: In this write mode the changed data are written into the Delta Buffer first and then
the whole content of this buffer (including changes being collected beforehand) is transferred to the MDF buffer
(flushed).
3. Collect Mode: In this write mode the changed data are collected in the Delta Buffer. The MDF buffer is not
involved and a flush is not taking place.
A flush can be triggered from the applications at any point in time by calling explicitly the respective flush method. In
addition to this a flush is normally automatically triggered when any read access happens or a write access with the
respective write mode. This must be considered when evaluating the result of any reading data access. Especially by
using the External Model API the flush can be suppressed by setting the corresponding importing parameter of the
method IF_USMD_MODEL_EXT~READ_CHAR_VALUE. So, in any case after the flush all changed data are located in the
MDF buffer, they might have be further changed by derivations and they are considered in read accesses.
When a change request is saved or submitted, the changed data are written as inactive data from the MDF buffer into
the MDF staging tables. When the change request later on is approved and activated, these inactive data is converted
into active data and end up either in the staging tables (flex entity types) or in the reuse tables (reuse entity types).
The MDG staging tables can be accessed with the report USMD_DATA_MODEL using transaction SE38.
4.3.1. Derivations
Derivations can be used to change entity data automatically without user interaction. The MDG framework offers
several possibilities when, where and how derivations can be implemented. The most important ones are mentioned in
the following:
1. Standard Derivations: The standard derivations can be implemented as BADI implementations of the BADI
USMD_RULE_SERVICE in the method DERIVE_ENTITY of the BADI interface IF_EX_USMD_RULE_SERVICE or as
BRF+ rules. The execution of these derivations is triggered by the abstraction layer method
12
IF_USMD_RULE_SERVICE~DERIVE_ENTITY. This method is called at any write operation from the Governance
API or the Change Request API and in addition by some application specific spots.
2. Derivations in Access Classes: The access class interface IF_USMD_PP_ACCESS provides the method
DERIVE_DATA which can be implemented with derivations. This method is called per involved access class
during a flush and gets the current content of the Delta Buffer to find out which data changes had been
collected since the last flush was process.
3. Cross entity derivations: Those derivations can be implemented for the BADI USMD_RULE_SERVICE in the method
DERIVE of the BADI interface IF_EX_USMD_RULE_SERVICE2. This method is also called during a flush and also
gets the current content of the Delta Buffer in order to find out which data changes had been collected since
the last flush was process. It is called after the derivations of the access classes and in addition obtains the
information which data had been derived there.
All the derivation methods get the currently changed data (i.e. all collected data of the delta buffer since the last flush
happened) imported using suitable importing parameters. If some additional entity data must be read within the
derivation methods, the External Model Interface must be used (never the Convenience or Governance API). To avoid
unnecessary flushes (and derivations), the NO_FLUSH parameter should be set to ‘X’.
In case of parallel change requests, it is possible that derived entity types are not in the scope of the change request
type or that a derived entity is already interlocked in another change request. In such a case the derived data which
cannot be added to the change list are filtered out. Only those derivations are taken over into the MDF buffer, that are
in scope and can be interlocked. The removed entities are listed in a warning message. If the derived data is essential
for data consistency a corresponding check should take care of this. The derivation provides no error message in such
a case.
Figure 6: Sequence diagram of the flush process and the called derivations
1. The entity must not be interlocked by an already existing open change request. That means that the main object
of the entity must not be part of the object list of an open classical change request and that the entity itself
must not be contained in the change list of an open parallel change request.
2. The main object of the entity must successfully be enqueued.
3. The user has the authorization to create (if it is a new entity) or change (if it is an existing entity) the entity data.
4. At least one suitable change request type must exist in the customizing. In the case of parallel change request
types the relevant entity type must be in the scope.
13
If these prerequisites are fulfilled, the Governance API automatically performs the following tasks:
1. If not yet done, the API creates a suitable change request. If only one suitable change request type exists in the
customizing, this one is automatically used. Otherwise the user is asked to select the desired change request
type. For edition-dependent entities the same mechanism is used to determine the edition to be used.
2. If not yet done, the main object of the entity is automatically added to the object list of the change request.
3. If not yet done, in the case of a parallel change request the entity is automatically added to the change list of the
change request.
4. In case of a reuse entity type the relevant snapshot is created.
5. The data changes are written into the abstraction layer.
The main method for writing entity data with the Governance API is IF_USMD_GOV_API_ENTITY~WRITE_ENTITY. The
interface of this method has the following parameters:
The Convenience and the Governance API always write with the write mode collect. During the runtime of such a
method execution it is guaranteed that a flush is not triggered. Several calls of the write method in a loop can therefore
be used to really collect some data within the Delta Buffer.
4.4. Authorization
To create a workflow, the CREATE (AUTH_ACT = 1) authorization for a specific change request type is required. To
complete a workflow step, the CHANGE (AUTH_ACT = 2) authorization for the change request type is required.
To change the object list of the change request, it is not necessary to check the change request authorization.
14
Figure 7: Sequence diagram of change request handling
REPORT zcreatecarr_sf.
DATA:
lo_gov_api TYPE REF TO if_usmd_gov_api,
lv_crequest_id TYPE usmd_crequest, "Change Request ID
15
lr_carr_data_tab TYPE REF TO data, "Entity Carrier - data table
FIELD-SYMBOLS:
<ls_carr_key> TYPE any,
<lt_carr_key> TYPE ANY TABLE,
<ls_carr_data> TYPE any,
<lt_carr_data> TYPE ANY TABLE,
<value> TYPE any.
"2nd: Create all the data references needed to maintain the carrier entity
"Create a data reference of the key structure / table of entity CARR (Carrier)
lo_gov_api->create_data_reference(
EXPORTING iv_entity_name = 'CARR'
iv_struct = lo_gov_api->gc_struct_key
IMPORTING er_structure = lr_carr_key_str
er_table = lr_carr_key_tab ).
"Assign the created data references for carrier key and carrier data
"to field symbols
ASSIGN lr_carr_key_str->* TO <ls_carr_key>.
ASSIGN lr_carr_key_tab->* TO <lt_carr_key>.
"3rd: Fill the key and data structure with values to create a new carrier
"The entity CARR only has key field CARR. The new carrier ID should be 'YZ'
ASSIGN COMPONENT 'CARR' OF STRUCTURE <ls_carr_key> TO <value>.
IF sy-subrc = 0.
<value> = 'YZ'.
INSERT <ls_carr_key> INTO TABLE <lt_carr_key>.
ELSE.
EXIT.
"Tough luck – unfortunately, this field name is not part of the key structure
ENDIF.
"4th: Create a new change request using change request type and a
"description (required)
TRY.
lv_crequest_id = lo_gov_api->create_crequest(
iv_crequest_type = 'SFC01'
iv_description = 'Create new Carrier YZ' ).
CATCH cx_usmd_gov_api.
"Something went wrong while creating the change request (e.g. model blocked
16
"or change request type unknown).
EXIT.
ENDTRY.
"8th: optionally, the entity data is read again... just to make sure everything
"went right.
TRY.
lo_gov_api->read_entity( EXPORTING iv_crequest_id = lv_crequest_id
iv_entity_name = 'CARR'
it_key = <lt_carr_key>
IMPORTING et_data = <lt_carr_data> ).
CATCH cx_usmd_gov_api_core_error cx_usmd_gov_api.
EXIT.
"Adequate Exception handling
ENDTRY.
17
CATCH cx_usmd_gov_api_core_error cx_usmd_gov_api.
"Possibility to handle the erroneous data or go on.
ENDTRY.
"10th: Save the change request (and the entity data of course)
TRY.
lo_gov_api->save( ).
"Save is done in draft mode by default so it is possible to
"save the change request even if change request data or
"entity data is not consistent.
CATCH cx_usmd_gov_api_core_error.
EXIT.
"Adequate Exception handling
ENDTRY.
REPORT zchangepfli_sf.
DATA:
lo_gov_api TYPE REF TO if_usmd_gov_api,
lv_crequest_id TYPE usmd_crequest, "Change Request ID
18
lr_flight_key_tab TYPE REF TO data, "Entity Flight - key table
lr_flight_data_str TYPE REF TO data, "Entity Flight - data structure
lr_flight_data_tab TYPE REF TO data, "Entity Flight - data table
FIELD-SYMBOLS:
<ls_pfli_key> TYPE any,
<lt_pfli_key> TYPE INDEX TABLE,
<ls_pfli_data> TYPE any,
<lt_pfli_data> TYPE INDEX TABLE,
"2: Create the data references needed to maintain the flight connection entity
"Create a data reference of the key structure/table of entity PFLI
lo_gov_api->create_data_reference(
EXPORTING iv_entity_name = 'PFLI'
iv_struct = lo_gov_api->gc_struct_key
IMPORTING er_structure = lr_pfli_key_str
er_table = lr_pfli_key_tab ).
lo_gov_api->create_data_reference(
EXPORTING iv_entity_name = 'PFLI'
iv_struct = lo_gov_api->gc_struct_key_attr
IMPORTING er_structure = lr_pfli_data_str
er_table = lr_pfli_data_tab ).
"Assign the created data references for the flight connection key to the field symbols
ASSIGN lr_pfli_key_str->* TO <ls_pfli_key>.
ASSIGN lr_pfli_key_tab->* TO <lt_pfli_key>.
"Assign the created data references for the flight connection data to the field symbols
ASSIGN lr_pfli_data_str->* TO <ls_pfli_data>.
ASSIGN lr_pfli_data_tab->* TO <lt_pfli_data>.
"3: Create a new change request using change request type and a
description (required)
TRY.
lv_crequest_id = lo_gov_api->create_crequest(
iv_crequest_type = 'SFP02'
iv_description = 'Change Flight Connection LH 400' ).
CATCH cx_usmd_gov_api.
"Something went wrong while creating the change request (e.g. data model blocked
or change request type unknown).
EXIT.
ENDTRY.
19
"4: Before making changes to an object, the object needs to be enqueued.
TRY.
lo_gov_api->enqueue_entity( EXPORTING iv_crequest_id = lv_crequest_id
iv_entity_name = 'PFLI'
it_data = <lt_pfli_key> ).
CATCH cx_usmd_gov_api_entity_lock cx_usmd_gov_api.
EXIT.
ENDTRY.
"7: Create all the data references needed to maintain the flight entity
"Create a data reference of the key structure/table of entity FLIGHT (Flight)
lo_gov_api->create_data_reference(
EXPORTING iv_entity_name = 'FLIGHT'
iv_struct = lo_gov_api->gc_struct_key
IMPORTING er_structure = lr_flight_key_str
er_table = lr_flight_key_tab ).
lo_gov_api->create_data_reference(
EXPORTING iv_entity_name = 'FLIGHT'
iv_struct = lo_gov_api->gc_struct_key_attr
IMPORTING er_structure = lr_flight_data_str
er_table = lr_flight_data_tab ).
"Assign the created data references for flight connection key to the field symbols
ASSIGN lr_flight_key_str->* TO <ls_flight_key>.
ASSIGN lr_flight_key_tab->* TO <lt_flight_key>.
20
EXIT.
ENDTRY.
IF sy-subrc <> 0.
MOVE-CORRESPONDING <ls_flight_key> TO <ls_flight_data>.
ASSIGN COMPONENT 'FLDATE' OF STRUCTURE <ls_flight_data> TO <value>.
<value> = '31122013'.
ENDIF.
"11: Save the change request (and the entity data, of course)
TRY.
lo_gov_api->save( ).
"Save is done in draft mode by default so it is possible to
save the change request even if the change request data or
the entity data is not consistent.
CATCH cx_usmd_gov_api_core_error.
EXIT.
"Adequate exception handling
ENDTRY.
21
CATCH cx_usmd_gov_api_core_error.
"Adequate exception handling
ENDTRY.
6. ADDITIONAL INFORMATION
6.1. Further Reading
Information on SAP MDG on SAP S/4HANA
• Exchange knowledge: SAP Community | Q&A | Blog
• Try SAP Master Data Governance on S/4HANA for free: Trial Version
• Learn more: Latest Release | Webinars | Help Portal | How-to Information | Key Presentations
Related Information
• Learn more: Floorplan Manager for Web Dynpro ABAP | How to Adapt FPM | FPM Blog | How-to Information |
Service Mapping Tool | SAP S/4HANA Cookbook CVI
22
www.sap.com/contactsap
The information contained herein may be changed without prior notice. Some software products marketed by SAP SE and its distributors contain proprietary software components of other software vendors. National
product specifications may vary.
These materials are provided by SAP SE or an SAP affiliate company for informational purposes only, without representation or warranty of any kind, and SAP or its affiliated companies shall not be liable for errors or
omissions with respect to the materials. The only warranties for SAP or SAP affiliate company products and services are those that are set forth in the express warranty statements accompanying such products and
services, if any. Nothing herein should be construed as constituting an additional warranty.
In particular, SAP SE or its affiliated companies have no obligation to pursue any course of business outlined in this document or any related presentation, or to develop or release any functionality mentioned therein.
This document, or any related presentation, and SAP SE’s or its affiliated companies’ strategy and possible future developments, products, and/or platform directions and functionality are all subject to change and may
be changed by SAP SE or its affiliated companies at any time for any reason without notice. The information in this document is not a commitment, promise, or legal obligation to deliver any material, code, or
functionality. All forward-looking statements are subject to various risks and uncertainties that could cause actual results to differ materially from expectations. Readers are cautioned not to place undue reliance on
these forward-looking statements, and they should not be relied upon in making purchasing decisions.
SAP and other SAP products and services mentioned herein as well as their respective logos are trademarks or registered trademarks of SAP SE (or an SAP affiliate company) in Germany and other countries. All
other product and service names mentioned are the trademarks of their respective companies. See www.sap.com/trademark for additional trademark information and notices.