Setting production lists

*Content reviewed for accuracy June 2020

Making sure that production data lists are correctly marked within a model is a key step to setting up and using Application Lifecycle Management (ALM). This guide will provide a solution to how someone can make revisions to their model to allow for the tagging of a list as a production data list. Please note: this solution doesn’t work if there are hard-coded references on non-composite summary items. For more information on working with production lists and ragged hierarchies, please visit Production lists and ragged hierarchies logic.

The issue arises as a model administrator needs to tag a production data list, but there are hard-coded references in the model that won’t allow the person to do so. When this occurs and the model administrator tries to tag it as a production list, they will get a warning similar to this:
Picture1.png

See Formula Protection for more details.

To fix this issue, all direct formula references to production data lists need to be changed to be indirect references to lists using either LOOKUPs or Boolean formatted conditional logic.  Below, you will find a step-by-step guide to replacing these formulas.

Identify formulas with hard-coded references

There is now an easy way to identify all of the formulas which are hard-coded to production data lists.

Check the 'Referenced in Formula' column in the General Lists section.

2019-04-18_12-35-58.png

This will show the line items where the list is used. Check the respective formula for hard-coded references.  If there are no hard-coded references, then it is OK to check the list as a production data list.  This is the recommended approach, as just setting the lists without prior checking may lead to a rollback error being generated, which could be time-consuming for large models (as well as frustrating).

It is possible to just export the General Lists grid to help where there are multiple references for the same list and then use formulas and filters to identify all offenders in the same effort. This option will save significant amounts of time if there are many line items that would need to be changed.

You are looking for direct references on the list members:

  • [SELECT: List Name.list member]
  • ITEM(List Name) =List Name.List member

The following constructs are valid, but not recommended, as any changes to the names or codes could change the result of calculations:

  • IF CODE(ITEM(List Name))=
  • IF NAME(ITEM(List Name))=

After following those steps, you should have a list of all of the line items that need to be changed in the model in order for production data list to be open to being checked. Please note: There may still be list properties that have hard-coded references to items. You will need to take note of these as well, but as per D.I.S.C.O., (Best practice for Module design) we recommend that List Properties are replaced with Line Items in System Modules.

Replacing model formulas:

The next step is to replace these formulas within the model. For this, there are two recommended options.

The first option (Option 1 below) is to replace your SELECT statements with a LOOKUP formula that is referencing a list drop-down. Use this option when there are 1:1 mappings between list items and your formula logic. For example, if you were building out a P&L variance report and needed to select from a specific revenue account, you might use this option. 

The second option (Option 2 below) for replacing these formulas is to build a logic module that allows you to use Booleans to select list items and reference these Boolean fields in your formulas. Use this option when there is more complex modeling logic than a 1:1 mapping. For example, you might use this option if you are building a variance report by region and you have different logic for all items under Region 1 (ex: budget – actual) than the items under Region 2 (ex: budget – forecast). 

(Option 1) Add List Selections module to be used in LOOKUPs for 1:1 mappings:

From here you should make a module called List Selections, with no lists applied to it and a line item for each list item reference that you previously used in the formulas that will be changed. Each of these line items will be formatted as the list that you are selecting to be production data.

Afterward, you should have a module that looks similar to this:Picture2.pngAn easy and effective way to stay organized is to partition and group your line items of similar list formats into the same sections with a section header line item formatted as No Data and a style of "Heading 1."

After the line items have been created, the model administrator should use the list drop-downs to select the appropriate items which are being referenced. As new line items are created in a standard mode model, the model administrator will need to open the deployed model downstream to reselect or copy and paste the list formatted values in this module since this is considered production data.

Remove hard-coding and replace with LOOKUPs:

Once you have created the List Selections module with all of the correct line items, you will begin replacing old formulas, which you’ve identified in Excel, with new references.

For formulas where there is a SELECT statement, you will replace the entire SELECT section of the formula with a LOOKUP to the correct line item in the list selections.

Example:

Old Formula = Full PL.Amount[SELECT: Accounts.Product Sales]
New Formula = Full PL.Amount[LOOKUP: List Selections.Select Product Sales]

For formulas where there is an IF ITEM (List Name) = List Name Item, you will replace the second section of the formula after the ‘=’ to directly reference the correct line item in the list selections.

Example:

Old Formula = If ITEM(Accounts) = Accounts.Product Sales THEN Full PL.Amount ELSE 0
New Formula = IF ITEM(Accounts) = List Selections.Select Product Sales THEN Full PL.Amount ELSE 0

 

(Option 2) Modeling for complex logic and many to many relationship:

In the event that you are building more complex modeling logic in your model, you should start by building Boolean references that you can use in your formulas. To accomplish this, you will create a new module with Boolean line items for each logic type that you need. Sticking with the same example as above, if you need to build a variance report where you have different logic depending on the region, start by creating a module by region that has different line items for each different logic that you need similar to the view below:

Picture3.pngOnce you have the Boolean module set up, you can then change your hard-coded formulas to reference these Boolean formatted line items to write your logic. The formula may look similar to this:

IF Region Logic.Logic 1 THEN logic1
ELSE IF Region Logic.Logic 2 THEN logic2
ELSE IF Region Logic.Logic 3 THEN logic3
ELSE 0

 

Here is a screenshot of what the end result may look like:

  Picture4.png

This method can be used across many different use cases and will provide a more efficient way of writing complex formulas while avoiding hard-coding for production data lists.

Selecting production data list:

After all of the hard-coded formulas have been changed in the model, you can navigate back to the Settings tab, and open General Lists. In the Production Data column, check the box for the list that you want to set as a production data list.

Repeat for each list in the model that needs to be a production data list:

For each list in the model that you need to make a production data list, you can repeat the steps throughout this process to successfully remove all hard-coded list references.

Comments

  • One of the biggest challenges I have with my clients is that they are not clear as to what define as Production List and what is structural.  I have seen some clients define all their lists as Production,  while some clients will define all their lists as strucutural, as well as everything in between.  Accordingly, many of clients have run into issues with synch errors or gaps in their model due to the lack of clarity on this subject. I have seen some documentation on definition of production vs. structural data, but it defintitely needs to be revisited and more clearly artiuclated as to what is best practice here.

  • Personally, it saves the time, expense, and headache, to just create an ADMIN: Lookups module, and dimension each line item in the module by the list you are referencing, then code the specific line item you would want to normally use a SELECT statement for. Then instead, you use LOOKUP, and if the client ever messes with the production data checkbox in the future, you, and they, won't have issues.