Cálculo de Tempo Útil de Atendimento (SLA)

Fala pessoal! Tudo bom?

Em algum momento já se depararam com a possibilidade de cálculo do tempo de atendimento (SLA)? Considerando apenas o tempo útil da empresa?

Parece simples, mas não é!

Esse cálculo envolve muitas condicionais e tratativas. Confesso que a primeira vez que fui desenvolver, fiquei um bom tempo (MUIIITO TEMPO) pensando em todas as possibilidades do cálculo!

Vou citar algumas:

1 – Abre dentro do horário e fecha no mesmo dia dentro do horário
2 – Abre dentro do horário e fecha no mesmo dia fora do horário
3 – Abre fora do horário e fecha no mesmo dia dentro do horário
4 – Abre fora do horário e fecha no mesmo dia fora do horário
5 – Abre dentro do horário e fecha em outro dia dentro do horário
6 – Abre dentro do horário e fecha em outro dia fora do horário
7 – Abre fora do horário e fecha em outro dia dentro do horário
8 – Abre fora do horário e fecha em outro dia fora do horário
9 – Abre dentro do horário e fecha em outro dia dentro do horário
10 – Abre dentro do horário e fecha em outro dia fora do horário
11 – Abre fora do horário e fecha em outro dia dentro do horário
12 – Abre fora do horário e fecha em outro dia fora do horário
13 – Abre antes do final de semana dentro do horário e fecha no final de semana
14 – Abre antes do final de semana dentro do horário e fecha no próximo dia útil dentro do horário
15 – Abre antes do final de semana fora do horário e fecha no final de semana
16 – Abre antes do final de semana fora do horário e fecha no próximo dia útil fora do horário
17 – Abre antes do feriado dentro do horário e fecha no feriado
18 – Abre antes do feriado dentro do horário e no próximo dia útil após o feriado antes do horário
19 – Abre antes do feriado dentro do horário e no próximo dia útil após o feriado dentro do horário
20 – Abre antes do feriado fora do horário e no próximo dia útil após o feriado dentro do horário

E acredite, existem mais condicionais.

Vamos ao que interessa, a prática!

Funções

Para este exemplo, utilizaremos as seguintes funções:

  • FRAC
  • FLOOR
  • MakeTime
  • NetWorkDays
  • LastWorkDate
  • FABS
  • Interval

Manual!! Me ajude…

FRAC

Utilização: frac(x)

Descrição: Retorna a parte fracionária de um número.

Exemplos:
frac( 11,43 ) retorna 0,43

FLOOR

Utilização: floor(x [ , base [ , offset ]])

Descrição: Arredondamento de x para baixo até o múltiplo mais próximo de base com um deslocamento de offset. O
resultado é um número.

Exemplos:

floor( 2,4 ) retorna 2

floor(11,43) retorna 11

MakeTime

Utilização: MakeTime( hh [, mm [, ss [.fff ]]] )

Descrição: Retorna uma hora calculada a partir da hora hh, do minuto mm, do segundo ss com uma fração fff até um
valor em milissegundos.

Se nenhum minuto for indicado, 00 será assumido.
Se nenhum segundo for indicado, 00 será assumido.
Se nenhuma fração de segundo for indicada, 000 será assumido.
Exemplos:
maketime( 22 ) retorna 22:00:00
maketime( 22, 17 ) retorna 22:17:00
maketime( 22, 17, 52 ) retorna 22:17:52

NetWorkDays

Utilização: networkdays (data_inicial, data_final {, feriado})

Descrição: Retorna o número de dias úteis (segunda-sexta) entre e incluindo a data_inicial e a data_final,
levando em conta quaisquer feriados opcionais listados. Todos os parâmetros devem ser datas ou
datas/horas válidas.

Exemplos:
networkdays (‘2007-02-19’, ‘2007-03-01’) retorna 9
networkdays (‘2006-12-18’, ‘2006-12-31’, ‘2006-12-25’, ‘2006-12-26’) retorna 8

LastWorkDate

Utilização: lastworkdate(data_inicial, nº_de_dias_úteis {, feriado})

