SAP Knowledge Base Article - Public

2857750 - [1911] OData API edit behavior for MDF foundation objects - SuccessFactors HCM Suite

Symptom

In Q4 2019 release we have improved our edit behavior for MDF foundation objects. The improvement has lead to change in the behavior of the edit handling for EC API (OData).

Environment

SAP SuccessFactors HCM Suite

Resolution

 What are the behavior changes for the MDF foundation objects?

Use Case

Example query

Old Behavior

New Behavior

When you have an already existing MDF foundation object (in this case Business Unit) with translated fields and now do an update but not provide all translated field, then only the provided fields will be updated.

Before all the translated fields were update although they were not in the request.

Existing data: FOBusinessUnit(externalCode='BU_ITEST1',startDate=datetime'1990-01-01T00:00:00')

"description": "description localized value",
"description_defaultValue": "description localized value",
"description_localized": "description localized value",
"description_en_US": "description localized value",
"description_en_GB": null,
"cust_translation_defaultValue": "cust_translation en_GB value",
"cust_translation_localized": "cust_translation en_GB value",
"cust_translation_en_US": null,
"cust_translation_en_GB": "cust_translation en_GB value"

 

Create data: FOBusinessUnit(externalCode='BU_ITEST1',startDate=datetime'1990-01-02T00:00:00')

"description_localized": "description localized value again",
"cust_translation_en_GB": "cust_translation en_GB value again"

 

"description": "description localized value again",
"description_defaultValue": "description localized value again",
"description_localized": "description localized value again",
"description_en_US": "description localized value again",
"description_en_GB": null,
"cust_translation_defaultValue": "cust_translation en_GB value again",
"cust_translation_localized": "cust_translation en_GB value again",
"cust_translation_en_US": null,
"cust_translation_en_GB": "cust_translation en_GB value again"

"description": "description localized value",
"description_defaultValue": "description localized value",
"description_localized": "description localized value again",
"description_en_US": "description localized value again",
"description_en_GB": null,
"cust_translation_defaultValue": "cust_translation en_GB value",
"cust_translation_localized": "cust_translation en_GB value",
"cust_translation_en_US": null,
"cust_translation_en_GB": "cust_translation en_GB value again"

When you want to create an MDF foundation object that is already in the system, then you will now not get an error message.

 

Before you got an error message that the object already exist.

Existing data: FOBusinessUnit(externalCode='BU_ITEST1',startDate=datetime'1990-01-01T00:00:00')

 

Create data:

FOBusinessUnit(externalCode='BU_ITEST1',startDate=datetime'1990-01-01T00:00:00')

ERROR:
Save batch with same externalCode failed! Same records exist in Batch!

OK

Note: data is upserted.

 

When you create an MDF foundation object with an link to an association with the same data that is already in the system, then you will now not get an error message.

 

Before you got an error message that the Link already exist.

Existing data:

