Measures Formulas

You can use Primavera Cloud Expression Language to define custom portfolio and strategy measures that enable you to track your organization's performance metrics. Primavera Cloud Expression Language supports the creation of two measure types, Field Based or Measure Based.

Field Based Measures

Field based measures aggregate object field values to set measure actuals and targets. Primavera Cloud Expression Language provides aggregation types that specify how a measure is calculated. For example, the aggregation type Sum calculates the result of adding the values of its arguments. Aggregation methods accept two types of arguments: fields and an optional filter. Field arguments determine what field values will be aggregated. The filter argument limits the set of aggregated fields to those matching the conditions specified by the filter. For example, the expression count(object.Project_projectCode, object.Project_status == 'ACTIVE') returns the number of projects in the application with a current status of active.

You can also use Primavera Cloud Expression Language operators to combine aggregation types or pass complex field values as arguments.

The following examples illustrate a number of expressions you can use when defining measures. Doubles are valid outside of parenthesis as long as one of the following numeric operators is used: +, -, *, /.

Note: Text surrounded in <> indicates a variable. Variable values must be replaced by valid aggregation methods, measures, or field.

<operator> indicates any valid Primavera Cloud Expression Language numeric operator, such as +, -, *, /.

<double> indicates a value of the Primavera Cloud Expression Language data type Double.

Expression Format

Example Expression

<aggregationType>(<fieldA>, <filter>)

count(object.Project_projectCode, object.Project_status == 'ACTIVE');

<aggregationType>(<UDFField>, <filter>)

count(object.ProjectCPUDF_APPROVALRATING, object.ProjectCPUDF_APPROVALRATING == 100);

<aggregationType>(<field> <operator> <Double>)

sum(object.Project_atCompletionCost + 10000);

<aggregationType>(<fieldA> <operator> <fieldB>)

max(object.Project_currentApprovedBudgetBase - object.Project_currentApprovedBudgetBaseDistributed);

<aggregationType>((<fieldA> <operator> <fieldB>) * <Double>

average((object.Project_estToCompleteCost + object.Project_currentApprovedBudgetBaseUndistributed) * 100)

<aggregationType>(<fieldA> <operator> <Double> <operator> <fieldB> <operator> <Double>)

max(object.Project_costVariance * 100 + object.Project_scheduleVariance * 100);

<aggregationType>(<fieldA>) <operator> <Double>

max(object.Project_percentComplete) * 100

<aggregationType>(<fieldA> <operator> <fieldB>) <operator> <Double>

average(object.Project_proposedBudgetBase - object.Project_plannedBudget) * 100

<aggregationType>((<fieldA> <operator> <fieldB>) <operator> <Double>) <operator> <Double>

min((object.Project_plannedBudget + object.Project_proposedBudgetBase) * 100) / 2

Filters Using Numeric Fields and Numbers

Expression Format

Example Expression

<aggregationType>(<fieldA>, <fieldB> > <Double>)

min(object.Project_projectCode, object.Project_netPresentValue > 100000);

<aggregationType>(<fieldA>, <fieldB> > <Double> || <fieldA> > <Double>)

max(object.Project_plannedBudget, object.Project_currentApprovedBudgetBaseUndistributed > 100000 || object.ProjectCPUDF_APPROVALRATING > 10000);

<aggregationType>(<fieldA>, (<fieldB> + <fieldC>) > <Double>)

average(object.Project_currentApprovedBudgetBase, (object.Project_plannedBudget + object.Project_proposedBudget) > 100000);

<aggregationType>(<fieldA>, (<fieldB> + <fieldC>) > <fieldD>)

count(object.Project_projectCode, (object.Project_currentApprovedBudgetBaseDistributed + object.Project_estToCompleteCost) > object.Project_currentApprovedBudgetBase);

<aggregationType>(<fieldA>, (<fieldB> + <fieldC>) > <fieldD> * <Double>)

average(object.Project_netPresentValue, (object.ProjectforecastCost + object.Project_estToCompleteCost) > object.Project_currentApprovedBudgetBase * 100);

<aggregationType>(<fieldA>, (<fieldB> + <fieldC>) > (<fieldD> * <fieldE>))

sum(object.Project_currentApprovedBudgetBase, (object.Project_plannedBudget + object.Project_estToCompleteCost) > (object.Project_atCompletionCost * object.Project_spendCost))

Filters Using Text Fields

Expression Format

Example Expression

<aggregationType>(<fieldA>, <fieldB> == 'String1' && <fieldC> != 'String2' )

count(object.Project_projectCode, object.Project_status == 'ACTIVE' && object.Project_projectName != 'Barr Harbor Office Refurbishment');

Filters Using Date Fields

Expression Format

Example Expression

<aggregationType>(<fieldA>, <dateFieldA> > <dateFieldB>)

count(object.Project_projectCode, object.Project_actualStartDate > object.Project_planStartDate)

<aggregationType>(<fieldA>, <dateField> > Date)

count(object.Project_projectCode, object.Project_actualStartDate > Date.parse('dd/mm/yyyy', '02/06/2017'))

<aggregationType>(<fieldA>, <dateFieldA> == Date || <dateFieldB> >= Date)

count(object.Project_projectCode, object.Project_planFinishDate == Date.parse('dd-MMM-yyyy', '02-JUN-2017') || object.Project_actualFinishDate >= Date.parse('dd/MMM/yyyy', '02/JUN/2017'))

 

Measure Based Measures

A measure based measure leverages existing measures to define actual and target values for a custom measure. Primavera Cloud Expression Language provides get methods that enable you to use measure data from various objects within the application. Get methods have the following general method signature:

<object>.get("<workspaceName>", "<objectName>").'<measure>_<measureName>'

Note: Get methods only accept string literals as arguments. If you pass a variable as an argument to a get method, your Primavera Cloud Expression Language script will fail to validate.

Regular Measure or a Measure-Based Measure from the Current Workspace

Expression Format

Example Expression

object.'PortfolioMeasure_<Measure Name>'

object.'PortfolioMeasure_<Measure Name> .Target' or object.'PortfolioMeasure_<Measure Name> .Actual'

object.'PortfolioMeasure_Project Delays'

object.'PortfolioMeasure_Project Delays.Target'

object.'PortfolioMeasure_Project Delays.Actual'

object.'PortfolioMeasure_<Measure Name>' <operator> <Double>

object.'PortfolioMeasure_Project Delays' * 100

object.'PortfolioMeasure_<Measure Name>' <operator> object.'PortfolioMeasure_<Measure Name>'

object.'PortfolioMeasure_Project Delays' + object.'PortfolioMeasure_Additional Expenses'

Workspace Could be the Current Workspace and Child Workspaces

Expression Format

Example Expression

<portfolioMeasure>

Portfolios.get("JM001","Active Projects").'PortfolioMeasure_Project Delays'

<strategyMeasure>

Strategies.get("JM001","Maximize NPV").'StrategyMeasure_NPV Aggregate'

<portfolioMeasureA> <operator> <portfolioMeasureB>

Portfolios.get("JM001","Active Projects").'PortfolioMeasure_Under Budget' - Portfolios.get("KM002","Planned Projects").'PortfolioMeasure_Insufficient Funds'

<strategyMeasureA> <operator> <strategyMeasureB>

Strategies.get("JM001","Maximize NPV").'StrategyMeasure_NPV Aggregate' + Strategies.get("KM002","Maximize ROI").'StrategyMeasure_ROI Aggregate'

Combination of Referenced Measures and a Simple Measure-Based Measure from the Current Workspace

Expression Format

Example Expression

(<portfolioMeasureA> <operator> <portfolioMeasureB>) <operator> <measureA>

(Portfolios.get("JM001","Active Projects").'PortfolioMeasure_Active Budgets' + Portfolios.get("KM002","Planned Projects").'PortfolioMeasure_Proposed Budgets') / object.'PortfolioMeasure_Planned Budgets'

Using Weights in Calculations

Expression Format

Example Expression

<Double> <operator> <strategyMeasureA> <operator> <Double> <operator> <strategyMeasureB> <operator> <Double> <operator> <strategyMeasureC>

0.50 * Strategies.get("JM001","Maximize NPV").'StrategyMeasure_NPV Aggregate' + 0.25 * Strategies.get("KM002","Maximize ROI").'StrategyMeasure_ROI Aggregate' + 0.25 * Strategies.get("IM001","Low Budget").'StrategyMeasure_Budget Aggregate'

<Double> <operator> (<portfolioMeasureA> <operator> <portfolioMeasureB>) <operator> <Double> <operator> <portfolioMeasureC>

(Portfolios.get("JM001","Active Projects").'PortfolioMeasure_Active Budgets' + Portfolios.get("KM002","Planned Projects").'PortfolioMeasure_Planned Budgets') * 0.50 + Portfolios.get("IM001","Inactive Projects").'PortfolioMeasure_Proposed Budgets' * 0.50



Last Published Tuesday, May 21, 2024