# Carrier Dashboard

{% hint style="warning" %}

#### Workshop - Carrier Dashboard

Enterprise dashboards demand sophisticated analytical capabilities that seamlessly integrate multidimensional data analysis with intuitive user interfaces, enabling business users to explore complex telecommunications metrics through interactive visualizations and dynamic filtering. In this comprehensive workshop, you'll build a complete Wireless Carrier analytics dashboard from the ground up, mastering advanced CTools techniques including Mondrian OLAP schema integration, complex MDX query development with calculated members and parameter substitution, hierarchical layout design with CSS styling, and the creation of interactive components that respond to user selections.&#x20;

Working with a real-world telecommunications dataset, you'll learn how to transform raw call traffic data into a polished, production-ready dashboard that tracks regional calling patterns, platform usage metrics, and month-over-month performance trends across multiple analytical dimensions.

In this hands-on workshop, you'll experience the complete enterprise dashboard development lifecycle, beginning with database setup and Mondrian schema configuration in Schema Workbench, progressing through sophisticated multi-level layout construction with CSS-based styling, and culminating in the creation of parameterized MDX queries that power dynamic selectors, KPI displays, visualizations, and detailed analytical tables.&#x20;

You'll learn how to work with the baseline\_demo PostgreSQL database containing fact tables and dimension tables structured in a star schema optimized for OLAP analysis. As you work through the exercises, you'll master critical techniques including crafting MDX queries with WITH clauses that define calculated members for month-over-month comparisons, implementing parameter substitution using `${parameterName}` syntax for dynamic filtering, configuring output column ordering and renaming for presentation clarity, and handling null values with `IIf(IsEmpty())` logic to prevent calculation errors. You'll also develop expertise in creating responsive dashboard layouts with nested rows and columns, applying external CSS stylesheets for consistent visual design, and structuring CDA data sources that support interactive component behavior through parameter-driven queries.

**What You'll Accomplish:**

* **Database and OLAP Schema Infrastructure** - Groups PostgreSQL connection, JDBC setup, Schema Workbench, Mondrian schema import, and cube navigation
* **Multi-Level Dashboard Layouts** - Combines all layout design elements (rows, columns, headers, KPIs, charts, tables)
* **CSS Styling** - Consolidates external CSS resources, application, and visual consistency validation
* **MDX Data Source Connections** - Groups connection creation, JNDI/schema configuration, and parameter-driven structure
* **Advanced MDX Queries** - Consolidates WITH clauses, calculated members, temporal functions, null handling, hierarchies, and CROSSJOIN
* **Dynamic Parameterization** - Unifies parameter syntax, default values, .Children usage, and multi-parameter filtering
* **Query Output Configuration** - Groups column ordering, index mapping, renaming, and optimization
* **Testing and Validation** - Combines Schema Workbench testing, CDA preview, troubleshooting, and iterative development

By the end of this workshop, you'll have created a sophisticated, fully functional telecommunications analytics dashboard that demonstrates enterprise-grade CTools development practices. You'll understand how to architect complex dashboards that integrate OLAP analysis, dynamic parameter passing, calculated metrics with temporal comparisons, and multi-component interactivity.&#x20;

**Prerequisites:** Pentaho Business Analytics Server with CTools installed, PostgreSQL with baseline\_demo database configured, Schema Workbench with PostgreSQL JDBC driver, Wireless Carrier Mondrian schema XML file available, administrative access to Pentaho User Console\
**Estimated Time:** 90 minutes
{% endhint %}

<figure><img src="https://content.gitbook.com/content/B36Vh3y5doh2RbQX2zOj/blobs/4lycvWjGfZZOm7V7eMMt/image.png" alt=""><figcaption><p>Wireless Carrier Dashboard</p></figcaption></figure>

{% tabs %}
{% tab title="Prerequisites" %}
{% hint style="info" %}
Before we begin our dashboard journey, we need to understand our OLAP Mondrian datasource.
{% endhint %}

<figure><img src="https://content.gitbook.com/content/B36Vh3y5doh2RbQX2zOj/blobs/ZFZmJNuo4XwFEiIoosYP/image.png" alt=""><figcaption><p>baseline_demo database</p></figcaption></figure>

1. Log into the Postgres baseline\_demo database.

{% hint style="info" %}
The baseline\_demo database has a number of key features:

