Medida de Tempo (Horas, Minutos, Segundos) com Agregação com Cell Formatter do Mondrian

Bem pessoal, já é a segunda vez que tenho essa necessidade, então acho que pode ser bem mais comum que eu imaginava.

Vários tipos de negócio precisam tratar tempo (em horas, minutos e segundos) como uma medida e não como uma dimensão. Casos como tempo médio ou tempo total de um atendimento, de um serviço, etc. são sempre indicadores importantes quando as empresas se preocupam com o cliente.

Acontece que no Mondrian, ao definirmos uma medida do tipo “time” ou “timestamp” não é permitido usar funções de agregação como sum() ou avg() (soma ou média). Daí imaginem o seguinte cenário:

Uma empresa de telemarketing precisa ter uma granularidade de tempo de atendimento por funcionário, depois agregar isso por filial. Se a medida não permite soma ou média, como posso saber o tempo total ou médio por filial em mm:ss?

Para resolver isso usamos o “Cell Formatter” do Mondrian, onde vamos usar uma medida do tipo inteiro e convertê-la para o formato 00:00 em tempo de execução e ainda fazer agregações nessa medida dando tempo médio ou total de atendimento.

Veja os passos para atingir esse objetivo:

Na tabela fato criei uma medida que chamei de minutos. Na verdade, devido a necessidade do cliente aqui eu gravo o tempo em segundos. Esse atributo da tabela é do tipo inteiro.

No Mondriam criei uma medida no meu cubo, com as configurações conforme a figura abaixo:

Minutos

Note que o tipo de dado é inteiro mesmo.

Para inserir um script de formatação, clique com o botão direito d mouse sobre a medida “Minutos”, depois clique em “Add Cell Formatter”. Mais um ícone surgirá abaixo da medida, é o ícone do “Cell Formatter”. Clique sobre ele com o botão direito e clique em “Add Script”

minutos_cell_formatter

A primeira opção é “language”, define a linguagem do script. Digite JavaScript

Depois, no campo cData coloque seu script de conversão como a seguir:

/*pego o valor inteiro que vem do BD e divido por 60 para converter os segundos em minutos*/
var minutos_decimal = value/60;
/*com a função floor eu pego apenas a parte inteira da conversão, pois ela se refere aos minutos*/
var minutos = Math.floor(minutos_decimal);

/*para obter os segundos eu tiro a parte inteira dos decimais*/
var segundos = minutos_decimal – minutos;

/*converto os decimais de volta para segundos*/
segundos = Math.floor((segundos*10)*6);

/*Monto a formatação 00:00 (mm:ss)*/
if(segundos < 10) {
minutos = minutos.toString() + ‘:0’ + segundos.toString();
}else{
minutos = minutos.toString() + ‘:’ + segundos.toString();
}
/*retorno para minha medida*/
return minutos;
Note que fiz apenas a conversão de segundos para minutos e formatei como “mm:ss”. As conversões poderiam continuar para horas, dias, semanas, meses, anos, etc.

Feito isso, salve seu schema, publique-o e veja o resultado no seu visualizador Olap. Você deve ter algo como:

agregado

Agregado (parece estranho, pois as conversões foram apenas até minutos)

detalhado

Detalhado

Por hoje é só pessoal!

1 comentário em “Medida de Tempo (Horas, Minutos, Segundos) com Agregação com Cell Formatter do Mondrian”

  1. Pingback: Medida de Tempo – Horas, Minutos e Segundos no Table Component do CDE | Consultor em TI

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *