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",
Create data: FOBusinessUnit(externalCode='BU_ITEST1',startDate=datetime'1990-01-02T00:00:00') "description_localized": "description localized value again",
|
"description": "description localized value again", |
"description": "description localized value", |
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: |
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 |
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 |
new |
400: COE_GENERAL_BAD_REQUEST |
|||
Delete Link |
incremental |
|
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 |
new |
400: COE_GENERAL_BAD_REQUEST |
|||
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 |
old |
400: COMDF_MUTUALLY_EXECLUSIVE_PROPERTY_LOCALIZED |
new |
400: COE_GENERAL_BAD_REQUEST |
|||
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. |
new |
[COE0018]Effective Date for new record must be later than creation date |
|||
Create |
incremental |
create localized property 'name' and navigation property |
old |
400: COMDF_MUTUALLY_EXECLUSIVE_PROPERTY_LOCALIZED |
new |
400: COE_GENERAL_BAD_REQUEST |
|||
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