&#x20; • Centralized Fact Tables

&#x20; • Dimension Tables (sometimes called lookup tables)

&#x20; • Simple Join Paths

&#x20; • Denormalized Structure

&#x20; • Query Optimization Features

These tables have been 'mapped' using Pentaho Schema Workbench.
{% endhint %}

{% hint style="warning" %}
You will need to copy over the Postgres database driver to: /schema-workbench/lib
{% endhint %}

2. Start Schema Workbench.

```bash
cd
cd /Pentaho/design-tools/schema-workbench
./workbench.sh
```

3. Open: Workshop--Ctools/Carrier/schema/Wireless carrier.mondrian.xml
4. Expand: Retail Sales & Call Corridor cubes - our datasources.

<figure><img src="https://content.gitbook.com/content/B36Vh3y5doh2RbQX2zOj/blobs/eMq7gBT1W4sTbptXgkuQ/image.png" alt=""><figcaption><p>Wireless Carrier Mondrian Schema</p></figcaption></figure>

{% hint style="info" %}
You can test your MDX queries that will be used to populate the dashboard.
{% endhint %}

5. Open the MDX query panel: File -> New -> MDX Query
6. Copy & paste the following MDX query. Execute.

```
WITH 
 MEMBER [Measures].[Source Member Name] AS [Call Source].currentmember.uniquename
SELECT 
 [Measures].[Source Member Name]  ON 0,
 {[Call Source].[All], [Call Source].[Source Region].Members} ON 1
FROM 
 [Call Corridor]
```

<figure><img src="https://content.gitbook.com/content/B36Vh3y5doh2RbQX2zOj/blobs/jDD9lfHwbjakPsLBrfIp/image.png" alt=""><figcaption><p>MDX query - All Call Regions</p></figcaption></figure>

***

{% hint style="info" %}
The last step is to from the Pentaho Server - PUC&#x20;

&#x20; • define a connection to the baseline\_demo databse

&#x20; • upload the Wireless carrier Mondrian Schema
{% endhint %}

1. In the PUC select: Manage Data Sources.
2. Click on the cog wheel & select: New Connection.

<figure><img src="https://content.gitbook.com/content/B36Vh3y5doh2RbQX2zOj/blobs/vn8aPCzOSUKq3OOyB9BC/image.png" alt=""><figcaption><p>New JDBC connection</p></figcaption></figure>

3. Select Postgres and enter the following details:

<figure><img src="https://content.gitbook.com/content/B36Vh3y5doh2RbQX2zOj/blobs/Ab97FACsdDOnoRV6E84m/image.png" alt=""><figcaption><p>baseline_demo connection details</p></figcaption></figure>

4. The Manage Data Sources also has the option to: Import Analysis
5. Browse to: Workshop--CTools/schemas/Wireless Carrier.Mondian.xml and associate with baseline\_demo datasource.

<figure><img src="https://content.gitbook.com/content/B36Vh3y5doh2RbQX2zOj/blobs/xEvceqQX3sX67ywNOXke/image.png" alt=""><figcaption></figcaption></figure>

6. Click: Import & check the xml schema has been successfully imported.

<figure><img src="https://content.gitbook.com/content/B36Vh3y5doh2RbQX2zOj/blobs/oXnMOIOW6JNchfbQP6we/image.png" alt=""><figcaption><p>Wireless Carrier schema</p></figcaption></figure>

{% hint style="info" %}
The schema can now be referenced to create the dashboard mdx.mondrian.jndi queries.
{% endhint %}
{% endtab %}

{% tab title="Layout & Style" %}
{% hint style="info" %}
We're going to make a few assumptions here ..

&#x20; • connections tested

&#x20; • the layout has been confirmed

&#x20; • chart content & types agreed

&#x20; • dashboard functions included - export graphs & tables
{% endhint %}

<figure><img src="https://content.gitbook.com/content/B36Vh3y5doh2RbQX2zOj/blobs/GLpjJxrbVNSQvLS54p80/image.png" alt=""><figcaption><p>Dashboard layout</p></figcaption></figure>

{% hint style="info" %}
There are five “main” rows:

The first row contains four columns: one with the logo, and three with the selectors.&#x20;