Descrição: Retorna a data final mais recente para obter o número_de_dias_úteis (segunda-sexta) se o início for
na data_inicial, considerando-se os feriados listados opcionalmente. Data_inicial e feriado devem
ser datas ou datas/horas válidas.

Exemplos:
lastworkdate (‘2007-02-19’, 9) retorna ‘2007-03-01’
lastworkdate (‘2006-12-18’, 8, ‘2006-12-25’, ‘2006-12-26’) retorna ‘2006-12-29’

FABS

Utilização: fabs(x)

Descrição: É o valor absoluto de x. O resultado é um número positivo.

Exemplos:
fabs( 2,4 ) retorna 2,4
fabs( -3.8 ) retorna 3.8

Interval

Utilização: interval( expressão [ , código de formato ])

Descrição: A função interval formata a expressão como um intervalo de tempo, de acordo com o caracter fornecido
como código de formato. Se o código de formato for omitido, será utilizado o formato de hora definido no
sistema operacional. Os intervalos podem ser formatados como hora, dia ou como uma combinação de dias,
horas, minutos, segundos e frações de segundos.

Exemplos:
Os exemplos abaixo supõem as seguintes configurações do sistema operacional:
Formato de data abreviada: YY-MM-DD
Formato de hora: hh:mm:ss
Separador de número decimal: .
interval( A ) em que A=0.375 retorna:
Caracter 09:00:00
Número 0.375
interval( A ) em que A=1.375 retorna:
Caracter 33:00:00
Número 1.375

Vamos ao código

Nosso exemplo vai calcular o tempo útil de SLA de uma empresa que possui como horário de trabalho das 08:00 até as 18:00 de Segunda à Sexta. Nessa empresa a hora do almoço é contabilizada!

Calcularemos o tempo de fechamento de chamados, ou seja, nossa tabela possui uma data de abertura e data de encerramento.

Vamos lá….

Em primeiro lugar crio uma variável chamada Feriado e cadastro os possíveis feriados, mas lembre-se de cadastrar esses feriados com os valores entre apóstrofes e delimitados por virgula “,”.

Segue exemplo:

SET Feriados = ’09/06/2015′,’10/06/2015′;

Em segundo, devo tratar a data de abertura e data de encerramento.

Para a coluna de data de abertura:

  • Se a abertura é antes das 08 horas, então passa a ser as 08 horas do mesmo dia
  • Se a abertura é após as 18 horas, então passa a ser as 08 horas do próximo dia útil (considerando feriados e finais de semana).

Para a coluna de data de encerramento:

  • Se o encerramento é antes das 08 horas, então passa a ser 18 horas do dia útil anterior
  • Se o encerramento é depois das 18 horas, então passa a ser 18 horas do mesmo dia

Em terceiro, faço os cálculos finais, com as condições:

  • Se a data de encerramento é igual ao dia de abertura, então faço uma coluna menos a outra e assim temos o tempo útil
  • Se a data de encerramento é diferente ao dia de abertura, então faço preciso fazer o seguinte cálculo:
    • A – uma coluna menos a outra para contabilizar a quantidade de horas no intervalo
    • B – Verifico a quantidade de dias que existe dentro desse intervalo e multiplico por 14 (14 horas não úteis dentro de um dia de 10 horas úteis). Lembre-se que das 08:00 até as 18:00 temos 10 horas, logo se o dia possui 24 horas, então neste dia temos 14 horas não úteis.
    • C – Verifico a quantidade de dias não uteis dentro do intervalo e multiplico por 24 (Esses dias não úteis são os Sáb, Dom e Feriados)
    • A conta final fica: A – B – C

Ufa!!

Bem chatinho né? Isso porque não estamos desconsiderando a hora de almoço!! Mas isso fica para um próximo post!

Desta vez não irei colar o código, mas peço que façam o download da aplicação de exemplo. Opa, Só clicar aqui para fazer o download!

Espero que gostem!

Até a próxima semana!

Evento – Qlik Visualize Your World

Fala pessoal! Tudo bom?

Venho aqui divulgar um evento de QlikView da própria Qlik. É o “Qlik Visualize Your World” que acontecerá no dia 16 de Junho as 16h no Noah Gastronomia.

