Things have changed! In December of 2022 I finished the pretty large project which has taken up most of my time for the last two years. This means that I can now make room for other projects, even if full-tme projects are still not possible.
I also hope to have some time for this blog, and my Chrome extensions. And there are some other pretty cool stuff on the way.
Remote contracts are the easiest to find time for, and most of the work I do can be made remotely, so please get in touch if you need help with Qlik Sense mashups, extensions or integration. Stuff I can help you with:
development of mashups and extensions
lower level integration using the Qlik Engine API, possibly together with other APIs
extension and mashup strategy: when and how to use them, what to check for in an extension or mashup
maintenance of extensions
troubleshooting and performance problems
validating (and fixing) extensions and mashups with new Qlik Sense versions
Recently I have helped customers and partners with among other things:
make extensions work with NPrinting (pretty common problem, I’m afraid)
building a generic write-back solution with extension and back-end service
advanced extension development
making sure extensions work on a mashup hosted on a web server (not Qlik)
trobleshooting performance problems in a mashup, using my Chrome add-on Add Sense
moving solutions to Qlik Sense SaaS environment
Best way to reach me is through mail: erik at upper88.com
For a while I have been working together with Ingemar Carlo on some software projects, and last week we made our products publically available in the swedish market. You will find them at Carlobi.se.
The idea behind Carlobi Quick Start is to make it easy to get started with a Qlik environment where they can analyze their own data. In 15 minutes they can get up and running with a Qlik Cloud tenant and their own financial data loaded in a Qlik Sense app.
We do this by using a swedish standard format for export from financial systems. When you sign up for a trial you will get a Qlik Sense tenant with tools for uploading this format, converting it and loading it into a Qlik Sense app, based on a template that’s also included.
While this would work for most, if not all, financial systems in the swedish market, we have made sure it works well with the largest one in the swedish market, Fortnox. We also provide Carlobi Data Extractor, a product that helps you extract data from Fortnox. This allows us to help customers build solutions targeted to their specific needs.
A new version of my Chrome extension Add Sense is now available. If you’ve already installed an older version it should be updated automatically, if not you’ll find it here.
App box moved
Probably the first thng you will notice is that the app info box now has moved, from bottom right corner to top middle. The old placement blocked som parts of the Qlik Sense UI, hopefully the new one works better.
More sheet info
The sheet info box now has some more info, like if the sheet is published or not, and if you can modify it. One of the mistakes I’ve made most in Qlik Sense app development is that I forget publishing a sheet before publishing the app. This is a reminder to help you avoid that mistake.
Reintroducing ‘Enable copy’
A few versions ago I made a menu alternative to help you with use copy and paste in Qlik Sense. I wasn’t totally satisfied with how this worked, so in a previous version I removed the ‘Enable copy’ feature. But it seems like users used that, in ways I didn’t think of, so now it’s back again.
Property panel definition
Lastly I’ve added a small new feature: if you’re in advanced edit mode and the property panel is visible, you will be able to see it’s definition. That can help you if your property panel does not work as you expected.
One of the recent new features in Qlik Sense is the ability to add filters to charts, filters that applies only to the chart they are included in, not other charts. So far this is only available n Qlik Sense Clod. (Help is available here)
It has always been possible to filter data in a chart, but setting it up has been more complicated. The new feature makes it much easier and more straightforward, so it is surely a feature that will be welcomed.
Setting it up
To try this I’ll use a copy of the Demo App – Beginner’s tutorial that’s available in QlikSense Cloud If you want to follow along, open it in Qlik Sense Cloud and then make a copy of the sheet ‘ Product details’. Then click on ‘Edit sheet’ in your new sheet.
The filter option is only available in the new authoring mode, so make sure you’r not in the old one (called ‘Advanced options’). I’ll be using the chart ‘Sales and margin by Product Group’ but since that is actually a master object, and you can’t use the new authoring mode on master objects, I’ll firts have to unlink it, to make it no longer a master object. Once that is done, we’re ready to go.
Adding a filter
Filters are based on Qlik set expressions, but do not fear, there is help available to create the expressions. To add filters you use this little area:
First step is to enter the field namn (no, you cannot use dimensions). Do that, either by clicking Add and then searching for the field namn or by dragging and dropping the ‘Region’ field and you get a dialog like this:
Just select one or more regions and we are done:
To verify that it works, end edit mode and make some selections in the region field. Notice how the values in the other charts change, but not the values in our filtered chart, they will still be showing the values in the reion(s) we set in the filter (in my case Nordic). So far so good.
What does the filter affect??
But exactly what does the filter affect? It surely affects the data in the chart itself, but what about other expressions, like dynamic titles etc? Let’s try. Change the title of the chart to (you will probably need Advancd options for this):
=’Sales and Margin by Product Group. Total: ‘ & Sum(Sales)
And now you will have a sum added to your chart title. Switch to analysis mode again, and make some selections in the Region field. Notice that the sum in the title changes, so the filter does not affect the title.
The filter will only affect chart data, not dynamic titles etc. That’s important to be aware of if you are using dynamic titles.
Displaying the filter to users
As you might have noticed Qlik Sense shows the filter at the bottom of the visualization. That works pretty well in this case, but in many Qlik data models you have flags with name that are not so user friendly, or you might have fieldnames with prefixes or more cmplicated filters. If that is the case you can enter your own describing text as a footnote to the chart, like this:
And you will get your own text instead of the default one:
Behind the scenes
If you take a look at the properties of your visualization (I use my own Chrome extension for this) you can find your filters in their own structure:
Using this structure Qlik Sense then generates the actual set expression (qContextSetExpression) that is used:
A new version of my Chrome extension Add Sense is now on it’s way out. There is only one new feature in it: measures and dimensions are now validated, and if there is an error, you’ll see it in the list of measures / dimensions.
If you, like me, often start a new app by copying an old one, you might by accident have published an app with invalid measures and/or dimensions. The new feature helps you find thos, so you can fix or remove them. Also pretty useful if you’ve made changes to the data model in the app.
You don’t need to do anything to get the new version, Chrome will update automatically.
Add Sense Chrome version 2.0.0 is now available in the Chrome web store. If you already installed the previous version it should be upgraded automatically.
The main change is that the extension now uses Chrome manifest version 3, a change that was needed since version 2 will soon no longer be supported. As a user that change will not mean much. There are however some other changes too:
if you use many Qlik Sense objects in your page numbers with more than 2 digits will work better
the Active objects list has been updated, number of currently active objects are now displayed in the header, if the are not valid you will see that
the small boxes in the page can now be closed to avoid clutter
ODAG objects work better
the properties button in Active Objects has been corrected
Much of Qlik’s focus is today on their cloud products. Getting up and running with Qlik Sense Business (the name Qlik uses for their entry-level cloud product) is easy. And even if the hub is different and there is no QMC, it feels familiar. After all it’s the same engine behind the scenes. Many (probably most) extension will also work, since the extension API is the same, and the Capabilities API also the same – almost. But even though the methods are all there, some of them actually don’t give the same result.
The global object in the Capabilities API
The differences I have found are in the global object, as should be expected. (documentation is here). So let’s try it.
The first method is getAppList(). In Qlik Sense Desktop or Qlik Sense Enterprise (which is Qlik’s name on the product you install yourself on a windows server) this method will give you a list of all apps the currently authorized user has access to. In Qlik Sense Business it still works, but if you try it, it looks something like this:
In my Qlik Sense Business hub, I’ve got four apps, but getAppList only returns the one I am currently using. So if your extension uses getAppList to create a list of other apps, it won’t work in Qlik Sense Business.
Another frequently used method in the global object is getAuthenticatedUser(). You use it to find out the users id. In Qlik Sense Desktop you’ll get ‘Personal\\Me’, in Qlik Sense Enterprise you’ll get a string containing UserId and UserDirectory. In qlik Sense Business it looks like this:
So, while the format is the same as in Qlik Sense Enterprise, the content is different. The UserDirectory is empty, and the UserId is actually the IdP subject you can find in the cloud console (IdP stands for Identity Provider).
callRepository
The Capabilities APIs has one method designed to call the repository, originally built to call Qlik Sense Enterprise REST API called callRepository(). It is marked as Deprecated, but it is still there in Qlik Sense Enterprise, and looks like it’s there in Qlik Sense Business too. What happens if we try it?
Qlik Sense Cloud has the REST endpoint /api/v1/items to list apps the user has access to. If we try it, it looks like this:
We do get a warning in the console, but the call works, the data array actually contains the four apps I’ve got in my Qlik Sense Business hub. But since it is deprecated we probably shouldn’t use it but use some standard method of making a REST call instead.
Version 1.3.0 of my Chrome Extension Add Sense is now available here. If you already have it installed, you should get the update automatically. These are the changes
Changed icon set
The extension now uses Qlik’s Leonardo UI instead of material design icons. The loading of Material Design icons does not work without configuration changes in Qlik’s cloud products, while Leonardo UI is already loaded.
Fixed bug when properties where treated like HTML elements
Sometimes expressions containing set analysis where destroyed in the tool. Mostly this happened when there was a letter immediately after the < character. That has now been fixed.
Other changes
If the visualization on screen is in the library, you previously only got the link (containing the id of the master visualization) in the property popup. Now you get the master objects properties.
The default filename when you save properties to file now contains the id of the visualization. You can still use another filename if you want to.
I while ago I wrote a post on using CSS in Qlik Sense, with focus on extension development (you find it here). Much of it is of interest also if you are making Themes. While that post is still relevant, there are some recent changes in the Qlik Sense client that are important to know.
Inline styles
Qlik Sense now uses more inline styles. An example is headers, that are now styled something like this:
This is because you can now actually set header color etc for some of the built-in charts. Where this is possible you will find a ‘Styling’ button in the property panel under ‘Presentation’, that gives you some new options:
Based on your settings here, Qlik Sense will create an inline style. Even if you do not have this section (looks like it is undocumented, if you find any documentation on it, please let me know) Qlik Sense will still create inline styles. Since it is an inline style, you will need to use !important if you want to override it, whether in a theme or in an extension, something like this:
A common request is that you want to disable the maximize functionality for some objects. While expanding a chart or a table to full-page is often a good feature, for many extensions, like buttons, or most text objects it makes no sense. This once used to be possible to do with some CSS, but because of changes in the HTML structure is no longer possible. But in the latest release there is a new flag under Appearance/General that allows you the disable the hover menu:
This is almost the same, though not quite:
everything in the hover menu will disappear
instead you can use the context (right-click) menu, where everything is still available, so you can still make a button full screen
A new version of my Chrome extension for Qlik Sense, Add Sense, is now available in Chrome Web Store. This is a pretty big version, actually that’s why it has number 1.2.1, because a bug sneaked into 1.2.0 which I had to fix.
New app level operations
You reach the new functions from the app popup box:
In fact, most of the buttons are new. From the left to the right they are used for:
showing the script
listing the tables
exploring the data model (in Catwalk)
listing variables
listing dimensions
listing measures
listing extensions used
listing active objects
Data model
A number of the new functions helps you with the data model. You can see what tables are defined in the app, and list dimensions and measures (and copy their definition into a program of your choice, like Excel or something). But perhaps the best new function is the link to Catwalk. Click on the compass icon, and it will open Catwalk with your current app:
If you don’t know what Catwalk is it’s time to get to know it knopw. It’s an open source tool from Qlik that helps you explore the data model of a Qlik Sense app. If it doesn’t work on your server, you might need to whitelist it. Check the documentation! Originally I planned to do some visualization of the data model, but I realized that I cannot make anything better than Catwalk, so why not reuse it.
List all active objects
The Add Sense extension uses Angular and some CSS selectors to find Qlik objects in your page, whether it’s the standard Qlik Sense client or a mashup. This only works for visualizations that are either Qlik Sense standard visualizations or extensions built with the traditional Angular-based method. But in a custom built web app using Qlik you might choose to visualize the data in some other way. Qlik Sense objects used this way have previously not been available in Add Sense, you could not check their properties, monitor recalculation times etc.
With the new function to list all active objects that has changed. While the little boxes showed on the page start from the HTML DOM and Angular scopes, this function uses enigmajs and lists all objects active in the enigmajs session. It might look something like this:
It still needs to find the enigmajs session, which might not work in all cases. If you want to use the extension for a case where it does not work, please let me know, you might be able to fix that with just a very small change.
Dimensions and measures
The extension can now also list dimensions and measures.
You can use the copy function in the dialog to copy the contants to the clipboard and then into application of your choice, like Excel etc.
And that’s it for the new functions. Please let me know if there is anything you are missing.
From time to time I get questions from Qlik customers and partners with some problem regarding Qlik Sense extensions or mashups. Usually this means a few hours of troubleshooting and hopefully fixing something, fun and interesting. Could be extensions that break when Qlik Sense is upgraded, performance issues or some feature that doesn’t work.
A recurring problem is with printing extension objects. Many customers don’t care whether this works, they don’t use NPrinting or it’s not relevant for their extensions, but some do. And if they have problems, it can be a challenge to solve them if you have never done it before.
How does it work
Qlik Sense uses snapshots for printing. That means what’s printed is not what you see on your screen, but a snapshot of the data in the extension, that is then re-rendered by the rendering engine and eventually printed. There is no live connection to the Qlik Sense engine available during this re-rendering, which means that everything that needs a live connection is not available. That’s why you should always base your rendering only on the layout.
So, a first step is to verify that the extension does not do any calls that require an engine connection in the rendering part (they can be used in the property panel, and in many cases are to fill dropdown lists with content etc). This might require some refactoring to solve and so might take some time, but in most cases this is not the problem.
Waiting for the extension to be ready
A more common problem is that the printing is made before the extension is ready. This might mean that printing works sometimes, but not all of the time. It might also mean that the printout is partial, showing the extension when parts of it are rendered, but not all of it etc.
To solve this you need to return a Promise and make sure it is not resolved until your rendering is complete, something like this:
paint: function ($element, layout) {
// do your rendering
return new qlik.Promise(function (resolve, reject) {
// when rendering is complete, call resolve
resolve();
// optionally if rendering fails, call reject
reject();
});
} //end of print function
The Promise supplied by Qlik now follows the standard javascript API (though it looks like it isn’t the standard) unlike in previuos releases where it was essentially angular $p service. I’m afraid that means the code I’ve published earlier in this blog no longer works, the code above is how it should be.