The second row contains two columns with the main KPIs: Number of Calls and Average Call Duration. Each column contains two rows: one for the header, and another for the data.&#x20;

The third row has two columns, each with two rows.&#x20;

The fourth and fifth rows have one column which contains two rows, but notice that the first row is split into two columns because there is a title and an Export button.
{% endhint %}

1. Highlight: /Public/CTools-Dashboard/Carrier-Dashboard-Layout/Layout.
2. Select: Edit from the Folder Actions.

<figure><img src="https://content.gitbook.com/content/B36Vh3y5doh2RbQX2zOj/blobs/J3N8co0NHtczi3MmuPB2/image.png" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
Keep the Layout dashboard open in its own tab.

You will need to refer to each Layout entity to apply the Property Values.
{% endhint %}

```
Root Container
│
└── Layout Row (id: layoutRow)
    └── Layout Column (id: layoutColumn span:12)
        └── Header Row (id: headerRow)
            ├── CTools Logo Column (id: ctoolsLogo span:3)
            ├── sourceObj Column (id: sourceOBj span:3)
            ├── destinationObj Column (id: destinationObj span:3)
            └── monthObj Column (id: monthObj span:3)
    Space
        └── KPI Row (id: kpiRow)
            └── Total Calls Column (id: totalCallsCol span:6)
                └── Total Calls Title Row (id: totalCallsTitle)
                    └── Total Calls Title Column (id: totalCallsTitle span:12)
                        └── HTML Number of Calls
                    Total Calls Row (id: totalCallsRow)
                    └── Total Calls Obj Column (id: totalCallsObj span:12)
                    
             └── Average Calls Time Column (id: totalCallsCol span:6)
                 └── Average Calls Total Title Row (id: averageCallsTimeTitleRow)
                     └── Average Calls Time Title Column (id: averageCallsTimeTitle span:12)
                         └── HTML Call Duration
                     Average Calls Time Row (id: averageCallsTimeRow)
                     └── Total Calls Time Obj Column (id: averageCallsTimeObj span:12)
    Space
        └── Calls By Row (id: callsByRow)
            └── Horizontal Bar Chart Column (id: horizontalBarChartCol span:6)
                └── Horizontal Bar Chart Title Row (id: horizontalBarChartTitleRow)
                    └── Horizontal Bar Chart Title Column (id: horizontalBarChartTitle span:12)
                        └── HTML Calls by Platform
                    Horizontal Bar Chart Row (id: horizontalBarChartRow)
                    └── Horizontal Bar Chart Obj Column (id: horizontalBarChartObj span:12)

            └── Pie Chart Title Column (id: pieChartTitleCol span:6)
                └── Pie Chart Total Title Row (id: pieChartTitleRow)
                    └── Pie Chart Title Column (id: averageCallsTimeTitle span:12)
                        └── HTML Number of Calls
                    Pie Chart Row (id: pieChartRow)
                    └── Pie Chart Table Obj Column (id: pieChartTableObj span:8)
                    └── Pie Chart Obj Column (id: pieChartObj span:4)
    Space
        └── Calls Summary Row (id: callsSummaryRow)
            └── Calls Summary Column (id: callsSummaryCol span:12)
                └──Table Title Row (id: tableTitleRow)
                   └── Table Title Column (id: tableTitle span:10)
                       └── HTML Calls Summary
                   └── Export Table Button Obj (id: exportTableButtonObj span:2)
                   Main Table Row (id: mainTableRow)
                   └── Main Table Obj Column (id: mainTableObj span:12)
     
```

3. Create a Layout folder in the PUC ..  give it a go ..!

***

{% hint style="info" %}
Most modern day layout are controlled by Cascading Style Sheets (CSS)
{% endhint %}

<figure><img src="https://content.gitbook.com/content/B36Vh3y5doh2RbQX2zOj/blobs/FnnqhZHjAddNkCeQVfAm/image.png" alt=""><figcaption><p>Add a Resource - CSS</p></figcaption></figure>

1. Click on the Add Resource option in the Layout Structure toolbar.

<figure><img src="https://content.gitbook.com/content/B36Vh3y5doh2RbQX2zOj/blobs/vH61ghPlwcvrNyMaSOBA/image.png" alt=""><figcaption><p>Add Resource</p></figcaption></figure>

2. Enter the following options:

