Skip to content

Working with Qlik Sense variables

Introduction

Variables are a powerful feature in Qlik Sense that allow you to store and reuse values across your app. This guide shows you how to use qlik-embed to create, interact with, and delete variables in Qlik Sense.

A complete example is available at the end of this guide.

Prerequisites

To use the example page in this guide, ensure that you have the following:

Variable substitution and vocabulary

Throughout this tutorial, variables will be used to communicate value placement. The variable substitution format is VARIABLE_NAME or <VARIABLE_NAME>. Here is a list of variables that appear in the sample code.

VariableDescription
QLIK_TENANT_URLThe domain for the tenant you are accessing. Equivalent to tenant.region.qlikcloud.com.
QLIK_OAUTH_CLIENT_IDThe clientId of the OAuth SPA you configured.
QLIK_REDIRECT_URIThe Redirect URL for the OAuth2 client to provide an access token.
QLIK_APP_IDThe unique identifier of the application.
QLIK_OBJECT_IDThe unique identifier of the sheet.

This example loads these values from process.env, which you can set in a .env file and reference when running the example with node.js 20+ using node --env-file=.env server.js.

You must connect to the Qlik Sense app before manipulating fields or selection. You do this with the qix.openAppSession method.

import { auth, qix } from "https://cdn.jsdelivr.net/npm/@qlik/api/index.js";

// Retrieve settings from environment
const QLIK_TENANT_URL = process.env.QLIK_TENANT_URL;
const QLIK_OAUTH_CLIENT_ID = process.env.QLIK_OAUTH_CLIENT_ID;
const QLIK_APP_ID = process.env.QLIK_APP_ID;
const QLIK_REDIRECT_URI = process.env.QLIK_REDIRECT_URI;


// OAuth authentication settings
const hostConfig = {
    host: QLIK_TENANT_URL,
    authType: "oauth2",
    clientId: QLIK_OAUTH_CLIENT_ID,
    redirectUri: QLIK_REDIRECT_URI
};

auth.setDefaultHostConfig(hostConfig);

let app;
let variables;

async function initQlik() {
    try {
        const session = await qix.openAppSession(QLIK_APP_ID);
        app = await session.getDoc();
        await listVariables(app);
    } catch (error) {
        console.error("Error initializing Qlik:", error);
    }
}

Examples of use

Learn what you can do with the Variable API.

Create a new variable

Use the createVariableEx method of a Qix Doc object to create a new variable.

async function createVariable(app, name) {
    try {
        const result = app.createVariableEx({
            qInfo: {
                qId: "13",
                qType: "variable",
            },
            qName: `${name}`,
            qDefinition: "sum(Ascii)",
        });
        await listVariables(app);
    } catch (error) {
        console.error("Failed to create variable", error);
    }
}

List variables

Use the qVariableList.qItems property from the layout of an app Session object.

async function listVariables(app) {
    const sessionObjectDef = {
        qInfo: {
            qType: "VariableList",
        },
        qVariableListDef: {
            qType: "variable",
            qData: {
                tags: "/tags",
            },
        },
    };

    try {
        const sessionObject = await app.createSessionObject(sessionObjectDef);
        const layout = await sessionObject.getLayout();
        variables = layout.qVariableList.qItems;
        displayVariables(variables);
    } catch (error) {
        console.error("Error getting variables:", error);
    }
}

Delete variables

Use the app.destroyVariableById method of a Qix Doc object to delete a variable identified by Id.

async function destroyVariables(variables) {
    variables.forEach(async (variable) => {
        await app.destroyVariableById(variable.qInfo.qId);
    });
    await listVariables(app);
}

Full code example

Below is an example built using qlik-api and qlik-embed web components.

Style sheet: web-component-variable.css

body,
html {
    margin: 0;
    padding: 0;
    font-family: sans-serif;
    font-size: 14px;
    background-color: #f5f5f5;
    color: #333;
    height: 100%;
    width: 100%;
}

div.flex-container {
    display: flex;
    flex-wrap: wrap;
    margin: 0 45px 45px 0;
    flex-direction: column;
    height: 50%;
}

.qvobject {
    flex: 1 1 auto;
    height: 300px;
    min-width: 400px;
    margin: 45px 0 0 45px;
}

.buttons-container {
    position: fixed;
    top: 10px;
    left: 10px;
    z-index: 1000;
}

button {
    margin-right: 10px;
}

div.list-container {
    flex: 1 1 auto;
    border: 1px solid;
    border-color: black;
    background-color: white;
    margin: 45px 0 0 45px;
    padding: 20px;
}

.viz {
    height: 500px;
    border: 1px solid #bbb;
    box-shadow: 1px 1px 10px rgba(0, 0, 0, 0.2);
}

JavaScript: web-component-variable.js

import { auth, qix } from "https://cdn.jsdelivr.net/npm/@qlik/api/index.js";

// Retrieve settings from environment
const QLIK_TENANT_URL = process.env.QLIK_TENANT_URL;
const QLIK_OAUTH_CLIENT_ID = process.env.QLIK_OAUTH_CLIENT_ID;
const QLIK_APP_ID = process.env.QLIK_APP_ID;
const QLIK_REDIRECT_URI = process.env.QLIK_REDIRECT_URI;


// OAuth authentication settings
const hostConfig = {
    host: QLIK_TENANT_URL,
    authType: "oauth2",
    clientId: QLIK_OAUTH_CLIENT_ID,
    redirectUri: QLIK_REDIRECT_URI
};

auth.setDefaultHostConfig(hostConfig);

let app;
let variables;

async function initQlik() {
    try {
        const session = await qix.openAppSession(QLIK_APP_ID);
        app = await session.getDoc();
        await listVariables(app);
    } catch (error) {
        console.error("Error initializing Qlik:", error);
    }
}

async function listVariables(app) {
    const sessionObjectDef = {
        qInfo: {
            qType: "VariableList",
        },
        qVariableListDef: {
            qType: "variable",
            qData: {
                tags: "/tags",
            },
        },
    };

    try {
        const sessionObject = await app.createSessionObject(sessionObjectDef);
        const layout = await sessionObject.getLayout();
        variables = layout.qVariableList.qItems;
        displayVariables(variables);
    } catch (error) {
        console.error("Error getting variables:", error);
    }
}

function displayVariables(variables) {
    const selectionsList = document.getElementById("selectionsList");
    selectionsList.innerHTML = "";

    variables.forEach((variable) => {
        const listItem = document.createElement("li");
        listItem.textContent = `Name: ${variable.qName}, Value: ${variable.qDefinition}`;
        selectionsList.appendChild(listItem);
    });
}

async function createVariable(app, name) {
    try {
        const result = app.createVariableEx({
            qInfo: {
                qId: "13",
                qType: "variable",
            },
            qName: `${name}`,
            qDefinition: "sum(Ascii)",
        });
        await listVariables(app);
    } catch (error) {
        console.error("Failed to create variable", error);
    }
}

async function destroyVariables(variables) {
    variables.forEach(async (variable) => {
        await app.destroyVariableById(variable.qInfo.qId);
    });
    await listVariables(app);
}

document.addEventListener("DOMContentLoaded", async () => {
    await initQlik();
    document.getElementById("createVariableButton").addEventListener("click", () => {
        const variableName = document.getElementById("variableNameInput").value;
        if (variableName) {
            createVariable(app, variableName);
        } else {
            alert("Please enter a variable name");
        }
    });
    document.getElementById("destroyVariableButton").addEventListener("click", () => {
        destroyVariables(variables);
    });
});

HTML: web-component-variable.html

<!doctype html>
<html lang="en">

<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <link rel="stylesheet" href="https://clip.eu.qlik-stage.com/resources/autogenerated/qlik-styles.css" />
    <link rel="stylesheet" href="web-component-variable.css" />
    <script src="https://cdn.jsdelivr.net/npm/@qlik/embed-web-components@1/dist/index.min.js"></script>
    <script type="module" src="web-component-variable.js"></script>
</head>

<body>
    <div class="buttons-container">
        <input type="text" id="variableNameInput" placeholder="Enter variable name" />
        <button id="createVariableButton">Create Variable</button>
        <button id="destroyVariableButton">Delete Variables</button>
    </div>
    <div class="viz">
        <qlik-embed ui="analytics/chart" app-id="%QLIK_APP_ID%" object-id="%QLIK_APP_OBJECT_ID%" />
    </div>
    <div class="list-container">
        <h3>Variables</h3>
        <ul id="selectionsList"></ul>
    </div>
</body>

</html>

Was this page helpful?