Power BI: Resolving one case of “Access to the Resource is Forbidden”

Just last week while returning to work on a Power BI report I get this message when trying to refresh the data:

What the heck?  In Data Source Settings everything looked fine.  My report used a couple of OneDrive connections that looked OK, for example:

After a while of double-checking folder locations, file names, permissions, etc., I thought I would just try removing and reentering the credentials in the dialog above and voilà, problem solved.

Power BI Best Practice: Use Parameters for Connection Information

This best practice is a simple corollary from a software engineering principle: never hard code values in code!  I am singling out connection information as in Power BI all work begins by connecting to one or more data sources.  You should always use parameters to refer to server addresses, database names, folder paths, and file names, for example.  For a tutorial on parameters see this article from Microsoft: http://tinyurl.com/hwftfda.

There are several benefits to this:

  • More readable code.  It’s easier to understand this M code:

    Source = Sql.Database ( #”QA Server”, #”CRM Database” )

    than this M code:

    Source = Sql.Database ( “333.444.55.66”, “DB459” )

  • Changes are easier to make.  If you have several queries against a database, for example, and the server address or the database name changes, then you only need to change parameter values, not each query’s code.  Consider a scenario in which you begin report development against data sources in a test environment.  When the time comes to test against the production environment it is more convenient to make the switch by editing parameter values.
  • Dependencies are explicit.  By just looking at parameter names and values you can tell what a report’s data source dependencies are.
  • Parameters can be changed in the Power BI service.  If connection information changes after publishing a report, parameters may be edited online in the dataset’s settings.  No need to republish the report.  Following a previous example, consider a situation in which you don’t have access to production data sources.  You may publish the report with the test environment’s parameter values and then edit the connection information after publication.  (For this to work the Power BI data gateway needs to have the production environment’s data sources defined.)

Using Z-Order to “Hide” Visuals Targeted for Phone Layout in Power BI

One important but often overlooked design requirement for a report page
is whether it will be viewed in phones and not only in desktop devices. And even
when we are aware of such a requirement it might be a challenge to use visuals
that work well for both kinds of devices. This is because in Power BI the desktop
layout is the principal layout: the phone layout simply allows you to choose from the visuals already present and configured in the desktop layout. But sometimes we need visuals targeted for phone layout only.

Such a need may arise with “wide” visuals, such as a column chart with many categories in its X axis, a situation which I faced in a recent report that led me to write about this. The visual in question displays amounts by day number:

On a phone this visual will require heavy scrolling, which is quite inconvenient, as evidenced when viewed in phone layout:

A bar chart would be more suitable for a phone as there is “infinite” vertical space available.  In this image I chose to cap it at 24 days but could have gone the full 30:

So what to do?

Without layout independence one might think that an easy solution would be that a visual designed and configured specially for phone view might just be hidden (via the Selection Pane) in desktop layout and then selected in phone layout. However, while the visual may appear to be available when you switch to phone layout:

when you drag it onto the phone canvas it “disappears.”  This is what I see after dragging it to the top of the canvas:

My solution to this was to use the z-order setting for visuals to “hide” my phone visual behind the desktop visual (I also did this for a few other phone-only visuals):

The ideal situation would be to have more design independence on the phone layout rather than having to resort to such stratagems.

Power BI Best Practice: Use Dedicated Views and Schema to Fetch Data

If getting data from a relational source such as SQL Server, use views to abstract the report from the physical layout of database tables and never write queries inside reports; from a maintenance and development standpoint, it is simpler and faster to update a view than it is to edit a query inside a report and then republish the report.

Also, if available, create a separate schema for the views for grouping and security purposes.  This is the recommended architecture:

Click here for a full set of Power BI best practices.

Carefully Choose the Data Source Connection Method in Power BI

There are three ways to connect to data: Import, Live Connection, and DirectQuery (note: currently in preview are hybrid methods).  The choice of method will depend on various considerations, such as the size of the data, the number of users, and the data refresh needs.  Make sure an appropriate assessment is made before the report is built, as switching from one method to another is not always possible or straightforward.

The following chart summarizes the options on several dimensions.

chart

*This is for Power BI Pro.  Power BI Premium has more flexible refresh and size limits.

Click here for a full set of Power BI best practices.

Setting Up Drillthrough Filters in Power BI

[8 September 2017]  This feature is now part of the September release of Power BI Desktop.

A recent addition in the Power BI Service is the ability to define “Drillthrough Filters” in a report page.  You can think of these as dataset fields that serve as parameters to the report page.  Let’s call such a page a “drillthrough page.”  You can navigate to a drillthrough page from another page by right-clicking on a visual that includes one of the drillthrough fields.

Set Up

For example, I have a report about sales and collections that includes salespeople and their supervisors.  One of the report’s pages, called Totals, breaks down sales and collections by salesperson and allows filtering by month/year and supervisor.

1

I will use this page as a drillthrough page with Supervisor as a drillthrough filter by dragging the Supervisor field on to the new “Drillthrough filters” field well for the report page:

2

Once you complete this action, a new shape visual (an arrow) will be added to top-left corner of the page.  This will serve as a “go back” button when navigating by clicking on it while pressing the Control key:

3

The visual is hard to see in this case but you can move it around and even edit it, just like any other shape visual:

4

And note the new “Back button” option for the visual:

5

In fact, this option is now available for all shape visuals and clicking on it will get you back to the previous page, regardless of drill through.

Drilling Through

If I go to a visual on another page that includes the Supervisor field I’ll get a new option when I right-click on an item:

6

 

When you drill through, you will see that the Drillthrough filters field well now has the corresponding value selected as a filter.  It can be modified and cleared, too:

8

Finally, a page may have more than one drillthrough filter and a field may be a drillthrough filter for more than one page.  For the latter case, you would get multiple options on right-clicking:

7

Overlaying an Image to get a Proportional Fill Effect in Power BI

In a super cool trick for Power BI, Miguel Myers (@myersmiguel) did an overlay between a bar chart and a duplicated image to simulate a proportional fill, resulting in this:

base example

You can see the full report here.  While he shows how to do it in a YouTube video, it took me a while to simulate it and I thought it would be nice to write it up.

To start, you will need an image to work with.  This is my initial image:

Original Image

Now make the outside of the silhoutte the same color as the background of your report.  In my case, it’s already white so I didn’t have to do anything (in Mykhael’s report, it is black).

Next, make the shape transparent:

One Image Photo

And then duplicate it as many times as the maximum for your measure, as in:

Many Images Photo

For example, for a measure that’s a percentage, you may want to have 10 shapes so that each represents 10%.

Now to the report.  Create a bar chart and remove the X axis and the title:

Clean Chart

Bring in your image over it and immediately you will start seeing the end result:

Iniial Overlay

Adjust the heights of the bar and of the image so that the bar is fully covered:

Adjusting Height

Then left-align the image to the start of the bar

Final View

So that the bar does not stretch past the image, you will need to make sure that the image is exactly and completely filled at the max value of the measure.  This will also take care of displaying the right amount of fill for the different values of the measure.

Another key point is to set the start and end values of the axis so that they don’t change with different filter selections in your report and then wreak havok on the proportions you just coordinated.

This is the final product:

Animation

 

 

Using a Power BI Scatter Chart to Visualize Control of Congress

In this post I will show you how I built this pretty chart that depicts which party controled each house of the United States Congress (the Senate and the House of Representatives) between 1968 and 1980:

Final Chart

The chart displays, per year, the party that controls each house and the relative majority under which control is held.  The first item is given by the color of the dots and the second by their size.  Hovering over any of the dots shows this:

Hover

I got the raw data from Wikipedia, and it looks like this:

Wiki

I had to format the data in a special way to build the chart, especially for the year-by-year continuity.  This is because elections are not held every year but are staggered.  In the Senate, seats are held for six years but elections occur every two years for approximately one-third of the seats.  In the House, elections are held every two years for all members.  So after some M programming and a bit of DAX I got it into this shape:

Data

To build the scatter chart, we need two measures, one for the X axis and one for the Y axis.  For the X axis, I used the Begin Year and for the Y axis the House Type (1 for Senate, 2 for House).   Using Controlling Party for the legend provided the colors and the size was given by the Majority Percentage.  This is the final configuration:

Configuration

The last touch was to use an overlaid text box to label the final Y axis:

Y Axis

As a final note, the Quick Insights feature of Power BI gave me the idea for this chart:

Control

View the complete report here.

Power BI Fun with a Baby Names Database

The United States’ Social Security Administration publishes counts of the names of newborns.  Kendra Little has loaded these counts for the years 1880 to 2014 (which are provided in separate files per year) into a SQL Server database that she has made available here for download.  I had some Power BI fun with it exploring the most common names throughout the years.

Word cloud for the top 10 female names between 1900 and 1949:

Female Names

Sample of animation for the top 5 male names from 1880 to 2014:
Baby Names

Download the Power BI Desktop file here (6MB).  The Power BI version is 2.30.4246.181 64-bit (December 2015).  It uses version 1.0.2 the WordCloud custom visual available in the Power BI Visuals Gallery.  For a live version of the report, scroll to the end of this article.  It was embedded using the new “publish to web” feature in Power BI.

The visuals use a ranking number assigned per year, per gender.  My first version calculated the rank in DAX using RANKX but the performance was poor, especially for the animated scatter chart; it took a long time to load and refresh.  I solved the problem by calculating the rank in T-SQL like this:

SELECT a.[FirstName] as [First Name]
 , [ReportYear] as [Report Year]
 , [Gender]
 , [NameCount] as [Name Count]
 , DENSE_RANK() OVER (PARTITION BY [ReportYear],[Gender] ORDER BY [NameCount] DESC) as Ranking
 FROM [ref].[FirstName] a inner join [agg].[FirstNameByYear] b
 on a.FirstNameId = b.FirstNameId;

Table agg.FirstNamesByYear has about 1.8 million records.