<figure><img src="https://content.gitbook.com/content/B36Vh3y5doh2RbQX2zOj/blobs/QsA3PtHj3I1vAMApP8m6/image.png" alt=""><figcaption><p>CSS External File</p></figcaption></figure>

3. Click on the ^ button and browse for the file.

<figure><img src="https://content.gitbook.com/content/B36Vh3y5doh2RbQX2zOj/blobs/QXDUZlmkYIWVo1Gs1mqC/image.png" alt=""><figcaption><p>Add dashstyle.css</p></figcaption></figure>

<figure><img src="https://content.gitbook.com/content/B36Vh3y5doh2RbQX2zOj/blobs/5R0iYepKPdIDZo96uaYw/image.png" alt=""><figcaption><p>dashstyle.css</p></figcaption></figure>

4. Finally check the CSS has been applied.
5. Save & Preview the dashboard.

<figure><img src="https://content.gitbook.com/content/B36Vh3y5doh2RbQX2zOj/blobs/0I5RTciCG5NVK0ceJrNT/image.png" alt=""><figcaption><p>Layout</p></figcaption></figure>

{% hint style="success" %}
The completed workshop:&#x20;

/Public/CTools-Dashboard/Carrier-Dashboard-Layout/Layout
{% endhint %}
{% endtab %}

{% tab title="CDA" %}
{% hint style="info" %}
Now that the Layout is complete, time to turn our attention to CDA data sources.&#x20;

All the data in this dashboard comes from ten MDX queries.&#x20;

The three selectors:

&#x20; • Source Region

&#x20; • Destination Region

&#x20; • Month

are all populated via MDX queries, as are each of the tables and charts in the dashboard.

We're going to add two MDX queries to the dashboard.&#x20;

&#x20; • First query returns the values for the Source Selector.&#x20;

&#x20; • Second query returns the results for the main dashboard table that includes several defined parameters.
{% endhint %}

<figure><img src="https://content.gitbook.com/content/B36Vh3y5doh2RbQX2zOj/blobs/zZ27d68ZWp6ro6AKRjLv/image.png" alt=""><figcaption><p>MDX Data Sources</p></figcaption></figure>

{% tabs %}
{% tab title="sourceSelectorQuery" %}
{% hint style="info" %}
Let's start with the MDX query that retrieves the list of Regions.

Start with the Layout dashboard .. &#x20;
{% endhint %}

Layout

1. Browse to: /Public/CTools Dashboard/Carrier-Dashboard-CDA/Layout
2. Click Edit under File Actions.

<figure><img src="https://content.gitbook.com/content/B36Vh3y5doh2RbQX2zOj/blobs/Y7YOxqE5ODS53NYvvLTp/image.png" alt=""><figcaption><p>Layout Dashboard</p></figcaption></figure>

3. On the CDE Perspectives Toolbar, click the Data Sources Panel icon.

<figure><img src="https://content.gitbook.com/content/B36Vh3y5doh2RbQX2zOj/blobs/oljEaRH9k4b2FhympGkH/image.png" alt=""><figcaption><p>mdx over mondrianjndi</p></figcaption></figure>

4. From the Data Source list, expand MDX Queries, and then click mdx over mondrianjndi.
5. To name this data source, in the Properties pane:&#x20;

&#x20;      • Click in the Value for the Name property.&#x20;

&#x20;      • Type sourceSelectorQuery.

&#x20;      • Press Tab or Enter.

{% hint style="info" %}
Its BP to add the suffix “Query” to the data source name.
{% endhint %}

6. In the Properties pane:&#x20;

&#x20;      • Click in the Value for the Jndi property.&#x20;

&#x20;      • On the keyboard, press the down arrow.&#x20;

&#x20;      • Select the BaselineDemo connection.

7. In the Properties pane:&#x20;

&#x20;      • Click in the Value for the Mondrian schema property.&#x20;

&#x20;      • On the keyboard, press the down arrow.&#x20;

&#x20;      • Select the Wireless Carrier schema.

8. To enter the MDX query:&#x20;

&#x20;      • In the Properties pane, click the ellipsis icon to the right of the Query property.&#x20;

&#x20;      • In the MDX Editor window, enter the following MDX query, and then click OK:

