@AbapCatalog.sqlViewName: 'IPROCSTFRCDTA'
@AbapCatalog.compiler.compareFilter: true
@AccessControl.authorizationCheck: #CHECK
@AccessControl.personalData.blocking: #NOT_REQUIRED
@VDM.viewType: #COMPOSITE
@EndUserText.label: 'Project Cost Forecast: ML Training Input'
@ClientHandling: {
type: #CLIENT_DEPENDENT,
algorithm: #SESSION_VARIABLE
}
@ObjectModel: {
semanticKey: [ 'Project' ],
usageType: {
serviceQuality: #D,
dataClass: #MIXED,
sizeCategory: #L
}
}
@VDM.lifecycle.contract.type: #SAP_INTERNAL_API
define view I_PPM_ProjectCostForecastData
as select from I_PPM_ProjectSummaryTask as ProjSumTask
left outer join P_ProjectCostSum as ProjCost on ProjCost.ProjectInternalID = ProjSumTask.ProjectInternalID
left outer join I_ProjectCostDates as ProjDates on ProjDates.ProjectInternalID = ProjCost.ProjectInternalID
left outer join I_ProjectToWBSElementCount as WBSCount on WBSCount.ProjectInternalID = ProjDates.ProjectInternalID
left outer join I_PPM_ProjTeamMembersCntNoSt as TeamMemberCnt on TeamMemberCnt.ProjectSummaryTaskUUID = ProjSumTask.ProjectSummaryTaskUUID
left outer join I_PPM_ProjTeamStaffingCntNoSt as TeamStaffingCnt on TeamStaffingCnt.ProjectSummaryTaskUUID = ProjSumTask.ProjectSummaryTaskUUID
{
// key ProjSumTask.ProjectSummaryTaskUUID,
//key ProjSumTask.ProjectSummaryTaskUUID,
key ProjSumTask.ProjectInternalID,
'1' as TargetProjectID,
// ProjCost.ProjectInternalID as TargetProjectID,
ProjSumTask.WBSElementInternalID,
ProjSumTask._ProjObjRoot.WBSDescription,
ProjSumTask._ProjObjRoot.WBSElementObject,
ProjSumTask._ProjObjRoot._Project.Project,
--cast (ProjCost.ActualAmountInGlobalCurrency as fis_act_ksl) as ActualAmountInGlobalCurrency,
cast (ProjCost.ActualAmountInGlobalCurrency as fis_act_ksl) as ActualCostAmount,
ProjSumTask._ProjObjRoot.CompanyCode,
ProjSumTask._ProjObjRoot.ControllingArea,
ProjSumTask._ProjObjRoot.ProfitCenter,
ProjSumTask._I_Project.ProjectProfileCode,
ProjSumTask._ProjObjRoot.Plant,
ProjSumTask._ProjObjRoot.FunctionalArea,
ProjSumTask._ProjObjRoot.CostCenter,
ProjSumTask._ProjObjRoot._ProjectType.ProjectType,
ProjSumTask.ProjectProcessingStatus, //only needed for Training Filters
//Actual Start/End not in Project and WBS available.
ProjSumTask._ProjObjRoot._Project.PlannedStartDate, //Planned Date. Not in WBS available. Retrieved from Project
ProjSumTask._ProjObjRoot._Project.PlannedEndDate, //Planned Date. Not in WBS available. Retrieved from Project
// Duration calculated based on Project Dates
case
when ProjSumTask._ProjObjRoot._Project.PlannedStartDate > '19000101'
and ProjSumTask._ProjObjRoot._Project.PlannedEndDate > '19000101'
--then cast ((dats_days_between(ProjSumTask._ProjObjRoot._Project.PlannedStartDate, ProjSumTask._ProjObjRoot._Project.PlannedEndDate) + 1) as int8_lew )
--then cast ((dats_days_between(ProjSumTask._ProjObjRoot._Project.PlannedStartDate, ProjSumTask._ProjObjRoot._Project.PlannedEndDate) + 1) as ps_plfaz )
then cast ((dats_days_between(ProjSumTask._ProjObjRoot._Project.PlannedStartDate, ProjSumTask._ProjObjRoot._Project.PlannedEndDate) + 1) as numberofdays )
else 0
end as PlannedDuration,
// Dates based on Planned Cost
--ProjDates.PlanCostStartDate,
@Semantics.businessDate.at: true
// PAI Workaround: Try explicit data element assignment
cast ((ProjDates.PlannedStartByErlstPlannedCost) as dpr_tv_planstartdate ) as PlannedStartByErlstPlannedCost,
--ProjDates.PlanCostStartYearMonth,
--cast (ProjDates.PlanCostStartYearMonth as vdm_yearmonth ) as PlanCostStartYearMonth,
// PAI Workaround: Try explicit data element assignment
cast (ProjDates.PlannedCostStartYearMonth as vdm_yearmonth) as PlannedCostStartYearMonth,
--ProjDates.PlanCostEndDate,
@Semantics.businessDate.at: true
// PAI Workaround: Try explicit data element assignment
cast (ProjDates.PlannedEndByLtstPlannedCost as dpr_tv_planfinishdate ) as PlannedEndByLtstPlannedCost,
--ProjDates.PlanCostEndYearMonth,
--cast (ProjDates.PlanCostEndYearMonth as vdm_yearmonth ) as PlanCostEndYearMonth,
--cast (ProjDates.PlanCostEndYearMonth as num6 ) as PlanCostEndYearMonth,
// PAI Workaround: Try explicit data element assignment
cast (ProjDates.PlannedCostEndYearMonth as vdm_yearmonth) as PlannedCostEndYearMonth,
// Duration calculated based on Planned Cost
case
when ProjDates.PlannedStartByErlstPlannedCost > '19000101' and ProjDates.PlannedEndByLtstPlannedCost > '19000101'
--then dats_days_between(ProjDates.PlanCostStartDate,ProjDates.PlanCostEndDate) + 1
// PAI Workaround: Try explicit data element assignment
then cast ((dats_days_between(ProjDates.PlannedStartByErlstPlannedCost,ProjDates.PlannedEndByLtstPlannedCost) + 1) as numberofdays )
else 0
end as PlannedCostErlstToLtstDurn,
// Dates based on Actual Cost
--ProjDates.ActualCostStartDate,
@Semantics.businessDate.at: true
// PAI Workaround: Try explicit data element assignment
cast (ProjDates.ActualStartByErlstActualCost as dpr_tv_actual_start) as ActualStartByErlstActualCost,
--ProjDates.ActualCostStartYearMonth,
// PAI Workaround: Try explicit data element assignment
cast (ProjDates.ActualCostStartYearMonth as vdm_yearmonth ) as ActualCostStartYearMonth,
--ProjDates.ActualCostEndYearMonth,
// PAI Workaround: Try explicit data element assignment
cast (ProjDates.ActualCostEndYearMonth as vdm_yearmonth ) as ActualCostEndYearMonth,
--ProjDates.ActualCostEndDate,
@Semantics.businessDate.at: true
// PAI Workaround: Try explicit data element assignment
cast (ProjDates.ActualEndByLtstActualCost as dpr_tv_actual_finish ) as ActualEndByLtstActualCost,
// Duration calculated based on Actual Cost
case
when ProjDates.ActualStartByErlstActualCost > '19000101' and ProjDates.ActualEndByLtstActualCost > '19000101'
--then dats_days_between(ProjDates.ActualCostStartDate,ProjDates.ActualCostEndDate) + 1
// PAI Workaround: Try explicit data element assignment
then cast ((dats_days_between(ProjDates.ActualStartByErlstActualCost, ProjDates.ActualEndByLtstActualCost) + 1) as numberofdays )
else 0
end as ActualCostErlstToLtstDurn,
ProjSumTask._ProjObjRoot.CostingSheet,
ProjSumTask._ProjObjRoot.ResponsibleCostCenter,
ProjSumTask._ProjObjRoot.FactoryCalendar,
ProjSumTask._ProjObjRoot.InvestmentProfile,
cast( WBSCount.NumberOfWBSElements as int4 ) as NumberOfWBSElements, //WBSCount.NumberOfWBSElements,
cast( TeamMemberCnt.TeamMemberCount as int4 ) as TeamMemberCount, //TeamMemberCnt.TeamMemberCount
cast( TeamStaffingCnt.TeamMemberRoleStaffingCount as int4 ) as TeamMemberRoleStaffingCount //TeamStaffingCnt.TeamMemberRoleStaffingCount
}
where
ProjSumTask.ProjectInternalID <> '00000000'
and ProjSumTask.WBSElementInternalID <> '00000000'
and ProjSumTask._ProjObjRoot.CompanyCode is not null
and ProjSumTask._ProjObjRoot.ControllingArea is not null
/*+[internal] {
"BASEINFO":
{
"FROM":
[
"I_PPM_PROJECTSUMMARYTASK",
"I_PPM_PROJTEAMMEMBERSCNTNOST",
"I_PPM_PROJTEAMSTAFFINGCNTNOST",
"I_PROJECTBASICDATA",
"I_PROJECTCOSTDATES",
"I_PROJECTTOWBSELEMENTCOUNT",
"I_PROJECTTYPE",
"I_WBSELEMENTBASICDATA",
"P_PROJECTCOSTSUM"
],
"ASSOCIATED":
[],
"BASE":
[],
"ANNO_REF":
[],
"SCALAR_FUNCTION":
[],
"VERSION":0,
"ANNOREF_EVALUATION_ERROR":""
}
}*/