A página visualizar mais informações e se registrar no evento clique aqui.

Analisei o escopo do evento e acredito que este não seja um evento muito técnico e sim mais voltado para os usuários finais, porém teremos alguns assuntos bem interessantes, veja a lista:

Agenda

Estou bastante ansioso para a Palestra de Big Data! 😀

O mais legal é podermos nos conhecer e trocarmos ideia no evento. Apareçam por lá!

Acumulado com Expressão

Fala pessoal! Tudo beleza?
 
Certamente vocês já fizeram algum relatório de Contabilidade e foi solicitado um indicador que possui os valores acumulados mês a mês, seja de Saldo, Lucro, etc.
 
Sabemos que a maioria dos gráficos possuem a função de acumular na aba de expressões, mas nem sempre esse acumulado vai atender a nossa demanda.
  
Gráficos que possuem a função de acumular: Barra, Linha, Combinado, Radar, Mekko, Dispersão, Grade e Table Simples.
 
Gráficos que não possuem a função de acumular: Mostrador, Tabela Dinâmica, Pizza, Funil e Blocos.
   
Imagine um cenário em que temos: um gráfico de tabela simples com o valor de REALIZADO e o valor de META. Precisamos agora criar mais três colunas: Realizado Acumulado, Meta Acumulada e % de Realizado em relação a meta.
 
Tranquilo! Gráfico de tabela simples possui a função de acumular a expressão por padrão.
  
Primeira expressão: Realizado Acumulado!
 
SUM(VALOR)
 
Marco Acumular, já era uma. 😀
  
Segunda expressão: Meta Acumulada!
 
SUM(META)
 
Marco Acumular, já era duas!
  
Terceira expressão: %!
 
Vou apenas reaproveitar as expressões…
  
[Realizado Acum.]/[Meta Acum.]
 
Pronto! Terminei!
   
Apenas verifico os valores só para ter certeza que não fiz nada errado
   
Jan/2015
Realizado Acum = 100
Meta Acum =  110
Percentual = 100/110 = 90,91%
Qlikview = 90,91% BOA!

   
Fev/2015
Realizado Acum = 220
Meta Acum =  240
Percentual = 220/240= 91,66%
Qlikview = 92,31% UÉ!
  
Bom, acho que preciso marcar o acumulado na expressão do percentual também!
 
Qlikview = 183,22%
 
NÃO É POSSÍVEL!
  
Deve ser algum erro de casa decimal (RSRSRS Eu sempre penso isso kkk!!!)
 
Refaço as contas e realmente não é erro de casa decimal.
 
Removo o acumulado das expressões: Realizado Acum e Meta Acum, e refaço o cálculo do percentual
  
Fev/2015
Realizado Acum = 120
Meta Acum =  130
Percentual = 120/130= 92,31%
  
Não acredito, o qlikview não consegue reutilizar a expressão com o acumulado. Afff! E agora?
  
Bom! Teremos então que investigar algumas funções que possam obter o mesmo resultado do acumulado do QlikView.
   

Funções

Hoje trabalharemos com as funções Funções Inter-Registro de Gráficos, são elas:
 
Above() = Acima – Retorna o valor da expressão avaliada com os valores de dimensão do gráfico da forma como aparecem na linha acima da atual em um segmento de coluna de uma tabela.
 
Below()Abaixo – Retorna o valor da expressão avaliado com os valores de dimensão do gráfico que aparecem na linha abaixo da atual dentro de um segmento de coluna em uma tabela.
 
Before() = Antes – Retorna o valor da expressão avaliada com os valores de dimensão de uma tabela dinâmica como aparecerem na coluna antes da atual.
 
After() = Depois – Retorna o valor da expressão avaliada com os valores de dimensão de uma tabela dinâmica como aparecerem na coluna depois da atual.
   

Características das funções

  • Na primeira coluna de um segmento de linha, um valor NULL será retornado, já que não há uma coluna
    antes dela.
  • Se a tabela for unidimensional ou se a expressão for precedida pelo qualificador total, o segmento de linha
    atual será sempre igual à linha inteira.
  • Especificar um deslocamento maior que 1 permite que você transfira a avaliação da expressão para essa outra coluna, por exemplo: Se usar para a função Before, então estará avaliando colunas a esquerda em relação a atual coluna.
  • Um número de deslocamento negativo tornará a função o seu inverso, por exemplo a função before ficará equivalente a função after.
  • A especificação de um deslocamento igual a 0 avaliará a expressão da coluna atual.
  • Ao especificar um terceiro parâmetro n maior que 1, a função retornará não um, mas uma série de valores n,
    um para cada n colunas da tabela. Dessa forma, a função pode ser usada como um argumento para qualquer uma das Funções de Intervalo de Gráfico especiais.

  
A parte acima grifada é muito importante, pois como queremos trabalhar com valores acumulados, então teremos que pegar o valor da linha/coluna atual e somar com o de linha(s)/coluna(s) anterior(es) e isso nos obriga a utilizar essas funções de intervalo de gráfico especiais.
  
Essas funções são precedidas da palavra Range, então temos: RangeSum, RangeAvg, RangeCount, RangeMin, RangeMax…. por aí vai.
  
IMPORTANTE: Essas funções de Range servirão para somar os resultados das funções Inter-Registros. Lembre-se que essas funções Inter-Registros retornaram vários resultados e é por isso que teremos que utilizar as funções de Range. Se tentássemos utilizar somente um SUM, o Qlikview retornaria nulo.
   

Exemplo

No exemplo em que vou comentar, estarei utilizando um gráfico de tabela simples com a dimensão MêsAno e suas respectivas expressões.
 
Se estamos trabalhando com um gráfico de tabela simples, então utilizaremos a função Inter-Registro Above(), pois o resultado do mês anterior esta na linha acima, desde que o gráfico esteja ordenado de forma Crescente.
 
Lembrando: Queremos acumular desde o primeiro MêsAno disponível nos filtros.
  
Expressão de Realizado: RangeSum(Above(SUM(VALOR), 0, RowNo()))
 
Vamos entender os parâmetros do Above
 
Deslocamento é zero, ou seja, estou avaliando a expressão da linha atual
 
N = RowNo() [RowNo() retorna o número da linha do gráfico]
 
Se estamos na primeira linha do gráfico, então a expressão estará da seguinte forma: RangeSum(Above(SUM(VALOR), 0, 1)), ou seja, estamos analisando somente a linha atual. Para a expressão RangeSum estamos somando o intervalo da linha atual até a linha atual.
 
Se estamos na segunda linha do gráfico, então a expressão estará da seguinte forma: RangeSum(Above(SUM(VALOR), 0, 2)), ou seja, estamos analisando a linha atual  e a linha anterior. Para a expressão RangeSum estamos somando o intervalo da linha atual até a linha anterior.
 
Se estamos na terceira linha do gráfico, então a expressão estará da seguinte forma: RangeSum(Above(SUM(VALOR), 0, 3)), ou seja, estamos analisando a linha atual  e duas linhas anteriores. Para a expressão RangeSum estamos somando o intervalo da linha atual até duas linhas anteriores.
  
Expressão de Meta: RangeSum(Above(SUM(META), 0, RowNo()))
 
A regra se mantém a mesma para a meta.
 
Agora o percentual fica fácil:
 
RangeSum(Above(SUM(VALOR), 0, RowNo())) / RangeSum(Above(SUM(META), 0, RowNo()))
 
Agora teremos o seguinte resultado
  
Grafico01
  
Muito bom!
   

Fique Atento

Lembre-se de escolher corretamente a expressão Inter-Registro a ser utilizada, se estiver em uma tabela dinâmica, com o MêsAno pivoteado, então temos que pegar o resultado da COLUNA ANTERIOR, para isso devemos utilizar a função Before().
 
Abaixo disponibilizei uma aplicação com um exemplo na tabela dinâmica e como acumular somente alguns passos, por exemplo: Somente 1 mês anterior ou somente dois meses anteriores.
 
Para fazer download da aplicação de exemplo clique aqui!
   

Conclusão

