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:
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”
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 (parece estranho, pois as conversões foram apenas até minutos)
Detalhado
Por hoje é só pessoal!
Pingback: Medida de Tempo – Horas, Minutos e Segundos no Table Component do CDE | Consultor em TI