Cognos передает значение всем подсказкам

Поэтому я использую jQuery в своих отчетах, и у меня есть набор отчетов, которые все загружаются благодаря jQuery одновременно, поэтому клиент чувствует, что переходы выполняются быстрее, потому что им не нужно ждать между каждым кликом. Я хочу, чтобы все отчеты менялись в зависимости от запроса, который использует клиент. Поэтому, если они выберут определенный день, все отчеты в наборе будут изменены на этот день. Или, если у них есть определенная область, которую они выбирают, все отчеты попадают в эту область. Это позволит клиенту не загружать параметры в подсказку для каждого отчета. Мне интересно, есть ли способ сделать это. Я посмотрел и ничего не нашел.

Изменить. Итак, в моем отчете, в котором находятся все фреймы и подсказка о значении, которую я назвал changeMonth, у меня есть этот JS

<script>
var report = cognos.Report.getReport("_THIS_");
var radio = report.prompt.getControlByName('monthChange');

var currentRadioValue = radio.getValues()[0]; //Get initial value object

radio.setValidator(validateRadio); //Define function to validate prompt

function validateRadio(values) {
if (values && values.length > 0 && values[0].use != currentRadioValue.use) { //Only do anything if control has value and has changed
    currentRadioValue = values[0]; //Assign new value for later comparison
    for (var i=0; i<window.frames.length; i++) { //Loop through all iFrames
             window.frames[i].changeValue(values[0].use); //Call the changeValue     function passing in the radio button value
    }
 }
return true; //Indicates the prompt is valid
}
</script>

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

<script>
function changeValue(str){
var report = cognos.Report.getReport("_THIS_"); //Grab a handle for the report
var control = report.prompt.getControlByName('monthChange'); //Grab a handle for the    prompt control
control.addValues([{"use":str,"display":str}]); //Change the prompt to the passed in value
report.sendRequest(cognos.Report.Action.REPROMPT); //Reprompt the page
}
</script>

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


person giff1    schedule 06.08.2014    source источник
comment
Где работают ваши отчеты? Студия отчетов? Рабочее пространство? Можете ли вы предоставить более подробную информацию? Я много работал с JavaScript в Cognos, но мне нужна дополнительная информация, чтобы помочь вам.   -  person Johnsonium    schedule 07.08.2014
comment
@Johnsonium все это будет сделано в студии отчетов. Я пытаюсь заставить его работать, пока мы говорим. Итак, у меня есть две настройки iFrames, и я хочу получить подсказку для управления обоими этими iframe. В фреймах у меня есть перекрестные таблицы. Поэтому, если я изменю месяц в подсказке, он изменит его в обоих фреймах.   -  person giff1    schedule 07.08.2014
comment
Итак, у вас есть отчет Report Studio, содержащий набор iFrames, каждый из которых имеет собственный отчет Report Studio. Это правильно? Кроме того, можете ли вы указать, какую версию Cognos вы используете?   -  person Johnsonium    schedule 07.08.2014
comment
@Johnsonium Я использую 10.2.1, и да, как я его сейчас настроил, каждый отчет вставлен в iframe, и они связаны с вкладкой вверху, которая запускается кодом jQuery. Итак, что происходит, когда отчет запускается, все отчеты запускаются одновременно, поэтому переход от вкладки к вкладке не требует ожидания, потому что все уже загружено. Где, как и раньше, он будет загружаться при переходе на каждую вкладку. Итак, чего хочет клиент, так это иметь возможность выбрать подсказку значения вверху, чтобы управлять всеми фреймами для изменения месяца, который они хотят просмотреть. Я нашел несколько раскрывающихся списков jquery, которые могут работать, но пока не уверен   -  person giff1    schedule 07.08.2014


Ответы (1)


Я смог заставить это работать, создав функцию JavaScript в каждом дочернем отчете, которая изменяет скрытое значение приглашения, от которого зависит запрос, а затем повторно запрашивает страницу. Вот часть кода, которая должна быть в каждом дочернем объекте:

Код дочернего отчета

<script>
function changeValue(str){
    var report = cognos.Report.getReport("_THIS_"); //Grab a handle for the report
    var control = report.prompt.getControlByName('controlname'); //Grab a handle for the prompt control
    control.addValues([{"use":str,"display":str}]); //Change the prompt to the passed in value
    report.sendRequest(cognos.Report.Action.REPROMPT); //Reprompt the page
}
</script>

При этом используется Cognos JavaScript Prompt API, добавленный в Cognos версии 10.2. Функции getReport, getControlByName, addValues ​​и sendRequest — это функции, предоставляемые Cognos для упрощения работы с подсказками в JavaScript. Здесь больше информации:

Документация по Cognos JavaScript Prompt API

