19 Janeiro 2018

Expand & Collapse no IBM Cognos Report Studio

Introdução

IBM Cognos Report Studio é uma tecnologia que fornece aos utilizadores a capacidade de explorar praticamente todos os tipos de informação através de uma interface dinâmica e altamente customizável.

Os reports podem conter um número ilimitado de objetos tais como, charts, crosstabs e listas, bem como, imagem, logos e outras aplicações passíveis de serem linkadas a informação complementar.

À semelhança do meu artigo anterior, onde partilhei os passos necessários para utilizar as funcionalidades de expand e colapse no IBM Cognos Workspace, este documento tem como objetivo providenciar aos utilizadores a capacidade de definir e explorar a sua informação de uma forma idêntica, mas no módulo IBM Cognos Report Studio.

Público-Alvo

O objetivo deste documento é providenciar uma forma de melhorar os reports que já desenvolveu ou que pretende desenvolver no futuro. Desta forma, a utilização deste guia pressupõe que o utilizador tenha experiência na utilização de browsers, elaboração de reports e domínio de conceitos básicos IBM Cognos.

A utilização deste guia com a sua própria instalação IBM Cognos Report Studio implica que tenha em consideração que o aspeto da user interface, as funcionalidades e ações que pode ou não realizar, dependem do conjunto de permissões que são atribuídas ao seu utilizador.

Um utilizador com a capacidade de criar um report pode criar reports e adicionar componentes, ao passo que um utilizado apenas com capacidade de consultar um report não tem estas funcionalidades disponíveis.

Funcionalidade de Expand e Collapse

Uma das funcionalidades mais requisitadas no Cognos é a capacidade de expandir e colapsar informação. Existe uma solução que funciona para o Report Studio que consiste em passar o member unique name (MUN) da linha para uma prompt escondida, fazer o append desse valor para um set e reordenar o mesmo para a sua ordem natural. Colapsar a linha consiste basicamente em remover o membro da prompt. Isto significa que é possível manter o terceiro nível visível enquanto se esconde o segundo.

Ativar Funcionalidade de Expand e Collapse numa Crosstab

Começamos com a query. Cada nó da crosstab refere-se a 3 data items: O set, o mun e o count dos filhos.

1. O set será o data item “LO”:

#promptmany('LocationSet','mun','[OLAP].[Location].[Location].[District]
','hierarchize(union([OLAP].[Location].[Location].[District];descendants(set(','[OLAP].[ Location].[ Location]',');1)))')#

Se nada estiver selecionado, o default será [OLAP].[Location].[Location].[District]. Se um valor for selecionado, fará a união com os descendants do set e reordena os mesmos para a sua ordem natural.

2. O count será o data item “LO_Children” :

count(1 within set children(currentMember([OLAP].[Location].[Location])))

Este data item serve para controlar quando é que o botão de expand aparece. Evidentemente não fará sentido mostrar o botão se não existirem filhos.

3. O member unique name, mun, será o data item “LO_Mun”:

roleValue('_memberUniqueName';[Location])

Este deverá ser o aspeto do report no modo “Page Design” e “HTML”, respetivamente:

Page Design

 

HTML ITEM S1

<script>

var myScripts = {}

  , oCR = cognos.Report.getReport(“THIS”)

  , ocv = eval(“oCV” + “_THIS_”).getRV().getCV();

myScripts.getControl = function(promptName) {

  return oCR.prompt.getControlByName(promptName);

};

function getMethods(myObject)

{

  var funcs=[]

  for(var name in myObject)

  {

    funcs.push(name)

  }

  return  funcs.join(‘, ‘);

}

myScripts.getSelMuns= function(){

var selLength =ocv.getSelectionController().getSelections().length

  , myObj=[];

 

  if(!selLength) return false;

 

  for (i=0;i<selLength;++i){

    myObj.push({

      ‘mun’:ocv.getSelectionController().getSelections()[i].getMuns()[0][0],

      ‘dataItem’:ocv.getSelectionController().getSelections()[i].getDataItems()[0][0]});

  };

 

   return(myObj);

}

 

myScripts.passMunsToPrompt = function(){

  var obj = myScripts.getSelMuns()

    , objLen = obj.length;

 

  for(var i=0;i<objLen ;++i){

    myScripts.getControl(obj[i].dataItem).addValues([{‘use’:obj[i].mun}]);

  }

}

 

myScripts.passMunsToPromptCompat = function(promptName,mun){

    myScripts.getControl(promptName).addValues([{‘use’:mun}]);

}

myScripts.removeMunsFromPrompt= function(){

  var obj = myScripts.getSelMuns()

    , objLen = obj.length

    , updatedPrompts=[];

  for(var i=0;i<objLen ;++i){

    for( var j=0;j<myScripts.getControl(obj[i].dataItem).getValues().length;++j){

      if(myScripts.getControl(obj[i].dataItem).getValues()[j].use == obj[i].mun) {continue;}

      else {updatedPrompts.push(myScripts.getControl(obj[i].dataItem).getValues()[j])}

    }

    myScripts.getControl(obj[i].dataItem).setValues(updatedPrompts);

  }

}

myScripts.removeMunsFromPromptCompat= function(promptName,mun){

  var updatedPrompts=[];

  for( var j=0;j<myScripts.getControl(promptName).getValues().length;++j){

    if(myScripts.getControl(promptName).getValues()[j].use == mun) {continue;}

    else {updatedPrompts.push(myScripts.getControl(promptName).getValues()[j])}

  }

  myScripts.getControl(promptName).setValues(updatedPrompts);

}

</script>

HTML ITEM S2

<div style=”display:none”>

HTML ITEM S3

</div>

REPORT EXPRESSION FOR ITEM S4

case when [Report_Data].[LO_Children] = 0 then ” else

case when ParamDisplayValue(‘LocationSet’) contains ([Report Data].[LO_Mun])

then ‘<input type=”button” onclick=”

myScripts.removeMunsFromPromptCompat(”LO”,”’+[Report_Data].[LO_Mun]+”’);

oCR.sendRequest(cognos.Report.Action.FINISH);

value=”-“

>’

else ‘<input type=”button” onclick=”

myScripts.passMunsToPromptCompat(”LO”,”’+[Report_Data].[LO_Mun]+”’);

oCR.sendRequest(cognos.Report.Action.FINISH);

value=”+”>’

end

end

Esta report expression verifica se existem filhos e toma ações em função do resultado. Se não existirem não coloca o símbolo de expand, se o membro já se encontra presente no parâmetro então o símbolo de colapse aparece, caso contrário mostra o de expand.

É importante ter em consideração que os data items relativos ao “count” e ao “mun” têm que ser adicionados às propriedades do nó de forma a ser possível referir os mesmos na report expression acima indicada.

HTML