🇧🇷 SAP Analytics Cloud – Como Simplificar o Gerenciamento de Controle de Entrada com a API .setSelectedMembers

Fala pessoal!

A SAP adicionou uma API muito útil para definir membros ativos de dimensões nos controles de entrada (filtros) do SAP Analytics Cloud chamada .setSelectedMembers().

Isso pode não ter recebido toda a atenção que merece quando foi anunciado, mas acredite em mim, vai mudar a forma que você cria suas histórias quando se trata de gerenciar controles de entrada.

Neste tutorial, vou mostrar as aplicações da API .setSelectedMembers() usando dois exemplos aplicáveis. Imagine que você tem um tela com tabelas e graficos ligadas a vários modelos de dados e, para complicar ainda mais, essas tabelas possuem medidas restritas. Lidar com inúmeros controles de entrada personalizados pode ser realmente complicado, não é?

A ideia é a seguinte: você pode facilmente buscar os membros selecionados de apenas um controle de entrada, armazená-los em uma variável e, em seguida, passá-los facilmente para outros controles de entrada usando a API setSelectedMembers(). Não precisa mais gastar tempo mudando seleções em vários controles de entrada diferentes.

Vamos então para os exemplos:

Exemplo 1

Digamos que, por exemplo, você tenha dois controles de entrada (filtros) em sua história, e eles estão conectados a dois modelos diferentes que contêm a mesma dimensão Version (Versão). O objetivo aqui é garantir que o conteúdo do primeiro controle de entrada seja o mesmo que o segundo.

Para isso, siga as etapas abaixo:

  • Clique no botão fx do primeiro controle de entrada que você deseja selecionar (Version_1).
  • Em seguida, escreva o seguinte código no bloco onSelect:
//Obter o membro selecionado do controle de entrada Version_1
var inputVersion = this.getInputControlDataSource().getActiveSelectedMembers();
 
//Definir a mesma versão para o segundo controle de entrada Version_2
Version_2.getInputControlDataSource().setSelectedMembers(inputVersion);

Conforme explicado nos comentários, a linha 2 define uma variável para armazenar o membro selecionado, e a linha 5 o passa para o outro controle de entrada. Esse método pode ser aplicado mesmo se você tiver mais de dois controles de entrada.

Após salvar a história, clique no modo Exibição.

Aqui está a saída final no modo de visualização:

Exemplo 2

Agora vamos explorar um exemplo mais avançado que adiciona uma lógica à forma como gerenciar o segundo controle de entrada (ou terceiro, quarto, etc).

Neste cenário, temos dois controles de entrada de data. No entanto, em vez de ter a mesma seleção para ambos sempre, queremos que o filtro Date_1 controle o segundo controle de entrada, ao mesmo tempo em que garantimos que o filtro Date_2 represente sempre o mês anterior ao Date_1.

Para alcançar isso, siga estas etapas abaixo:

  • Clique no botão fx do primeiro controle de entrada que você deseja selecionar (Date_1).

Em seguida, escreva o seguinte código no bloco onSelect:

  • Obtenha o membro selecionado do controle de entrada Date_1 na variável inputMonth.
var inputMonth = this.getInputControlDataSource().getActiveSelectedMembers();
  • Extraia o ano e o mês do ID do controle de entrada, que se parece com isso: [Date].[YM].&[YYYYMM].
var year = inputMonth[0].id.slice(-7, -3);
var month = inputMonth[0].id.slice(-3, -1);
  • Converta as strings extraídas para inteiros.
var yearInt = ConvertUtils.stringToInteger(year);
var monthInt = ConvertUtils.stringToInteger(month);
  • Calcule o mês anterior.
if (monthInt === 1) {
  yearInt--;
  monthInt = 12;
} else {
  monthInt--;
}

Verifique se o mês é menor que 10 e adicione um zero à esquerda, se necessário.

if (monthInt < 10) {
  month = "0".concat(ConvertUtils.numberToString(monthInt));
}
  • Crie a variável previousMonth combinando o ano e o mês.
var previousMonth = ConvertUtils.numberToString(yearInt).concat(month);
  • Defina o previousMonth como o segundo controle de entrada Date_2.
Date_2.getInputControlDataSource().setSelectedMembers(previousMonth);

Este trecho de código obtém o ID do membro selecionado no filtro Date_1, manipula as strings para extrair o mês anterior e, em seguida, o passa para o segundo controle de entrada. Imagine as possibilidades que essa abordagem oferece para diferentes aplicações!

Aqui está o código completo:

//Obter o membro selecionado do controle de entrada Data_1
var inputMonth = this.getInputControlDataSource().getActiveSelectedMembers();
 
//Extrair o ano e o mês do ID do controle de entrada que se parece com isso: [Date].[YM].&[YYYYMM]
var year = inputMonth[0].id.slice(-7, -3);
var month = inputMonth[0].id.slice(-3, -1);
 
//Converter as strings para numeros inteiros
var yearInt = ConvertUtils.stringToInteger(year);
var monthInt = ConvertUtils.stringToInteger(month);
 
//Calcula o mês anterior
if (monthInt === 1) {
  yearInt --;
  monthInt = 12;
} else {
  monthInt --;
}
 
//Verifica se o mês é menor que 10 e adiciona um zero à esquerda, case necessário
if (monthInt < 10) {
    month = "0".concat(ConvertUtils.numberToString(monthInt));
 
    var previousMonth = ConvertUtils.numberToString(yearInt).concat(month);
}
 
//Define o priorMonth como o segundo controle de entrada Date_2
Date_2.getInputControlDataSource().setSelectedMembers(previousMonth);

Após salvar a história, clique no modo Exibição. Aqui está o resultado final em ação:

Limitações

Conforme mencionado por Orla Cullen aqui, esta API não suporta controles de entrada que mostram:

  • Membros não reservados (Unbooked members)
  • Membros excluídos
  • Filtros de intervalo e filtros avançados

Espero que você tenha curtido e achado esses exemplos úteis. Se você tiver alguma pergunta ou sugestão, deixe um comentário abaixo.

Obrigado e até a próxima!

Jorge Rocha

Artigo em ingles