Не так давно мне понадобилось создать расширение для Qlik Sense, в котором нужны были многомерные кубы с измерениями и мерами, которые устанавливаются пользователем. Это статья как раз и будет примером решения данной задачи. Конечно, мое решение – лишь начало пути, потому что в него можно добавить и другие интересные штуки.
Шаг 1 – Добавляем кубы в стартовые настройки
Нам нужно добавить функцию initialProperties. Кубы можно добавить через независимые объекты:
-
12345678910111213141516171819202122initialProperties: {cube1: {qHyperCubeDef: {qDimensions: [],qMeasures: [],qInitialDataFetch: [{qWidth: 2,qHeight: 5000}]}},cube2: {qHyperCubeDef: {qDimensions: [],qMeasures: [],qInitialDataFetch: [{qWidth: 2,qHeight: 5000}]}}}
Шаг 2 – Добавляем возможность определения мер и измерений через определения пользователей
Теперь нам нужно добавить возможность добавления мер и измерений для каждого куба в панели настроек.
-
12345678910111213141516171819202122232425262728293031323334353637383940414243444546<del></del>definition: {type: "items",component: "accordion",items: {cube1props: {label: "Cube 1",type: "items",items: {dimension: {label: "Dimension",type: "string",expression: "always",expressionType: "dimension",ref: "cube1props.dimension"},measure: {label: "Measure",type: "string",expression: "always",expressionType: "measure",ref: "cube1props.measure"},}},cube2props: {label: "Cube 2",type: "items",items: {dimension: {label: "Dimension",type: "string",expression: "always",expressionType: "dimension",ref: "cube2props.dimension"},measure: {label: "Measure",type: "string",expression: "always",expressionType: "measure",ref: "cube2props.measure"}}}}}
Шаг 3 –Обновление многомерных кубов с настройками пользователя
Вот это самая интересная часть нашего решения. Когда пользователь обновляет настройки, связанные с параметрами кубов, нам нужно обновить куб. Здесь мы устанавливаем специальный механизм контроля этих изменений. Для этого используем метод Backend API ApplyPatches для обновления куба.
-
1234567891011121314151617181920212223242526272829303132//Set cube1$scope.$watchCollection("layout.cube1props", function(props) {$scope.backendApi.applyPatches([{"qPath": "/cube1/qHyperCubeDef/qDimensions","qOp": "replace","qValue": JSON.stringify([{qDef: {qFieldDefs: [props.dimension]}}])},{"qPath": "/cube1/qHyperCubeDef/qMeasures","qOp": "replace","qValue": JSON.stringify([{qDef: {qDef: props.measure}}])}], false);});//Set cube2$scope.$watchCollection("layout.cube2props", function(props) {$scope.backendApi.applyPatches([{"qPath": "/cube2/qHyperCubeDef/qDimensions","qOp": "replace","qValue": JSON.stringify([{qDef: {qFieldDefs: [props.dimension]}}])},{"qPath": "/cube2/qHyperCubeDef/qMeasures","qOp": "replace","qValue": JSON.stringify([{qDef: {qDef: props.measure}}])}], false);});
Вот и все! Теперь пользователь может сам обновлять меры и измерения в многомерных кубах. Конечно, это решение можно развить и далее, например, добавить количество переменных в мерах и измерениях, позволяя настраивать другие параметры кубов, работать с выборками и прочее.
Свежие комментарии