```xml
WITH 
 MEMBER [Measures].[Source Member Name] AS [Call Source].currentmember.uniquename
SELECT 
 [Measures].[Source Member Name]  ON 0,
 {[Call Source].[All], [Call Source].[Source Region].Members} ON 1
FROM 
 [Call Corridor]
```

{% hint style="info" %}
The query creates a calculated member (Source Member Name) and obtains the list of Source Regions from the Call Source dimension.
{% endhint %}

<figure><img src="https://content.gitbook.com/content/B36Vh3y5doh2RbQX2zOj/blobs/TUPRhzMTPcgqjHe78CFu/image.png" alt=""><figcaption><p>sourceSelectorQuery</p></figcaption></figure>

9. Save & Test the Layout.cda

<figure><img src="https://content.gitbook.com/content/B36Vh3y5doh2RbQX2zOj/blobs/qiAbMUhBm35Yr6jWJUVL/image.png" alt=""><figcaption><p>Layout.cda</p></figcaption></figure>

{% hint style="warning" %}
OOOOps the columns are the wrong way around ..
{% endhint %}

10. To change the order of the columns:&#x20;

&#x20;      • In the Properties pane, click in the Value for the Output Columns property.&#x20;

&#x20;      • In the new window, click the Add button once to add another field.&#x20;

&#x20;      • In the first Index field, type 1.&#x20;

&#x20;      • In the second Index field, type 0.&#x20;

&#x20;      • Click OK.

<figure><img src="https://content.gitbook.com/content/B36Vh3y5doh2RbQX2zOj/blobs/c6Ceyz6mcbeRnB2FmTxQ/image.png" alt=""><figcaption><p>Change the column order</p></figcaption></figure>

11. Save the  dashboard and try again ..  Refresh the layout.cda

<figure><img src="https://content.gitbook.com/content/B36Vh3y5doh2RbQX2zOj/blobs/gtednf1lyu4Gk4cLybjS/image.png" alt=""><figcaption><p>Refresh CDA Dashboard</p></figcaption></figure>

{% hint style="warning" %}
Notice the Query has also returned an 'Unknown' Geography value ..   This indicates that the Geography table in the baseline\_demo database contains errors. &#x20;
{% endhint %}

{% hint style="success" %}
The completed workshop:&#x20;

/Public/CTools-Dashboard/Carrier-Dashboard-Layout/Layout CDA
{% endhint %}
{% endtab %}

{% tab title="tableQuery" %}
{% hint style="info" %}
Next MDX query populates the main dashboard table.  This query is a bit trickier as it includes parameters ..
{% endhint %}

1. Duplicate the sourceSelectorQuery and change the name to tableQuery.

<figure><img src="https://content.gitbook.com/content/B36Vh3y5doh2RbQX2zOj/blobs/e4bGt3iNXbz1GAGAaBsd/image.png" alt=""><figcaption><p>Duplicate Query</p></figcaption></figure>

2. Delete the Output columns.

<figure><img src="https://content.gitbook.com/content/B36Vh3y5doh2RbQX2zOj/blobs/BWvZYD2BtPuTEKqSpXwr/image.png" alt=""><figcaption><p>Delete Output Columns</p></figcaption></figure>

3. Add the MDX Query.

```
WITH
 MEMBER [Measures].[usersCurrentMonth] AS '([Measures].[Users], ${monthParameter})'
 MEMBER [Measures].[usersLastMonth] AS '([Measures].[Users], ${monthParameter}.Lag(1))'
 MEMBER [Measures].[usersDifference] AS 'IIf(IsEmpty([Measures].[usersCurrentMonth]), NULL, (([Measures].[usersCurrentMonth] / [Measures].[usersLastMonth])-1)*100)'
 MEMBER [Measures].[callsCurrentMonth] AS '([Measures].[Calls], ${monthParameter})'
 MEMBER [Measures].[callsLastMonth] AS '([Measures].[Calls], ${monthParameter}.LAG(1))'
 MEMBER [Measures].[callsDifference] AS 'IIf(IsEmpty([Measures].[callsCurrentMonth]), NULL, (([Measures].[callsCurrentMonth] / [Measures].[callsLastMonth])-1)*100)'
 MEMBER [Measures].[timeCurrentMonth] AS '([Measures].[Duration in Minutes], ${monthParameter})'
 MEMBER [Measures].[timeLastMonth] AS '([Measures].[Duration in Minutes],${monthParameter}.LAG(1))'
 MEMBER [Measures].[timeDifference] AS 'IIf(IsEmpty([Measures].[timeCurrentMonth]), NULL, (([Measures].[timeCurrentMonth] / [Measures].[timeLastMonth])-1)*100)'

SELECT {[Measures].[usersCurrentMonth], [Measures].[usersDifference], [Measures].[callsCurrentMonth], [Measures].[callsDifference], [Measures].[timeCurrentMonth],[Measures].[timeDifference]} ON COLUMNS,
 CROSSJOIN(${sourceCallParameter}${sourceChildren}, ${destinationCallParameter}${destinationChildren}) ON ROWS

FROM 
 [Call Corridor]
```

{% hint style="info" %}
It's out of scope to explain how MDX queries work , however, let's break this Query down into the various parts to hep explain whats happening behind the scenes:
{% endhint %}

{% hint style="info" %}
**Calculated Members Definition**: The query starts by defining several calculated members in three groups (users, calls, and time), each following the same pattern:
{% endhint %}

#### Users:

```
- [usersCurrentMonth]: Gets the Users measure for the current month (specified by monthParameter)
- [usersLastMonth]: Gets the Users measure for the previous month using LAG(1)
- [usersDifference]: Calculates the percentage change between current and last month ((current/last - 1) * 100)
```

#### Calls:

```
- [callsCurrentMonth]: Gets the Calls measure for current month
- [callsLastMonth]: Gets the Calls measure for previous month
- [callsDifference]: Calculates percentage change in calls
```

#### Duration:

```
- [timeCurrentMonth]: Gets Duration in Minutes for current month
- [timeLastMonth]: Gets Duration for previous month
- [timeDifference]: Calculates percentage change in duration
```

{% hint style="info" %}
**The IIf Logic**: Each "difference" measure uses `IIf(IsEmpty())` to handle null cases.

This prevents division by zero errors and returns NULL if current month data is empty.
{% endhint %}

```
IIf(IsEmpty([Measures].[currentMonth]), NULL, (([currentMonth] / [lastMonth])-1)*100)
```

{% hint style="info" %}
**SELECT Statement**:

On COLUMNS: Shows the current values and their percentage differences for users, calls, and duration

On ROWS: Uses CROSSJOIN to combine two dimensions:

${sourceCallParameter}${sourceChildren} (likely source locations/departments)

${destinationCallParameter}${destinationChildren} (likely destination locations/departments)
{% endhint %}

{% hint style="info" %}
**Template Parameters**:&#x20;

The query uses several parameters (denoted by ${...}):

${monthParameter}: Specifies the current month

${sourceCallParameter}: Source dimension

${sourceChildren}: Additional source hierarchy members

${destinationCallParameter}: Destination dimension

${destinationChildren}: Additional destination hierarchy members
{% endhint %}

{% hint style="info" %}
**From Clause**: The data comes from a cube named \[Call Corridor], which tracks call metrics between different locations.
{% endhint %}

{% hint style="info" %}
The query is designed to display month-over-month comparisons of:

&#x20; • Number of users

&#x20; • Number of calls

&#x20; • Total call duration&#x20;

Each with their corresponding percentage changes, broken down by source and destination locations.
{% endhint %}

4. To specify default values for the parameters:&#x20;

&#x20;      • In the Properties pane, click in the Value column for the Parameters property.&#x20;

&#x20;      • In the new window, click the Add button four times.&#x20;

&#x20;      • In the Name and Value columns, type the following:

<table><thead><tr><th width="246">Parameter</th><th>MDX</th></tr></thead><tbody><tr><td>destinationCallParameter</td><td>[Call Destination.Destination Geography].[All]</td></tr><tr><td>sourceCallParameter</td><td>[Call Source.Source Geography].[All]</td></tr><tr><td>monthParameter</td><td>[Time.Standard Time].[2011].[Q1 2011].[January]</td></tr><tr><td>sourceChildren</td><td>.Children</td></tr><tr><td>destinationChildren</td><td>.Children</td></tr></tbody></table>

{% hint style="info" %}
.Children returns all the direct child members of a given member in a hierarchy. When used with crossjoined tables, it returns the immediate descendants of the specified level or member.
{% endhint %}

5. To see the new results in CDA:&#x20;

