A_ServiceOrder
Service Order
A_ServiceOrder is a Composite CDS View that provides data about "Service Order" in SAP S/4HANA. It reads from 1 data source (I_ServiceDocumentEnhcd) and exposes 80 fields with key field ServiceOrder. It has 25 associations to related views.
Data Sources (1)
| Source | Alias | Join Type |
|---|---|---|
| I_ServiceDocumentEnhcd | ServiceOrder | from |
Associations (25)
| Cardinality | Target | Alias | Condition |
|---|---|---|---|
| [0..*] | A_ServiceOrderItem | _Item | $projection.ServiceOrder = _Item.ServiceOrder |
| [0..*] | A_ServiceOrderPersonResp | _PersonResponsible | $projection.ServiceOrder = _PersonResponsible.ServiceOrder |
| [0..*] | A_ServiceOrderRefObject | _ReferenceObject | $projection.ServiceOrder = _ReferenceObject.ServiceOrder |
| [0..*] | A_SrvcOrdProdRefObject | _ProductReferenceObject | $projection.ServiceOrder = _ProductReferenceObject.ServiceOrder |
| [0..*] | A_ServiceOrderConfirmation | _Confirmation | $projection.ServiceOrder = _Confirmation.ServiceOrder |
| [0..*] | A_ServiceOrderText | _Text | $projection.ServiceOrder = _Text.ServiceOrder |
| [0..*] | A_ServiceOrderDefect | _Defect | $projection.ServiceOrder = _Defect.ServiceOrder |
| [0..*] | A_SrvcOrdRefServiceContract | _ReferenceServiceContract | $projection.ServiceOrder = _ReferenceServiceContract.ServiceOrder |
| [0..1] | I_ServiceDocumentPredecessor | _RefServiceRequest | $projection.ServiceOrderUUID = _RefServiceRequest.ServiceDocumentUUID and _RefServiceRequest.ServiceDocPrdcssrBusObjType = 'BUS2000223' |
| [0..1] | I_ServiceDocumentPredecessor | _RefServiceTemplate | $projection.ServiceOrderUUID = _RefServiceTemplate.ServiceDocumentUUID and _RefServiceTemplate.ServiceDocPrdcssrBusObjType = 'BUS2000116' and $projection.ServiceDocumentTemplateType is not initial |
| [0..*] | A_ServiceOrderPriceElement | _PricingElement | $projection.ServiceOrder = _PricingElement.ServiceOrder |
| [0..*] | A_SrvcOrdQualification | _Qualification | $projection.ServiceOrder = _Qualification.ServiceOrder |
| [0..1] | I_RespyMgmtTeamHeaderDetail | _ServiceTeamHeader | $projection.RespyMgmtServiceTeam = _ServiceTeamHeader.RespyMgmtTeamID |
| [0..1] | I_SrvcOrdRefFSMServiceCall | _SrvcOrdRefFSMServiceCall | $projection.ServiceOrderUUID = _SrvcOrdRefFSMServiceCall.ServiceDocumentUUID and _SrvcOrdRefFSMServiceCall.PrdcssrSuccssrDocObjectType = 'FSMCALL' |
| [0..1] | E_ServiceDocument | _Extension | _Extension.ServiceCategory = 'BUS2000116' and $projection.ServiceOrder = _Extension.ServiceOrder |
| [0..1] | I_CustMgmtExtRefID | _CustMgmtExtRef | _CustMgmtExtRef.CustMgmtObjectType = 'BUS2000116' and $projection.ServiceOrder = _CustMgmtExtRef.CustMgmtDocument and _CustMgmtExtRef.CustMgmtExtRefIDType = '0001' |
| [0..1] | P_SrvcPrdcssrSrvcContr | _RefServiceContract | $projection.ServiceOrderUUID = _RefServiceContract.ServiceDocumentUUID and _RefServiceContract.NumberOfOccurrences = 1 |
| [0..*] | A_ServiceOrdUserStatus | _ServiceOrdUserStatus | $projection.ServiceOrder = _ServiceOrdUserStatus.ServiceOrder |
| [0..*] | A_SrvcOrdPartner | _Partner | $projection.ServiceOrder = _Partner.ServiceOrder |
| [0..*] | A_SrvcOrdTransHistory | _SrvcOrdTransHistory | $projection.ServiceOrder = _SrvcOrdTransHistory.ServiceOrder |
| [0..*] | A_SrvcOrdDuration | _Duration | $projection.ServiceOrder = _Duration.ServiceOrder |
| [0..*] | A_SrvcOrdAppointment | _Appointment | $projection.ServiceOrder = _Appointment.ServiceOrder |
| [0..1] | I_WBSElementBasicData | _WBSElement | _WBSElement.WBSElementInternalID = ServiceOrder.WBSElementInternalID |
| [0..1] | I_WBSElementBasicData | _WBSElementCO | _WBSElementCO.WBSElement = ServiceOrder.WBSElement |
| [0..*] | A_SrvcOrdInHouseRepairItem | _InHouseRepairItem | $projection.ServiceOrder = _InHouseRepairItem.ServiceOrder |
Annotations (15)
| Name | Value | Level | Field |
|---|---|---|---|
| ClientHandling.algorithm | #SESSION_VARIABLE | view | |
| EndUserText.label | Service Order | view | |
| VDM.viewType | #COMPOSITE | view | |
| VDM.lifecycle.contract.type | #PUBLIC_REMOTE_API | view | |
| AbapCatalog.sqlViewName | ASRVORD | view | |
| AbapCatalog.compiler.compareFilter | true | view | |
| AbapCatalog.preserveKey | true | view | |
| AccessControl.authorizationCheck | #CHECK | view | |
| ObjectModel.representativeKey | ServiceOrder | view | |
| ObjectModel.createEnabled | true | view | |
| ObjectModel.updateEnabled | true | view | |
| ObjectModel.usageType.dataClass | #TRANSACTIONAL | view | |
| ObjectModel.usageType.serviceQuality | #C | view | |
| ObjectModel.usageType.sizeCategory | #L | view | |
| Metadata.ignorePropagatedAnnotations | true | view |
Fields (80)
| Key | Field | Source Table | Source Field | Description |
|---|---|---|---|---|
| KEY | ServiceOrder | ServiceDocument | ||
| ServiceOrderType | ServiceDocumentType | |||
| ServiceOrderUUID | ServiceDocumentUUID | |||
| ServiceOrderDescription | ServiceDocumentDescription | |||
| ServiceObjectType | ServiceObjectType | |||
| Language | Language | |||
| ServiceDocumentPriority | ServiceDocumentPriority | |||
| RequestedServiceStartDateTime | RequestedServiceStartDateTime | |||
| RequestedServiceEndDateTime | RequestedServiceEndDateTime | |||
| ErlstRequestedDeliveryDateTime | ErlstRequestedDeliveryDateTime | |||
| ServiceDocChangedDateTime | ServiceDocChangedDateTime | |||
| PostingDate | PostingDate | |||
| ServiceDocumentCreationDate | ServiceDocumentCreationDate | |||
| ServiceDocumentChangedDate | ServiceDocumentChangedDate | |||
| ServiceDocumentCreatedByUser | ServiceDocumentCreatedByUser | |||
| ServiceDocumentChangedByUser | ServiceDocumentChangedByUser | |||
| ServiceDocumentTemplateType | ServiceDocumentTemplateType | |||
| PurchaseOrderByCustomer | PurchaseOrderByCustomer | |||
| CustomerPurchaseOrderDate | CustomerPurchaseOrderDate | |||
| ServiceOrderIsReleased | ServiceDocumentIsReleased | |||
| ServiceOrderIsRejected | ServiceDocumentIsRejected | |||
| SrvcOrdIsBusinessCompleted | SrvcOrdIsBusinessCompleted | |||
| SrvcOrdIsBusinessReopened | SrvcOrdIsBusinessReopened | |||
| SalesOrganization | SalesOrganization | |||
| DistributionChannel | DistributionChannel | |||
| Division | Division | |||
| SalesOffice | SalesOffice | |||
| SalesGroup | SalesGroup | |||
| SoldToParty | SoldToParty | |||
| ShipToParty | ShipToParty | |||
| BillToParty | BillToParty | |||
| PayerParty | PayerParty | |||
| ContactPerson | ContactPerson | |||
| ServiceDocGrossAmount | ServiceDocGrossAmount | |||
| ServiceDocNetAmount | ServiceDocNetAmount | |||
| ServiceDocTaxAmount | ServiceDocTaxAmount | |||
| TransactionCurrency | TransactionCurrency | |||
| ReferenceServiceRequest | ||||
| ReferenceServiceContract | _RefServiceContract | ServiceContract | ||
| RefServiceOrderTemplate | ||||
| ReferenceServiceOrder | _CustMgmtExtRef | CustMgmtExtRefID | ||
| ShippingCondition | ShippingCondition | |||
| RespyMgmtServiceTeam | RespyMgmtServiceTeam | |||
| RespyMgmtServiceTeamName | _ServiceTeamHeader | TeamName | ||
| RespyMgmtGlobalTeamID | _ServiceTeamHeader | RespyMgmtGlobalTeamID | ||
| SrvcOrdCreditStatus | SrvcDocCreditStatus | |||
| SrvcOrdGTSEmbargoStatus | SrvcDocGTSEmbargoStatus | |||
| SrvcOrdGTSScreeningStatus | SrvcDocGTSScreeningStatus | |||
| SrvcOrdGTSLglControlStatus | SrvcDocGTSLglControlStatus | |||
| SrvcOrdExecutionStatus | SrvcDocExecutionStatus | |||
| PaymentTerms | PaymentTerms | |||
| PaymentMethod | PaymentMethod | |||
| SEPAMandate | SEPAMandate | |||
| SrvcSEPAMandateRelevance | SrvcSEPAMandateRelevance | |||
| SalesOrganizationOrgUnitID | SalesOrganizationOrgUnitID | |||
| ServiceOrganization | ServiceOrganization | |||
| SalesOfficeOrgUnitID | SalesOfficeOrgUnitID | |||
| SalesGroupOrgUnitID | SalesGroupOrgUnitID | |||
| EnterpriseServiceOrganization | EnterpriseServiceOrganization | |||
| FSMServiceCall | _SrvcOrdRefFSMServiceCall | FSMServiceCall | ||
| ServiceOrderRejectionReason | ServiceDocumentRejectionReason | |||
| ReferenceInHouseRepair | ReferenceInHouseRepair | |||
| ReferenceInHouseRepairItem | ReferenceInHouseRepairItem | |||
| ServiceDocumentCategory | BusinessActivityCategory | |||
| _Item | _Item | |||
| _PersonResponsible | _PersonResponsible | |||
| _ReferenceObject | _ReferenceObject | |||
| _ProductReferenceObject | _ProductReferenceObject | |||
| _Confirmation | _Confirmation | |||
| _Text | _Text | |||
| _Defect | _Defect | |||
| _ReferenceServiceContract | _ReferenceServiceContract | |||
| _PricingElement | _PricingElement | |||
| _Qualification | _Qualification | |||
| _ServiceOrdUserStatus | _ServiceOrdUserStatus | |||
| _InHouseRepairItem | _InHouseRepairItem | |||
| _SrvcOrdTransHistory | _SrvcOrdTransHistory | |||
| _Partner | _Partner | |||
| _Duration | _Duration | |||
| _Appointment | _Appointment |
@ClientHandling.algorithm:#SESSION_VARIABLE
@EndUserText.label: 'Service Order'
@VDM: {
viewType: #COMPOSITE,
lifecycle.contract.type: #PUBLIC_REMOTE_API
}
@AbapCatalog: {
sqlViewName: 'ASRVORD',
compiler.compareFilter: true,
preserveKey: true
}
@AccessControl: {
authorizationCheck: #CHECK,
personalData.blocking: #('TRANSACTIONAL_DATA')
}
@ObjectModel: {
representativeKey: 'ServiceOrder',
createEnabled: true,
updateEnabled: true,
usageType: {
dataClass: #TRANSACTIONAL,
serviceQuality: #C,
sizeCategory: #L
}
}
@Metadata.ignorePropagatedAnnotations: true
define view A_ServiceOrder
as select from I_ServiceDocumentEnhcd as ServiceOrder
association [0..*] to A_ServiceOrderItem as _Item on $projection.ServiceOrder = _Item.ServiceOrder
association [0..*] to A_ServiceOrderPersonResp as _PersonResponsible on $projection.ServiceOrder = _PersonResponsible.ServiceOrder
association [0..*] to A_ServiceOrderRefObject as _ReferenceObject on $projection.ServiceOrder = _ReferenceObject.ServiceOrder
association [0..*] to A_SrvcOrdProdRefObject as _ProductReferenceObject on $projection.ServiceOrder = _ProductReferenceObject.ServiceOrder
association [0..*] to A_ServiceOrderConfirmation as _Confirmation on $projection.ServiceOrder = _Confirmation.ServiceOrder
association [0..*] to A_ServiceOrderText as _Text on $projection.ServiceOrder = _Text.ServiceOrder
association [0..*] to A_ServiceOrderDefect as _Defect on $projection.ServiceOrder = _Defect.ServiceOrder
association [0..*] to A_SrvcOrdRefServiceContract as _ReferenceServiceContract on $projection.ServiceOrder = _ReferenceServiceContract.ServiceOrder
association [0..1] to I_ServiceDocumentPredecessor as _RefServiceRequest on $projection.ServiceOrderUUID = _RefServiceRequest.ServiceDocumentUUID
and _RefServiceRequest.ServiceDocPrdcssrBusObjType = 'BUS2000223'
// association [0..1] to I_ServiceDocumentPredecessor as _RefServiceContract on $projection.ServiceOrderUUID = _RefServiceContract.ServiceDocumentUUID
// and _RefServiceContract.ServiceDocPrdcssrBusObjType = 'BUS2000112'
association [0..1] to I_ServiceDocumentPredecessor as _RefServiceTemplate on $projection.ServiceOrderUUID = _RefServiceTemplate.ServiceDocumentUUID
and _RefServiceTemplate.ServiceDocPrdcssrBusObjType = 'BUS2000116'
and $projection.ServiceDocumentTemplateType is not initial
association [0..*] to A_ServiceOrderPriceElement as _PricingElement on $projection.ServiceOrder = _PricingElement.ServiceOrder
association [0..*] to A_SrvcOrdQualification as _Qualification on $projection.ServiceOrder = _Qualification.ServiceOrder
association [0..1] to I_RespyMgmtTeamHeaderDetail as _ServiceTeamHeader on $projection.RespyMgmtServiceTeam = _ServiceTeamHeader.RespyMgmtTeamID
association [0..1] to I_SrvcOrdRefFSMServiceCall as _SrvcOrdRefFSMServiceCall on $projection.ServiceOrderUUID = _SrvcOrdRefFSMServiceCall.ServiceDocumentUUID
and _SrvcOrdRefFSMServiceCall.PrdcssrSuccssrDocObjectType = 'FSMCALL'
//Extensibility
association [0..1] to E_ServiceDocument as _Extension on _Extension.ServiceCategory = 'BUS2000116'
and $projection.ServiceOrder = _Extension.ServiceOrder
//External ID
association [0..1] to I_CustMgmtExtRefID as _CustMgmtExtRef on _CustMgmtExtRef.CustMgmtObjectType = 'BUS2000116'
and $projection.ServiceOrder = _CustMgmtExtRef.CustMgmtDocument
and _CustMgmtExtRef.CustMgmtExtRefIDType = '0001'
association [0..1] to P_SrvcPrdcssrSrvcContr as _RefServiceContract on $projection.ServiceOrderUUID = _RefServiceContract.ServiceDocumentUUID
and _RefServiceContract.NumberOfOccurrences = 1
association [0..*] to A_ServiceOrdUserStatus as _ServiceOrdUserStatus on $projection.ServiceOrder = _ServiceOrdUserStatus.ServiceOrder
association [0..*] to A_SrvcOrdPartner as _Partner on $projection.ServiceOrder = _Partner.ServiceOrder
association [0..*] to A_SrvcOrdTransHistory as _SrvcOrdTransHistory on $projection.ServiceOrder = _SrvcOrdTransHistory.ServiceOrder
association [0..*] to A_SrvcOrdDuration as _Duration on $projection.ServiceOrder = _Duration.ServiceOrder
association [0..*] to A_SrvcOrdAppointment as _Appointment on $projection.ServiceOrder = _Appointment.ServiceOrder
association [0..1] to I_WBSElementBasicData as _WBSElement on _WBSElement.WBSElementInternalID = ServiceOrder.WBSElementInternalID
association [0..1] to I_WBSElementBasicData as _WBSElementCO on _WBSElementCO.WBSElement = ServiceOrder.WBSElement
association [0..*] to A_SrvcOrdInHouseRepairItem as _InHouseRepairItem on $projection.ServiceOrder = _InHouseRepairItem.ServiceOrder
{
key ServiceDocument as ServiceOrder,
@ObjectModel.sapObjectNodeTypeReference: 'ServiceDocumentType'
ServiceDocumentType as ServiceOrderType,
ServiceDocumentUUID as ServiceOrderUUID,
ServiceDocumentDescription as ServiceOrderDescription,
ServiceObjectType,
Language,
@ObjectModel.sapObjectNodeTypeReference: 'ServiceDocumentPriority'
ServiceDocumentPriority,
RequestedServiceStartDateTime,
RequestedServiceEndDateTime,
ErlstRequestedDeliveryDateTime,
@ObjectModel.readOnly: true
ServiceDocChangedDateTime,
PostingDate,
@ObjectModel.readOnly: true
ServiceDocumentCreationDate,
@ObjectModel.readOnly: true
ServiceDocumentChangedDate,
@ObjectModel.readOnly: true
ServiceDocumentCreatedByUser,
@ObjectModel.readOnly: true
ServiceDocumentChangedByUser,
ServiceDocumentTemplateType,
PurchaseOrderByCustomer,
CustomerPurchaseOrderDate,
/* STATUS */
// ServiceDocumentIsOpen as ServiceOrderIsOpen,
ServiceDocumentIsReleased as ServiceOrderIsReleased,
// case ServiceDocumentStatus
// when 'C' then 'X'
// else ''
// end as ServiceOrderIsCompleted,
case ServiceDocumentIsOpen
when '' then
case ServiceDocumentIsReleased
when '' then 'X' else ''
end
else ''
end as ServiceOrderIsCompleted,
ServiceDocumentIsRejected as ServiceOrderIsRejected,
@Semantics.booleanIndicator:true
SrvcOrdIsBusinessCompleted,
@Semantics.booleanIndicator:true
@ObjectModel.readOnly: true
SrvcOrdIsBusinessReopened,
/* ORG */
SalesOrganization,
DistributionChannel,
@ObjectModel.sapObjectNodeTypeReference: 'Division'
Division,
SalesOffice,
SalesGroup,
// ServiceOrganization,
/* PARTNER */
SoldToParty,
ShipToParty,
BillToParty,
PayerParty,
ContactPerson,
/* CUMULAT_H */
@Semantics: { amount : {currencyCode: 'TransactionCurrency'} }
ServiceDocGrossAmount,
@Semantics: { amount : {currencyCode: 'TransactionCurrency'} }
ServiceDocNetAmount,
@Semantics: { amount : {currencyCode: 'TransactionCurrency'} }
ServiceDocTaxAmount,
@ObjectModel.sapObjectNodeTypeReference: 'Currency'
TransactionCurrency,
/* DOCFLOW - Preceding Document
@ObjectModel.virtualElement: true
@ObjectModel.virtualElementCalculatedBy: 'cl_crms4_api_odata_srv_ord'
cast ('' as crmt_object_id) as ReferenceServiceRequest,
cast ('' as crmt_object_id) as ReferenceServiceContract, */
_RefServiceRequest._ServiceDoc.ServiceDocument as ReferenceServiceRequest,
//_RefServiceContract._ServiceDoc.ServiceDocument
_RefServiceContract.ServiceContract as ReferenceServiceContract,
_RefServiceTemplate._ServiceDoc.ServiceDocument as RefServiceOrderTemplate,
/* SUBJECT - Categorization Schema
ServiceDefectSchema,
ServiceDefectCategory, */
_CustMgmtExtRef.CustMgmtExtRefID as ReferenceServiceOrder,
/* Shipping */
ShippingCondition,
/********************************************************/
/********* Cloud Specific Fields **************************/
//Service Team
//@ObjectModel.editableFieldFor: 'RespyMgmtServiceTeamName'
//@feature: 'BF:API_ESSENTIALSCOPE'
RespyMgmtServiceTeam,
//@feature: 'BF:API_ESSENTIALSCOPE'
@ObjectModel.readOnly: true
_ServiceTeamHeader.TeamName as RespyMgmtServiceTeamName,
//@feature: 'BF:API_ESSENTIALSCOPE'
_ServiceTeamHeader.RespyMgmtGlobalTeamID as RespyMgmtGlobalTeamID,
@ObjectModel.sapObjectNodeTypeReference: 'SrvcDocCreditStatus'
@Feature: 'BF:API_ESSENTIALSCOPE'
@ObjectModel.readOnly: true
SrvcDocCreditStatus as SrvcOrdCreditStatus,
// GTS Embargo Status
@ObjectModel.readOnly: true
SrvcDocGTSEmbargoStatus as SrvcOrdGTSEmbargoStatus,
// GTS Screening Status
@ObjectModel.readOnly: true
SrvcDocGTSScreeningStatus as SrvcOrdGTSScreeningStatus,
// GTS Legal Control
@ObjectModel.readOnly: true
SrvcDocGTSLglControlStatus as SrvcOrdGTSLglControlStatus,
@ObjectModel.sapObjectNodeTypeReference: 'SrvcDocExecutionStatus'
SrvcDocExecutionStatus as SrvcOrdExecutionStatus,
//@feature: 'BF:API_ESSENTIALSCOPE'
@ObjectModel.sapObjectNodeTypeReference: 'PaymentTerms'
PaymentTerms,
//@feature: 'BF:API_ESSENTIALSCOPE'
@ObjectModel.sapObjectNodeTypeReference: 'PaymentMethod'
PaymentMethod,
//@feature: 'BF:API_ESSENTIALSCOPE'
SEPAMandate,
//@Feature: 'BF:API_ESSENTIALSCOPE'
@ObjectModel.readOnly: true
@ObjectModel.sapObjectNodeTypeReference: 'SrvcSEPAMandateRelevance'
SrvcSEPAMandateRelevance,
case SrvcDocAcctAssgmtObjectType
when '03' then _WBSElementCO.WBSElementExternalID
else _WBSElement.WBSElementExternalID
end as WBSElementExternalID,
// SrvcDocCreditStatus,
/********************************************************/
/********************************************************/
/********* OP Specific Fields **************************/
//@feature: 'BF:API_FULLSCOPE'
SalesOrganizationOrgUnitID,
//@feature: 'BF:API_FULLSCOPE'
ServiceOrganization,
//@feature: 'BF:API_FULLSCOPE'
SalesOfficeOrgUnitID,
//@feature: 'BF:API_FULLSCOPE'
SalesGroupOrgUnitID,
@Feature: 'BF:API_FULLSCOPE'
@ObjectModel.sapObjectNodeTypeReference: 'EnterpriseServiceOrganization'
EnterpriseServiceOrganization,
/********************************************************/
/********************************************************/
/********* FSM Specific Fields **************************/
_SrvcOrdRefFSMServiceCall.FSMServiceCall,
/********************************************************/
@ObjectModel.sapObjectNodeTypeReference: 'SalesDocumentRjcnReason'
ServiceDocumentRejectionReason as ServiceOrderRejectionReason,
/********************************************************/
/********* In-House Repair Specific Fields *************/
ReferenceInHouseRepair as ReferenceInHouseRepair,
ReferenceInHouseRepairItem as ReferenceInHouseRepairItem,
@Feature: 'BF:API_FULLSCOPE' //! OP Specific field
BusinessActivityCategory as ServiceDocumentCategory,
//Associations
_Item,
_PersonResponsible,
_ReferenceObject,
_ProductReferenceObject,
_Confirmation,
_Text,
_Defect,
_ReferenceServiceContract,
_PricingElement,
_Qualification,
_ServiceOrdUserStatus,
_InHouseRepairItem,
_SrvcOrdTransHistory,
//@Feature: 'BF:API_FULLSCOPE'
_Partner,
_Duration,
_Appointment
}
where
ServiceObjectType = 'BUS2000116' // Service Process
and ServiceDocumentIsQuotation is initial
Learn More
- What Is a CDS View in SAP S/4HANA?
- Types of CDS Views: Basic, Composite, Consumption, and Transactional
- SAP Tables vs CDS Views — Key Differences
- Understanding Data Lineage in SAP S/4HANA
- VDM (Virtual Data Model) in SAP S/4HANA Explained
- CDS View Annotations — A Complete Guide
- CDS View Field Mapping and Associations
- Understanding the SAP S/4HANA Data Model
- CDS View Extensions and Custom Fields in SAP S/4HANA
- Released APIs and Stability Contracts in SAP S/4HANA