//@AbapCatalog.sqlViewName: 'CPROJPRFTBLTY'
@VDM.viewType: #CONSUMPTION
@EndUserText.label: 'Project Profitability Overview'
@AccessControl.authorizationCheck: #CHECK
@AccessControl.personalData.blocking: #REQUIRED
@AccessControl.auditFilter: #ENABLED
@Metadata.allowExtensions: true
//@AbapCatalog.preserveKey:true
@Analytics.settings.maxProcessingEffort: #HIGH
//@ClientHandling.algorithm: #SESSION_VARIABLE
@Metadata.ignorePropagatedAnnotations: true
//@AbapCatalog.compiler.compareFilter:true
@ObjectModel.usageType.serviceQuality: #D
@ObjectModel.usageType.sizeCategory: #XXL
@ObjectModel.usageType.dataClass: #MIXED
@UI.chart: [{
title: 'Recognized Margin',
description: 'Recognized Margin',
chartType: #COLUMN,
dimensions: [ 'CompanyCode' ],
dimensionAttributes: [{
dimension: 'CompanyCode',
role: #CATEGORY
}],
measures: [ 'RecognizedCOGSAmtInCCCrcy','RecognizedRevnAmtInCCCrcy'],
measureAttributes: [{
measure: 'RecognizedCOGSAmtInCCCrcy',
role: #AXIS_1
},{
measure: 'RecognizedRevnAmtInCCCrcy',
role: #AXIS_1
}]
},{
qualifier: 'RecognizedMarginWaterfall',
title: 'Recognized Margin',
description: 'Recognized Margin',
chartType: #COLUMN,
dimensions: [ 'CompanyCode' ],
dimensionAttributes: [{
dimension: 'CompanyCode',
role: #CATEGORY
}],
measures: [ 'RecognizedCOGSAmtInCCCrcy','RecognizedRevnAmtInCCCrcy'],
measureAttributes: [{
measure: 'RecognizedCOGSAmtInCCCrcy',
role: #AXIS_1
},{
measure: 'RecognizedRevnAmtInCCCrcy',
role: #AXIS_1
}]
},{
qualifier: 'RecognizedRevenueDonut',
title: 'Recognized Revenue By G/L Account',
description: 'Recognized Revenue By G/L Account',
chartType: #COLUMN,
dimensions: [ 'GLAccount' ],
dimensionAttributes: [{
dimension: 'GLAccount',
role: #CATEGORY
}],
measures: [ 'RecognizedRevnAmtInCCCrcy'],
measureAttributes: [{
measure: 'RecognizedRevnAmtInCCCrcy',
role: #AXIS_1
}]
},{
qualifier: 'RecognizedMarginByPC',
title: 'Recognized Margin By Profit Center',
description: 'Recognized Margin',
chartType: #COLUMN,
dimensions: [ 'ProfitCenter' ],
dimensionAttributes: [{
dimension: 'ProfitCenter',
role: #CATEGORY
}],
measures: [ 'RecognizedMarginAmtInCCCrcy'],
measureAttributes: [{
measure: 'RecognizedMarginAmtInCCCrcy',
role: #AXIS_1
}]
},{
qualifier: 'RecognizedMarginByOPC',
title: 'Recognized Margin By Origin ProfitCenter',
description: 'Recognized Margin',
chartType: #COLUMN,
dimensions: [ 'OriginProfitCenter' ],
dimensionAttributes: [{
dimension: 'OriginProfitCenter',
role: #CATEGORY
}],
measures: [ 'RecognizedMarginAmtInCCCrcy'],
measureAttributes: [{
measure: 'RecognizedMarginAmtInCCCrcy',
role: #AXIS_1
}]
},{
qualifier: 'RecognizedMarginScatterBySalesOrganzation',
title: 'Recognized Margin By Sales Organzation',
description: 'Recognized Margin By Sales Organzation',
chartType: #SCATTER,
dimensions: [ 'SalesOrganization' ],
dimensionAttributes: [{
dimension: 'SalesOrganization',
role: #CATEGORY
}],
measures: [ 'RecognizedCOGSAmtInCCCrcy','RecognizedRevnAmtInCCCrcy'],
measureAttributes: [{
measure: 'RecognizedCOGSAmtInCCCrcy',
role: #AXIS_2
},{
measure: 'RecognizedRevnAmtInCCCrcy',
role: #AXIS_2
}]
},{
qualifier: 'RecognizedMarginScatterByMaterialGroup',
title: 'Recognized Margin By Product Sold Group',
description: 'Recognized Margin By Product Sold Group',
chartType: #SCATTER,
dimensions: [ 'MaterialGroup' ],
dimensionAttributes: [{
dimension: 'MaterialGroup',
role: #CATEGORY
}],
measures: [ 'RecognizedCOGSAmtInCCCrcy','RecognizedRevnAmtInCCCrcy'],
measureAttributes: [{
measure: 'RecognizedCOGSAmtInCCCrcy',
role: #AXIS_2
},{
measure: 'RecognizedRevnAmtInCCCrcy',
role: #AXIS_2
}]
},{
qualifier: 'RecognizedMarginScatterByCustomerGroup',
title: 'Recognized Margin By Customer Group',
description: 'Recognized Margin By Customer Group',
chartType: #SCATTER,
dimensions: [ 'CustomerGroup' ],
dimensionAttributes: [{
dimension: 'CustomerGroup',
role: #CATEGORY
}],
measures: [ 'RecognizedCOGSAmtInCCCrcy','RecognizedRevnAmtInCCCrcy'],
measureAttributes: [{
measure: 'RecognizedCOGSAmtInCCCrcy',
role: #AXIS_2
},{
measure: 'RecognizedRevnAmtInCCCrcy',
role: #AXIS_2
}]
},{
qualifier: 'RecognizedMarginByResources',
title: 'Recognized Margin By Resource',
description: 'Recognized Margin By Resource',
chartType: #COLUMN,
dimensions: [ 'CostAnalysisResource' ],
dimensionAttributes: [{
dimension: 'CostAnalysisResource',
role: #CATEGORY
}],
measures: [ 'RecognizedMarginAmtInCCCrcy'],
measureAttributes: [{
measure: 'RecognizedMarginAmtInCCCrcy',
role: #AXIS_2
}]
},{
qualifier: 'WIPRevCOS',
title: 'WIP By Company',
description: 'WIP By Company',
chartType: #COLUMN,
dimensions: [ 'CompanyCode' ],
dimensionAttributes: [{
dimension: 'CompanyCode',
role: #SERIES
}],
measures: [ 'AccruedCOGSAmtInCCCrcy', 'AccruedRevenueAmtInCCCrcy', 'DeferredCOGSAmtInCCCrcy', 'DeferredRevenueAmtInCCCrcy'],
measureAttributes: [{
measure: 'DeferredCOGSAmtInCCCrcy', role: #AXIS_1
}, {
measure: 'AccruedCOGSAmtInCCCrcy', role: #AXIS_1
}, {
measure: 'DeferredRevenueAmtInCCCrcy', role: #AXIS_1
}, {
measure: 'AccruedRevenueAmtInCCCrcy', role: #AXIS_1
}]
},{
qualifier: 'WIPRevCOSByProdSoldGroup',
title: 'WIP By Product Sold Group',
description: 'WIP By Product Sold Group',
chartType: #COLUMN,
dimensions: [ 'MaterialGroup' ],
dimensionAttributes: [{
dimension: 'MaterialGroup',
role: #CATEGORY
}],
measures: [ 'AccruedCOGSAmtInCCCrcy', 'AccruedRevenueAmtInCCCrcy', 'DeferredCOGSAmtInCCCrcy', 'DeferredRevenueAmtInCCCrcy'],
measureAttributes: [{
measure: 'DeferredCOGSAmtInCCCrcy', role: #AXIS_1
}, {
measure: 'AccruedCOGSAmtInCCCrcy', role: #AXIS_1
}, {
measure: 'DeferredRevenueAmtInCCCrcy', role: #AXIS_1
}, {
measure: 'AccruedRevenueAmtInCCCrcy', role: #AXIS_1
}]
},{
qualifier: 'WIPRevCOSByCustomerGroup',
title: 'WIP By Customer Group',
description: 'WIP By Customer Group',
chartType: #COLUMN,
dimensions: [ 'CustomerGroup' ],
dimensionAttributes: [{
dimension: 'CustomerGroup',
role: #CATEGORY
}],
measures: [ 'AccruedCOGSAmtInCCCrcy', 'AccruedRevenueAmtInCCCrcy', 'DeferredCOGSAmtInCCCrcy', 'DeferredRevenueAmtInCCCrcy'],
measureAttributes: [{
measure: 'DeferredCOGSAmtInCCCrcy', role: #AXIS_1
}, {
measure: 'AccruedCOGSAmtInCCCrcy', role: #AXIS_1
}, {
measure: 'DeferredRevenueAmtInCCCrcy', role: #AXIS_1
}, {
measure: 'AccruedRevenueAmtInCCCrcy', role: #AXIS_1
}]
}]
@UI.presentationVariant: [{
qualifier: 'TopProjectByMargin',
sortOrder: [{
by: 'RecognizedMarginAmtInCCCrcy',
direction: #DESC
}]
},
{
qualifier: 'RecognizedMarginByCenter',
sortOrder: [{
by: 'RecognizedMarginAmtInCCCrcy',
direction: #DESC
}]
}]
@UI.selectionVariant:[{
qualifier: 'CostByCostTags',
id: 'CostByCostTags',
text: 'Cost By Cost Tags',
filter: 'SemanticTag in (COGS_PERT,TRAVELCST,SERVICECST,HRD_COST,LIC_COST,MATCST,COGS_OMAT,OVH_ADMIN,OTHERSMISC)'
},{
qualifier: 'RecognizedMarginByResources',
id: 'RecognizedMarginByResources',
text: 'Recognized Margin By Resource',
filter: 'CostAnalysisResource in (SAPACTCC,SAPACTI,SAPACTE,SAPACTECC,SAPEXPCC,SAPEXPI,SAPEXPE)'
},{
qualifier: 'RecognizedRevenueDonut',
id: 'RecognizedRevenueDonut',
text: 'RecognizedRevenueDonut',
filter: 'SemanticTag eq RECO_REV'
}]
define view entity C_ProjectProfitabilityOverview
with parameters
@Consumption.hidden: true
@Environment.systemField: #SYSTEM_LANGUAGE
P_Language : sylangu,
@Consumption.hidden: true
@Environment.systemField: #SYSTEM_DATE
P_KeyDate : sydate
//,
//@Consumption.valueHelpDefinition: [{
// entity: {
// name: 'I_GLAccountHierarchyStdVH',
// element: 'GLAccountHierarchy'
// }
//}]
// @Consumption.derivation: { lookupEntity: 'I_UserSetGetParamForCtrlgArea',
// resultElement: 'CtrlgStdFinStatementVersion' }
//P_GLAccountHierarchy : fins_sem_tag_hryid
as select from I_GLAccountLineItemSemTag as I_GLAccountLineItemSemTag
association [1..1] to C_BusinessPartner as _BusinessPartner on $projection.Customer = _BusinessPartner.BusinessPartner
{
@Consumption.filter :{ selectionType: #SINGLE, multipleSelections: false, mandatory: true, defaultValue: 'YPS2' }
@UI.selectionField: [{position: 10 }]
@UI.textArrangement: #TEXT_LAST
@ObjectModel.text.element: [ 'GLAccountHierarchyName' ]
@EndUserText.label: 'Financial Statement Version'
@Consumption.valueHelpDefinition: [{ entity:{ name: 'I_GLAccountHierarchyStdVH', element: 'GLAccountHierarchy' } }]
key GLAccountHierarchy,
// In ODATA Service ,Derivation must be used as mandatory filter: otherwise space will get the derivation value defautly!!!
// Analytical Query does have this problem
// @Consumption.derivation: { lookupEntity: 'I_Ledger',
// resultElement: 'Ledger', binding: [
// { targetElement : 'IsLeadingLedger' , type : #CONSTANT, value : 'X' } ]
// }
@Consumption.filter :{ selectionType: #SINGLE, multipleSelections: true, mandatory: false, defaultValue: '0L' }
@AnalyticsDetails.query.totals: #HIDE
@UI.selectionField:[{position: 30, exclude: false }]
@UI.textArrangement: #TEXT_LAST
@ObjectModel.text.element: [ 'LedgerName' ]
@Consumption.valueHelpDefinition: [{ entity:{ name: 'I_Ledger', element: 'Ledger' } }]
key Ledger,
@Consumption.filter :{ selectionType: #SINGLE, multipleSelections: true, mandatory: false }
@UI.selectionField:[{position: 12, exclude: false }]
@AnalyticsDetails.query.variableSequence : 20
@UI.textArrangement: #TEXT_LAST
@ObjectModel.text.element: [ 'CompanyCodeName' ]
@Consumption.valueHelpDefinition: [{ entity:{ name: 'C_CompanyCodeValueHelp', element: 'CompanyCode' } }]
key CompanyCode,
key AccountingDocument,
key LedgerGLLineItem,
key SourceLedger,
@AnalyticsDetails.query.axis: #FREE
key SemanticTag,
@Consumption.filter :{ selectionType: #SINGLE, multipleSelections: true, mandatory: false }
@AnalyticsDetails.query.variableSequence : 60
@AnalyticsDetails.query.totals: #SHOW
@UI.selectionField:[{position: 15, exclude: false }]
@Semantics.fiscal.year: true
@Consumption.valueHelpDefinition: [{ entity:{ name: 'I_FiscalYearForCompanyCode', element: 'FiscalYear' } }]
// @Consumption.derivation: {
// lookupEntity: 'F_FsclYrDteFuncSglVal',
// resultElement: 'FiscalYear',
// binding: [
// { targetParameter: 'P_DateFunction', type : #CONSTANT, value: 'CURRENTFISCALYEAR' },
// { targetParameter: 'P_FiscalYearVariant', type : #CONSTANT, value: 'K4' }
// ]
// }
key FiscalYear,
@UI.textArrangement: #TEXT_LAST
@ObjectModel.text.element: [ 'ProjectName' ]
@AnalyticsDetails.query.axis: #ROWS
@AnalyticsDetails.query.totals: #SHOW
@Consumption.filter :{ selectionType: #SINGLE, multipleSelections: true, mandatory: false }
@AnalyticsDetails.query.variableSequence : 30
@UI.selectionField:[{position: 25, exclude: false }]
@UI.lineItem:[ {
qualifier: 'TopProjectByMargin',
position: 1,
importance: #HIGH
}]
@Consumption.valueHelpDefinition: [
{ entity: { name: 'I_ProjectByExternalID',
element: 'ProjectExternalID' }
}]
//key cast ( Project as ps_pspid_edit preserving type ) as Project,
key ProjectExternalID as Project,
@AnalyticsDetails.query.totals: #SHOW
//key cast ( WBSElement as fis_wbsext_no_conv preserving type ) as WBSElement,
key WBSElementExternalID,
@AnalyticsDetails.query.totals: #SHOW
@Consumption.filter :{ selectionType: #SINGLE, multipleSelections: true, mandatory: false }
@AnalyticsDetails.query.variableSequence : 50
@Semantics.fiscal.period: true
key FiscalPeriod,
@AnalyticsDetails.query.axis: #ROWS
@AnalyticsDetails.query.totals: #SHOW
@UI.textArrangement: #TEXT_LAST
key SoldProduct,
@Semantics.text: true
@UI.hidden: true
_GLAccountHierarchy._Text[1:Language = $session.system_language].GLAccountHierarchyName as GLAccountHierarchyName,
@Semantics.text: true
@UI.hidden: true
_CompanyCode.CompanyCodeName as CompanyCodeName,
@Semantics.text: true
@UI.hidden: true
_Ledger._Text[1:Language = $session.system_language].LedgerName as LedgerName,
@Semantics.text: true
@UI.hidden: true
_ProjectExternalID.ProjectDescription as ProjectName,
@UI.textArrangement: #TEXT_LAST
@ObjectModel.text.element: [ 'ProfitCenterName' ]
@Consumption.valueHelpDefinition: [{ entity:{ name: 'I_ProfitCenterVH', element: 'ProfitCenter' } }]
ProfitCenter,
@Semantics.text: true
@UI.hidden: true
@EndUserText.label: 'Profit Center Name'
@EndUserText.quickInfo: 'Profit Center Name'
_CurrentProfitCenter._Text[1:Language = $session.system_language].ProfitCenterName as ProfitCenterName,
@UI.textArrangement: #TEXT_LAST
@ObjectModel.text.element: ['CustomerName']
@Consumption: {
valueHelpDefinition: [
{ entity: { name : 'I_Customer_VH', element: 'Customer' } ,
qualifier: 'CustMultiAddr1',
label: 'Customers with Standard Address'},
{ entity: { name: 'I_BPCustomerMultiAddrVH', element: 'Customer'},
qualifier: 'CustMultiAddr',
label: 'Customers with Multiple Addresses' ,
enabled: 'BPCustMultiAddrIsActive' }
]
}
Customer,
@UI.hidden: true
_BusinessPartner.BPCustMultiAddrIsActive as BPCustMultiAddrIsActive,
@Semantics.text: true
@UI.hidden: true
_Customer.CustomerName as CustomerName,
@UI.textArrangement: #TEXT_LAST
@ObjectModel.text.element: [ 'CustomerGroupName' ]
@Consumption.filter :{ selectionType: #SINGLE, multipleSelections: true, mandatory: false }
@Consumption.valueHelpDefinition: [{ entity:{ name: 'I_CustomerGroup', element: 'CustomerGroup' } }]
CustomerGroup,
@Semantics.text: true
@UI.hidden: true
@EndUserText.label: 'Customer Group Name'
@EndUserText.quickInfo: 'Customer Group Name'
_CustomerGroup._Text[1:Language = $session.system_language].CustomerGroupName as CustomerGroupName,
FiscalYearVariant,
@UI.textArrangement: #TEXT_LAST
@Consumption.filter :{ selectionType: #INTERVAL, multipleSelections: true, mandatory: false }
@Consumption.valueHelpDefinition: [{ entity:{ name: 'I_FiscalYearForVariant', element: 'FiscalYear' } }]
@Semantics.fiscal.year: true
LedgerFiscalYear,
@ObjectModel.text.element: ['SalesOrganizationName']
@UI.textArrangement: #TEXT_LAST
@Consumption.valueHelpDefinition: [{ entity:{ name: 'C_RevnVarSlsOrgVH', element: 'SalesOrganization' } }]
SalesOrganization,
@Semantics.text: true
@UI.hidden: true
_SalesOrganization._Text[1:Language = $session.system_language].SalesOrganizationName,
@ObjectModel.text.element: ['GLAccountName']
@UI.textArrangement: #TEXT_LAST
GLAccount,
@Semantics.text: true
@UI.hidden: true
_GLAccountInChartOfAccounts._Text[1: Language = $parameters.P_Language ].GLAccountName,
OriginProfitCenter,
CostAnalysisResource,
ControllingArea,
@UI.textArrangement: #TEXT_LAST
@ObjectModel.text.element: [ 'SoldProductGroupName' ]
MaterialGroup,
@Semantics.text: true
@UI.hidden: true
@EndUserText.label: 'Sold Product Group Name'
@EndUserText.quickInfo: 'Sold Product Group Name'
_MaterialGroup._Text[1:Language = $session.system_language].MaterialGroupName as SoldProductGroupName,
@Semantics.fiscal.yearPeriod: true
FiscalYearPeriod,
@DefaultAggregation: #SUM
@Semantics.amount.currencyCode: 'CompanyCodeCurrency'
cast ( BilledRevenueAmtInCoCodeCrcy as fins_trr_actrevn preserving type ) as BilledRevenueAmtInCoCodeCrcy,
@DefaultAggregation: #SUM
@Semantics.amount.currencyCode: 'CompanyCodeCurrency'
RecognizableCostAmtInCCCrcy,
@UI.dataPoint:{
title:'Recognized Revenue',
description: 'Recognized Revenue',
longDescription: 'Recognized Revenue Amount',
criticalityCalculation: {
improvementDirection: #MAXIMIZE
},
valueFormat.numberOfFractionalDigits: 3,
visualization: #NUMBER
}
@DefaultAggregation: #SUM
@Semantics.amount.currencyCode: 'CompanyCodeCurrency'
RecognizedRevnAmtInCCCrcy,
@UI.dataPoint:{
title:'Recognized COGS',
description: 'Recognized COGS',
longDescription: 'Recognized Cost Of Goods Sold',
criticalityCalculation: {
improvementDirection: #MINIMIZE
},
valueFormat.numberOfFractionalDigits: 3,
visualization: #NUMBER
}
@DefaultAggregation: #SUM
@Semantics.amount.currencyCode: 'CompanyCodeCurrency'
RecognizedCOGSAmtInCCCrcy,
@UI.lineItem:[ {
qualifier: 'TopProjectByMargin',
position: 10,
importance: #HIGH,
type:#AS_DATAPOINT
}]
@UI.dataPoint:{
title:'Recognized Margin',
description: 'Recognized Margin',
longDescription: 'Recognized Margin',
criticalityCalculation: {
improvementDirection: #MAXIMIZE
},
visualization: #BULLET_CHART,
valueFormat.numberOfFractionalDigits: 3
}
@UI.identification: [
{
importance: #HIGH,
type: #FOR_INTENT_BASED_NAVIGATION,
//semanticObjectAction: 'displayProjectBooklet'
semanticObjectAction: 'analyzeProjectProfitability'
}
]
@Consumption.semanticObject: 'Project'
@DefaultAggregation: #SUM
@Semantics.amount.currencyCode: 'CompanyCodeCurrency'
RecognizedMarginAmtInCCCrcy,
@UI.dataPoint:{
title:'Asset/Liability',
description: 'Asset/Liability',
longDescription: 'Asset/Liability',
criticalityCalculation: {
improvementDirection: #MAXIMIZE
},
valueFormat.numberOfFractionalDigits: 3,
visualization: #NUMBER
}
@AnalyticsDetails.query.hidden: true
@DefaultAggregation: #SUM
@Semantics.amount.currencyCode: 'CompanyCodeCurrency'
AssetLiabilityAmtInCCCrcy,
@DefaultAggregation: #SUM
@Semantics.amount.currencyCode: 'CompanyCodeCurrency'
RevenueAdjustmentAmtInCCCrcy,
@DefaultAggregation: #SUM
@Semantics.amount.currencyCode: 'CompanyCodeCurrency'
COGSAdjustmentAmtInCCCrcy,
@DefaultAggregation: #SUM
@Semantics.amount.currencyCode: 'CompanyCodeCurrency'
DeferredCOGSAmtInCCCrcy,
@DefaultAggregation: #SUM
@Semantics.amount.currencyCode: 'CompanyCodeCurrency'
DeferredRevenueAmtInCCCrcy,
@DefaultAggregation: #SUM
@Semantics.amount.currencyCode: 'CompanyCodeCurrency'
AccruedRevenueAmtInCCCrcy,
@DefaultAggregation: #SUM
@Semantics.amount.currencyCode: 'CompanyCodeCurrency'
AccruedCOGSAmtInCCCrcy,
CompanyCodeCurrency,
_BusinessPartner,
//Add these fields to enhance the DCL to inherit I_GLAccountLineItem
FinancialAccountType,
ValuationArea,
SalesDocument,
Segment,
Supplier,
DistributionChannel,
OrganizationDivision,
CostCenter,
OrderID,
AssetClass,
PostingDate,
FunctionalArea,
AccountingDocumentType,
ServiceDocumentType,
ServiceDocument,
_CurrentProfitCenter,
_AccountingDocumentType,
_ServiceDocument,
_CurrentCostCenter,
_Order,
_Customer,
_Supplier,
_SalesDocument,
_FinancialAccountType
}
where
//I_GLAccountLineItemSemTag.GLAccountHierarchy = $parameters.P_GLAccountHierarchy
//and
AccountAssignmentType = 'PR'
and SemanticTag <> 'NTINC_ALAC'