Пользовательский JavaScript в Cognos Analytics II — запросы даты и наборы данных

Пол Мендельсон

В предыдущей статье мы говорили об элементах управления с помощью пользовательского javaScript в Cognos Analytics. Мы создали приглашение выбора, которое динамически генерирует список имен полей в указанном списке и позволяет пользователю переключать видимость отдельных столбцов. В этой статье мы потратим некоторое время на подсказки даты и наборы данных, рассмотрим случаи, когда нам не нужно генерировать интерфейсный элемент управления, и рассмотрим практический пример.

Пользовательский JavaScript — подсказки даты

Многие отчеты имеют отдельные подсказки даты начала и окончания. Это сделано для обеспечения более точного контроля, чем это возможно со стандартными подсказками диапазона дат Cognos. Часто запрашиваемое требование состоит в том, чтобы предоставить способ запретить пользователям выбирать даты начала ПОСЛЕ даты окончания или наоборот. Другой запрос — динамически установить дату по умолчанию, а также дату начала и окончания.

Начнем с первого требования. Это довольно просто сделать с помощью Prompt API. Каждый раз, когда дата начала изменяется, ее необходимо сравнивать с датой окончания. Если дата начала позже даты окончания, сбросьте значение:

var fromVal = функция (значения) {

var o = oControlHost.configuration

, ctrlFrom = о ? o["fromPrompt"] : "fromDate"

, ctrlTo = о ? o["toPrompt"] : "toDate"

, ctrl = oControlHost.page.getControlByName(ctrlFrom)

, fromDt = момент(значения[0].use).toDate()

, toDt = момент(oControlHost.page.getControlByName(ctrlTo).getValues()[0].use).toDate();

// базовая проверка, чтобы убедиться, что дата начала предшествует дате завершения.

если(отDt › доDt ) {

ctrl.setValidator (функция () {});

ctrl.setValues(oControlHost.page.getControlByName(ctrlTo).getValues());

ctrl.setValidator(из Вал);

вернуть истину;

};

}

oControlHost.page.getControlByName(this.ctrlFrom).setValidator(fromVal);

Прежде чем мы продолжим, вам может быть интересно, что здесь делают строки setValidator. Оказывается, в работе setValues ​​есть небольшая ошибка. Когда setValues ​​применяет дату, запрос даты сначала сбрасывается на текущую дату! В некоторых случаях это может привести к бесконечному циклу. Итак, мы отключаем валидатор, устанавливаем дату, затем повторно применяем валидатор.

Мы получаем имена подсказок из конфигурации.

Затем с этими значениями мы можем вызвать подсказку для установки валидатора. В валидаторе мы получаем даты от и до, преобразуя их в объект фактической даты. Мы сравниваем две даты, и если fromDt больше, чем toDt, мы устанавливаем значение ctrlFrom на то же значение, что и ctrlTo.

Но давайте усложним этот пользовательский Javascript в Cognos. Теперь я хочу динамически установить дату вчера, и я хочу установить доступный диапазон дат на три месяца, на один месяц назад и на один месяц вперед. Чтобы поддержать этот случай, я решил использовать библиотеку дат с открытым исходным кодом под названием Moment.js. Момент упрощает выбор дат. Хотите вчера? Попробуйте: момент (). Вычтите (1, «дни»). Конец следующего месяца? Используйте: moment().add(1,'месяц').endOf('месяц'). Но как мы можем это использовать?

Во-первых, мы хотим убедиться, что динамическая дата применяется только при первом запуске отчета. Никому бы не помогло, если бы даты продолжали смещаться. Так что давайте использовать для этого sessionStorage. Этот код устанавливается в части инициализации функции.

secondRun = sessionStorage.getItem(this.ctrlFrom+'secondaryRun');

// необязательная dynDate из конфигурации

if(!secondaryRun&&o&&o["dynStartDate"]&&moment(eval(o["dynStartDate"])).isValid()) {

dynStartDate=момент(eval(o["dynStartDate"])).format('ГГГГ-ММ-ДД');

};

В этом случае хранилище для startDate1secondaryRun еще не установлено, поэтому продолжайте. О существует? существует ли o[“dynStartDate”]? Уместный ли это момент? Если все это верно, определите dynStartDate на выбранную дату.

Далее давайте удостоверимся, что пользователи не выбирают дату за пределами выбранного диапазона. Нам нужно сделать это как часть валидатора:

// необязательная minDate из конфигурации

if(o&&o["minDate"]&&moment(eval(o["minDate"])).isValid()&&fromDt ‹ moment(eval(o["minDate"])).toDate()) {

ctrl.setValidator (функция () {});

ctrl.setValues([{‘use’:moment(eval(o[“minDate”])).format(‘YYYY-MM-DD’)}]);

ctrl.setValidator(из Вал);

вернуть истину;

};

Давайте посмотрим на это в действии.

Пользовательский JavaScript — наборы данных

А теперь одна доработка. Во многих случаях вы хотели бы получить дату из таблицы и использовать ее для установки минимального/максимального диапазона или дат по умолчанию. Для этого нам нужно добавить поддержку наборов данных в пользовательский JavaScript.

В инициализаторе для первого запуска имеем:

//проверка наборов данных

если (oControlHost.control.dataStores) хранилища данных = oControlHost.control.dataStores;

if(datastores&&datastores.length›0){

//если датасторы найдены, начинаем искать minDate. Сначала мы перебираем хранилища данных

for(var i=0;i‹datastores.length;++i){

//затем проходим по столбцам

for(var j=0;j‹хранилища данных[i].columnNames.length;++j){

// тест на dynDate

if(datastores[i].columnNames[j]==’dynStartDate’) dynStartDate = datastores[i].columnValues[j][0].substring(0,10);

if(datastores[i].columnNames[j]==’dynEndDate’) dynEndDate = datastores[i].columnValues[j][0].substring(0,10);

}

}

};

if(!secondaryRun&&dynStartDate) oControlHost.page.getControlByName(this.ctrlFrom).setValues([{‘use’:dynStartDate}]);

if(!secondaryRun&&dynEndDate) oControlHost.page.getControlByName(this.ctrlTo).setValues([{‘use’:dynEndDate}]);

И валидатор теперь содержит:

var o = oControlHost.configuration

, ctrlFrom = о ? o["fromPrompt"] : "fromDate"

, ctrlTo = о ? o["toPrompt"] : "toDate"

, ctrl = oControlHost.page.getControlByName(ctrlFrom)

, fromDt = момент(значения[0].use).toDate()

, toDt = момент(oControlHost.page.getControlByName(ctrlTo).getValues()[0].use).toDate()

, хранилища данных =[]

, минДата;

//проверка наборов данных

если (oControlHost.control.dataStores) {

хранилища данных = oControlHost.control.dataStores;

if(datastores&&datastores.length›0){

//если датасторы найдены, начинаем искать minDate. Сначала мы перебираем хранилища данных

for(var i=0;i‹datastores.length;++i){

//затем проходим по столбцам

for(var j=0;j‹хранилища данных[i].columnNames.length;++j){

//проверяем каждый столбец на minDate, и если находим, заполняем minDate

if(datastores[i].columnNames[j]==’minDate’) {

minDate = datastores[i].columnValues[j][0].substring(0,10);

if(fromDt ‹ момент(minDate).toDate()) {

ctrl.setValidator (функция () {});

ctrl.setValues([{‘use’:minDate}]);

ctrl.setValidator(из Вал);

}

}

}

}

}

};

Когда элемент управления загружается, он получает информацию из запроса в виде объекта JavaScript. У нас есть массив с именем dataStores, хранящийся внутри элемента управления. Хранилище данных содержит массив наборов данных, возвращенных из запроса. Каждый набор данных может быть запрошен для количества столбцов, имен полей, типов данных. Мы можем вызвать отдельные ячейки и получить значение или даже отформатированное значение. Наборы данных также можно сортировать различными способами. В этом случае мы ищем конкретное значение с именем «minDate».

Во-первых, запросы. Чтобы сделать это максимально гибким, я добавил поддержку нескольких запросов. Сценарий циклически перебирает наборы данных в поисках четырех значений.

  1. dynStartDate
  2. dynEndDate
  3. minDate
  4. максимальная дата

Они могут исходить из разных запросов или из одного. Все они совершенно необязательны. В этом случае у нас есть два запроса, возвращающие динамическую дату начала, минимальную дату и максимальную дату. dynEndDate не отображается, поэтому приглашение по умолчанию будет сегодня.

Запросы связываются с приглашением путем выбора элемента управления и нажатия кнопки «Добавить набор данных». Вы можете иметь столько, сколько хотите.

Зоны перетаскивания должны быть знакомы всем, кто имеет опыт работы с активными отчетами. Сами даты должны быть определены без агрегирования, что немного усложняет задачу. В этом примере используется следующее выражение: минимум([Продажи (запрос)].[Время].[Дата]) для minDate и минимум([Продажи (запрос)].[Время].[Дата])+1. месяц для dynStartDate. Как видите, работает красиво.

Объект хранилища данных имеет довольно много доступных функций, и в более поздних версиях их будет больше. На данный момент пользовательский код JavaScript проходит по каждому хранилищу данных, а затем по столбцам в поисках указанного имени. Как только он находит его, он применяет значение по мере необходимости.

Установка значений по умолчанию

И предотвращение движения до/после указанных дат.

Разработчикам, использующим это, потребуются некоторые инструкции по использованию этого — используемые имена жестко закодированы в JavaScript. В будущем они могут предоставить способ автоматического отображения обязательных и необязательных параметров.

Чтобы использовать этот метод, измените тип файла FromToDateValidation.txt и moment.txt на .js и сохраните оба файла в папке webcontents/javascript. Элемент управления должен ссылаться на /javascript/FromToDateValidation.js.

Этот метод просто не позволяет пользователям выбирать недопустимые диапазоны дат, но не дает пользователю никаких других уведомлений. В следующей статье мы добавим различные способы, чтобы пользователи точно знали, почему подсказки диапазона дат не делают того, что им нужно.

Посмотреть отчет и файлы js можно здесь: Блог: JavaScript — файлы (293 скачивания)

Вывод

Я надеюсь, что этот подробный обзор пользовательского JavaScript в Cognos будет вам полезен. Если вы еще этого не сделали, обязательно ознакомьтесь с другими моими статьями о пользовательском JavaScript, чтобы получить больше советов. Подпишитесь на нашу электронную рассылку, чтобы получать больше технических статей и обновлений, доставляемых прямо на ваш почтовый ящик.

"ПОДПИСЫВАТЬСЯ"

Если вы хотите узнать больше о том, как PMsquare может помочь вашей организации, свяжитесь с нами по адресу:

Сообщение в блоге предоставлено PMsquare LLC

Связанный

Теги: Cognos BIПользовательский JavaScriptНаборы данныхПодсказки датIBM Cognos AnalyticsОтчетностьОтчеты

Первоначально опубликовано на www.pmsquare.com 10 апреля 2017 г.