#javascript #angularjs #qliksense
#javascript #angularjs #qliksense
Вопрос:
Проблема в Qliksense SelectValues Field API, когда поле имеет формат даты
Привет ,
Просто чтобы предоставить вам справочную информацию — в нашем веб-приложении открыто несколько приложений qlik, и когда пользователь делает выбор в основном приложении — мы применяем общий выбор ко всем открытым приложениям. У нас есть эта странная проблема с полями, которые помечены как Дата в datamodel. Пожалуйста, проверьте приведенный ниже пример.
Версия: патч 7 v13.82.15 от июня 2020 года
У меня проблема с API полей selectValues, когда поле находится в формате даты.
1. Сценарий 1 — Поле: Month_Year — тип данных даты:
Допустим, у меня есть массив значений, в котором я выбрал значения поля типа даты «Month_Year».
Var FieldName = "Month_Year"; // field in datamodel script : Date#(Month_Year,'MMM YYYY') AS Month_Year
var valArray[]= {
0:"Jan 2020"
1:"Feb 2020"
2:"Mar 2020"
}
app.Field(FieldName ).selectValues(valArray);
он не выбирает значение в желаемом «приложении», потому что FieldName = Month_Year выводится как Date#(Month_Year,’ММ ГГГГ’).
2. Сценарий 2 — Поле: Month_Year — это ТЕКСТОВЫЙ () строковый тип данных:
Допустим, у меня есть массив значений, в котором я выбрал значения поля текстового / строкового типа «Month_Year».
Var FieldName = "Month_Year"; // field in datamodel script : Text(Month_Year) AS Month_Year
var valArray[]= {
0:"Jan 2020"
1:"Feb 2020"
2:"Mar 2020"
}
app.Field(FieldName ).selectValues(valArray);
Теперь то же поле выполняет выбор в поле, если мы вводим поле в виде текста (Month_Year) как Month_Year.
кто-нибудь сталкивался с этой проблемой в вашем приложении mash up?
Ответ №1:
Это потому, что под капотом Qlik хранит значения в двойном представлении — число и текст (особенно для полей, помеченных как дата). Фактическое значение для 01/01/2020
на самом деле 43831
и отображается как 01 Jan 2020
(или независимо от формата даты). Поэтому при попытке выбора Jan 2020
ничего не происходит, потому что такого значения не существует.
Когда вы «нарушаете» двойное представление (используя Text()
функцию), тогда выбор работает, но потенциально могут быть последствия для производительности (в основном на основе объема данных в приложении)
Взгляните на документацию функции dual() для получения дополнительной информации об этом поведении.
Чтобы выбрать что-то в этом случае, вам нужно будет найти базовые значения или номера элементов и выбрать их.
Лично я создаю временный список для требуемого файла, и когда мне нужно выбрать, я нахожу qElemNumber
требуемые значения, а затем выбираю их в списке
// let values = ['array', 'of', 'values', 'to', 'select']
// create the session object
let sessionObj = await qDoc.createSessionObject(lbDef);
// get the layout so we can loop through the data pages
let layout = await sessionObj.getLayout();
// get the qElemNumber for the required values
// WARNING: if the field contains more than 1000 (i think) DISTINCT values then we'll have to loop through all the databased
let index = layout.field.qListObject.qDataPages[0].qMatrix.filter(function (m) {
return values.indexOf(m[0].qText) > -1
}).map(function (e) {
return e[0].qElemNumber
});
// perform the selection
let selection = await sessionObj.selectListObjectValues('/field/qListObjectDef', index, toggle);
Я использовал такой подход здесь
Комментарии:
1. Спасибо, Стефан! Я посмотрю на это. На данный момент мы изменили это поле на text() и делаем выбор в других приложениях. Было бы слишком просто, если бы мы получили эквивалентное количество каждого значения в том же ответе, например qNum в qSelections. qSelectedFieldSelectionInfo . Я также буду следить за производительностью приложения. Эта основная таблица календаря содержит около 2200 строк с различным значением 36 в указанном поле. Еще раз спасибо — это новый подход, я даже не думал об этом.