Migrating QlikView documents
This page details how to migrate QlikView documents and its related content. It also lists best practices, limitations and considerations.
App limitations
The following table outlines the basic app sizes allowed with Qlik Cloud depending on your subscription.
App type | Supported app size (in-memory) | Peak memory during scheduled reloads | Peak memory during manual reloads |
---|---|---|---|
Standard tier for Qlik Sense Enterprise SaaS | Up to 5 GB | Up to 40 GB | Up to 10 GB |
Standard tier for Qlik Cloud Analytics Premium and Enterprise | Up to 10 GB | Up to 40 GB | Up to 10 GB |
Large app capacity | Up to 50 GB | Depends on the purchased capacity | Depends on the purchased capacity |
Determining app size
You can measure app size in two ways:
-
Size in memory the last time the app was reloaded
-
Size on disk
Use the following tools to determine the size of an app:
-
QlikView Governance Dashboard, Complexity sheet – This sheet indicates size on disk.
-
QlikView to SaaS Migration App in the Qlik Cloud migration tools has a dedicated section on the Migration Tools tab under Assess Qlik Cloud that estimates base RAM footprint and identifies apps that are expected to land on the Standard tier or not.
Mitigating issues with app size
If you encounter high memory allocation problems due to large app sizes, there are two main approaches that you can take to mitigate the issues.
-
Review and update the data load script as applicable:
-
Remove unused fields and rows from being loaded.
-
Drop tables when no longer needed in the data processing.
-
Implement incremental loads to optimize the volume of data being processed.
-
Use optimized QVD loads.
-
-
Add more capacity to the tenant to allow for heavier workloads. See Large app support.
Other limitations and considerations
Cloud deployments do not typically allow access to the file system of your host or server, therefore, use these load script modifications when migrating the load script from an on-premises app to Qlik Cloud.
Extensions
QlikView extensions do not work in Qlik Cloud. This applies to both Server extensions and Document extensions.
Refer to the Qlik Cloud Developer site for custom development related content, including API references and Toolkits.
In Qlik Cloud, there are some limitations with extensions compared to Qlik Sense Enterprise Client-Managed. For more information, see Managing Extensions.
You must add requests for external resources to the allowlist in Administration > Content Security Policy. See Managing Content Security Policy.
Themes
Application styling cannot be migrated form QlikView to Qlik Cloud. See Styling an app for information about application styling on a Qlik Cloud application and about custom themes.
GeoAnalytics
QlikView GeoAnalytics extension object functionality has been incorporated into the native Qlik Sense Map object. Qlik Sense apps cannot be authored using these legacy objects and objects should be rebuilt using the Qlik Sense native map object
Migrating from GeoAnalytics Connector to Qlik GeoOperations
Qlik GeoOperations in Qlik Cloud provides similar features and operations as the GeoAnalytics Connector does within QlikView. They also support many of the same data formats. They have the following differences:
- Qlik GeoOperations is an Advanced Analytics Integration (AAI), which is more suitable for sending out and processing data than a connector.
- Script syntax is different for Advanced Analytics Integrations than for connectors.
- Some GeoOperations can also be used in chart expressions.
- Qlik GeoOperations returns a single table. Compared to what the GeoAnalytics Connector returns, the tables are joined in Qlik GeoOperations.
- In Qlik GeoOperations, some fields and parameters has been renamed to be more consistent.
The following outlines how to convert the script produced by the GeoAnalytics Connector Wizard to Qlik GeoOperations:
- In Data load editor, in the GeoAnalytics Connector script code, copy everything after SQL up to the second SELECT or ";", whichever comes first.
- Replace all ' in the GeoAnalytics Connector script with ".
-
Add the selected field names from the secondary SELECT statement in the GeoAnalytics Connector script to the first SELECT statement in the GeoOperations script. Omit any fields that are already there. Add the source table name to the field names, separating them with a period. For example, table.field. This will create a single joined table instead of several tables.
-
Review the reference documentation for the operation and dataset and adjust any parameter or field names where needed.
For a summary of key differences, see GeoOperations and GeoAnalytics field differences
-
Add the following to the start of the GeoOperations script:
Load * Extension GeoOperations.ScriptEval('
-
Add the following to the end of the GeoOperations script:
');
If using a loaded table with the GeoAnalytics Connector, send it as the second parameter to GeoOperations.ScriptEval instead.
As Qlik GeoOperations returns a joined table, only field values that have a corresponding value in the primary table are returned from the secondary tables. For example, if you want to find the closest airports in Germany for some points, only data about airports that are closest to the points are returned. If you want all airports in Germany, they need to be loaded separately with a LOAD operation.
If loading from an SQL database with the connector, the data should instead be loaded with one of the database connectors like the ODBC connector. Make sure to load the geometries as WKT (apply a function usually called st_asText() in the SQL query). Then convert the WKT field by sending the table to Qlik GeoOperations. It will then return a field with the geometries in Qlik Sense format.
Example script conversion
This script conversion example will use the following GeoAnalytics Connector script:
Do the following:
-
Take the script between SQL and the second SELECT statement.
SELECT [LocationDbId], [Clusters_ClusterID] FROM Cluster(distance='10000', points='Points') DATASOURCE Points LOCATIONSERVICE geometry='POINT', type='XIATA', country='de', serviceName='default' -
Replace quotes:
SELECT [LocationDbId], [Clusters_ClusterID] FROM Cluster(distance="10000", points="Points") DATASOURCE Points LOCATIONSERVICE geometry="POINT", type="XIATA", country="de", serviceName="default" -
Add fields from secondary tables:
SELECT [LocationDbId], [Clusters_ClusterID], [Clusters.Clusters_ClusterCenter] FROM Cluster(distance="10000", points="Points") DATASOURCE Points LOCATIONSERVICE geometry="POINT", type="XIATA", country="de", serviceName="default" -
Adjust parameter and field names:
SELECT [LocationDbId], [ClusterID], [Clusters.ClusterPoint] as [Clusters_ClusterCenter] FROM Cluster(distance="10000", points="Points") DATASOURCE Points LOCATIONSERVICE geometry="POINT", type="XIATA", country="de", serviceName="default" -
Enclose in boilerplate code:
Load * Extension GeoOperations.ScriptEval(' SELECT [LocationDbId], [ClusterID], [Clusters.ClusterPoint] as [Clusters_ClusterCenter] FROM Cluster(distance="10000", points="Points") DATASOURCE Points LOCATIONSERVICE geometry="POINT", type="XIATA", country="de", serviceName="default" ');
This script code now can be used with Qlik GeoOperations.
GeoOperations and GeoAnalytics field differences
The default fields between GeoOperations and GeoAnalytics scripts have differences, typically with prefixes. When migrating your GeoAnalytics scripts to GeoOperations, you might need to adjust some of the field names.
AddressToPoint
GeoOperations and GeoAnalytics return the following fields:
-
GeoOperations: <id>, Address, AddressPoint, CountryIso2, Adm1, City, PostalCode, Street, HouseNumber, Match
-
GeoAnalytics: [<id>], [Dataset_Address], [Dataset_Geometry], [CountryIso2], [Dataset_Adm1], [Dataset_City], [Dataset_PostalCode], [Dataset_Street], [Dataset_HouseNumber], [Dataset_Match]
GeoAnalytics and GeoOperations have the following differences:
-
GeoAnalytics fields have prefixes from the dataset.
-
Dataset_Geometry is called AddressPoint in GeoOperations.
Binning
GeoOperations and GeoAnalytics return the following fields:
-
GeoOperations: <id>, BinId, BinTable.BinPolygon, BinTable.CenterPoint
-
GeoAnalytics: [<id>], [RH2W3], [RH2W3_CenterPoint]
GeoAnalytics and GeoOperations have the following differences:
-
In GeoAnalytics, RH2W3 is the polygon field and its name is generated based on grid size / ratio. In GeoOperations the field is BinTable.BinPolygon.
-
GeoAnalytics does not have a BinId field.
Closest
GeoOperations and GeoAnalytics return the following fields:
-
GeoOperations: dataset_dataset2_RelationId, dataset.<ds1 id>, dataset2.<ds2 id>, Distance
-
GeoAnalytics: [Dataset1_Dataset2_RelationId], [Dataset1.<ds1 id>], [Dataset2.<ds2 id>], [Dataset1_Dataset2_Distance]
GeoAnalytics and GeoOperations have the following differences:
-
GeoOperations has no prefixes for the Distance field.
Cluster
GeoOperations and GeoAnalytics return the following fields:
-
GeoOperations: <id>, ClusterID, Clusters.ClusterPoint, Clusters.PointCount
-
GeoAnalytics: [<id>], [Clusters_ClusterID], [Clusters_ClusterCenter], [Clusters_PointCount]
GeoAnalytics and GeoOperations have the following differences:
-
Prefixes are different between GeoOperations and GeoAnalytics.
Dissolve
GeoOperations and GeoAnalytics return the following fields:
-
GeoOperations: <id>, DissolvedPolygon
-
GeoAnalytics: [<id>], [<id>_Geometry]
GeoAnalytics and GeoOperations have the following differences:
-
Name of the geometry column
Intersects
GeoOperations and GeoAnalytics return the following fields:
-
GeoOperations: dataset_dataset2_RelationId, dataset.<dataset1 id>, dataset2.<dataset2 id>, dataset.RelativeOverlap, dataset2.RelativeOverlap
-
GeoAnalytics: [Dataset1_Dataset2_RelationKey], [Dataset1.<ds1 id>], [Dataset2.<ds1 id>], [Dataset1_RelativeOverlap], [Dataset2_RelativeOverlap]
GeoAnalytics and GeoOperations have the following key differences:
-
Prefixes between GeoOperations and GeoAnalytics differ.
IpLookup
GeoOperations and GeoAnalytics return the following fields:
-
GeoOperations: <id>, IpPoint, CountryIso2, Adm1Code, City
-
GeoAnalytics: [<id>], [IpTable_Geometry], [CountryIso2], [IpTable_Adm1Code], [IpTable_City]
GeoAnalytics and GeoOperations have the following differences:
-
IpTable_Geometry in GeoAnalytics is IpPoint in GeoOperations.
-
Prefixes between GeoOperations and GeoAnalytics differ.
Load (location dataset)
GeoOperations and GeoAnalytics return the following fields:
-
GeoOperations (area): LocationDbId, LocationPolygon, Name, CountryIso2, Adm1Code, Adm2Code, LocationDbType
-
GeoOperations (point): LocationDbId, LocationPoint, Name, CountryIso2, Adm1Code, Adm2Code, LocationDbType
-
GeoAnalytics: [LocationDbId], [Dataset_Geometry], [Dataset_Name], [CountryIso2], [Dataset_Adm1Code], [Dataset_Adm2Code], [LocationDbType]
GeoAnalytics and GeoOperations have the following differences:
-
The geometry fields (LocationPolygon and LocationPoint in GeoAnalytics are Dataset_Geometry in GeoOperations.
-
Prefixes between GeoOperations and GeoAnalytics differ.
PointToAddress
GeoOperations and GeoAnalytics return the following fields:
-
GeoOperations: <id>, Address, AddressPoint, CountryIso2, Adm1, City, PostalCode, Street, HouseNumber, Distance
-
GeoAnalytics: [<id>], [Dataset_Address], [Dataset_Geometry], [CountryIso2], [Dataset_Adm1], [Dataset_City], [Dataset_PostalCode], [Dataset_Street], [Dataset_HouseNumber], [Dataset_Distance]
GeoAnalytics and GeoOperations have the following differences:
-
Prefixes between GeoOperations and GeoAnalytics differ.
Routes
GeoOperations and GeoAnalytics return the following fields:
-
GeoOperations: <id>, Distance, Duration, Status, LowResLine
-
GeoAnalytics: [<id>], [Dataset_Distance], [Dataset_Duration], [Dataset_Status], [Dataset_PathLowRes]
GeoAnalytics and GeoOperations have the following differences:
-
The geometry field Dataset_PathLowRes in GeoAnalytics is LowResLine in GeoOperations.
-
Prefixes between GeoOperations and GeoAnalytics differ.
Simplify
GeoOperations and GeoAnalytics return the following fields:
-
GeoOperations: <id>, Simplified_<geo field name>
-
GeoAnalytics: [<id>], [Dataset_Simplified_Geometry]
.GeoAnalytics and GeoOperations have the following differences:
-
The names of the geometry field are different between GeoOperations and GeoAnalytics.
TravelAreas
GeoOperations and GeoAnalytics return the following fields:
-
GeoOperations: <id>, TravelArea, Cost, CostUnit, Status
-
GeoAnalytics: [<id>], [Dataset_TravelArea], [Dataset_Origin], [Dataset_Cost], [Dataset_CostUnit], [Dataset_Status]
GeoAnalytics and GeoOperations have the following differences:
-
GeoOperations does not include an origin field.
-
Prefixes between GeoOperations and GeoAnalytics differ.
Within
GeoOperations and GeoAnalytics return the following fields:
-
GeoOperations: dataset_dataset2_RelationId, dataset.<dataset1 id>, dataset2.<dataset2 id>
-
GeoAnalytics: [Enclosed_Enclosing_RelationId], [Enclosed.<dataset 1/2 id>], [Enclosing.<datasets 1/2 id>]
GeoAnalytics and GeoOperations have the following differences:
-
GeoOperations prefixes include dataset names, while GeoAnalytics also includes the prefix Enclosed.
Migrating the documents
Follow this procedure when migrating your QlikView documents to Qlik Sense apps that you can use in Qlik Cloud.
Do the following:
-
Assess, identify, and prioritize QlikView documents for their migration. You can use QlikView Governance Dashboard’s Complexity sheet, or the Explore Objects feature on the Migration Tools tab on the QlikView to SaaS Migration App.
-
Convert the QlikView documents to a Qlik Sense application using the QlikView converter. See the following examples:
-
Upload the converted QlikView document to Qlik Cloud.
Information noteYou can bulk upload the converted QlikView documents to Qlik Cloud using the CLI script 7_migrateapps.ps1 available with the Qlik Cloud migration tools. When referencing the app to import, in the exports/apps.csv file, omit the .qvf extension from the 'QSAppName' value.
Reload tasks
Reload tasks must be manually recreated in Qlik Cloud.
Use the QlikView to SaaS Migration App to identity the reload tasks. You find the reload tasks in the QVPR Task Trigger Details table located on the Migration Tools tab's Explore QVPR screen.
Note down all the task details, and then manually recreate these tasks in your Qlik Cloud tenant.
See Scheduling reloading app data for how to create reload tasks.
If you have task chaining, you need to use Qlik Application Automation (QAA), see Task chaining: tutorial.
Converting QlikView documents best practices
Consider the following information when planning your conversion.
QlikView converter
The QlikView converter is a tool to support converting QlikView documents to Qlik Sense apps. You can use the tool to move some of the value developed in QlikView documents to a Qlik Sense app.
The converter tool can be used with Qlik Sense Desktop. You cannot use the QlikView converter to convert documents that are larger than 500 MB on disk. You can reduce the amount of data in a document, or save the document without data, to reduce the size of a document without losing assets. For more information, see Qlik Sense Desktop.
The QlikView converter will move most objects into Qlik Sense, including:
- Scripts
- Most variables. See QlikView variables excluded from export
- List boxes
- Charts and tables
The converter cannot convert certain objects. Objects that cannot be converted include the following:
- Containers
- Triggers
- Macros
- Conditional statements
- Text boxes
- Object layers
- Custom chart colors
- Expression in list boxes
Many of the above objects can be recreated manually in Qlik Sense. For example, while triggers are not converted, the behavior of triggers on open can be recreated using default bookmarks in Qlik Sense.
The converter displays some, but not all, objects that are not converted. We recommend creating a sheet-by-sheet inventory of all your objects in QlikView and comparing that inventory against those objects that are listed in the converter.
Data load script
QlikView and data load scripts are compatible in general, but there are some differences that you may need to take account for and adapt the script in the data load editor before you can reload data.
QlikView uses absolute or relative file paths which are not supported in Qlik Sense standard mode, so you need to use folder data connections to point to file locations instead.
QlikView syntax
Qlik Sense syntax
Hidden script tabs
When a QlikView document with hidden script is converted, the hidden script part will be disregarded and not included in the Qlik Sense script. Before converting the document, open it in the QlikView script editor, and then copy the code from the hidden script tabs and paste it into regular script tabs. Note that you cannot hide script code in Qlik Sense.
Standard mode
Several statements and functions cannot be used or have limitations in standard mode. For more information, see File system access restriction documentation.
Section access
A QlikView document with section access cannot be imported into Qlik Sense, as there are differences in format and supported functionality.
When converting document with section access, the following steps are required:
- Before converting the document, remove the section access code in QlikView script editor.
- Convert the document.
- Reapply section access in the Qlik Sense app.
There are some differences in Qlik Sense you should take into account:
- User authentication is changed. The USERID field is used to authenticate all users, and the NTNAME and PASSWORD fields are not supported.
- Section access is applied using strict exclusion in Qlik Sense. This means that you can only see data that you have been specifically granted access to.
If you have access to the script, but not to the data, you can open the app without data and edit the script, including the section access.
For more information, see Managing security with section access.
Quotation notation in set analysis
Quotation notation in set analysis in older QlikView documents, or in documents created with older versions of QlikView, is different than that in Qlik Sense. You may need to modify certain set analysis expressions in Qlik Sense.
Old notation
Single quotes and double quotes behave the same in the old notation. Both single quotes and double quotes are interpreted as a search. Wild cards (*, ?) can be used.
New notation
Single quotes and double quotes behave differently in the new notation.
Single quotes are interpreted as a literal string comparison. Only one field value is found, and wild cards are not allowed in the search string. An asterisk, for example, is interpreted as an asterisk.
Double quotes are interpreted as a search. Wild cards and relational operators are allowed, and several field values can be found.
For example, Sum({$<Country={'Austr*'}>}Sales) may need to be changed to Sum({$<Country={"Austr*"}>}Sales)
Similarly, numeric or variable comparisons may need to be changed. For example, Duration={'>3'} may need to be changed to Duration={">3"}
QlikView variables excluded from export
A number of variables are not exported from a QlikView document as they are only relevant for QlikView or are handled differently in Qlik Sense.
The following variables are not exported:
- All variables starting with CD
- All variables starting with FLOPPY
- QvPath, QvRoot, QvWorkPath, QvWorkRoot
- WinPath, WinRoot
- ErrorMode
- StripComments
- ScriptErrorCount, ScriptError
- ThousandSep, DecimalSep, MoneyThousandSep, MoneyDecimalSep, MoneyFormat
- TimeFormat, DateFormat, TimestampFormat
- MonthNames, DayNames
- ScriptErrorDetails, ScriptErrorList
- OpenUrlTimeout
- HidePrefix
- FirstWeekDay
- BrokenWeeks
- ReferenceDay
- FirstMonthOfYear
- CollationLocale
- LongMonthNames, LongDayNames