Se o que você deseja fazer o QlikView oferece, então utilize! Sempre as funções prontas do QlikView oferecem melhor performance, mas nem tudo o QlikView nos oferece de “mão beijada”, desta forma é bom estarmos preparados para essas ocasiões.
 
Até a próxima semana!

Posicionamento de objetos na tela

Fala pessoal, tudo bom?
 
Hoje quero abordar sobre o tema de layout. Este é um tema muito importante pra mim, pois me considero uma pessoa muito fraca em layout. O estudo que realizei para esta semana vai ajudar muito a todos nos (principalmente eu rsrs).
 
Todas as citações e autores que pesquisei serão citados com direcionamentos para os seus materiais. Um outro material importante do post foi essa dissertação de mestrado: Aqui.
  
Famosas perguntas
 
Qual a melhor maneira de posicionar os objetos em um dashboard?

Qual a posição devo disponibilizar os filtros?
  
A maneira como os olhos das pessoas se movimentam ao longo de interfaces gráficas digitais. É de extrema importância o conhecimento dos padrões de visualização de dados em telas computadorizadas, pois esta é a única maneira de posicionar, com eficácia, títulos, barras de navegação, gráficos, filtros, entre outros elementos que formam a interface.
  
Exploração visual e áreas de maior visibilidade da tela
De acordo com LYNCH e HORTON, ao visualizarem uma interface gráfica digital, primeiro os usuários vêem as telas como grandes massas de formatos e cores, com os elementos do primeiro plano contrastando com a área de
fundo. Em seguida, os usuários começam a identificar informações específicas, inicialmente através dos gráficos (quando presentes), e somente então eles começam a analisar gramaticalmente o texto e a ler as palavras e frases que o compõem.
 
Os 10 ou 12 centímetros superiores são a parte que estará mais visível. Logo, a posição dos elementos faz toda a diferença. Em interfaces projetadas para oferecer uma navegação eficiente.
 
A exploração da interface gráfica digital divide-se em 7 zonas de visualização.

  1. O olhar direciona-se para o lado superior esquerdo da tela.
  2. Depois, movimenta-se da esquerda para a direita.
  3. Em seguida, o olhar desce para a parte inferior esquerda e a partir deste ponto, passa a explorar as extremidades da tela.
  4. Explora a extremidade superior esquerda,
  5. Depois explora a extremidade superior direita.
  6. Então, o olhar dirige-se para a extremidade inferior esquerda,
  7. Finalizando com um movimento na direção da extremidade inferior direita.

 
Abaixo a representação a seguir, é possível observar a trajetória de exploração visual de uma interface.
  
Layout_01
 
Em culturas diferentes da ocidental, onde o sentido da leitura é realizado da direita para a esquerda, estes processos de exploração visual da interface gráfica digital talvez sejam inválidos.
 
Ainda de acordo com STEVE OUTING e LAURA RUEL, o instinto das pessoas faz com que elas olhem para a área localizada no canto superior esquerdo da tela, conforme é possível observar na representação de áreas de prioridade a seguir.
Sendo assim, ao desenvolver uma interface gráfica digital, deve-se dar grande importância para as informações que estarão contidas nestas áreas de prioridade.
 
Layout_02
  
Esses autores também descrevem que as pessoas costumam olhar para os elementos textuais da interface antes dos seus olhos se fixarem em fotos ou gráficos. Em páginas com muita informação textual captam a atenção do olhar, especialmente quando estão localizados na parte superior esquerda da tela. Fontes menores encorajam o comportamento de leitura das palavras, enquanto fontes maiores promovem a varredura da página (pessoas lêem apenas as primeiras palavras e só dão continuidade ao processo caso a sua atenção seja despertada por estas palavras).
 
Pessoas não estão acostumadas a observar menus de navegação no lado direito das interfaces.
 
Ao tratar de gráficos, os autores afirmam que tanto para imagens quanto para textos prevaleceu a regra básica: o tamanho do gráfico importa. Quanto maior a imagem, ou o banner, maior o tempo que as pessoas permaneceram olhando para a mesma.
 
 
Conclusão
 