FODivision(externalCode='DEU_01',startDate=datetime'1900-01-01T00:00:00')",

                "cust_toBusinessUnit": {

                FOBusinessUnit(externalCode='DEU_02',startDate=datetime'1900-

              01-01T00:00:00')

 

Create data:

FODivision(externalCode='DEU_01',startDate=datetime'1900-01-01T00:00:00')",

                "cust_toBusinessUnit": {

                FOBusinessUnit(externalCode='DEU_02',startDate=datetime'1900-

              01-01T00:00:00')

400: COE_GENERAL_BAD_REQUEST
[COE0018]Link already exist for FO wrappercust_toGeoZone, externalCode = AUSTRALIA

204: no content

Note: no error message, data also has no change

 

 

Error Enhancements:

Operation

Purge Type

Test

Behavior

Create Link

incremental

create existing link for composite 1:1 association

 old

 [COE0018]Link already exist for 1-1 FO wrappercust_toPayRange

 new

 [COE0018]???COMDF_LINK_NAV_EXIST???

Create Link

incremental

create existing link for valid when 1:1 association

 old

 [COE0018]Link already exist for 1-1 validWhen associationcust_toCurrency

 new

 [COE0018]???COMDF_LINK_NAV_EXIST???

Create Link

incremental

create existing link for valid when 1:n association

old

 [COE0018]Link already exist for validWhen associationcust_toCostCenter, externalCode = 8500-2210

 new

 [COE0018]???COMDF_LINK_NAV_EXIST???

Create Link

incremental

create link with invalid external code for composite association

 old

 [COE0018]Cannot find FO by code : abcdefg, asOfDate : Mon Jan 01 00:00:00 UTC 1990, foElementId : payRange

 new

 [COE0018]Invalid value '(externalCode=abcdefg)' for entity 'cust_toPayRange'.

Create Link

incremental

create link with invalid external code for valid when association

 old

 500: COE_GENERAL_SERVER_FAILURE
 [COE0019]Invalid navigation key! FOBusinessUnit/externalCode=BU_LTEST2,FOBusinessUnit/startDate=1990-01-  01T00:00:00.000Z,
 asOfDate: Mon Jan 01 00:00:00 UTC 1990

 new

 400: COE_GENERAL_BAD_REQUEST
 [COE0018]Invalid reference '(effectiveStartDate=1990-01-01, externalCode=abcdefg)' for valid when association  'cust_toCostCenter'.

Delete Link

incremental


delete link without giving key for 1:n association

 old

 [COE0018]Key is missing for Property cust_toCostCenter

 new

 [COE0018]Key is missing for property 'cust_toCostCenter'.

Update Link

incremental

 

update link with invalid external code for composite association

 old

 [COE0018]Cannot find FO by code : abcdefg, asOfDate : Mon Jan 01 00:00:00 UTC 1990, foElementId : geozone

 new

 [COE0018]Invalid value '(externalCode=abcdefg)' for entity 'cust_toGeoZone'.

Update Link

incremental

 

update link with invalid external code for valid when association

 old

 500: COE_GENERAL_SERVER_FAILURE
 [COE0019]Invalid navigation key! FOBusinessUnit/externalCode=BU_LTEST2,FOBusinessUnit/startDate=1990-01- 01T00:00:00.000Z,
 asOfDate: Mon Jan 01 00:00:00 UTC 1990

 new

 400: COE_GENERAL_BAD_REQUEST
 [COE0018]Invalid reference '(effectiveStartDate=1990-01-01, externalCode=abcdefg)' for valid when association 'cust_toCostCenter'.

Create/Merge/Update

incremental

create/merge/update User field 'cust_tzUser' with invalid value

 old

 [COE0018]User abcdefg does not exist

 new

 [COE0018]Invalid User ID: 'abcdefg'.

Create/Merge/Update

incremental

create/merge/update FO field 'cust_tzFODynamicRole' with invalid value

 old

 [COE0018]Cannot find FO by code : abcdefg, asOfDate : Mon Jan 01 00:00:00 UTC 1990, foElementId : dynamicRole

 new

 [COE0018]Invalid value 'abcdefg' for the Foundation Object field 'cust_tzFODynamicRole'.

Create/Merge/Update

incremental

create/merge/update GO field 'cust_tzGOPositionType' with invalid value

 old

 [COE0018]Invalid Enum value: abcdefg

 new

 [COE0018]Invalid value 'abcdefg' for the Generic Object field 'cust_tzGOPositionType'.

Create/Merge/Update

incremental

create/merge/update picklist field 'cust_tzPicklist' with invalid value

 old

 [COE0018]Cannot find PickListValue by picklistId : EMPLOYEECLASS, asOfDate : Mon Jan 01 00:00:00 UTC 1990, externalCode : abcdefg

 new

 [COE0018]Invalid Picklist value: 'abcdefg'.

Create/Merge

incremental

create/merge valid when association string property 'cust_toDivisionProp' with invalid value

 old

 [COE0018]Cannot find GO by externalCode : abcdefg, asOfDate : Mon Jan 01 00:00:00 UTC 1990, objectType : Division

 new

 [COE0018]Invalid reference '(effectiveStartDate=1990-01-01, externalCode=abcdefg)' for valid when association 'cust_toDivision'.

Create/Merge

incremental

create valid when association flexible property 'CurrencyFlx' with invalid value

 old

 [COE0018]Cannot find GO by externalCode : abcdefg, asOfDate : Mon Jan 01 00:00:00 UTC 1990, objectType : Currency

 new

 [COE0018]Invalid reference '(code=abcdefg, effectiveStartDate=1990-01-01)' for valid when association  'cust_toCurrency'.

Create/Merge/Update/Replace

incremental

create localized property 'description' and country code property
'description_localized' at the same time

 old

 400: COMDF_MUTUALLY_EXECLUSIVE_PROPERTY_LOCALIZED
cannot provide localized property at the same time: description_localized,description_countryCode suffix prope

 new

 400: COE_GENERAL_BAD_REQUEST
 [COE0018]Localized value has different source type. Use one of the following: xx_<locale>, xx_localized, xx_translationTextNav.

Create

incremental

create existing records

 old

 [COE0018]Duplicate Record! externalCode=BU_ITEST1, objectType = BusinessUnit

 new

 [COE0018]Record '(externalCode=BU_ITEST1)' of type 'BusinessUnit' already exists.

Create

incremental

create with same external code but earlier start date

 old

 [COE0018]Failed to save object! Messages: 0:Effective Date for new record must be later than creation date.
Object: objectType=BusinessUnit, externalCode=BU_EARLIERDATETEST, effectiveStartDate=1990-01-01

 new

 [COE0018]Effective Date for new record must be later than creation date

Create

incremental

create localized property 'name' and navigation property
'nameTranslationTextNav' at the same time

 old

 400: COMDF_MUTUALLY_EXECLUSIVE_PROPERTY_LOCALIZED
cannot provide localized property at the same time: name_countryCode suffix property,nameTranslationTextNav

 new

 400: COE_GENERAL_BAD_REQUEST
[COE0018]Localized value has different source type. Use one of the following: xx_<locale>, xx_localized, xx_translationTextNav.

Upsert

incremental/full

upsert User field 'cust_tzUser' with invalid value

 old

 Save batch with same externalCode failed! User abcdefg does not exist; with the index 0

 new

 Invalid User ID: 'abcdefg'. with the index 0

Upsert

incremental/full

upsert FO field 'cust_tzFODynamicRole' with invalid value

 old

 Save batch with same externalCode failed! Cannot find FO by code : abcdefg, asOfDate : Mon Jan 01 00:00:00 UTC 1990, foElementId : dynamicRole; with the index 0

 new

 Invalid value 'abcdefg' for the Foundation Object field 'cust_tzFODynamicRole'. with the index 0

Upsert

incremental/full

upsert GO field 'cust_tzGOPositionType' with invalid value

 old

 Save batch with same externalCode failed! Invalid Enum value: abcdefg; with the index 0

 new

 Invalid value 'abcdefg' for the Generic Object field 'cust_tzGOPositionType'. with the index 0

Upsert

incremental/full

upsert picklist field 'cust_tzPicklist' with invalid value

 old

 Save batch with same externalCode failed! Cannot find PickListValue by picklistId : EMPLOYEECLASS, asOfDate : Mon Jan 01 00:00:00 UTC 1990, externalCode : abcdefg; with the index 0

 new

 Invalid Picklist value: 'abcdefg'. with the index 0

Upsert

incremental/full

upsert valid when association string property 'cust_toDivisionProp' with invalid value

 old

 Save batch with same externalCode failed! Cannot find GO by externalCode : abcdefg, asOfDate : Mon Jan 01 00:00:00 UTC 1990, objectType : Division; with the index 0

 new

 Invalid reference '(effectiveStartDate=1990-01-01, externalCode=abcdefg)' for valid when association 'cust_toDivision'. with the index 0

Upsert

incremental/full

upsert valid when association flexible property 'CurrencyFlx' with invalid value

 old

 Save batch with same externalCode failed! Cannot find GO by externalCode : abcdefg, asOfDate : Mon Jan 01 00:00:00 UTC 1990, objectType : Currency; with the index 0

 new

 Invalid reference '(code=abcdefg, effectiveStartDate=1990-01-01)' for valid when association 'cust_toCurrency'. with the index 0

Upsert

incremental/full

upsert composite association flexible property 'geozoneFlx'  with invalid value

 old

 Save batch with same externalCode failed! Cannot find FO by code : abcdefg, asOfDate : Mon Jan 01 00:00:00 UTC 1990, foElementId : geozone; with the index 0

 new

 Invalid value '(externalCode=abcdefg)' for entity 'cust_toGeoZone'. with the index 0

Upsert

incremental/full

upsert localized property 'description' and country code property

'description_localized' at the same time

 old

 cannot provide localized property at the same time: description_localized,description_countryCode suffix property with the index 0

 new

 Localized value has different source type. Use one of the following: xx_<locale>, xx_localized, xx_translationTextNav. with the index 0

Upsert

incremental/full

upsert duplicate records with different status

 old

 Save batch with same externalCode failed! Same records exist in Batch!

 new

 Cannot be merged as the conflict value found for properties: 'effectiveStatus'.

Upsert

incremental

upsert with existing external code but earlier start date

 old

 Save batch MDF object failed! 0:Effective Date for new record must be later than creation date with the index 0

 new

 Effective Date for new record must be later than creation date with the index 0

Upsert

incremental/full

upsert localized property 'name' and navigation property

'nameTranslationTextNav' at the same time

 old

 Cannot provide localized property at the same time: name_countryCode suffix property,nameTranslationTextNav with the index 0

 new

 Localized value has different source type. Use one of the following: xx_<locale>, xx_localized, xx_translationTextNav.with the index 0

Keywords

MDF Foundation Objects, Business Unit, Location, Division, OData, SuccessFactors HCM Suite, API, upsert, merge, create, incremental, full , KBA , LOD-SF-INT-ODATA , OData API Framework , LOD-SF-INT , Integrations , LOD-SF-INT-MDF , Metadata Framework API (MDF) , How To

Product

SAP SuccessFactors HCM Suite all versions