В контейнерном отчете я создал приглашение значения радиокнопки Cognos. Я написал код JavaScript, чтобы использовать встроенный хук проверки при изменении, предоставляемый Cognos в API, для запуска кода при изменении переключателя. Код перебирает все iFrames и вызывает функцию, определенную выше, в каждом дочернем отчете, передавая значение выбранного переключателя.

Код отчета контейнера

<script>
var report = cognos.Report.getReport("_THIS_");
var radio = report.prompt.getControlByName('radio');

var currentRadioValue = radio.getValues()[0]; //Get initial value object

radio.setValidator(validateRadio); //Define function to validate prompt

function validateRadio(values) {
    if (values && values.length > 0 && values[0].use != currentRadioValue.use) { //Only do anything if control has value and has changed
        currentRadioValue = values[0]; //Assign new value for later comparison
        for (var i=0; i<window.frames.length; i++) { //Loop through all iFrames
                 window.frames[i].changeValue(values[0].use); //Call the changeValue function passing in the radio button value
        }
    }
    return true; //Indicates the prompt is valid
}
</script>

Обратите внимание, что в приведенном выше коде строки «controlname» и «radio» соответствуют свойству Name рассматриваемых элементов управления подсказками. По умолчанию Cognos не дает имени элементам управления подсказками. Таким образом, вы должны указать имя после создания. Какие бы имена вы им ни дали, сценарий необходимо соответствующим образом скорректировать, чтобы разрешить JavaScript доступ к их объектам Cognos Prompt API.

Этот метод можно модифицировать, чтобы получать ввод от любого из множества элементов управления подсказками, доступных в Cognos. Кроме того, теоретически контейнер вообще не обязательно должен быть Cognos. Это может быть отдельная веб-страница с элементами управления, которые вызывают функции JavaScript в iFrames при срабатывании стандартных HTML-событий onchange. Единственное предостережение связано с ограничениями безопасности, которые браузеры не позволяют вызывать функции в iFrame из контейнеров, домен которых отличается от домена iFrame. Это следует учитывать при разработке решения.

person Johnsonium    schedule 07.08.2014
comment
Итак, я попробовал то, что вы перечислили. Я помещаю ребенка в отчеты, в которых будет iFramed, и контейнер в отчете с подсказкой. Я поместил подсказку значения в дочерний отчет, указав месяц в подсказке. Я назвал его pMonth. Затем я перешел к отчету о контейнере и назвал подсказку, которая должна управлять всем, и когда я запускаю свой отчет, он не меняет iframe. Может быть, я делаю что-то не так. Я изучил этот API, на который вы ссылались, и это помогает, но я все еще немного не понимаю, как все реализовать. Любая дополнительная помощь будет принята с благодарностью. - person giff1; 11.08.2014
comment
Главное, что нужно проверить, — это убедиться, что вы изменили параметры функции getControlByName, чтобы они соответствовали свойству name подсказок, которые вы создали как в контейнере, так и в дочерних отчетах. Обратите внимание, что вы должны указать свойство «Имя» каждой подсказки, а не свойство «Параметр». Это две разные вещи. API JavaScript находит объекты в вашем отчете, ища указанное имя («радио» и «имя управления» в моем коде выше). - person Johnsonium; 12.08.2014
comment
Я изменил имя каждой подсказки в свойстве name. Я изменил их из pMonth, потому что это был параметр для changeMonth, посмотрите на мое редактирование, которое я сделаю здесь через мгновение со всем кодом и тем, где он у меня есть, и, возможно, вы сможете направить меня в правильном направлении. - person giff1; 12.08.2014
comment
Помог ли мой код в моем редактировании? Я играю с этим со вчерашнего дня весь день, и я до сих пор не могу заставить его работать - person giff1; 12.08.2014
comment
Ваш код выглядит правильно. С точки зрения API подсказок Cognos JavaScript не имеет значения, используете ли вы раскрывающийся список, список или группу переключателей. То, как JavaScript работает с объектами приглашения, такое же. Вы можете смотреть в консоль браузера, когда запускаете отчет? Часто он предоставляет полезную информацию об ошибках. Вы можете получить доступ к консоли в большинстве браузеров, нажав F12. - person Johnsonium; 12.08.2014
comment
Я получаю одну ошибку: невозможно получить значение свойства getValues: объект имеет значение null или не определен. - person giff1; 12.08.2014
comment
Убедитесь, что ваш HTML-объект, содержащий JavaScript, всегда находится в самом низу страницы. Cognos визуализирует все сверху вниз. Таким образом, если вы попытаетесь сослаться на подсказку, которая появляется под JavaScript, она еще не будет существовать, и вы получите описанную вами ошибку. - person Johnsonium; 12.08.2014
comment
Спасибо за всю вашу помощь и терпение со мной. Я помещаю теги html в нижнюю часть контейнера и дочерний элемент. Я запускаю отчет и меняю дату в подсказке в контейнерном отчете, и это не изменит дату в дочернем отчете. По умолчанию это август в iframe, и он остается в августе в кросс-таблице, в которую вставляется iframe. Может ли моя компания отключить API для подсказок? если нет, то что-нибудь еще посоветуете? - person giff1; 12.08.2014
comment
Вы все еще получаете сообщение об ошибке после перемещения HTML вниз? На данный момент единственное, что я могу порекомендовать, — это стандартное устранение неполадок JavaScript. Поместите console.log('сообщение'); строки в JavaScript (где «сообщение» — это контекстное сообщение) и посмотреть, выводится ли оно на консоль. Работайте над кодом, пока не обнаружите, где он терпит неудачу. Кроме того, вы часто можете запускать команды JavaScript в интерактивном режиме в консоли браузера. Попробуйте запустить некоторые ключевые команды вручную. Например, функция changeValue() в дочерних отчетах. - person Johnsonium; 13.08.2014
comment
Да, теги HTML внизу каждого отчета. Я попробую и еще раз спасибо за вашу помощь - person giff1; 13.08.2014
comment
Итак, немного поиграв с тем, что вы предусмотрели. Мы смогли заставить его работать без каких-либо проблем. мы просто создали другой отчет и следовали вашим инструкциям с нуля, вместо того, чтобы включать его в существующий, и это сработало. Большое спасибо, теперь мы знаем, как его использовать, и мы можем заставить его работать на нас. - person giff1; 13.08.2014
comment
Хорошо, у меня есть последний вопрос к вам. Поэтому, когда я создаю отчет, все работает нормально. У меня есть эти верхние ссылки, на которые клиент может навести курсор, и это расширит некоторые отчеты. Каждый раз, когда я добавляю эти верхние ссылки в отчеты, мои подсказки перестают работать, но когда я их удаляю, они работают нормально. Любые идеи? верхние ссылки управляются jquery, и кажется, что jquery ломает другие js. - person giff1; 14.08.2014
comment
Недавно я экспериментировал с Cognos и JQuery и время от времени сталкивался с некоторыми странными проблемами. Можете ли вы посмотреть на консоль и увидеть, есть ли ошибка? - person Johnsonium; 14.08.2014
comment
Итак, поиграв с ним, jQuery, кажется, вызывает проблемы, и я не уверен, почему. В нем говорится, что объект не поддерживает свойство или метод и указывает на что-то в моем jquery. Это работает, когда я использую jquery в другом отчете, в котором есть JS, но по какой-то причине он не работает в этом отчете. Когда я его удаляю, он работает без проблем. Я собираюсь продолжать делать свои TS, потому что мне это нужно, но если у вас есть какие-либо идеи, это будет очень признательно. и вся ваша помощь до этого момента приветствуется. - person giff1; 14.08.2014
comment
Как я уже сказал, я новичок в использовании jQuery в Cognos. Я избегал фреймворков, потому что хотел узнать код базового уровня, прежде чем изучать абстракции более высокого уровня, такие как jQuery. До сих пор использование jQuery в Cognos было несколько сдержанным. Я думаю, вы и сами это видите. В Cognos есть некоторые особенности в отношении состояния объекта, которые могут сбивать с толку jQuery. По мере того, как я получу информацию, я поделюсь ею с сообществом. Для этой цели я начинаю блог разработчиков Cognos, который я не буду продвигать здесь. - person Johnsonium; 14.08.2014
comment
Таким образом, я смог заставить все это работать так, как я хочу, но у меня есть еще один вопрос, на который, я надеюсь, вы сможете ответить, потому что я не могу понять это. Есть ли способ передать несколько подсказок. Итак, если у меня есть две или пять разных подсказок, управляющих всеми моими iFrames, возможно ли, чтобы они были там? Первая подсказка указывает на месяц вождения, следующая подсказка — на измерение, а следующая — на область. Это возможно? - person giff1; 22.08.2014
comment
Да. Есть два пути. Внесение изменений в любое приглашение немедленно приводит к обновлению каждого дочернего отчета для отражения нового значения. В этом сценарии вы можете просто воспроизвести то, что уже было описано, по одному разу для каждого значения подсказки. Второй подход заключается в том, чтобы не обновлять дочерние отчеты до тех пор, пока пользователь не нажмет какую-либо кнопку подсказки. В этом случае вы можете создать одну функцию в каждом дочернем отчете, которая получает значения из каждой подсказки в качестве параметров, изменяет связанное значение подсказки и обновляет страницу. - person Johnsonium; 22.08.2014