Uma peculiaridade da mente humana é que nossa memória visual é muito mais duradoura que a memória textual. É por isso que temos muito mais facilidade de esquecer um nome que um rosto. Desta forma, a construção da interface gráfica digital deve ser simples, pois quanto mais simples, mais cognitivo. Sendo mais cognitivo, atingirá a compreensão do usuário.
 
Pense em sua interface como uma embalagem. Ela deve conter certas características como: facilidade de aprendizagem, simplicidade de uso e emitir clareza.
 
Em anexo, também disponibilizo uma material referente ao posicionamento de navegação e exibição do QlikView. Clique aqui para fazer o download.

Como recuperar uma licença de um QVW deletado

Uma antiga aplicação, que não esta mais sendo utilizada, esta prestes a ser removida da pasta de acesso do QlikView Server. Sabendo que este QVW não é utilizado a décadas, logo optamos por remover essa aplicação da face de nosso ambiente. Lembro-me de remover as tasks de recarga e depois vou até o diretório onde o arquivo se encontra e SHIFT + DELL!
Pronto! Arquivo removido, uma aplicação a menos para dar manutenção 😀

Um tempo se passa e chegam novas requisições de acessos para determinadas aplicações. Sem nenhuma dúvida acessamos ao nosso querido QMC, encontramos o QVW no qual solicitaram acesso e vou adicionar as licenças solicitadas, só que não… nenhuma licença disponível para alocar a novos usuários.

Indignado! Pois tempos atrás foi removido um QVW e liberada algumas Calls para utilização.
Agora verifico a parte de licenciamento em meu QMC e, novamente, vejo a informação de que todas as licenças estão alocadas.

Inicio uma varredura, QVW a QVW (ninguém merece —– PS: no futuro disponibilizo uma app para facilitar nossa vida nesse processo!) para entender e identificar com quem esta as licenças que deveriam estar disponíveis para utilização.
QVW a QVW vou anotando a quantidade de licença e para quem foi disponibilizado.

Passado um tempo, mapeada todas as aplicações e seus respectivos usuários, identifico que alguma coisa “Pode” estar errada, o número de licenças alocadas em cada QVW não bate com o número total de licenças em que meu ambiente deveria possuir.

E agora?


Aff! Esqueci de remover as licenças daquele painel em que deletei! Porém essa aplicação não esta mais aparecendo em meu QMC. Como vou remover essas licenças e recupera-las para utilização?

Angustiado tento reiniciar todos os serviços do QlikView Server….. NADA!
Aflito tento remover o .SHARED daquela aplicação….. NADA!
Desesperado tento remover o .pgo do root folder…. NADA!!

E agora? Perdi a licença?

rsrsrs
Calma!

Existe uma luz!

Vamos lá

Solução 1

  1. Pare o serviço “QlikView Server”.
  2. Adicione uma linha com a informação “PgoAsXmlAlso=1” logo abaixo da linha que contém a informação [Settings 7] no arquivo Settings.ini que fica no diretório “C:\ProgramData\QlikTech\QlikViewServer”.
  3. Inicie o serviço “QlikView Server”
  4. Crie um documento, em branco, com o exato nome do documento que foi removido e ficou com as licenças presas.
    1. Caso não se recorde do nome do documento, encontre o arquivo CalData.pgo.xml que se encontra dentro do diretório Root
  5. Abra o QMC. Agora o documento deve reaparecer e assim será possível remover as licenças alocadas para ele.

Solução 2

Pare os serviços “QlikView Server” e “QlikView Management Service” e depois remova o arquivo “caldata.pgo” do diretório Root (diretório em que esta mapeado o QVS) e também do diretório “C:\ProgramData\QlikTech\QlikViewServer”.

OBS: Esse método é aconselhável somente se a primeira solução não tenha dado certo.

Solução 3

Remova a licença de seu QlikView Server e aplique-a novamente.

OBS: Esse método é aconselhável somente para ambientes pequenos e caso nenhuma das outras alternativas funcione.

Pessoal, nunca se esqueçam de fazer backup dos arquivos antes de remove-los. Existe um risco grande de parar o seu ambiente.