&#x20;      • From the Opened perspective, click the layout.cda tab.&#x20;

&#x20;      • Right-click the layout.cda tab.&#x20;

&#x20;      • From the menu, select Reload Tab.&#x20;

&#x20;      • In the Confirm Reload dialog, click Yes.

<figure><img src="https://content.gitbook.com/content/B36Vh3y5doh2RbQX2zOj/blobs/C14BihgtmmjIrNDKG6uD/image.png" alt=""><figcaption><p>tableQuery</p></figcaption></figure>

{% hint style="info" %}
The column names and data formats are not ideal. We will improve the appearance of the data when we create the table later.

For now let's modify the column names for the tableQuery.
{% endhint %}

6. To specify column names for the query output:&#x20;

&#x20;      • In the Properties pane, click in the Value column for the Columns property.&#x20;

&#x20;      • In the new window, click the Add button seven times.&#x20;

&#x20;      • In the Index and Name columns type the following, and then press OK.

<table><thead><tr><th width="145">Index</th><th>Name</th></tr></thead><tbody><tr><td>0</td><td>Source Call</td></tr><tr><td>1</td><td>Destination Call</td></tr><tr><td>2</td><td>Users</td></tr><tr><td>3</td><td>m/m-1</td></tr><tr><td>4</td><td>Calls</td></tr><tr><td>5</td><td>m/m-1</td></tr><tr><td>6</td><td>Duration</td></tr><tr><td>7</td><td>m/m-1</td></tr></tbody></table>

<figure><img src="https://content.gitbook.com/content/B36Vh3y5doh2RbQX2zOj/blobs/UX8tLIcnnvoGeKqELmDt/image.png" alt=""><figcaption><p>Rename Columns</p></figcaption></figure>

7. Save and again check in CDA dashboard.

<figure><img src="https://content.gitbook.com/content/B36Vh3y5doh2RbQX2zOj/blobs/2EVmJMgnXbu71vvMnKKI/image.png" alt=""><figcaption><p>Column Names</p></figcaption></figure>

{% hint style="success" %}
The completed workshop:&#x20;

/Public/CTools-Dashboard/Carrier-Dashboard-Layout/Layout CDA
{% endhint %}
{% endtab %}

{% tab title="lineChartQuery" %}
{% hint style="info" %}
The lineChartQuery
{% endhint %}

1. Duplicate the tableQuery and rename to: lineChartQuery.

<figure><img src="https://content.gitbook.com/content/B36Vh3y5doh2RbQX2zOj/blobs/rDGMnJ8skorTJzfG1iBf/image.png" alt=""><figcaption><p>lineChartQuery</p></figcaption></figure>

2. Replace the existing MDX query:

```
WITH 
 SET DAYS AS DESCENDANTS(${monthParameter}, 1) 
SELECT
 DAYS ON 1,
 {[Measures].[Calls], [Measures].[Users]} ON 0
FROM 
 [Call Corridor]
WHERE 
 (${sourceCallParameter}, ${destinationCallParameter})
```

3. To edit/delete the column names:&#x20;

&#x20;      • Click in the Value column for the Columns property.&#x20;

&#x20;      • To the left of Index 0, click the delete icon.&#x20;

&#x20;      • Click Remove.&#x20;

&#x20;      • Change Index 1 to Number of Calls.&#x20;

&#x20;      • Change Index 2 to Number of Users.&#x20;

&#x20;      • Delete the remaining column names.&#x20;

&#x20;      • Click OK.

<figure><img src="https://content.gitbook.com/content/B36Vh3y5doh2RbQX2zOj/blobs/kBRnBXYq55XnufPn5S8K/image.png" alt=""><figcaption><p>Change column names</p></figcaption></figure>

4. Save and view in CDA Dashboard.&#x20;

<figure><img src="https://content.gitbook.com/content/B36Vh3y5doh2RbQX2zOj/blobs/RoQVecH9YYa6Qby5FflN/image.png" alt=""><figcaption><p>lineChartQuery</p></figcaption></figure>

{% hint style="success" %}
The completed workshop:&#x20;

/Public/CTools-Dashboard/Carrier-Dashboard-Layout/Layout CDA
{% endhint %}
{% endtab %}
{% endtabs %}
{% endtab %}
{% endtabs %}
